]> git.mxchange.org Git - quix0rs-gnu-social.git/commitdiff
Merge branch 'locshunt' into 0.9.x
authorEvan Prodromou <evan@status.net>
Mon, 28 Dec 2009 23:49:27 +0000 (15:49 -0800)
committerEvan Prodromou <evan@status.net>
Mon, 28 Dec 2009 23:49:27 +0000 (15:49 -0800)
actions/apistatusesupdate.php
actions/newnotice.php
actions/profilesettings.php
classes/Notice.php
classes/User.php
classes/User_location_prefs.php [new file with mode: 0644]
classes/statusnet.ini
db/08to09.sql
db/statusnet.sql
lib/default.php

index dabbea92f5246c747b913a16bd70a8c3308c7a9d..f594bbf393626ffa67cccc8d5806ea9629df864a 100644 (file)
@@ -203,12 +203,6 @@ class ApiStatusesUpdateAction extends ApiAuthAction
                 }
             }
 
-            $location = null;
-
-            if (!empty($this->lat) && !empty($this->lon)) {
-                $location = Location::fromLatLon($this->lat, $this->lon);
-            }
-
             $upload = null;
 
             try {
@@ -235,11 +229,15 @@ class ApiStatusesUpdateAction extends ApiAuthAction
 
             $options = array('reply_to' => $reply_to);
 
-            if (!empty($location)) {
-                $options['lat'] = $location->lat;
-                $options['lon'] = $location->lon;
-                $options['location_id'] = $location->location_id;
-                $options['location_ns'] = $location->location_ns;
+            if ($this->user->shareLocation()) {
+
+                $locOptions = Notice::locationOptions($this->lat,
+                                                      $this->lon,
+                                                      null,
+                                                      null,
+                                                      $this->user->getProfile());
+
+                $options = array_merge($options, $locOptions);
             }
 
             $this->notice =
index c014f1781cd9b380b46a160e3113bc846057327f..2d9f0ff797d973fc31e5970a28061859fc7054d7 100644 (file)
@@ -164,19 +164,6 @@ class NewnoticeAction extends Action
             $replyto = 'false';
         }
 
-        $lat = $this->trimmed('lat');
-        $lon = $this->trimmed('lon');
-        $location_id = $this->trimmed('location_id');
-        $location_ns = $this->trimmed('location_ns');
-
-        if (!empty($lat) && !empty($lon) && empty($location_id)) {
-            $location = Location::fromLatLon($lat, $lon);
-            if (!empty($location)) {
-                $location_id = $location->location_id;
-                $location_ns = $location->location_ns;
-            }
-        }
-
         $upload = null;
         $upload = MediaFile::fromUpload('attach');
 
@@ -195,12 +182,20 @@ class NewnoticeAction extends Action
             }
         }
 
-        $notice = Notice::saveNew($user->id, $content_shortened, 'web',
-                                  array('reply_to' => ($replyto == 'false') ? null : $replyto,
-                                        'lat' => $lat,
-                                        'lon' => $lon,
-                                        'location_id' => $location_id,
-                                        'location_ns' => $location_ns));
+        $options = array('reply_to' => ($replyto == 'false') ? null : $replyto);
+
+        if ($user->shareLocation()) {
+
+            $locOptions = Notice::locationOptions($this->trimmed('lat'),
+                                                  $this->trimmed('lon'),
+                                                  $this->trimmed('location_id'),
+                                                  $this->trimmed('location_ns'),
+                                                  $user->getProfile());
+
+            $options = array_merge($options, $locOptions);
+        }
+
+        $notice = Notice::saveNew($user->id, $content_shortened, 'web', $options);
 
         if (isset($upload)) {
             $upload->attachToNotice($notice);
index acfcbcd00747e38832124cc9e78139786f1700bd..ee236fe62503ec3b3cd7adf5af58e813a3605713 100644 (file)
@@ -133,6 +133,13 @@ class ProfilesettingsAction extends AccountSettingsAction
                          ($this->arg('location')) ? $this->arg('location') : $profile->location,
                          _('Where you are, like "City, State (or Region), Country"'));
             $this->elementEnd('li');
+            if (common_config('location', 'share') == 'user') {
+                $this->elementStart('li');
+                $this->checkbox('sharelocation', _('Share my current location when posting notices'),
+                                ($this->arg('sharelocation')) ?
+                                $this->arg('sharelocation') : $user->shareLocation());
+                $this->elementEnd('li');
+            }
             Event::handle('EndProfileFormData', array($this));
             $this->elementStart('li');
             $this->input('tags', _('Tags'),
@@ -318,6 +325,37 @@ class ProfilesettingsAction extends AccountSettingsAction
 
             $profile->profileurl = common_profile_url($nickname);
 
+            if (common_config('location', 'share') == 'user') {
+
+                $exists = false;
+
+                $prefs = User_location_prefs::staticGet('user_id', $user->id);
+
+                if (empty($prefs)) {
+                    $prefs = new User_location_prefs();
+
+                    $prefs->user_id = $user->id;
+                    $prefs->created = common_sql_now();
+                } else {
+                    $exists = true;
+                    $orig = clone($prefs);
+                }
+
+                $prefs->share_location = $this->boolean('sharelocation');
+
+                if ($exists) {
+                    $result = $prefs->update($orig);
+                } else {
+                    $result = $prefs->insert();
+                }
+
+                if ($result === false) {
+                    common_log_db_error($prefs, ($exists) ? 'UPDATE' : 'INSERT', __FILE__);
+                    $this->serverError(_('Couldn\'t save location prefs.'));
+                    return;
+                }
+            }
+
             common_debug('Old profile: ' . common_log_objstring($orig_profile), __FILE__);
             common_debug('New profile: ' . common_log_objstring($profile), __FILE__);
 
index 7651d8bd50e4bd4fbc80022ea170d90551388cb9..9f68c52553d0647ae382685f2ec0ba50c6924ba0 100644 (file)
@@ -289,21 +289,11 @@ class Notice extends Memcached_DataObject
         if (!empty($lat) && !empty($lon)) {
             $notice->lat = $lat;
             $notice->lon = $lon;
+        }
+
+        if (!empty($location_ns) && !empty($location_id)) {
             $notice->location_id = $location_id;
             $notice->location_ns = $location_ns;
-        } else if (!empty($location_ns) && !empty($location_id)) {
-            $location = Location::fromId($location_id, $location_ns);
-            if (!empty($location)) {
-                $notice->lat = $location->lat;
-                $notice->lon = $location->lon;
-                $notice->location_id = $location_id;
-                $notice->location_ns = $location_ns;
-            }
-        } else {
-            $notice->lat         = $profile->lat;
-            $notice->lon         = $profile->lon;
-            $notice->location_id = $profile->location_id;
-            $notice->location_ns = $profile->location_ns;
         }
 
         if (Event::handle('StartNoticeSave', array(&$notice))) {
@@ -1429,4 +1419,47 @@ class Notice extends Memcached_DataObject
 
         return $ids;
     }
+
+    function locationOptions($lat, $lon, $location_id, $location_ns, $profile = null)
+    {
+        $options = array();
+
+        if (!empty($location_id) && !empty($location_ns)) {
+
+            $options['location_id'] = $location_id;
+            $options['location_ns'] = $location_ns;
+
+            $location = Location::fromId($location_id, $location_ns);
+
+            if (!empty($location)) {
+                $options['lat'] = $location->lat;
+                $options['lon'] = $location->lon;
+            }
+
+        } else if (!empty($lat) && !empty($lon)) {
+
+            $options['lat'] = $lat;
+            $options['lon'] = $lon;
+
+            $location = Location::fromLatLon($lat, $lon);
+
+            if (!empty($location)) {
+                $options['location_id'] = $location->location_id;
+                $options['location_ns'] = $location->location_ns;
+            }
+        } else if (!empty($profile)) {
+
+            if (isset($profile->lat) && isset($profile->lon)) {
+                $options['lat'] = $profile->lat;
+                $options['lon'] = $profile->lon;
+            }
+
+            if (isset($profile->location_id) && isset($profile->location_ns)) {
+                $options['location_id'] = $profile->location_id;
+                $options['location_ns'] = $profile->location_ns;
+            }
+        }
+
+        return $options;
+    }
 }
index 6708d95b6a52fea1dd6ba52abe79783ff5f7e545..34151778c5c3274b89cf6f6562334e11c29249a7 100644 (file)
@@ -996,4 +996,28 @@ class User extends Memcached_DataObject
 
         return $ids;
     }
+
+    function shareLocation()
+    {
+        $cfg = common_config('location', 'share');
+
+        if ($cfg == 'always') {
+            return true;
+        } else if ($cfg == 'never') {
+            return false;
+        } else { // user
+            $share = true;
+
+            $prefs = User_location_prefs::staticGet('user_id', $this->id);
+
+            if (empty($prefs)) {
+                $share = common_config('location', 'sharedefault');
+            } else {
+                $share = $prefs->share_location;
+                $prefs->free();
+            }
+
+            return $share;
+        }
+    }
 }
diff --git a/classes/User_location_prefs.php b/classes/User_location_prefs.php
new file mode 100644 (file)
index 0000000..52cb254
--- /dev/null
@@ -0,0 +1,48 @@
+<?php
+/**
+ * StatusNet, the distributed open-source microblogging tool
+ *
+ * Data class for user location preferences
+ *
+ * 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  Data
+ * @package   StatusNet
+ * @author    Evan Prodromou <evan@status.net>
+ * @copyright 2009 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/
+ */
+
+require_once INSTALLDIR.'/classes/Memcached_DataObject.php';
+
+class User_location_prefs extends Memcached_DataObject
+{
+    ###START_AUTOCODE
+    /* the code below is auto generated do not remove the above tag */
+
+    public $__table = 'user_location_prefs';             // table name
+    public $user_id;                         // int(4)  primary_key not_null
+    public $share_location;                  // tinyint(1)   default_1
+    public $created;                         // datetime   not_null default_0000-00-00%2000%3A00%3A00
+    public $modified;                        // timestamp   not_null default_CURRENT_TIMESTAMP
+
+    /* Static get */
+    function staticGet($k,$v=NULL) { return Memcached_DataObject::staticGet('User_location_prefs',$k,$v); }
+
+    /* the code above is auto generated do not remove the tag below */
+    ###END_AUTOCODE
+}
index 2cc37dbfefa2b327287eb6b3b1d1c9bcd8cadf48..35a000aacdcc715c5434966b226f343b7688fe70 100644 (file)
@@ -1,4 +1,3 @@
-
 [avatar]
 profile_id = 129
 original = 17
@@ -564,4 +563,14 @@ modified = 384
 
 [user_openid__keys]
 trustroot = K
-user_id = K
\ No newline at end of file
+user_id = K
+
+[user_location_prefs]
+user_id = 129
+share_location = 17
+created = 142
+modified = 384
+
+[user_location_prefs__keys]
+user_id = N
+
index 28ec3ec16b779eaf416b05448daf8d651d6940c4..d9c25bc723ade4610b69951a7dc9e6466e7e4391 100644 (file)
@@ -84,3 +84,13 @@ create table login_token (
 
     constraint primary key (user_id)
 ) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin;
+
+create table user_location_prefs (
+    user_id integer not null comment 'user who has the preference' references user (id),
+    share_location tinyint default 1 comment 'Whether to share location data',
+    created datetime not null comment 'date this record was created',
+    modified timestamp comment 'date this record was modified',
+
+    constraint primary key (user_id)
+) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin;
+
index 6b3c2ca068a0339aff53a831e0c1818e3d00a716..94b03df639172146dff192e21634e2ff1db5362b 100644 (file)
@@ -587,3 +587,12 @@ create table login_token (
     constraint primary key (user_id)
 ) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin;
 
+create table user_location_prefs (
+    user_id integer not null comment 'user who has the preference' references user (id),
+    share_location tinyint default 1 comment 'Whether to share location data',
+    created datetime not null comment 'date this record was created',
+    modified timestamp comment 'date this record was modified',
+
+    constraint primary key (user_id)
+) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin;
+
index 42d4623b1ef9ea9558eca9f30213a459c801a1bd..8a70ed3fa15d0672899f0d4c22e68abf062b7349 100644 (file)
@@ -226,7 +226,8 @@ $default =
         'message' =>
         array('contentlimit' => null),
         'location' =>
-        array('namespace' => 1), // 1 = geonames, 2 = Yahoo Where on Earth
+        array('share' => 'user', // whether to share location; 'always', 'user', 'never'
+              'sharedefault' => true),
         'omb' =>
         array('timeout' => 5), // HTTP request timeout in seconds when contacting remote hosts for OMB updates
         'logincommand' =>