0012482: fix diverged displaycontainer of container owner
authorCornelius Weiß <c.weiss@metaways.de>
Wed, 4 Jan 2017 08:59:53 +0000 (09:59 +0100)
committerPhilipp Schüle <p.schuele@metaways.de>
Wed, 4 Jan 2017 17:09:22 +0000 (18:09 +0100)
Change-Id: Ibb35c095ff0c68065353b15e1df64ad9dc0b67da
Reviewed-on: http://gerrit.tine20.com/customers/4038
Tested-by: Jenkins CI (http://ci.tine20.com/)
Reviewed-by: Philipp Schüle <p.schuele@metaways.de>
tine20/Calendar/Controller/Event.php
tine20/Calendar/Setup/Update/Release9.php
tine20/Calendar/Setup/setup.xml

index 948b0d4..cb7db93 100644 (file)
@@ -1999,7 +1999,7 @@ class Calendar_Controller_Event extends Tinebase_Controller_Record_Abstract impl
         // attach to display calendar if attender has/is a useraccount
         if ($userAccountId) {
             if ($calendar->type == Tinebase_Model_Container::TYPE_PERSONAL && Tinebase_Container::getInstance()->hasGrant($userAccountId, $calendar, Tinebase_Model_Grants::GRANT_ADMIN)) {
-                // if attender has admin grant to personal physical container, this phys. cal also gets displ. cal
+                // if attender has admin grant to (is owner of) personal physical container, this phys. cal also gets displ. cal
                 $attender->displaycontainer_id = $calendar->getId();
             } else if ($attender->displaycontainer_id && $userAccountId == Tinebase_Core::getUser()->getId() && Tinebase_Container::getInstance()->hasGrant($userAccountId, $attender->displaycontainer_id, Tinebase_Model_Grants::GRANT_ADMIN)) {
                 // allow user to set his own displ. cal
index 4b7bd20..a8df20e 100644 (file)
@@ -60,4 +60,81 @@ class Calendar_Setup_Update_Release9 extends Setup_Update_Abstract
         $release8->update_11();
         $this->setApplicationVersion('Calendar', '9.4');
     }
+
+    /**
+     * fix displaycontainer in organizers attendee records
+     */
+    public function update_4()
+    {
+        $allBroken = $this->_db->query(
+            "SELECT " . $this->_db->quoteIdentifier('events.id') . " AS " . $this->_db->quoteIdentifier('event_id') . "," .
+                        $this->_db->quoteIdentifier('events.is_deleted') . " AS " . $this->_db->quoteIdentifier('event_is_deleted') . "," .
+                        $this->_db->quoteIdentifier('events.container_id') . "," .
+                        $this->_db->quoteIdentifier('events.seq') . "," .
+                        $this->_db->quoteIdentifier('attendee.id') . " AS " . $this->_db->quoteIdentifier('attendee_id') .
+            " FROM " . $this->_db->quoteIdentifier(SQL_TABLE_PREFIX . "cal_events") . " AS " . $this->_db->quoteIdentifier('events') .
+            " INNER JOIN " . $this->_db->quoteIdentifier(SQL_TABLE_PREFIX . "container") . " AS " . $this->_db->quoteIdentifier('container') . " ON " .
+                $this->_db->quoteIdentifier('events.container_id') . " = ". $this->_db->quoteIdentifier('container.id') . " AND " .
+                $this->_db->quoteIdentifier('container.type') . " = ". $this->_db->quote('personal') .
+            " INNER JOIN " . $this->_db->quoteIdentifier(SQL_TABLE_PREFIX . "accounts") . " AS " . $this->_db->quoteIdentifier('owner') . " ON " .
+                $this->_db->quoteIdentifier('container.owner_id') . " = ". $this->_db->quoteIdentifier('owner.id') .
+            " INNER JOIN " . $this->_db->quoteIdentifier(SQL_TABLE_PREFIX . "cal_attendee") . " AS " . $this->_db->quoteIdentifier('attendee') . " ON " .
+                $this->_db->quoteIdentifier('attendee.cal_event_id') . " = ". $this->_db->quoteIdentifier('events.id') . " AND " .
+                $this->_db->quoteIdentifier('attendee.user_id') . " = ". $this->_db->quoteIdentifier('owner.contact_id') . " AND " .
+                $this->_db->quoteIdentifier('attendee.user_type') . " IN (". $this->_db->quote(array('user', 'groupmember')) . ") AND " .
+                $this->_db->quoteIdentifier('attendee.displaycontainer_id') . " != ". $this->_db->quoteIdentifier('events.container_id')
+        )->fetchAll(Zend_Db::FETCH_ASSOC);
+
+        foreach($allBroken as $broken) {
+            $time = Tinebase_DateTime::now()->toString();
+
+            $this->_db->query("START TRANSACTION");
+            $this->_db->query(
+                "UPDATE " . $this->_db->quoteIdentifier(SQL_TABLE_PREFIX . "cal_attendee") .
+                " SET " . $this->_db->quoteIdentifier("displaycontainer_id") . " = " . $this->_db->quote($broken['container_id']) .
+                " WHERE " . $this->_db->quoteIdentifier("id") . " = " . $this->_db->quote($broken['attendee_id'])
+            );
+
+            // care for consistent history for client updates
+            if (! $broken['event_is_deleted']) {
+                $this->_db->query(
+                    "UPDATE " . $this->_db->quoteIdentifier(SQL_TABLE_PREFIX . "cal_events") .
+                    " SET " . $this->_db->quoteIdentifier("seq") . " = (" . $this->_db->quoteIdentifier('seq') . " +1)," .
+                              $this->_db->quoteIdentifier("last_modified_time") . " = " . $this->_db->quote($time) .
+                    " WHERE " . $this->_db->quoteIdentifier("id") . " = " . $this->_db->quote($broken['event_id'])
+                );
+                $this->_db->query(
+                    "UPDATE " . $this->_db->quoteIdentifier(SQL_TABLE_PREFIX . "container") .
+                    " SET " . $this->_db->quoteIdentifier("content_seq") . " = (" . $this->_db->quoteIdentifier('content_seq') . " +1)" .
+                    " WHERE " . $this->_db->quoteIdentifier("id") . " = " . $this->_db->quote($broken['container_id'])
+                );
+                $content_seq = Tinebase_Helper::array_value('content_seq', Tinebase_Helper::array_value(0, $this->_db->query(
+                    "SELECT " . $this->_db->quoteIdentifier('content_seq') .
+                    " FROM " . $this->_db->quoteIdentifier(SQL_TABLE_PREFIX . "container") .
+                    " WHERE " . $this->_db->quoteIdentifier('id') . " = " . $this->_db->quote($broken['container_id'])
+                )->fetchAll(Zend_Db::FETCH_ASSOC)));
+                $this->_db->query(
+                    "INSERT INTO" . $this->_db->quoteIdentifier(SQL_TABLE_PREFIX . "container_content") .
+                    " (" .
+                        $this->_db->quoteIdentifier("id") . "," .
+                        $this->_db->quoteIdentifier("container_id") . "," .
+                        $this->_db->quoteIdentifier("record_id") . "," .
+                        $this->_db->quoteIdentifier("action") . "," .
+                        $this->_db->quoteIdentifier("content_seq") . "," .
+                        $this->_db->quoteIdentifier("time") .
+                    ") VALUES (" .
+                        $this->_db->quote(Tinebase_Record_Abstract::generateUID()) . "," .
+                        $this->_db->quote($broken['container_id']) . "," .
+                        $this->_db->quote($broken['event_id']) . "," .
+                        $this->_db->quote('update') . "," .
+                        $this->_db->quote($content_seq) . "," .
+                        $this->_db->quote($time) .
+                    ")"
+                );
+            }
+            $this->_db->query("COMMIT");
+        }
+
+        $this->setApplicationVersion('Calendar', '9.5');
+    }
 }
index 3246584..07978d1 100644 (file)
@@ -2,7 +2,7 @@
 <application>
     <name>Calendar</name>
     <!-- gettext('Calendar') -->   
-    <version>9.4</version>
+    <version>9.5</version>
     <order>15</order>
     <status>enabled</status>
     <tables>