Select Git revision
jquery.once.js
Forked from
UNL Information Services / UNL-CMS
Source project has a limited visibility.
EditController.php 14.56 KiB
<?php
class Courses_EditController extends App_Controller_Action
{
public function indexAction()
{
$in = $this->_getAllParams();
$session = new Zend_Session_Namespace('Edit Request ' . $in['id']);
$course = $session->course;
$request = $session->request;
$this->view->course = $course;
$this->view->parentCourse = $session->parentCourse;
$this->view->request = $request;
$this->view->errors = $session->errors;
$this->view->formSessionId = $in['id'];
$layout = Zend_Layout::getMvcInstance();
}
public function editPostAction()
{
$filter = array(
'subject' => array('Alpha', 'StringToUpper'),
'courseNumber' => array('Digits'),
'courseLetter' => array('Alpha', 'StringToUpper')
);
$validator = array();
$options = array('escapeFilter' => 'StringTrim');
$in = new Zend_Filter_Input($filter, $validator, $this->getRequest()->getParams(), $options);
$rawIn = $this->getRequest()->getParams();
$session = new Zend_Session_Namespace('Edit Request ' . $rawIn['id']);
$course = $session->course;
$request = $session->request;
$errors = array();
if (!in_array($request->getType(), array('RemoveCourse', 'AddACEToCourse', 'RemoveACEFromCourse', 'ChangeACE'))) {
$course->setCourseCode($in->subject, $in->courseNumber, $in->courseLetter);
$course->setTitle($in->title);
if (Unl_Util::isArray($in->crosslistings)) {
foreach ($in->crosslistings as $id => $crosslisting) {
$filter = array(
'subject' => array('Alpha', 'StringToUpper'),
'courseNumber' => array('Digits'),
'courseLetter' => array('Alpha', 'StringToUpper')
);
$validator = array();
$crosslisting = new Zend_Filter_Input($filter, $validator, $crosslisting);
if ($crosslisting->delete == 'yes') {
$course->removeCrosslisting($id);
} else {
if ($crosslisting->action == 'edit') {
$course->editCrosslisting($id, $crosslisting->type, $crosslisting->subject, $crosslisting->courseNumber, $crosslisting->courseLetter);
} else {
$course->addCrosslisting($crosslisting->type, $crosslisting->subject, $crosslisting->courseNumber, $crosslisting->courseLetter);
}
}
}
}
foreach ($in->credits as $type => $credit) {
if ($type == Courses_CourseModel::CREDIT_TYPE_SINGLE) {
$credit = explode(',', $credit);
foreach($credit as $key => $hours) {
$credit[$key] = trim($hours);
}
}
$course->setCredit($type, $credit);
}
$course->setTermsOffered($in->termsOffered);
if (Unl_Util::isArray($in->activities)) {
foreach ($in->activities as $activity) {
if ($activity['delete'] == 'yes') {
$course->removeActivity($activity['type']);
} else {
$course->setActivity($activity['type'], $activity['hours']);
}
}
}
$course->setPrerequisite($rawIn['prerequisite']);
$course->setGradingType($in->gradingType);
$course->setDfRemoval($in->dfRemoval);
$course->setDeliveryMethods($in->deliveryMethods);
$course->setCampuses($in->campuses);
$course->setNotes($rawIn['notes']);
$course->setDescription($rawIn['description']);
if ($in->gradTieIn['credits'] || $in->gradTieIn['prerequisites'] || $in->gradTieIn['notes']) {
$course->setGradTieIn($in->gradTieIn['credits'], $rawIn['gradTieIn']['prerequisites'], $rawIn['gradTieIn']['notes']);
} else {
$course->removeGradTieIn();
}
}
if (in_array($request->getType(), array('NewCourseWithACE', 'AddACEToCourse', 'AddACEAndChangeCourse', 'ChangeACE'))) {
foreach ($rawIn['ace']['outcomes'] as $name => $aceOutcome) {
if ($aceOutcome['enabled']) {
$course->setAceOutcome($name, $aceOutcome['justification'], $aceOutcome['studentWork'], $aceOutcome['assesmentPlan']);
} else {
$course->removeAceOutcome($name);
}
}
foreach ($rawIn['ace']['reinforcements'] as $name => $aceReinforcement) {
if ($aceReinforcement['enabled']) {
$course->setAceReinforcement($name, $aceReinforcement['description']);
} else {
$course->removeAceReinforcement($name);
}
}
}
$request->setJustification($rawIn['request']['justification']);
$fileTypes = array(
Requests_RequestModel::FILE_TYPE_SYLLABUS,
Requests_RequestModel::FILE_TYPE_CROSSLIST_MEMO,
Requests_RequestModel::FILE_TYPE_OTHER,
Requests_RequestModel::FILE_TYPE_IS_NARRATIVE
);
/*
foreach ($fileTypes as $fileType) {
if ($in->removeFiles[$fileType] == 'yes') {
$request->removeFile($fileType);
}
if ($_FILES['request']['error'][$fileType] === 0) {
$title = $_FILES['request']['name'][$fileType];
$fileExtension = array_pop(explode('.', $title));
if (!in_array($fileExtension, array('rtf', 'pdf', 'odt', 'doc'))) {
continue;
}
$mimeType = $_FILES['request']['type'][$fileType];
$content = file_get_contents($_FILES['request']['tmp_name'][$fileType]);
$request->setFile($fileType, $title, $mimeType, $content);
}
}
*/
if (Unl_Util::isArray($in->files)) {
foreach ($in->files as $fileId => $file) {
if ($file['delete'] == 'yes') {
$request->removeFileById($fileId);
}
}
}
if (Unl_Util::isArray($_FILES['files']['name'])) {
foreach ($_FILES['files']['name'] as $fileType => $files) {
foreach ($files as $fileId => $title) {
if ($_FILES['files']['error'][$fileType][$fileId] !== 0) {
continue;
}
$title = $_FILES['files']['name'][$fileType][$fileId];
$fileExtension = array_pop(explode('.', $title));
if (!in_array($fileExtension, array('rtf', 'pdf', 'odt', 'doc', 'docx'))) {
continue;
}
$mimeType = $_FILES['files']['type'][$fileType][$fileId];
$content = file_get_contents($_FILES['files']['tmp_name'][$fileType][$fileId]);
$request->addFile($fileType, $title, $mimeType, $content);
}
}
}
$session->course = $course;
$session->request = $request;
$session->errors = $errors;
if (count($errors) > 0) {
$this->_redirect('/courses/edit/index/id/' . $rawIn['id']);
} else {
$this->_redirect('/courses/view/index/type/session/id/' . $rawIn['id']);
}
}
public function loadAction()
{
$in = $this->getRequest()->getParams();
$tempId = hash('md5', uniqid());
$session = new Zend_Session_Namespace('Edit Request ' . $tempId);
if ($in['sessionId'] !== null) {
$id = $in['sessionId'];
$user = Auth_UserModel::findCurrentUser();
$savedRequests = RegistryModel::findByNamespaceAndKey($user->getId(), 'savedRequests')->getData();
$request = $savedRequests[$id]['request'];
$course = $savedRequests[$id]['course'];
if ($this->_isSavedRequestStale($request, $course)) {
$controllerSession = new Zend_Session_Namespace(__CLASS__);
$controllerSession->errorMessage = 'Unfortunately another request modifying this course has been submitted since you saved your request. You will need to create a new request to continue.';
$this->_redirect('/courses/edit/error');
exit;
}
$parentCourse = $savedRequests[$id]['parentCourse'];
$session->currentSavedRequestId = $id;
} else {
$id = $in['id'];
$request = Requests_RequestModel::find($id);
$course = Courses_CourseModel::findLatestOfRequest($request);
$course = clone $course;
$parentCourse = Courses_CourseModel::findParentOfRequest($request);
unset($session->currentSavedRequestId);
}
$session->request = $request;
$session->course = $course;
$session->parentCourse = $parentCourse;
$this->_redirect('/courses/edit/index/id/' . $tempId);
}
public function submitPostAction()
{
$in = $this->getRequest()->getParams();
$session = new Zend_Session_Namespace('Edit Request ' . $in['id']);
if ($in['effectiveSemester']) {
$session->course->setEffectiveSemester($in['effectiveSemester']);
}
if ($in['submitType'] == 'Save for Later Submission') {
$this->_saveForLater();
$this->_redirect('/requests');
}
if ($in['submitType'] == 'Return to Edit') {
$this->_redirect('/courses/edit/index/id/' . $in['id']);
}
if ($in['submitType'] == 'Abandon Changes') {
$this->_redirect('/requests');
}
if ($in['submitType'] == 'Cancel Request') {
$this->_redirect('/requests');
}
if ($in['submitType'] == 'Save Changes') {
$this->_saveRequest();
$this->_redirect('/requests/view/index/id/' . $session->request->getId());
}
if ($in['submitType'] == 'Submit') {
set_time_limit(5);
$this->_saveRequest();
$this->_startApproval();
$this->_redirect('/requests');
}
}
public function errorAction()
{
$session = new Zend_Session_Namespace(__CLASS__);
$this->view->message = $session->errorMessage;
}
protected function _saveForLater()
{
$in = $this->_getAllParams();
$session = new Zend_Session_Namespace('Edit Request ' . $in['id']);
$user = Auth_UserModel::findCurrentUser();
$savedRequestRegistry = RegistryModel::findByNamespaceAndKey($user->getId(), 'savedRequests');
$savedRequests = $savedRequestRegistry->getData();
if (!Unl_Util::isArray($savedRequests)) {
$savedRequests = array();
}
$newSavedRequest = array(
'request' => $session->request,
'course' => $session->course,
'parentCourse' => $session->parentCourse
);
if ($session->currentSavedRequestId !== null) {
$id = $session->currentSavedRequestId;
$savedRequests[$id] = $newSavedRequest;
} else {
$savedRequests[] = $newSavedRequest;
}
$savedRequestRegistry->setData($savedRequests);
$collection = new Unl_Model_Collection('RegistryModel');
$collection[] = $savedRequestRegistry;
RegistryModel::save($collection);
}
protected function _saveRequest()
{
$in = $this->_getAllParams();
$session = new Zend_Session_Namespace('Edit Request ' . $in['id']);
if ($session->currentSavedRequestId !== null) {
$id = $session->currentSavedRequestId;
$user = Auth_UserModel::findCurrentUser();
$savedRequestRegistry = RegistryModel::findByNamespaceAndKey($user->getId(), 'savedRequests');
$savedRequests = $savedRequestRegistry->getData();
unset($savedRequests[$id]);
$savedRequestRegistry->setData($savedRequests);
$collection = new Unl_Model_Collection('RegistryModel');
$collection[] = $savedRequestRegistry;
RegistryModel::save($collection);
unset($session->currentSavedRequestId);
}
Requests_RequestModel::save($session->request);
$session->course->setRequest($session->request);
Courses_CourseModel::save($session->course);
}
protected function _startApproval()
{
$in = $this->_getAllParams();
$session = new Zend_Session_Namespace('Edit Request ' . $in['id']);
Requests_ApprovalChainModel::consider($session->request);
}
protected function _courseCodeIsAvailable(Courses_CourseModel $course, $subject, $courseNumber, $courseLetter = '')
{
foreach ($course->getCrosslistings() as $crosslisting) {
if ($crosslisting['subject'] == $subject &&
$crosslisting['courseNumber'] == $courseNumber &&
$crosslisting['courseLetter'] == $courseLetter) {
return true;
}
}
$course = Courses_CourseModel::findByCourseCode($subject, $courseNumber, $courseLetter);
if ($course) {
return false;
}
$activeRequests = Courses_CourseModel::findActiveRequestByCourseCode($subject, $courseNumber, $courseLetter);
if (count($activeRequests) > 0) {
return false;
}
return true;
}
protected function _isSavedRequestStale(Requests_RequestModel $request, Courses_CourseModel $course)
{
if (!$course->getCourseId()) {
return false;
}
$parentCourse = Courses_CourseModel::findByCourseId($course->getCourseId());
if ($parentCourse->getId() != $course->getParentId()) {
return true;
}
$otherRequests = Courses_CourseModel::findActiveRequestByCourseCode($parentCourse->getSubject(),
$parentCourse->getCourseNumber(),
$parentCourse->getCourseLetter());
if (count($otherRequests) > 0) {
return true;
}
return false;
}
public function isCourseCodeAvailableAction()
{
$in = $this->_getAllParams();
$session = new Zend_Session_Namespace('Edit Request ' . $in['id']);
$course = $session->course;
$available = $this->_courseCodeIsAvailable($course, $in['subject'], $in['courseNumber'], $in['courseLetter']);
$dom = new DOMDocument();
$root = $dom->createElement('response');
$dom->appendChild($root);
if ($available) {
$responseNode = $dom->createElement('true');
} else {
$responseNode = $dom->createElement('false');
}
$root->appendChild($responseNode);
header('Content-type: text/xml');
echo $dom->saveXML();
exit;
}
}