From 8e44c840d5abe95961d4679e50ecde8be67b43b9 Mon Sep 17 00:00:00 2001
From: Tim Steiner <tsteiner2@unl.edu>
Date: Fri, 23 Oct 2009 19:54:09 +0000
Subject: [PATCH] Check for "stale" saved requests before allowing a user to
 edit them.

---
 .../courses/controllers/EditController.php    | 31 ++++++++++++++++++-
 .../modules/courses/models/CourseModel.php    |  5 +++
 .../courses/views/scripts/edit/error.phtml    |  3 ++
 3 files changed, 38 insertions(+), 1 deletion(-)
 create mode 100644 application/modules/courses/views/scripts/edit/error.phtml

diff --git a/application/modules/courses/controllers/EditController.php b/application/modules/courses/controllers/EditController.php
index 034c5b45..d700e1cb 100644
--- a/application/modules/courses/controllers/EditController.php
+++ b/application/modules/courses/controllers/EditController.php
@@ -194,6 +194,12 @@ class Courses_EditController extends App_Controller_Action
     		$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 {
@@ -252,6 +258,12 @@ class Courses_EditController extends App_Controller_Action
 
     }
 
+    public function errorAction()
+    {
+        $session = new Zend_Session_Namespace(__CLASS__);
+        $this->view->message = $session->errorMessage;
+    }
+    
     protected function _saveForLater()
     {
     	$in = $this->_getAllParams();
@@ -319,7 +331,7 @@ class Courses_EditController extends App_Controller_Action
             if ($crosslisting['subject'] == $subject &&
                 $crosslisting['courseNumber'] == $courseNumber &&
                 $crosslisting['courseLetter'] == $courseLetter) {
-                return true; 
+                return true;
             }
         }
         
@@ -336,6 +348,23 @@ class Courses_EditController extends App_Controller_Action
         return true;
     }
     
+    protected function _isSavedRequestStale(Requests_RequestModel $request, Courses_CourseModel $course)
+    {
+        $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();
diff --git a/application/modules/courses/models/CourseModel.php b/application/modules/courses/models/CourseModel.php
index 9b295fe0..6856c912 100644
--- a/application/modules/courses/models/CourseModel.php
+++ b/application/modules/courses/models/CourseModel.php
@@ -2587,6 +2587,11 @@ class Courses_CourseModel extends Unl_Model
     {
         return $this->_data['course'];
     }
+    
+    public function getParentId()
+    {
+        return $this->_data['parent'];
+    }
 
     public function isValid()
     {
diff --git a/application/modules/courses/views/scripts/edit/error.phtml b/application/modules/courses/views/scripts/edit/error.phtml
new file mode 100644
index 00000000..8e134924
--- /dev/null
+++ b/application/modules/courses/views/scripts/edit/error.phtml
@@ -0,0 +1,3 @@
+<div style="color: #f00; font-weight: bold; font-size: 24px; line-height: normal; padding-bottom: 1em;">
+    <?php echo $this->message; ?>
+</div>
\ No newline at end of file
-- 
GitLab