Skip to content

Commit 1db2d00

Browse files
authored
Merge pull request #27 from topcoder-platform/issues-133
Issues-133, Issues-136, Issues-205
2 parents 08a570c + 31afbb7 commit 1db2d00

14 files changed

+1012
-187
lines changed

addon.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,8 @@
1616
"Groups.Group.Delete",
1717
"Groups.Moderation.Manage",
1818
"Groups.EmailInvitations.Add",
19-
"Groups.Category.Manage"
19+
"Groups.Category.Manage",
20+
"Groups.Group.Archive"
2021
],
2122
"authors": [
2223
{

class.groups.plugin.php

Lines changed: 41 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,12 @@
1515

1616
class GroupsPlugin extends Gdn_Plugin {
1717
const GROUPS_ROUTE = '/groups';
18+
const ROUTE_MY_GROUPS = '/groups/mine';
19+
const ROUTE_CHALLENGE_GROUPS = '/groups?filter=challenge'; //'/groups/challenges';
20+
const ROUTE_REGULAR_GROUPS = '/groups?filter=regular'; //'/groups/regulars';
1821
const GROUP_ROUTE = '/group/';
1922
const GROUPS_GROUP_ADD_PERMISSION = 'Groups.Group.Add';
23+
const GROUPS_GROUP_ARCHIVE_PERMISSION = 'Groups.Group.Archive';
2024
const GROUPS_GROUP_EDIT_PERMISSION = 'Groups.Group.Edit';
2125
const GROUPS_GROUP_DELETE_PERMISSION = 'Groups.Group.Delete';
2226
const GROUPS_CATEGORY_MANAGE_PERMISSION = 'Groups.Category.Manage';
@@ -79,7 +83,8 @@ private function initDefaultTopcoderRoles() {
7983
self::GROUPS_MODERATION_MANAGE_PERMISSION => 1,
8084
self::GROUPS_CATEGORY_MANAGE_PERMISSION => 1,
8185
self::GROUPS_GROUP_ADD_PERMISSION => 1,
82-
self::GROUPS_EMAIL_INVITATIONS_PERMISSION => 1
86+
self::GROUPS_EMAIL_INVITATIONS_PERMISSION => 1,
87+
self::GROUPS_GROUP_ARCHIVE_PERMISSION => 1
8388
], true);
8489

8590
$permissionModel->save( [
@@ -88,7 +93,8 @@ private function initDefaultTopcoderRoles() {
8893
self::GROUPS_MODERATION_MANAGE_PERMISSION => 1,
8994
self::GROUPS_CATEGORY_MANAGE_PERMISSION => 1,
9095
self::GROUPS_GROUP_ADD_PERMISSION => 1,
91-
self::GROUPS_EMAIL_INVITATIONS_PERMISSION => 1
96+
self::GROUPS_EMAIL_INVITATIONS_PERMISSION => 1,
97+
self::GROUPS_GROUP_ARCHIVE_PERMISSION => 1
9298
], true);
9399

94100
$permissionModel->save( [
@@ -165,11 +171,15 @@ public function onDisable() {
165171
public function discussionsController_beforeDiscussionMetaData_handler($sender, $args){
166172
if($args['Discussion']) {
167173
$discussion = $args['Discussion'];
168-
if ($discussion->GroupID) {
169-
$result = '/group/' . $discussion->GroupID;
174+
$groupModel = new GroupModel();
175+
$groupID = $groupModel->findGroupIDFromDiscussion($discussion);
176+
GroupsPlugin::log('discussionsController_beforeDiscussionMetaData_handler', [
177+
'GroupID' => $groupID]);
178+
if ($groupID) {
179+
$result = '/group/' . $groupID;
170180
$url = url($result, true);
171-
$groupModel = new GroupModel();
172-
$group = $groupModel->getByGroupID($discussion->GroupID);
181+
182+
$group = $groupModel->getByGroupID($groupID);
173183
echo '<div class="Meta Meta-Discussion Group-Info">'.
174184
'<span class="MItem ">'.
175185
'<span class="label">Challenge: </span>'.
@@ -234,11 +244,13 @@ public function settingsController_groups_create($sender) {
234244

235245
public function discussionController_render_before($sender, $args) {
236246
$Discussion = $sender->data('Discussion');
237-
if($Discussion && $Discussion->GroupID != null) {
247+
if($Discussion) {
238248
$groupModel = new GroupModel();
239249
$currentTopcoderProjectRoles = $sender->Data['ChallengeCurrentUserProjectRoles'];
240250
$groupModel->setCurrentUserTopcoderProjectRoles($currentTopcoderProjectRoles);
241-
$Group = $groupModel->getByGroupID($Discussion->GroupID);
251+
$groupID = $groupModel->findGroupIDFromDiscussion($Discussion);
252+
self::log('discussionController_render_before:GroupID='.$groupID, []);
253+
$Group = $groupModel->getByGroupID($groupID);
242254
if (!$groupModel->canView($Group)) {
243255
throw permissionException();
244256
}
@@ -318,16 +330,8 @@ public function base_discussionOptionsDropdown_handler($sender, $args){
318330
}
319331
}
320332

321-
public function discussionsController_afterDiscussionFilters_handler($sender){
322-
$this->addGroupLinkToMenu();
323-
}
324-
325-
public function discussionController_afterDiscussionFilters_handler($sender){
326-
$this->addGroupLinkToMenu();
327-
}
328-
329-
public function categoriesController_afterDiscussionFilters_handler($sender){
330-
$this->addGroupLinkToMenu();
333+
public function base_afterDiscussionFilters_handler($sender){
334+
$this->addGroupLinkToMenu($sender);
331335
}
332336

333337
public function base_categoryOptionsDropdown_handler($sender, $args) {
@@ -355,9 +359,9 @@ public function base_categoryOptionsDropdown_handler($sender, $args) {
355359
*/
356360
public function discussionController_discussionInfo_handler($sender, $args) {
357361
if($sender->Data['Discussion']) {
358-
$groupID = $sender->Data['Discussion']->GroupID;
362+
$groupModel = new GroupModel();
363+
$groupID = $groupModel->findGroupIDFromDiscussion($sender->Data['Discussion']);
359364
if($groupID) {
360-
$groupModel = new GroupModel();
361365
$group = $groupModel->getByGroupID($groupID);
362366
if($group->ChallengeUrl) {
363367
echo anchor($group->Name, $group->ChallengeUrl);
@@ -374,10 +378,12 @@ public function postController_afterDiscussionSave_handler($sender, $args) {
374378
return;
375379
}
376380
$discussion= $args['Discussion'];
381+
$groupModel = new GroupModel();
382+
$groupID = $groupModel->findGroupIDFromDiscussion($discussion);
377383
if ($sender->deliveryType() == DELIVERY_TYPE_ALL) {
378-
redirectTo(GroupsPlugin::GROUP_ROUTE.$discussion->GroupID);
384+
redirectTo(GroupsPlugin::GROUP_ROUTE.$groupID);
379385
} else {
380-
$sender->setRedirectTo(GroupsPlugin::GROUP_ROUTE.$discussion->GroupID);
386+
$sender->setRedirectTo(GroupsPlugin::GROUP_ROUTE.$groupID);
381387
}
382388
}
383389

@@ -679,12 +685,23 @@ private function getTopcoderProjectRoles($user, $resources = null, $roleResource
679685
/**
680686
* Display a groups link in the menu
681687
*/
682-
private function addGroupLinkToMenu() {
688+
private function addGroupLinkToMenu($sender) {
683689
if(Gdn::session()->isValid()) {
684-
echo '<li>'. anchor('Challenges', GroupsPlugin::GROUPS_ROUTE).'</li>';
690+
691+
echo '<li class="'.$this->getMenuItemCssClassFromQuery($sender, 'challenge').'">'. anchor('Challenges', GroupsPlugin::ROUTE_CHALLENGE_GROUPS).'</li>';
692+
echo '<li class="'.$this->getMenuItemCssClassFromQuery($sender, 'regular').'">'. anchor('Groups', GroupsPlugin::ROUTE_REGULAR_GROUPS).'</li>';
693+
// echo '<li class="'.$this->getMenuItemCssClassFromRequestMethod($sender, 'mine').'">'. anchor('My Challenges & Groups', GroupsPlugin::ROUTE_MY_GROUPS).'</li>';
685694
}
686695
}
687696

697+
private function getMenuItemCssClassFromRequestMethod($sender, $requestMethod){
698+
return $sender->ControllerName == 'groupscontroller' && $sender->RequestMethod == $requestMethod ? ' Active' : '';
699+
}
700+
701+
private function getMenuItemCssClassFromQuery($sender, $requestMethod){
702+
return $sender->ControllerName == 'groupscontroller' && Gdn::request()->get('filter') == $requestMethod ? ' Active' : '';
703+
}
704+
688705
public static function log($message, $data= []) {
689706
// if (c('Debug')) {
690707
Logger::event(

controllers/api/GroupsApiController.php

Lines changed: 38 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,12 @@ public function index(array $query) {
5757
'field' => 'ChallengeID'
5858
],
5959
],
60-
60+
'privacy:s?' => [
61+
'description' => 'Filter by group privacy.',
62+
'x-filter' => [
63+
'field' => 'Privacy'
64+
],
65+
],
6166
'type:s?' => [
6267
'description' => 'Filter by group type.',
6368
'x-filter' => [
@@ -194,6 +199,29 @@ public function post_members($id, array $body) {
194199
$this->groupModel->join($group->GroupID, $user->UserID);
195200
}
196201

202+
/**
203+
* Archive a group.
204+
*
205+
* @param int $id The ID of the group.
206+
* @throws NotFoundException if the group could not be found.
207+
* @throws ServerException If the group could not be archived.
208+
* @return
209+
*/
210+
public function put_archive($id, array $body) {
211+
$this->idParamSchema();
212+
213+
$group = $this->groupModel->getByGroupID($id);
214+
if(!$group) {
215+
throw new NotFoundException('Group');
216+
}
217+
218+
if(!$this->groupModel->canArchiveGroup($group)) {
219+
throw new ClientException('Don\'t have permissions to archive this group.');
220+
}
221+
222+
$this->groupModel->archiveGroup($group->GroupID);
223+
}
224+
197225

198226
/**
199227
* Remove a member from a group
@@ -284,8 +312,11 @@ public function groupPostSchema() {
284312
return $this->schema(Schema::parse([
285313
'name:s' => 'The name of the group.',
286314
'type:s' => [
287-
'enum' => [GroupModel::TYPE_SECRET, GroupModel::TYPE_PUBLIC, GroupModel::TYPE_PRIVATE],
288-
'description' => 'Type of the group'],
315+
'enum' => [GroupModel::TYPE_CHALLENGE, GroupModel::TYPE_REGULAR],
316+
'description' => 'Type of the group'],
317+
'privacy:s' => [
318+
'enum' => [GroupModel::PRIVACY_SECRET, GroupModel::PRIVACY_PUBLIC, GroupModel::PRIVACY_PRIVATE],
319+
'description' => 'Privacy of the group'],
289320
'description:s' => 'Description of the group',
290321
'challengeID:s?' => 'The challengeID of the Topcoder challenge.',
291322
'challengeUrl:s?' => 'The challengeUrl of the Topcoder challenge.',
@@ -300,7 +331,8 @@ public function groupPostSchema() {
300331
*/
301332
public function groupPatchSchema() {
302333
return $this->schema(Schema::parse([
303-
'name:s' => 'The name of the group.',
334+
'name:s?' => 'The name of the group.',
335+
'archived:i?' => 'The archived status of the group.',
304336
]), 'GroupPatch');
305337
}
306338

@@ -313,10 +345,11 @@ protected function fullSchema() {
313345
return Schema::parse([
314346
'groupID:i' => 'The ID of the group.',
315347
'type:s' => 'Type of the group',
348+
'privacy:s' => 'Privacy of the group',
349+
'archived:i' => 'Archived status of the group',
316350
'name:s' => 'The name of the group.',
317351
'challengeID:s?' => 'The challengeID of the Topcoder challenge.',
318352
'challengeUrl:s?' => 'The challengeUrl of the Topcoder challenge.',
319353
]);
320354
}
321-
322355
}

controllers/class.groupcontroller.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,7 @@ public function add() {
102102
throw permissionException();
103103
}
104104
$this->title(t('New Challenge'));
105+
105106
// Use the edit form without groupID
106107
$this->View = 'Edit';
107108
$this->edit();
@@ -155,6 +156,9 @@ public function edit($groupID = false) {
155156
$this->setData('Breadcrumbs', [['Name' => t('Challenges'), 'Url' => GroupsPlugin::GROUPS_ROUTE],
156157
['Name' => $Group->Name ? $Group->Name: $this->title() ]]);
157158

159+
$typesData = [GroupModel::TYPE_REGULAR => GroupModel::TYPE_REGULAR, GroupModel::TYPE_CHALLENGE => GroupModel::TYPE_CHALLENGE];
160+
$this->setData('Types', $typesData);
161+
158162
// Set the model on the form.
159163
$this->Form->setModel($this->GroupModel);
160164

0 commit comments

Comments
 (0)