summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEvan Prodromou <evan@controlyourself.ca>2009-01-21 02:22:10 -0500
committerEvan Prodromou <evan@controlyourself.ca>2009-01-21 02:22:10 -0500
commit26652e92f2ef0cedda9823e17c81fc78be82fe9b (patch)
tree06cda4f98d37dac0824e96f98f727f25ce3146da
parent97f14ef1f9c9a1151c149eb1e95646081918befb (diff)
First pass at a group home page
This is the first pass at a group home page.
-rw-r--r--actions/showgroup.php308
-rwxr-xr-xclasses/Group_member.php2
-rw-r--r--classes/User.php28
-rwxr-xr-xclasses/User_group.php29
-rw-r--r--lib/joinform.php116
-rw-r--r--lib/leaveform.php116
6 files changed, 597 insertions, 2 deletions
diff --git a/actions/showgroup.php b/actions/showgroup.php
new file mode 100644
index 000000000..9fa867615
--- /dev/null
+++ b/actions/showgroup.php
@@ -0,0 +1,308 @@
+<?php
+/**
+ * Laconica, the distributed open-source microblogging tool
+ *
+ * Group main page
+ *
+ * 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 Personal
+ * @package Laconica
+ * @author Evan Prodromou <evan@controlyourself.ca>
+ * @author Sarven Capadisli <csarven@controlyourself.ca>
+ * @copyright 2008-2009 Control Yourself, Inc.
+ * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
+ * @link http://laconi.ca/
+ */
+
+if (!defined('LACONICA')) {
+ exit(1);
+}
+
+require_once INSTALLDIR.'/lib/noticelist.php';
+require_once INSTALLDIR.'/lib/feedlist.php';
+
+/**
+ * Group main page
+ *
+ * @category Personal
+ * @package Laconica
+ * @author Evan Prodromou <evan@controlyourself.ca>
+ * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
+ * @link http://laconi.ca/
+ */
+
+class ShowgroupAction extends Action
+{
+ /** group we're viewing. */
+ var $group = null;
+ /** page we're viewing. */
+ var $page = null;
+
+ /**
+ * Title of the page
+ *
+ * @return string page title, with page number
+ */
+
+ function title()
+ {
+ if ($this->page == 1) {
+ return sprintf(_("%s group"), $this->group->nickname);
+ } else {
+ return sprintf(_("%s group, page %d"),
+ $this->group->nickname,
+ $this->page);
+ }
+ }
+
+ /**
+ * Prepare the action
+ *
+ * Reads and validates arguments and instantiates the attributes.
+ *
+ * @param array $args $_REQUEST args
+ *
+ * @return boolean success flag
+ */
+
+ function prepare($args)
+ {
+ parent::prepare($args);
+
+ if (!common_config('inboxes','enabled')) {
+ $this->serverError(_('Inboxes must be enabled for groups to work'));
+ return false;
+ }
+
+ $this->page = ($this->arg('page')) ? ($this->arg('page')+0) : 1;
+
+ $nickname_arg = $this->arg('nickname');
+ $nickname = common_canonical_nickname($nickname_arg);
+
+ // Permanent redirect on non-canonical nickname
+
+ if ($nickname_arg != $nickname) {
+ $args = array('nickname' => $nickname);
+ if ($this->page != 1) {
+ $args['page'] = $this->page;
+ }
+ common_redirect(common_local_url('showgroup', $args), 301);
+ return false;
+ }
+
+ if (!$nickname) {
+ $this->clientError(_('No nickname'), 404);
+ return false;
+ }
+
+ $this->group = User_group::staticGet('nickname', $nickname);
+
+ if (!$this->group) {
+ $this->clientError(_('No such group'), 404);
+ return false;
+ }
+
+ return true;
+ }
+
+ /**
+ * Handle the request
+ *
+ * Shows a profile for the group, some controls, and a list of
+ * group notices.
+ *
+ * @return void
+ */
+
+ function handle($args)
+ {
+ $this->showPage();
+ }
+
+ /**
+ * Show the page content
+ *
+ * Shows a group profile and a list of group notices
+ */
+
+ function showContent()
+ {
+ $this->showGroupProfile();
+ $this->showGroupNotices();
+ }
+
+ /**
+ * Show the group notices
+ *
+ * @return void
+ */
+
+ function showGroupNotices()
+ {
+ $notice = $this->group->getNotices(($this->page-1)*NOTICES_PER_PAGE,
+ NOTICES_PER_PAGE + 1);
+
+ $nl = new NoticeList($notice, $this);
+ $cnt = $nl->show();
+
+ $this->pagination($this->page > 1,
+ $cnt > NOTICES_PER_PAGE,
+ $this->page,
+ 'showgroup',
+ array('nickname' => $this->group->nickname));
+ }
+
+ /**
+ * Show the group profile
+ *
+ * Information about the group
+ *
+ * @return void
+ */
+
+ function showGroupProfile()
+ {
+ $this->elementStart('div', array('id' => 'group_profile',
+ 'class' => 'vcard author'));
+
+ $this->element('h2', null, _('Group profile'));
+
+ $this->elementStart('dl', 'group_depiction');
+ $this->element('dt', null, _('Photo'));
+ $this->elementStart('dd');
+
+ $logo = ($this->group->homepage_logo) ?
+ $this->group->homepage_logo : User_group::defaultLogo(AVATAR_PROFILE_SIZE);
+
+ $this->element('img', array('src' => $logo,
+ 'class' => 'photo avatar',
+ 'width' => AVATAR_PROFILE_SIZE,
+ 'height' => AVATAR_PROFILE_SIZE,
+ 'alt' => $this->group->nickname));
+ $this->elementEnd('dd');
+ $this->elementEnd('dl');
+
+ $this->elementStart('dl', 'group_nickname');
+ $this->element('dt', null, _('Nickname'));
+ $this->elementStart('dd');
+ $hasFN = ($this->group->fullname) ? 'nickname url uid' : 'fn nickname url uid';
+ $this->element('a', array('href' => $this->group->homeUrl(),
+ 'rel' => 'me', 'class' => $hasFN),
+ $this->group->nickname);
+ $this->elementEnd('dd');
+ $this->elementEnd('dl');
+
+ if ($this->group->fullname) {
+ $this->elementStart('dl', 'group_fn');
+ $this->element('dt', null, _('Full name'));
+ $this->elementStart('dd');
+ $this->element('span', 'fn', $this->group->fullname);
+ $this->elementEnd('dd');
+ $this->elementEnd('dl');
+ }
+
+ if ($this->group->location) {
+ $this->elementStart('dl', 'group_location');
+ $this->element('dt', null, _('Location'));
+ $this->element('dd', 'location', $this->group->location);
+ $this->elementEnd('dl');
+ }
+
+ if ($this->group->homepage) {
+ $this->elementStart('dl', 'group_url');
+ $this->element('dt', null, _('URL'));
+ $this->elementStart('dd');
+ $this->element('a', array('href' => $this->group->homepage,
+ 'rel' => 'me', 'class' => 'url'),
+ $this->group->homepage);
+ $this->elementEnd('dd');
+ $this->elementEnd('dl');
+ }
+
+ if ($this->group->description) {
+ $this->elementStart('dl', 'group_note');
+ $this->element('dt', null, _('Note'));
+ $this->element('dd', 'note', $this->group->description);
+ $this->elementEnd('dl');
+ }
+
+ $this->elementEnd('div');
+
+ $this->elementStart('div', array('id' => 'group_actions'));
+ $this->element('h2', null, _('Group actions'));
+ $this->elementStart('ul');
+ $this->elementStart('li', array('id' => 'group_subscribe'));
+ $cur = common_current_user();
+ if ($cur) {
+ if ($cur->isMember($this->group)) {
+ $lf = new LeaveForm($this, $this->group);
+ $lf->show();
+ if ($cur->isAdmin($this->group)) {
+ $edit = common_local_url('editgroup',
+ array('nickname' => $this->group->nickname));
+ $this->element('a',
+ array('href' => $edit,
+ 'id' => 'group_admin'),
+ _('Admin'));
+ }
+ } else {
+ $jf = new JoinForm($this, $this->group);
+ $jf->show();
+ }
+ }
+
+ $this->elementEnd('li');
+
+ $this->elementEnd('ul');
+ $this->elementEnd('div');
+ }
+
+ /**
+ * Show a list of links to feeds this page produces
+ *
+ * @return void
+ */
+
+ function showExportData()
+ {
+ $fl = new FeedList($this);
+ $fl->show(array(0=>array('href'=>common_local_url('grouprss',
+ array('nickname' => $this->group->nickname)),
+ 'type' => 'rss',
+ 'version' => 'RSS 1.0',
+ 'item' => 'notices')));
+ }
+
+ /**
+ * Show a list of links to feeds this page produces
+ *
+ * @return void
+ */
+
+ function showFeeds()
+ {
+ $url =
+ common_local_url('grouprss',
+ array('nickname' => $this->group->nickname));
+
+ $this->element('link', array('rel' => 'alternate',
+ 'href' => $url,
+ 'type' => 'application/rss+xml',
+ 'title' => sprintf(_('Notice feed for %s group'),
+ $this->group->nickname)));
+ }
+} \ No newline at end of file
diff --git a/classes/Group_member.php b/classes/Group_member.php
index 6aba84f65..32243fe45 100755
--- a/classes/Group_member.php
+++ b/classes/Group_member.php
@@ -2,7 +2,7 @@
/**
* Table Definition for group_member
*/
-require_once 'classes/Memcached_DataObject';
+require_once 'classes/Memcached_DataObject.php';
class Group_member extends Memcached_DataObject
{
diff --git a/classes/User.php b/classes/User.php
index 92ff8776b..51e23fccf 100644
--- a/classes/User.php
+++ b/classes/User.php
@@ -492,4 +492,32 @@ class User extends Memcached_DataObject
return true;
}
+ function isMember($group)
+ {
+ $mem = new Group_member();
+
+ $mem->group_id = $group->id;
+ $mem->profile_id = $this->id;
+
+ if ($mem->find()) {
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ function isAdmin($group)
+ {
+ $mem = new Group_member();
+
+ $mem->group_id = $group->id;
+ $mem->profile_id = $this->id;
+ $mem->is_admin = 1;
+
+ if ($mem->find()) {
+ return true;
+ } else {
+ return false;
+ }
+ }
}
diff --git a/classes/User_group.php b/classes/User_group.php
index e8aaec744..e0b6f2885 100755
--- a/classes/User_group.php
+++ b/classes/User_group.php
@@ -2,7 +2,7 @@
/**
* Table Definition for user_group
*/
-require_once 'classes/Memcached_DataObject';
+require_once 'classes/Memcached_DataObject.php';
class User_group extends Memcached_DataObject
{
@@ -28,4 +28,31 @@ class User_group extends Memcached_DataObject
/* the code above is auto generated do not remove the tag below */
###END_AUTOCODE
+
+ function defaultLogo($size) {
+ static $sizenames = array(AVATAR_PROFILE_SIZE => 'profile',
+ AVATAR_STREAM_SIZE => 'stream',
+ AVATAR_MINI_SIZE => 'mini');
+ return theme_path('default-avatar-'.$sizenames[$size].'.png');
+ }
+
+ function homeUrl() {
+ return common_local_url('showgroup',
+ array('nickname' => $this->nickname));
+ }
+
+ function permalink() {
+ return common_local_url('groupbyid',
+ array('id' => $this->id));
+ }
+
+ function getNotices($offset, $limit) {
+ $qry =
+ 'SELECT notice.* ' .
+ 'FROM notice JOIN group_inbox ON notice.id = group_inbox.notice_id ' .
+ 'WHERE group_inbox.group_id = %d ';
+ return Notice::getStream(sprintf($qry, $this->id),
+ 'group:notices:'.$this->id,
+ $offset, $limit);
+ }
}
diff --git a/lib/joinform.php b/lib/joinform.php
new file mode 100644
index 000000000..9a14b0940
--- /dev/null
+++ b/lib/joinform.php
@@ -0,0 +1,116 @@
+<?php
+/**
+ * Laconica, the distributed open-source microblogging tool
+ *
+ * Form for joining a group
+ *
+ * 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 Form
+ * @package Laconica
+ * @author Evan Prodromou <evan@controlyourself.ca>
+ * @author Sarven Capadisli <csarven@controlyourself.ca>
+ * @copyright 2009 Control Yourself, Inc.
+ * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
+ * @link http://laconi.ca/
+ */
+
+if (!defined('LACONICA')) {
+ exit(1);
+}
+
+require_once INSTALLDIR.'/lib/form.php';
+
+/**
+ * Form for joining a group
+ *
+ * @category Form
+ * @package Laconica
+ * @author Evan Prodromou <evan@controlyourself.ca>
+ * @author Sarven Capadisli <csarven@controlyourself.ca>
+ * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
+ * @link http://laconi.ca/
+ *
+ * @see UnsubscribeForm
+ */
+
+class JoinForm extends Form
+{
+ /**
+ * group for user to join
+ */
+
+ var $group = null;
+
+ /**
+ * Constructor
+ *
+ * @param HTMLOutputter $out output channel
+ * @param group $group group to join
+ */
+
+ function __construct($out=null, $group=null)
+ {
+ parent::__construct($out);
+
+ $this->group = $group;
+ }
+
+ /**
+ * ID of the form
+ *
+ * @return string ID of the form
+ */
+
+ function id()
+ {
+ return 'subscribe-' . $this->group->id;
+ }
+
+ /**
+ * class of the form
+ *
+ * @return string of the form class
+ */
+
+ function formClass()
+ {
+ return 'form_group_join';
+ }
+
+ /**
+ * Action of the form
+ *
+ * @return string URL of the action
+ */
+
+ function action()
+ {
+ return common_local_url('joingroup',
+ array('nickname' => $this->group->nickname));
+ }
+
+ /**
+ * Action elements
+ *
+ * @return void
+ */
+
+ function formActions()
+ {
+ $this->out->submit('submit', _('Join'));
+ }
+}
diff --git a/lib/leaveform.php b/lib/leaveform.php
new file mode 100644
index 000000000..f96b54662
--- /dev/null
+++ b/lib/leaveform.php
@@ -0,0 +1,116 @@
+<?php
+/**
+ * Laconica, the distributed open-source microblogging tool
+ *
+ * Form for leaving a group
+ *
+ * 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 Form
+ * @package Laconica
+ * @author Evan Prodromou <evan@controlyourself.ca>
+ * @author Sarven Capadisli <csarven@controlyourself.ca>
+ * @copyright 2009 Control Yourself, Inc.
+ * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
+ * @link http://laconi.ca/
+ */
+
+if (!defined('LACONICA')) {
+ exit(1);
+}
+
+require_once INSTALLDIR.'/lib/form.php';
+
+/**
+ * Form for leaving a group
+ *
+ * @category Form
+ * @package Laconica
+ * @author Evan Prodromou <evan@controlyourself.ca>
+ * @author Sarven Capadisli <csarven@controlyourself.ca>
+ * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
+ * @link http://laconi.ca/
+ *
+ * @see UnsubscribeForm
+ */
+
+class LeaveForm extends Form
+{
+ /**
+ * group for user to leave
+ */
+
+ var $group = null;
+
+ /**
+ * Constructor
+ *
+ * @param HTMLOutputter $out output channel
+ * @param group $group group to leave
+ */
+
+ function __construct($out=null, $group=null)
+ {
+ parent::__construct($out);
+
+ $this->group = $group;
+ }
+
+ /**
+ * ID of the form
+ *
+ * @return string ID of the form
+ */
+
+ function id()
+ {
+ return 'subscribe-' . $this->group->id;
+ }
+
+ /**
+ * class of the form
+ *
+ * @return string of the form class
+ */
+
+ function formClass()
+ {
+ return 'form_group_leave';
+ }
+
+ /**
+ * Action of the form
+ *
+ * @return string URL of the action
+ */
+
+ function action()
+ {
+ return common_local_url('leavegroup',
+ array('nickname' => $this->group->nickname));
+ }
+
+ /**
+ * Action elements
+ *
+ * @return void
+ */
+
+ function formActions()
+ {
+ $this->out->submit('submit', _('Leave'));
+ }
+}