]> git.mxchange.org Git - quix0rs-gnu-social.git/commitdiff
Cancelling RSVPs now seems to work.
authorMikael Nordfeldth <mmn@hethane.se>
Wed, 20 Jan 2016 15:10:10 +0000 (16:10 +0100)
committerMikael Nordfeldth <mmn@hethane.se>
Wed, 20 Jan 2016 15:10:10 +0000 (16:10 +0100)
lib/widget.php
plugins/Event/EventPlugin.php
plugins/Event/actions/cancelrsvp.php [deleted file]
plugins/Event/actions/newrsvp.php [deleted file]
plugins/Event/actions/rsvp.php [new file with mode: 0644]
plugins/Event/classes/RSVP.php
plugins/Event/forms/cancelrsvp.php [deleted file]
plugins/Event/forms/rsvp.php

index 1ccd1e252b2f74344d60742f058a2858adb1f668..227fe0ccee2d0fb6c1d70d4f04ae6ce5898605ec 100644 (file)
@@ -28,9 +28,7 @@
  * @link      http://status.net/
  */
 
-if (!defined('STATUSNET') && !defined('LACONICA')) {
-    exit(1);
-}
+if (!defined('GNUSOCIAL')) { exit(1); }
 
 /**
  * Base class for UI widgets
@@ -65,9 +63,13 @@ class Widget
      * @param Action $out output helper, defaults to null
      */
 
-    function __construct(Action $out=null)
+    function __construct(Action $out=null, array $widgetOpts=array())
     {
         $this->out = $out;
+        if (!array_key_exists('scoped', $widgetOpts)) {
+            $this->widgetOpts['scoped'] = Profile::current();
+        }
+        $this->scoped = $this->widgetOpts['scoped'];
     }
 
     /**
index 2e972b781c1cd3a8de6ce3e6053a5d521293a8d7..d22a5e91350e8147d1da960d81e1a7467ae70bec 100644 (file)
@@ -78,9 +78,10 @@ class EventPlugin extends ActivityVerbHandlerPlugin
         $m->connect('main/event/new',
                     array('action' => 'newevent'));
         $m->connect('main/event/rsvp',
-                    array('action' => 'newrsvp'));
-        $m->connect('main/event/rsvp/cancel',
-                    array('action' => 'cancelrsvp'));
+                    array('action' => 'rsvp'));
+        $m->connect('main/event/rsvp/:rsvp',    // this will probably change to include event notice id
+                    array('action' => 'rsvp'),
+                    array('rsvp'   => '[a-z]+'));
         $m->connect('event/:id',
                     array('action' => 'showevent'),
                     array('id' => '[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}'));
@@ -433,14 +434,7 @@ class EventPlugin extends ActivityVerbHandlerPlugin
         $out->elementEnd('div');
 
         if ($scoped instanceof Profile) {
-            $rsvp = $event->getRSVP($scoped);
-
-            if (empty($rsvp)) {
-                $form = new RSVPForm($out, array('event'=>$event));
-            } else {
-                $form = new CancelRSVPForm($out, array('rsvp'=>$rsvp));
-            }
-
+            $form = new RSVPForm($out, array('event'=>$event, 'scoped'=>$scoped));
             $form->show();
         }
         $out->elementEnd('div');
diff --git a/plugins/Event/actions/cancelrsvp.php b/plugins/Event/actions/cancelrsvp.php
deleted file mode 100644 (file)
index 67e5d89..0000000
+++ /dev/null
@@ -1,89 +0,0 @@
-<?php
-/**
- * StatusNet - the distributed open-source microblogging tool
- * Copyright (C) 2011, StatusNet, Inc.
- *
- * Cancel the RSVP for an event
- *
- * PHP version 5
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program.  If not, see <http://www.gnu.org/licenses/>.
- *
- * @category  Event
- * @package   StatusNet
- * @author    Evan Prodromou <evan@status.net>
- * @copyright 2011 StatusNet, Inc.
- * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0
- * @link      http://status.net/
- */
-
-if (!defined('GNUSOCIAL')) { exit(1); }
-
-/**
- * RSVP for an event
- *
- * @category  Event
- * @package   StatusNet
- * @author    Evan Prodromou <evan@status.net>
- * @copyright 2011 StatusNet, Inc.
- * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0
- * @link      http://status.net/
- */
-class CancelrsvpAction extends FormAction
-{
-    protected $form = 'CancelRSVP';
-
-    function title()
-    {
-        // TRANS: Title for RSVP ("please respond") action.
-        return _m('TITLE','Cancel RSVP');
-    }
-
-    // FIXME: Merge this action with RSVPAction and add a 'cancel' thing there...
-    protected function doPreparation()
-    {
-        $rsvpId = $this->trimmed('rsvp');
-        if (empty($rsvpId)) {
-            // TRANS: Client exception thrown when referring to a non-existing RSVP ("please respond") item.
-            throw new ClientException(_m('No such RSVP.'));
-        }
-
-        $this->rsvp = RSVP::getKV('id', $rsvpId);
-        if (empty($this->rsvp)) {
-            // TRANS: Client exception thrown when referring to a non-existing RSVP ("please respond") item.
-            throw new ClientException(_m('No such RSVP.'));
-        }
-
-        $this->formOpts['rsvp'] = $this->rsvp;
-    }
-
-    protected function doPost()
-    {
-        $this->event = Happening::getKV('uri', $this->rsvp->event_uri);
-        if (empty($this->event)) {
-            // TRANS: Client exception thrown when referring to a non-existing event.
-            throw new ClientException(_m('No such event.'));
-        }
-
-        $notice = $this->rsvp->getNotice();
-        // NB: this will delete the rsvp, too
-        if (!empty($notice)) {
-            common_log(LOG_DEBUG, "Deleting notice...");
-            $notice->deleteAs($this->scoped);
-        } else {
-            common_log(LOG_DEBUG, "Deleting RSVP alone...");
-            $this->rsvp->delete();
-        }
-    }
-}
diff --git a/plugins/Event/actions/newrsvp.php b/plugins/Event/actions/newrsvp.php
deleted file mode 100644 (file)
index df58f5b..0000000
+++ /dev/null
@@ -1,83 +0,0 @@
-<?php
-/**
- * StatusNet - the distributed open-source microblogging tool
- * Copyright (C) 2011, StatusNet, Inc.
- *
- * RSVP for an event
- *
- * PHP version 5
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program.  If not, see <http://www.gnu.org/licenses/>.
- *
- * @category  Event
- * @package   StatusNet
- * @author    Evan Prodromou <evan@status.net>
- * @copyright 2011 StatusNet, Inc.
- * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0
- * @link      http://status.net/
- */
-
-if (!defined('GNUSOCIAL')) { exit(1); }
-
-/**
- * RSVP for an event
- *
- * @category  Event
- * @package   StatusNet
- * @author    Evan Prodromou <evan@status.net>
- * @copyright 2011 StatusNet, Inc.
- * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0
- * @link      http://status.net/
- */
-class NewrsvpAction extends FormAction
-{
-    protected $form = 'RSVP';
-
-    protected $event;
-
-    function title()
-    {
-        // TRANS: Title for RSVP ("please respond") action.
-        return _m('TITLE','New RSVP');
-    }
-
-    protected function doPreparation()
-    {
-        $this->event = Happening::getByKeys(['uri'=>$this->trimmed('event')]);
-
-        $this->formOpts['event'] = $this->event;
-    }
-
-    protected function doPost()
-    {
-
-        $verb = RSVP::verbFor(strtolower($this->trimmed('submitvalue')));
-
-        $options = array('source' => 'web');
-
-        $act = new Activity();
-        $act->id = UUID::gen();
-        $act->verb    = $verb;
-        $act->time    = time();
-        $act->title   = _m('RSVP');
-        $act->actor   = $this->scoped->asActivityObject();
-        $act->target  = $this->event->getStored()->asActivityObject();
-        $act->objects = array(clone($act->target));
-        $act->content = RSVP::toHTML($this->scoped, $this->event, RSVP::codeFor($verb));
-
-        $stored = Notice::saveActivity($act, $this->scoped, $options);
-
-        return _m('Saved RSVP');
-    }
-}
diff --git a/plugins/Event/actions/rsvp.php b/plugins/Event/actions/rsvp.php
new file mode 100644 (file)
index 0000000..ec0267a
--- /dev/null
@@ -0,0 +1,93 @@
+<?php
+/**
+ * StatusNet - the distributed open-source microblogging tool
+ * Copyright (C) 2011, StatusNet, Inc.
+ *
+ * RSVP for an event
+ *
+ * PHP version 5
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * @category  Event
+ * @package   StatusNet
+ * @author    Evan Prodromou <evan@status.net>
+ * @copyright 2011 StatusNet, Inc.
+ * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0
+ * @link      http://status.net/
+ */
+
+if (!defined('GNUSOCIAL')) { exit(1); }
+
+/**
+ * RSVP for an event
+ *
+ * @category  Event
+ * @package   StatusNet
+ * @author    Evan Prodromou <evan@status.net>
+ * @copyright 2011 StatusNet, Inc.
+ * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0
+ * @link      http://status.net/
+ */
+class RsvpAction extends FormAction
+{
+    protected $form = 'RSVP';
+
+    protected $event = null;
+
+    function title()
+    {
+        // TRANS: Title for RSVP ("please respond") action.
+        return _m('TITLE','New RSVP');
+    }
+
+    protected function doPreparation()
+    {
+        $this->event = Happening::getByKeys(['uri'=>$this->trimmed('event')]);
+
+        $this->formOpts['event'] = $this->event;
+    }
+
+    protected function doPost()
+    {
+        if ($this->trimmed('rsvp') === 'cancel') {
+            $rsvp = RSVP::byEventAndActor($this->event, $this->scoped);
+            try {
+                $notice = $rsvp->getStored();
+                $notice->deleteAs($this->scoped);
+            } catch (NoResultException $e) {
+                // Notice already gone
+                $rsvp->delete();
+            }
+            return _m('Cancelled RSVP');
+        }
+
+        $verb = RSVP::verbFor(strtolower($this->trimmed('rsvp')));
+        $options = array('source' => 'web');
+
+        $act = new Activity();
+        $act->id = UUID::gen();
+        $act->verb    = $verb;
+        $act->time    = time();
+        $act->title   = _m('RSVP');
+        $act->actor   = $this->scoped->asActivityObject();
+        $act->target  = $this->event->getStored()->asActivityObject();
+        $act->objects = array(clone($act->target));
+        $act->content = RSVP::toHTML($this->scoped, $this->event, RSVP::codeFor($verb));
+
+        $stored = Notice::saveActivity($act, $this->scoped, $options);
+
+        return _m('Saved RSVP');
+    }
+}
index dc05f5a35ef1b2fb937d46fdfe25d3b5645bbf1b..bda502b8d015392e9153d395ba61db74c6e70b1e 100644 (file)
@@ -208,7 +208,7 @@ class RSVP extends Managed_DataObject
         return $this->event_uri;
     }
 
-    static function getStored()
+    public function getStored()
     {
         return Notice::getByKeys(['uri' => $this->getUri()]);
     }
@@ -218,6 +218,12 @@ class RSVP extends Managed_DataObject
         return self::getByKeys(['uri' => $stored->getUri()]);
     }
 
+    static function byEventAndActor(Happening $event, Profile $actor)
+    {
+        return self::getByKeys(['event_uri' => $event->getUri(),
+                                'profile_id' => $actor->getID()]);
+    }
+
     static function forEvent(Happening $event)
     {
         $keypart = sprintf('rsvp:for-event:%s', $event->getUri());
diff --git a/plugins/Event/forms/cancelrsvp.php b/plugins/Event/forms/cancelrsvp.php
deleted file mode 100644 (file)
index 4a07d46..0000000
+++ /dev/null
@@ -1,127 +0,0 @@
-<?php
-/**
- * StatusNet - the distributed open-source microblogging tool
- * Copyright (C) 2011, StatusNet, Inc.
- *
- * Form to RSVP for an event
- *
- * PHP version 5
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program.  If not, see <http://www.gnu.org/licenses/>.
- *
- * @category  Event
- * @package   StatusNet
- * @author    Evan Prodromou <evan@status.net>
- * @copyright 2011 StatusNet, Inc.
- * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0
- * @link      http://status.net/
- */
-
-if (!defined('STATUSNET')) { exit(1); }
-
-/**
- * A form to RSVP for an event
- *
- * @category  General
- * @package   StatusNet
- * @author    Evan Prodromou <evan@status.net>
- * @copyright 2011 StatusNet, Inc.
- * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0
- * @link      http://status.net/
- */
-class CancelRSVPForm extends Form
-{
-    protected $rsvp = null;
-
-    function __construct($out=null, array $formOpts=array())
-    {
-        parent::__construct($out);
-        if (!isset($formOpts['rsvp'])) {
-            throw new ServerException('You must set the "rsvp" form option for RSVPForm.');
-        } elseif (!$formOpts['rsvp'] instanceof RSVP) {
-            throw new ServerException('The "rsvp" form option for RSVPForm must be an RSVP object.');
-        }
-        $this->rsvp = $formOpts['rsvp'];
-    }
-
-    /**
-     * ID of the form
-     *
-     * @return int ID of the form
-     */
-    function id()
-    {
-        return 'form_event_rsvp';
-    }
-
-    /**
-     * class of the form
-     *
-     * @return string class of the form
-     */
-    function formClass()
-    {
-        return 'ajax';
-    }
-
-    /**
-     * Action of the form
-     *
-     * @return string URL of the action
-     */
-    function action()
-    {
-        return common_local_url('cancelrsvp');
-    }
-
-    /**
-     * Data elements of the form
-     *
-     * @return void
-     */
-    function formData()
-    {
-        $this->out->elementStart('fieldset', array('id' => 'new_rsvp_data'));
-
-        $this->out->hidden('rsvp-id', $this->rsvp->getUri(), 'rsvp');
-
-        switch (RSVP::verbFor($this->rsvp->response)) {
-        case RSVP::POSITIVE:
-            // TRANS: Possible status for RSVP ("please respond") item.
-            $this->out->text(_m('You will attend this event.'));
-            break;
-        case RSVP::NEGATIVE:
-            // TRANS: Possible status for RSVP ("please respond") item.
-            $this->out->text(_m('You will not attend this event.'));
-            break;
-        case RSVP::POSSIBLE:
-            // TRANS: Possible status for RSVP ("please respond") item.
-            $this->out->text(_m('You might attend this event.'));
-            break;
-        }
-
-        $this->out->elementEnd('fieldset');
-    }
-
-    /**
-     * Action elements
-     *
-     * @return void
-     */
-    function formActions()
-    {
-        // TRANS: Button text to cancel responding to an RSVP ("please respond") item.
-        $this->out->submit('rsvp-cancel', _m('BUTTON', 'Cancel'));
-    }
-}
index 81cd335f873fb216b3be8ce4105f833ae3ae8312..d4769955abd867d2d48c072105a1acccd546ea41 100644 (file)
@@ -82,7 +82,7 @@ class RSVPForm extends Form
      */
     function action()
     {
-        return common_local_url('newrsvp');
+        return common_local_url('rsvp');
     }
 
     /**
@@ -98,7 +98,7 @@ class RSVPForm extends Form
         $this->out->text(_m('RSVP:'));
 
         $this->out->hidden('event-id', $this->event->getUri(), 'event');
-        $this->out->hidden('submitvalue', '');
+        $this->out->hidden('rsvp', '');
 
         $this->out->elementEnd('fieldset');
     }
@@ -110,26 +110,31 @@ class RSVPForm extends Form
      */
     function formActions()
     {
-        // TRANS: Button text for RSVP ("please respond") reply to confirm attendence.
-        $this->submitButton('yes', _m('BUTTON', 'Yes'));
-        // TRANS: Button text for RSVP ("please respond") reply to deny attendence.
-        $this->submitButton('no', _m('BUTTON', 'No'));
-        // TRANS: Button text for RSVP ("please respond") reply to indicate one might attend.
-        $this->submitButton('maybe', _m('BUTTON', 'Maybe'));
+        try {
+            $rsvp = RSVP::byEventAndActor($this->event, $this->scoped);
+            $this->submitButton('cancel', _m('BUTTON', 'Cancel'));
+        } catch (NoResultException $e) {
+            // TRANS: Button text for RSVP ("please respond") reply to confirm attendence.
+            $this->submitButton('yes', _m('BUTTON', 'Yes'));
+            // TRANS: Button text for RSVP ("please respond") reply to deny attendence.
+            $this->submitButton('no', _m('BUTTON', 'No'));
+            // TRANS: Button text for RSVP ("please respond") reply to indicate one might attend.
+            $this->submitButton('maybe', _m('BUTTON', 'Maybe'));
+        }
     }
 
-    function submitButton($id, $label)
+    function submitButton($answer, $label)
     {
         $this->out->element(
             'input',
                 array(
                     'type'    => 'submit',
-                    'id'      => 'rsvp-submit',
-                    'name'    => $id,
+                    'id'      => 'rsvp-submit-'.$answer,
+                    'name'    => $answer,
                     'class'   => 'submit',
-                    'value'   => $label,
+                    'value'   => $answer,
                     'title'   => $label,
-                    'onClick' => 'this.form.submitvalue.value = this.name; return true;'
+                    'onClick' => 'this.form.rsvp.value = this.name; return true;'
             )
         );
     }