]> git.mxchange.org Git - quix0rs-gnu-social.git/commitdiff
Merge branch 'master' into 0.9.x
authorBrion Vibber <brion@pobox.com>
Tue, 21 Sep 2010 19:48:16 +0000 (12:48 -0700)
committerBrion Vibber <brion@pobox.com>
Tue, 21 Sep 2010 19:48:16 +0000 (12:48 -0700)
15 files changed:
actions/designadminpanel.php
actions/licenseadminpanel.php [new file with mode: 0644]
actions/pathsadminpanel.php
actions/sessionsadminpanel.php
actions/useradminpanel.php
classes/Status_network.php
lib/action.php
lib/activityobject.php
lib/adminpanelaction.php
lib/default.php
lib/feedlist.php
lib/router.php
plugins/Disqus/DisqusPlugin.php
plugins/SubMirror/lib/mirrorqueuehandler.php
plugins/TwitterBridge/daemons/twitterstatusfetcher.php

index 763737175bc73de5703fb2e32d92276592712cf8..4285f7d7310b9a0c8b0454231bbe6be1472dc6f4 100644 (file)
@@ -71,7 +71,7 @@ class DesignadminpanelAction extends AdminPanelAction
 
     function getInstructions()
     {
-        return _('Design settings for this StatusNet site.');
+        return _('Design settings for this StatusNet site');
     }
 
     /**
@@ -154,9 +154,22 @@ class DesignadminpanelAction extends AdminPanelAction
 
         $config->query('BEGIN');
 
-        // Only update colors if the theme has not changed.
+        if ($themeChanged) {
+            // If the theme has changed, reset custom colors and let them pick
+            // up the new theme's defaults.
+            $colors = array('background', 'content', 'sidebar', 'text', 'link');
+            foreach ($colors as $colorKey) {
+                // Clear from global config so we see defaults on this page...
+                $GLOBALS['config']['design'][$colorKey . 'color'] = false;
 
-        if (!$themeChanged) {
+                // And remove old settings from DB...
+                $this->deleteSetting('design', $colorKey . 'color');
+            }
+        } else {
+            // Only save colors from the form if the theme has not changed.
+            //
+            // @fixme a future more ajaxy form should allow theme switch
+            // and color customization in one step.
 
             $bgcolor = new WebColor($this->trimmed('design_background'));
             $ccolor  = new WebColor($this->trimmed('design_content'));
diff --git a/actions/licenseadminpanel.php b/actions/licenseadminpanel.php
new file mode 100644 (file)
index 0000000..c9aad5c
--- /dev/null
@@ -0,0 +1,303 @@
+<?php
+/**
+ * StatusNet, the distributed open-source microblogging tool
+ *
+ * License administration panel
+ *
+ * PHP version 5
+ *
+ * LICENCE: 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  Settings
+ * @package   StatusNet
+ * @author    Zach Copley <zach@status.net>
+ * @copyright 2010 StatusNet, Inc.
+ * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
+ * @link      http://status.net/
+ */
+
+if (!defined('STATUSNET')) {
+    exit(1);
+}
+
+/**
+ * License settings
+ *
+ * @category Admin
+ * @package  StatusNet
+ * @author   Zach Copley <zach@status.net>
+ * @license  http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
+ * @link     http://status.net/
+ */
+
+class LicenseadminpanelAction extends AdminPanelAction
+{
+
+    /**
+     * Returns the page title
+     *
+     * @return string page title
+     */
+
+    function title()
+    {
+        // TRANS: User admin panel title
+        return _m('TITLE', 'License');
+    }
+
+    /**
+     * Instructions for using this form.
+     *
+     * @return string instructions
+     */
+
+    function getInstructions()
+    {
+        return _('License for this StatusNet site');
+    }
+
+    /**
+     * Show the site admin panel form
+     *
+     * @return void
+     */
+
+    function showForm()
+    {
+        $form = new LicenseAdminPanelForm($this);
+        $form->show();
+        return;
+    }
+
+    /**
+     * Save settings from the form
+     *
+     * @return void
+     */
+
+    function saveSettings()
+    {
+        static $settings = array(
+            'license' => array('type', 'owner', 'url', 'title', 'image')
+        );
+
+        $values = array();
+
+        foreach ($settings as $section => $parts) {
+            foreach ($parts as $setting) {
+                $values[$section][$setting] = $this->trimmed($setting);
+            }
+        }
+
+        // This throws an exception on validation errors
+
+        $this->validate($values);
+
+        // assert(all values are valid);
+
+        $config = new Config();
+
+        $config->query('BEGIN');
+
+        foreach ($settings as $section => $parts) {
+            foreach ($parts as $setting) {
+                Config::save($section, $setting, $values[$section][$setting]);
+            }
+        }
+
+        $config->query('COMMIT');
+
+        return;
+    }
+
+    /**
+     * Validate License admin form values
+     *
+     * @param array &$values from the form
+     *
+     * @return nothing
+     */
+
+    function validate(&$values)
+    {
+        // Validate license type (shouldn't have to do it, but just in case)
+
+        $types = array('private', 'allrightsreserved', 'cc');
+
+        if (!in_array($values['license']['type'], $types)) {
+            $this->clientError(_("Invalid license selection."));
+        }
+
+        // Make sure the user has set an owner if the site has a private
+        // license
+
+        if ($values['license']['type'] == 'allrightsreserved'
+            && empty($values['license']['owner'])
+        ) {
+            $this->clientError(
+                _("You must specify the owner of the content when using the All Rights Reserved license.")
+            );
+        }
+
+        // Make sure the license title is not too long
+        if (mb_strlen($values['license']['type']) > 255) {
+            $this->clientError(
+                _("Invalid license title. Max length is 255 characters.")
+            );
+        }
+
+        // make sure the license URL and license image URL are valid URLs
+
+        $options = array('allowed_schemes' => array('http', 'https'));
+
+        if (!Validate::uri($values['license']['url'], $options)) {
+            $this->clientError(_("Invalid license URL."));
+        }
+
+        if (!Validate::uri($values['license']['image'], $options)) {
+            $this->clientError(_("Invalid license image URL."));
+        }
+    }
+}
+
+class LicenseAdminPanelForm extends AdminForm
+{
+    /**
+     * ID of the form
+     *
+     * @return int ID of the form
+     */
+
+    function id()
+    {
+        return 'licenseadminpanel';
+    }
+
+    /**
+     * class of the form
+     *
+     * @return string class of the form
+     */
+
+    function formClass()
+    {
+        return 'form_settings';
+    }
+
+    /**
+     * Action of the form
+     *
+     * @return string URL of the action
+     */
+
+    function action()
+    {
+        return common_local_url('licenseadminpanel');
+    }
+
+    /**
+     * Data elements of the form
+     *
+     * @return void
+     */
+
+    function formData()
+    {
+        $this->out->elementStart(
+            'fieldset', array('id' => 'settings_license-selection')
+        );
+        $this->out->element('legend', null, _('License selection'));
+        $this->out->elementStart('ul', 'form_data');
+
+        $this->li();
+
+        $types = array(
+            'private' => _('Private'),
+            'allrightsreserved' => _('All Rights Reserved'),
+            'cc' => _('Creative Commons')
+        );
+
+        $this->out->dropdown(
+            'type',
+            _('Type'),
+            $types,
+            _('Select license'),
+            false,
+            $this->value('type', 'license')
+        );
+
+        $this->unli();
+
+        $this->out->elementEnd('ul');
+        $this->out->elementEnd('fieldset');
+
+        $this->out->elementStart(
+            'fieldset',
+            array('id' => 'settings_license-details')
+        );
+        $this->out->element('legend', null, _('License details'));
+        $this->out->elementStart('ul', 'form_data');
+
+        $this->li();
+        $this->input(
+            'owner',
+            _('Owner'),
+            _('Name of the owner of the site\'s content (if applicable).'),
+            'license'
+        );
+        $this->unli();
+
+        $this->li();
+        $this->input(
+            'title',
+            _('License Title'),
+            _('The title of the license.'),
+            'license'
+        );
+        $this->unli();
+
+        $this->li();
+        $this->input(
+            'url',
+            _('License URL'),
+            _('URL for more information about the license.'),
+            'license'
+        );
+        $this->unli();
+
+        $this->li();
+        $this->input(
+            'image', _('License Image URL'),
+            _('URL for an image to display with the license.'),
+            'license'
+        );
+        $this->unli();
+
+        $this->out->elementEnd('ul');
+        $this->out->elementEnd('fieldset');
+    }
+
+    /**
+     * Action elements
+     *
+     * @return void
+     */
+
+    function formActions()
+    {
+        $this->out->submit(
+            'submit', _('Save'), 'submit', null, _('Save license settings')
+        );
+    }
+}
index 7ff3c2583a0c44f7868017256a3d8a7cb1ead954..0c83aa29ecec5a537dd72ee5280df13d1792d8ba 100644 (file)
@@ -67,7 +67,7 @@ class PathsadminpanelAction extends AdminPanelAction
 
     function getInstructions()
     {
-        return _('Path and server settings for this StatusNet site.');
+        return _('Path and server settings for this StatusNet site');
     }
 
     /**
index 4386ef844b549ce1a1163c1ab805f25b6bb49c7e..e9bd1719f267c2be88ce1faac18323092082da3e 100644 (file)
@@ -62,7 +62,7 @@ class SessionsadminpanelAction extends AdminPanelAction
 
     function getInstructions()
     {
-        return _('Session settings for this StatusNet site.');
+        return _('Session settings for this StatusNet site');
     }
 
     /**
index ee9c23076903cdefe939350ae5562ca784de0287..04e0ca3e757bc17ed96c30bdc0256d77755674e5 100644 (file)
@@ -12,6 +12,7 @@
  * (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.
@@ -24,7 +25,7 @@
  * @author    Evan Prodromou <evan@status.net>
  * @author    Zach Copley <zach@status.net>
  * @author    Sarven Capadisli <csarven@status.net>
- * @copyright 2008-2009 StatusNet, Inc.
+ * @copyright 2008-2010 StatusNet, Inc.
  * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
  * @link      http://status.net/
  */
@@ -67,7 +68,7 @@ class UseradminpanelAction extends AdminPanelAction
 
     function getInstructions()
     {
-        return _('User settings for this StatusNet site.');
+        return _('User settings for this StatusNet site');
     }
 
     /**
@@ -291,6 +292,6 @@ class UserAdminPanelForm extends AdminForm
 
     function formActions()
     {
-        $this->out->submit('submit', _('Save'), 'submit', null, _('Save site settings'));
+        $this->out->submit('submit', _('Save'), 'submit', null, _('Save user settings'));
     }
 }
index c4f37ce1c67228b2827f7345d66f73fed258a265..70c7a58eb7488040b3df886c54ade9e361f770be 100644 (file)
@@ -167,9 +167,8 @@ class Status_network extends Safe_DataObject
             ' WHERE nickname = ' . $this->_quote($this->nickname);
         $orig->decache();
         $result = $this->query($qry);
-        if ($result) {
-            $this->encache();
-        }
+        $this->decache();
+        
         return $result;
     }
     
index 5dcf78dcc964e9aa14ed4585cd2d2df44cf5a0eb..5482ac3773fde68a03f04ad6169519c40944e145 100644 (file)
@@ -715,14 +715,14 @@ class Action extends HTMLOutputter // lawsuit
     {
         $this->elementStart('div', array('id' => 'aside_primary',
                                          'class' => 'aside'));
-        if (Event::handle('StartShowExportData', array($this))) {
-            $this->showExportData();
-            Event::handle('EndShowExportData', array($this));
-        }
         if (Event::handle('StartShowSections', array($this))) {
             $this->showSections();
             Event::handle('EndShowSections', array($this));
         }
+        if (Event::handle('StartShowExportData', array($this))) {
+            $this->showExportData();
+            Event::handle('EndShowExportData', array($this));
+        }
         $this->elementEnd('div');
     }
 
index 0fc06948bb0d880d43fe4a869986a77df5794534..95615d581c8266537e02f1145176b08a048d9b2e 100644 (file)
@@ -428,6 +428,17 @@ class ActivityObject
                 $alink->height = $size;
                 $alink->width  = $size;
                 $alink->url    = Avatar::defaultImage($size);
+
+                if ($size == AVATAR_PROFILE_SIZE) {
+                    // Hack for Twitter import: we don't have a 96x96 image,
+                    // but we do have a 73x73 image. For now, fake it with that.
+                    $avatar = $profile->getAvatar(73);
+                    if ($avatar) {
+                        $alink = AvatarLink::fromAvatar($avatar);
+                        $alink->height= $size;
+                        $alink->width = $size;
+                    }
+                }
             }
 
             $object->avatarLinks[] = $alink;
index 5c414bbd7b505a357c3c7c06b09bc1b32d4497f2..fae9f4fa57a83a9b4a4f6542862013209c82be58 100644 (file)
@@ -396,6 +396,14 @@ class AdminPanelNav extends Widget
                                      $menu_title, $action_name == 'snapshotadminpanel', 'nav_snapshot_admin_panel');
             }
 
+            if (AdminPanelAction::canAdmin('license')) {
+                // TRANS: Menu item title/tooltip
+                $menu_title = _('Set site license');
+                // TRANS: Menu item for site administration
+                $this->out->menuItem(common_local_url('licenseadminpanel'), _('License'),
+                                     $menu_title, $action_name == 'licenseadminpanel', 'nav_license_admin_panel');
+            }
+
             Event::handle('EndAdminPanelNav', array($this));
         }
         $this->action->elementEnd('ul');
index 45a4560ff36100ccda3890267d51615ac1a3a9cd..6200abada1ea85bdfea4bb1d2f3c6505292d9379 100644 (file)
@@ -300,7 +300,7 @@ $default =
                                  'OpenID' => null),
               ),
         'admin' =>
-        array('panels' => array('design', 'site', 'user', 'paths', 'access', 'sessions', 'sitenotice')),
+        array('panels' => array('design', 'site', 'user', 'paths', 'access', 'sessions', 'sitenotice', 'license')),
         'singleuser' =>
         array('enabled' => false,
               'nickname' => null),
index 9ae83f5e886e00bac74c39dcbf06579c4ea8a229..7493e3575ed6666d3fd13ad9602cede8a1314f78 100644 (file)
@@ -61,7 +61,7 @@ class FeedList extends Widget
     {
         $this->out->elementStart('div', array('id' => 'export_data',
                                               'class' => 'section'));
-        $this->out->element('h2', null, _('Export data'));
+        $this->out->element('h2', null, _('Feeds'));
         $this->out->elementStart('ul', array('class' => 'xoxo'));
 
         foreach ($feeds as $feed) {
index 7e1e6a2a47a1887781c3154cb1684e6d39d7b6e1..fb5a3c7c364c6c16a3d6873cb791ff7c7a9e8550 100644 (file)
@@ -690,6 +690,8 @@ class Router
             $m->connect('admin/sessions', array('action' => 'sessionsadminpanel'));
             $m->connect('admin/sitenotice', array('action' => 'sitenoticeadminpanel'));
             $m->connect('admin/snapshot', array('action' => 'snapshotadminpanel'));
+            $m->connect('admin/license', array('action' => 'licenseadminpanel'));
+
 
             $m->connect('getfile/:filename',
                         array('action' => 'getfile'),
index 681be19dc97b9dafdf96b0d4fd7c31be6ccd64b3..3901562f98fe02131c2db30c4f3d82106b7e0a90 100644 (file)
@@ -70,6 +70,9 @@ if (!defined('STATUSNET')) {
  */
 class DisqusPlugin extends Plugin
 {
+    public $shortname; // Required 'shortname' for actually triggering Disqus.
+    public $div_style; // Optional CSS chunk for the main <div>
+
     function onEndShowContentBlock($action)
     {
         if (get_class($action) == 'ShownoticeAction') {
index dae9c088953d92d58adf235d04cf750c83d1114a..550986b444ce1a4be3646252c00a0f87d8836e9f 100644 (file)
@@ -36,7 +36,13 @@ class MirrorQueueHandler extends QueueHandler
         $mirror->subscribed = $notice->profile_id;
         if ($mirror->find()) {
             while ($mirror->fetch()) {
-                $mirror->mirrorNotice($notice);
+                try {
+                    $mirror->mirrorNotice($notice);
+                } catch (Exception $e) {
+                    common_log(LOG_ERR, "Exception trying to mirror notice $notice->id " .
+                                        "for subscriber $mirror->subscriber ($mirror->style): " .
+                                        $e->getMessage());
+                }
             }
         }
         return true;
index 31129b96d9e452ce63d9e21d7299457dd688a6dc..590fa2954d1ac467c65d2f23a97917a9b1ef59e6 100755 (executable)
@@ -692,6 +692,10 @@ class TwitterStatusFetcher extends ParallelizingDaemon
         $text = $status->text;
 
         if (empty($status->entities)) {
+            common_log(LOG_WARNING, "No entities data for {$status->id}; trying to fake up links ourselves.");
+            $text = common_replace_urls_callback($text, 'common_linkify');
+            $text = preg_replace('/(^|\&quot\;|\'|\(|\[|\{|\s+)#([\pL\pN_\-\.]{1,64})/e', "'\\1#'.TwitterStatusFetcher::tagLink('\\2')", $text);
+            $text = preg_replace('/(^|\s+)@([a-z0-9A-Z_]{1,64})/e', "'\\1@'.TwitterStatusFetcher::atLink('\\2')", $text);
             return $text;
         }
 
@@ -750,12 +754,26 @@ class TwitterStatusFetcher extends ParallelizingDaemon
 
     function makeHashtagLink($object)
     {
-        return "#<a href='https://twitter.com/search?q=%23{$object->text}' class='hashtag'>{$object->text}</a>";
+        return "#" . self::tagLink($object->text);
     }
 
     function makeMentionLink($object)
     {
-        return "@<a href='http://twitter.com/{$object->screen_name}' title='{$object->name}'>{$object->screen_name}</a>";
+        return "@".self::atLink($object->screen_name, $object->name);
+    }
+
+    static function tagLink($tag)
+    {
+        return "<a href='https://twitter.com/search?q=%23{$tag}' class='hashtag'>{$tag}</a>";
+    }
+
+    static function atLink($screenName, $fullName=null)
+    {
+        if (!empty($fullName)) {
+            return "<a href='http://twitter.com/{$screenName}' title='{$fullName}'>{$screenName}</a>";
+        } else {
+            return "<a href='http://twitter.com/{$screenName}'>{$screenName}</a>";
+        }
     }
 
     function saveStatusMentions($notice, $status)