diff --git a/app/controllers/admin/sem_classes.php b/app/controllers/admin/sem_classes.php index aef3e8487d42e27be619bb28edf2b96e262357ba..c0b098f89d873c4cf4d194bab1408efdfafe4809 100644 --- a/app/controllers/admin/sem_classes.php +++ b/app/controllers/admin/sem_classes.php @@ -125,6 +125,7 @@ class Admin_SemClassesController extends AuthenticatedController $sem_class->set('admission_type_default', Request::int("admission_type_default")); $sem_class->set('show_raumzeit', Request::int("show_raumzeit")); $sem_class->set('is_group', Request::int("is_group")); + $sem_class->set('unlimited_forbidden', Request::bool('unlimited_forbidden')); $sem_class->store(); foreach (array_keys($sem_class->getModules()) as $module_name) { if ($sem_class->isModuleMandatory($module_name) && !$old_data_sem_class->isModuleMandatory($module_name)) { diff --git a/app/views/admin/sem_classes/details.php b/app/views/admin/sem_classes/details.php index b6b8a35ee12b05a37dd9e386f847c48500749e93..54f4f903353bfc5500bef963374757a7a71bc836 100644 --- a/app/views/admin/sem_classes/details.php +++ b/app/views/admin/sem_classes/details.php @@ -196,14 +196,20 @@ </label> <label> - <?= _("Kurzer Beschreibungstext zum Anlegen einer Veranstaltung") ?> - <textarea id="create_description" maxlength="200" style="width: 100%"><?= htmlReady($sem_class['create_description']) ?></textarea> + <input type="checkbox" id="is_group" value="1" <?= $sem_class['is_group'] ? 'checked' : '' ?>> + <?= _('Kann Unterveranstaltungen haben') ?> + </label> + + <label> + <input type="checkbox" id="unlimited_forbidden" value="1" <?= $sem_class['unlimited_forbidden'] ? 'checked' : '' ?>> + <?= _('Unbegrenzte Laufzeit verbieten') ?> </label> <label> - <input type="checkbox" id="is_group" value="1"<?= $sem_class['is_group'] ? " checked" : "" ?>> - <?= _("Kann Unterveranstaltungen haben") ?> + <?= _('Kurzer Beschreibungstext zum Anlegen einer Veranstaltung') ?> + <textarea id="create_description" maxlength="200" style="width: 100%"><?= htmlReady($sem_class['create_description']) ?></textarea> </label> + </fieldset> <fieldset class="attribute_table"> diff --git a/app/views/course/timesrooms/editSemester.php b/app/views/course/timesrooms/editSemester.php index 0ac8d1d212ca6d34c2e1ef7246205526218dc351..84b654c85bebd223846840cbd37154a427dc3a17 100644 --- a/app/views/course/timesrooms/editSemester.php +++ b/app/views/course/timesrooms/editSemester.php @@ -37,9 +37,11 @@ </option> <? endif ?> <? endforeach ?> - <option value="-1"<?= $course->isOpenEnded() ? 'selected' : '' ?>> - <?= _('Unbegrenzt') ?> - </option> + <? if (!$course->getSemClass()['unlimited_forbidden']) : ?> + <option value="-1"<?= $course->isOpenEnded() ? 'selected' : '' ?>> + <?= _('Unbegrenzt') ?> + </option> + <? endif ?> </select> </label> </fieldset> diff --git a/db/migrations/5.5.26_tic3193_no_unlimited_courses.php b/db/migrations/5.5.26_tic3193_no_unlimited_courses.php new file mode 100644 index 0000000000000000000000000000000000000000..ef45bced3abcbbfa41e3a18bf52f8dabccde46af --- /dev/null +++ b/db/migrations/5.5.26_tic3193_no_unlimited_courses.php @@ -0,0 +1,26 @@ +<?php + +final class Tic3193NoUnlimitedCourses extends Migration +{ + public function description() + { + return 'adds option to forbid unlimited courses'; + } + + public function up() + { + DBManager::get()->exec(" + ALTER TABLE `sem_classes` ADD `unlimited_forbidden` TINYINT UNSIGNED NOT NULL DEFAULT 0 AFTER `is_group` + "); + $cache = StudipCacheFactory::getCache(); + $cache->expire('DB_SEM_CLASSES_ARRAY'); + } + + public function down() + { + DBManager::get()->exec("ALTER TABLE `sem_classes` DROP `unlimited_forbidden`"); + $cache = StudipCacheFactory::getCache(); + $cache->expire('DB_SEM_CLASSES_ARRAY'); + } +} + diff --git a/lib/classes/SemClass.class.php b/lib/classes/SemClass.class.php index cec05cc0ef08af34dbef42b0488a67e4cd1f6a02..09580e20444aef759ecbf3fdd1c61c71ac77d05f 100644 --- a/lib/classes/SemClass.class.php +++ b/lib/classes/SemClass.class.php @@ -383,6 +383,7 @@ class SemClass implements ArrayAccess "admission_type_default = :admission_type_default, " . "show_raumzeit = :show_raumzeit, " . "is_group = :is_group, " . + "unlimited_forbidden = :unlimited_forbidden, " . "chdate = UNIX_TIMESTAMP() " . "WHERE id = :id ". ""); @@ -425,7 +426,8 @@ class SemClass implements ArrayAccess 'admission_prelim_default' => (int)$this->data['admission_prelim_default'], 'admission_type_default' => (int)$this->data['admission_type_default'], 'show_raumzeit' => (int) $this->data['show_raumzeit'], - 'is_group' => (int) $this->data['is_group'] + 'is_group' => (int) $this->data['is_group'], + 'unlimited_forbidden' => (int) $this->data['unlimited_forbidden'], ]); } diff --git a/resources/assets/javascripts/lib/admin_sem_class.js b/resources/assets/javascripts/lib/admin_sem_class.js index 698a8d6b2770b69a60f4f9ca046a6d7ebc34a3d7..5ac9532468194ee2cd2b8dae99d033bd6380fd11 100644 --- a/resources/assets/javascripts/lib/admin_sem_class.js +++ b/resources/assets/javascripts/lib/admin_sem_class.js @@ -65,7 +65,8 @@ const admin_sem_class = { admission_prelim_default: jQuery('#admission_prelim_default').val(), admission_type_default: jQuery('#admission_type_default').val(), show_raumzeit: jQuery('#show_raumzeit').is(':checked') ? 1 : 0, - is_group: jQuery('#is_group').is(':checked') ? 1 : 0 + is_group: jQuery('#is_group').is(':checked') ? 1 : 0, + unlimited_forbidden: jQuery('#unlimited_forbidden').is(':checked') ? 1 : 0 }, type: 'POST', dataType: 'json',