/** * Test user with view and edit permissions on a userset. * This test only rund when local/elisprogram/setuplib.php exists. */ public function test_manual_field_is_view_or_editable_with_view_edit_permissions_on_userset() { global $DB, $CFG; // Skip test if local/elisprogram doesn't exist. if (!file_exists($CFG->dirroot . '/local/elisprogram/lib/setup.php')) { $this->markTestSkipped('Requires local/elisprogram to be installed.'); } $this->resetAfterTest(true); $this->load_libraries_for_additional_tests(); // Load CSV data. $this->load_csv_data(); // Setup place holders for capabilities. $editcap = 'local/elisprogram:user_edit'; $viewcap = 'local/elisprogram:user_view'; // Retrieve the PM user id to be assigned to a userset $param = array('id' => 103); $pmuserinusersetid = $DB->get_field('local_elisprogram_usr', 'id', $param); // Retrieve the user who will be assigned a role in the user set. $param = array('id' => 101); $userroleinuserset = $DB->get_record('user', $param); // Set user with role as logged in user $this->setUser($userroleinuserset); // Get the userset context. $usersetcontext = \local_elisprogram\context\userset::instance(1); // System context. $syscontext = context_system::instance(); // Create role and assign capabilites to it. $roleid = create_role('testrole', 'testrole', 'testrole'); assign_capability($editcap, CAP_ALLOW, $roleid, $syscontext->id); assign_capability($viewcap, CAP_ALLOW, $roleid, $syscontext->id); // Assin role to user in the userset context. role_assign($roleid, $userroleinuserset->id, $usersetcontext->id); // Add user to cluster/userset. $usersetassign = new clusterassignment(array('clusterid' => 1, 'userid' => $pmuserinusersetid, 'plugin' => 'manual')); $usersetassign->save(); $field = new field(array('id' => 101)); $field->load(); $result = manual_field_is_view_or_editable($field, $syscontext, $editcap, $viewcap, 'user', $pmuserinusersetid); $this->assertEquals(MANUAL_FIELD_EDITABLE, $result); }
/** * Method to add ELIS entity's custom fields to entity forms * * @param string $entity ELIS entity name: Eg. 'curriculum', 'track', 'course', 'class', 'cluster', 'user' * @param string $editcap The required edit capability * @param string $viewcap The required view capability * @param string $parententity The entity name of the parent object (optional) */ function add_custom_fields($entity, $editcap, $viewcap, $parententity = '') { $mform =& $this->_form; $fields = field::get_for_context_level($entity); $fields = $fields ? $fields : array(); if (isset($this->_customdata['obj'])) { if (isset($this->_customdata['obj']->id)) { // Use the current (existing) entity's context instance $contextlevel = \local_eliscore\context\helper::get_level_from_name($entity); $contextclass = \local_eliscore\context\helper::get_class_for_level($contextlevel); $context = $contextclass::instance($this->_customdata['obj']->id); } else { if (isset($this->_customdata['obj']->parent) && $parententity != '') { // ELIS-6498 -- Specify the parent entity type to get the correct parent context instance as we are // adding a new "child" entity $contextlevel = \local_eliscore\context\helper::get_level_from_name($parententity); $contextclass = \local_eliscore\context\helper::get_class_for_level($contextlevel); $context = $contextclass::instance($this->_customdata['obj']->parent); } else { if (isset($this->_customdata['obj']->courseid) && $parententity == 'course') { // ELIS-6498 -- Special handling of the course -> class hierarchy is required here $context = \local_elisprogram\context\course::instance($this->_customdata['obj']->courseid); } else { $context = context_system::instance(); } } } } else { $context = context_system::instance(); } require_once elis::plugin_file('elisfields_manual', 'custom_fields.php'); $lastcat = null; $entityid = isset($this->_customdata['obj']->id) ? $this->_customdata['obj']->id : 0; foreach ($fields as $rec) { $field = new field($rec); if (!isset($field->owners['manual'])) { continue; } // Capabilities for editing / viewing this context if (manual_field_is_view_or_editable($field, $context, $editcap, $viewcap, $entity, $entityid) != MANUAL_FIELD_NO_VIEW_OR_EDIT) { if ($lastcat != $rec->categoryid) { $lastcat = $rec->categoryid; $mform->addElement('header', "category_{$lastcat}", htmlspecialchars($rec->categoryname)); } manual_field_add_form_element($this, $mform, $context, $this->_customdata, $field, true, $editcap, $viewcap, $entity, $entityid); } } }
/** * Add an element to a form for a field. * * @param object $form the moodle form object we are adding the element to * @param object $mform the moodle quick form object belonging to the moodle form * @param mixed $context Moodle context * @param array $customdata any additional information to pass along to the element * @param object $field the custom field we are viewing / editing * @param boolean $checkrequired if true, add a required rule for this field * @param string $contexteditcap the edit capability to check if the field owner * is set up to use the "edit this context" option for editing * @param string $contextviewcap the view capability to check if the field owner * is set up to use the "view this context" option for viewing * @param int $entityid The id of the entity. Required only if an entity is passed. * @param string $entity optional entity/context name */ function manual_field_add_form_element($form, $mform, $context, $customdata, $field, $checkrequired = true, $contexteditcap = NULL, $contextviewcap = NULL, $entity = 'system', $entityid = 0) { $isvieworeditable = manual_field_is_view_or_editable($field, $context, $contexteditcap, $contextviewcap, $entity, $entityid); if ($isvieworeditable == MANUAL_FIELD_NO_VIEW_OR_EDIT) { return; } $elem = "field_{$field->shortname}"; $manual = new field_owner($field->owners['manual']); $control = $manual->param_control; require_once elis::plugin_file('elisfields_manual', "field_controls/{$control}.php"); call_user_func("{$control}_control_display", $form, $mform, $customdata, $field, false, $entity); $manualparams = unserialize($manual->params); // Set default data if no over-riding value set! if (!isset($customdata['obj']->{$elem})) { $defaultdata = field_data::get_for_context_and_field(NULL, $field); if (!empty($defaultdata)) { if ($field->multivalued) { $values = array(); foreach ($defaultdata as $defdata) { $values[] = $defdata->data; } $defaultdata = $values; // implode(',', $values) } else { foreach ($defaultdata as $defdata) { $defaultdata = $defdata->data; break; } } } // Format decimal numbers. if ($field->datatype == 'num' && $manualparams['control'] != 'menu') { $defaultdata = $field->format_number($defaultdata); } if (!is_null($defaultdata) && !is_object($defaultdata) && $defaultdata !== false) { if (is_string($defaultdata)) { $defaultdata = trim($defaultdata, "\r\n"); // Radio buttons! } $mform->setDefault($elem, $defaultdata); } } if ($isvieworeditable == MANUAL_FIELD_VIEWABLE) { // Have view but not edit permission. $mform->freeze($elem); } else { if ($checkrequired) { if (!empty($manualparams['required'])) { $mform->addRule($elem, null, 'required', null, 'client'); // TBD } } } }