From 6f31f25105f59bee5d6a8eccf43952e1396846b3 Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Thu, 20 Nov 2008 16:48:21 -0500 Subject: [PATCH] let users set their own profile tags from profilesettings darcs-hash:20081120214821-84dde-c8569ef645b389de545f78bf01a270f28b871f02.gz --- actions/profilesettings.php | 30 +++++++++++++++--- classes/Profile_tag.php | 63 +++++++++++++++++++++++++++++++++++++ classes/User.php | 8 +++++ classes/laconica.ini | 1 - lib/util.php | 4 +++ 5 files changed, 101 insertions(+), 5 deletions(-) diff --git a/actions/profilesettings.php b/actions/profilesettings.php index 2ae7360876..7f12de9fef 100644 --- a/actions/profilesettings.php +++ b/actions/profilesettings.php @@ -67,10 +67,9 @@ class ProfilesettingsAction extends SettingsAction { 'action' => common_local_url('profilesettings'))); common_hidden('token', common_session_token()); - - - + # too much common patterns here... abstractable? + common_input('nickname', _('Nickname'), ($this->arg('nickname')) ? $this->arg('nickname') : $profile->nickname, _('1-64 lowercase letters or numbers, no punctuation or spaces')); @@ -85,6 +84,9 @@ class ProfilesettingsAction extends SettingsAction { common_input('location', _('Location'), ($this->arg('location')) ? $this->arg('location') : $profile->location, _('Where you are, like "City, State (or Region), Country"')); + common_input('tags', _('Tags'), + ($this->arg('tags')) ? $this->arg('tags') : implode(' ', $user->getSelfTags()), + _('Tags for yourself (letters, numbers, -, ., and _), comma- or space- separated')); $language = common_language(); common_dropdown('language', _('Language'), get_nice_language_list(), _('Preferred language'), TRUE, $language); @@ -194,7 +196,8 @@ class ProfilesettingsAction extends SettingsAction { $autosubscribe = $this->boolean('autosubscribe'); $language = $this->trimmed('language'); $timezone = $this->trimmed('timezone'); - + $tagstring = $this->trimmed('tags'); + # Some validation if (!Validate::string($nickname, array('min_length' => 1, @@ -226,8 +229,18 @@ class ProfilesettingsAction extends SettingsAction { return; } else if (!is_null($language) && strlen($language) > 50) { $this->show_form(_('Language is too long (max 50 chars).')); + return; } + $tags = array_map('common_canonical_tag', preg_split('/[\s,]+/', $tagstring)); + + foreach ($tags as $tag) { + if (!common_valid_profile_tag($tag)) { + $this->show_form(sprintf(_('Invalid tag: "%s"'), $tag)); + return; + } + } + $user = common_current_user(); $user->query('BEGIN'); @@ -300,6 +313,15 @@ class ProfilesettingsAction extends SettingsAction { return; } + # Set the user tags + + $result = $user->setTags($tags); + + if (!$result) { + common_server_error(_('Couldn\'t save tags.')); + return; + } + $user->query('COMMIT'); common_broadcast_profile($profile); diff --git a/classes/Profile_tag.php b/classes/Profile_tag.php index f2d6ec6cf8..464a817fc8 100644 --- a/classes/Profile_tag.php +++ b/classes/Profile_tag.php @@ -20,4 +20,67 @@ class Profile_tag extends Memcached_DataObject /* the code above is auto generated do not remove the tag below */ ###END_AUTOCODE + + static function getTags($tagger, $tagged) { + + $tags = array(); + + # XXX: store this in memcached + + $profile_tag = new Profile_tag(); + $profile_tag->tagger = $tagger; + $profile_tag->tagged = $tagged; + + $profile_tag->find(); + + while ($profile_tag->fetch()) { + $tags[] = $profile_tag->tag; + } + + $profile_tag->free(); + + return $tags; + } + + static function setTags($tagger, $tagged, $tags) { + + $oldtags = Profile_tag::getTags($tagger, $tagged); + + # Delete stuff that's old that not in new + + $to_delete = array_diff($oldtags, $newtags); + + # Insert stuff that's in new and not in old + + $to_insert = array_diff($newtags, $oldtags); + + $profile_tag = new Profile_tag(); + + $profile_tag->tagger = $tagger; + $profile_tag->tagged = $tagged; + + $profile_tag->query('BEGIN'); + + foreach ($to_delete as $deltag) { + $profile_tag->tag = $deltag; + $result = $profile_tag->delete(); + if (!$result) { + common_log_db_error($profile_tag, 'DELETE', __FILE__); + return false; + } + } + + foreach ($to_insert as $instag) { + $profile_tag->tag = $instag; + $result = $profile_tag->insert(); + if (!$result) { + common_log_db_error($profile_tag, 'INSERT', __FILE__); + return false; + } + } + + $profile_tag->query('COMMIT'); + + return true; + } } diff --git a/classes/User.php b/classes/User.php index 45b1332138..696c85e737 100644 --- a/classes/User.php +++ b/classes/User.php @@ -401,4 +401,12 @@ class User extends Memcached_DataObject $cache->delete(common_cache_key('user:faves:'.$this->id).';last'); } } + + function getSelfTags() { + return Profile_tag::getTags($this->id, $this->id); + } + + function setSelfTags($newtags) { + return Profile_tag::setTags($this->id, $this->id, $newtags); + } } diff --git a/classes/laconica.ini b/classes/laconica.ini index 470c0eaf1b..ccf7e2f873 100644 --- a/classes/laconica.ini +++ b/classes/laconica.ini @@ -155,7 +155,6 @@ id = N [notice_inbox] user_id = 129 notice_id = 129 -source = 17 created = 142 source = 17 diff --git a/lib/util.php b/lib/util.php index efce283a91..13fcfcc70a 100644 --- a/lib/util.php +++ b/lib/util.php @@ -844,6 +844,10 @@ function common_canonical_tag($tag) { return strtolower(str_replace(array('-', '_', '.'), '', $tag)); } +function common_valid_profile_tag($str) { + return preg_match('/^[A-Za-z0-9_\-\.]{1,64}$/', $str); +} + function common_at_link($sender_id, $nickname) { $sender = Profile::staticGet($sender_id); $recipient = common_relative_profile($sender, common_canonical_nickname($nickname));