summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>2014-07-22 13:19:45 +0300
committerDmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>2014-07-22 13:19:45 +0300
commit6b4d5d21be69705f22cb2e848fdba9f182ef2bc5 (patch)
tree4d6d4e6f390dbc3b4fabfc1c108b997053f57a4c
parent68a9203bcef1e44bdf72acf4cc8d4977eec79b7a (diff)
parent1da2262efd272a4cf086f1cf1a033699a43df857 (diff)
downloadgitlab-ce-6b4d5d21be69705f22cb2e848fdba9f182ef2bc5.tar.gz
Merge branch 'public-groups' of https://github.com/innogames/gitlabhq into 7-2-dev
-rw-r--r--app/controllers/public/groups_controller.rb14
-rw-r--r--app/models/group.rb16
-rw-r--r--app/views/layouts/public_groups.html.haml11
-rw-r--r--app/views/public/groups/index.html.haml59
-rw-r--r--config/routes.rb1
-rw-r--r--features/public/public_groups.feature32
-rw-r--r--features/steps/shared/group.rb8
-rw-r--r--features/steps/shared/paths.rb8
8 files changed, 149 insertions, 0 deletions
diff --git a/app/controllers/public/groups_controller.rb b/app/controllers/public/groups_controller.rb
new file mode 100644
index 00000000000..7eb159c577d
--- /dev/null
+++ b/app/controllers/public/groups_controller.rb
@@ -0,0 +1,14 @@
+class Public::GroupsController < ApplicationController
+ skip_before_filter :authenticate_user!,
+ :reject_blocked, :set_current_user_for_observers,
+ :add_abilities
+
+ layout "public_groups"
+
+ def index
+ @groups = GroupsFinder.new.execute(current_user)
+ @groups = @groups.search(params[:search]) if params[:search].present?
+ @groups = @groups.sort(@sort = params[:sort])
+ @groups = @groups.page(params[:page]).per(20)
+ end
+end
diff --git a/app/models/group.rb b/app/models/group.rb
index 3a5c5e11354..66239f7fe6f 100644
--- a/app/models/group.rb
+++ b/app/models/group.rb
@@ -73,4 +73,20 @@ class Group < Namespace
def public_profile?
projects.public_only.any?
end
+
+ class << self
+ def search(query)
+ where("LOWER(namespaces.name) LIKE :query", query: "%#{query.downcase}%")
+ end
+
+ def sort(method)
+ case method.to_s
+ when "newest" then reorder("namespaces.created_at DESC")
+ when "oldest" then reorder("namespaces.created_at ASC")
+ when "recently_updated" then reorder("namespaces.updated_at DESC")
+ when "last_updated" then reorder("namespaces.updated_at ASC")
+ else reorder("namespaces.path, namespaces.name ASC")
+ end
+ end
+ end
end
diff --git a/app/views/layouts/public_groups.html.haml b/app/views/layouts/public_groups.html.haml
new file mode 100644
index 00000000000..bfa37b067b9
--- /dev/null
+++ b/app/views/layouts/public_groups.html.haml
@@ -0,0 +1,11 @@
+!!! 5
+%html{ lang: "en"}
+ = render "layouts/head", title: "Public Groups"
+ %body{class: "#{app_theme} application", :'data-page' => body_data_page}
+ = render "layouts/broadcast"
+ - if current_user
+ = render "layouts/head_panel", title: "Public Groups"
+ - else
+ = render "layouts/public_head_panel", title: "Public Groups"
+ .container.navless-container
+ .content= yield
diff --git a/app/views/public/groups/index.html.haml b/app/views/public/groups/index.html.haml
new file mode 100644
index 00000000000..7a2e5737804
--- /dev/null
+++ b/app/views/public/groups/index.html.haml
@@ -0,0 +1,59 @@
+%h3.page-title
+ Groups (#{@groups.total_count})
+
+%p.light
+ Group allows you to keep projects organized.
+ Use groups for uniting related projects.
+
+%hr
+.clearfix
+ .pull-left
+ = form_tag public_groups_path, method: :get, class: 'form-inline form-tiny' do |f|
+ .form-group
+ = search_field_tag :search, params[:search], placeholder: "Filter by name", class: "form-control search-text-input input-mn-300", id: "groups_search"
+ .form-group
+ = submit_tag 'Search', class: "btn btn-primary wide"
+
+ .pull-right
+ .dropdown.inline
+ %a.dropdown-toggle.btn{href: '#', "data-toggle" => "dropdown"}
+ %span.light sort:
+ - if @sort.present?
+ = @sort.humanize
+ - else
+ Name
+ %b.caret
+ %ul.dropdown-menu
+ %li
+ = link_to public_groups_path(sort: nil) do
+ Name
+ = link_to public_groups_path(sort: 'newest') do
+ Newest
+ = link_to public_groups_path(sort: 'oldest') do
+ Oldest
+ = link_to public_groups_path(sort: 'recently_updated') do
+ Recently updated
+ = link_to public_groups_path(sort: 'last_updated') do
+ Last updated
+
+%hr
+
+%ul.bordered-list
+ - @groups.each do |group|
+ %li
+ .clearfix
+ %h4
+ = link_to group_path(id: group.path) do
+ %i.icon-group
+ = group.name
+ .clearfix
+ %p
+ = truncate group.description, length: 150
+ .clearfix
+ %p.light
+ #{pluralize(group.members.size, 'member')}, #{pluralize(group.projects.count, 'project')}
+ - unless @groups.present?
+ .nothing-here-block No public groups
+
+
+= paginate @groups, theme: "gitlab"
diff --git a/config/routes.rb b/config/routes.rb
index f73fd7a87fa..7babab3438a 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -51,6 +51,7 @@ Gitlab::Application.routes.draw do
#
namespace :public do
resources :projects, only: [:index]
+ resources :groups, only: [:index]
root to: "projects#index"
end
diff --git a/features/public/public_groups.feature b/features/public/public_groups.feature
index 8bbda8cb6d4..ff3e1e3e955 100644
--- a/features/public/public_groups.feature
+++ b/features/public/public_groups.feature
@@ -117,3 +117,35 @@ Feature: Public Projects Feature
And I visit group "TestGroup" members page
Then I should see group member "John Doe"
And I should not see member roles
+
+ Scenario: I should see group with public project in public groups area
+ Given group "TestGroup" has public project "Community"
+ When I visit the public groups area
+ Then I should see group "TestGroup"
+
+ Scenario: I should not see group with internal project in public groups area
+ Given group "TestGroup" has internal project "Internal"
+ When I visit the public groups area
+ Then I should not see group "TestGroup"
+
+ Scenario: I should not see group with private project in public groups area
+ When I visit the public groups area
+ Then I should not see group "TestGroup"
+
+ Scenario: I should see group with public project in public groups area as user
+ Given group "TestGroup" has public project "Community"
+ When I sign in as a user
+ And I visit the public groups area
+ Then I should see group "TestGroup"
+
+ Scenario: I should see group with internal project in public groups area as user
+ Given group "TestGroup" has internal project "Internal"
+ When I sign in as a user
+ And I visit the public groups area
+ Then I should see group "TestGroup"
+
+ Scenario: I should not see group with private project in public groups area as user
+ When I sign in as a user
+ And I visit the public groups area
+ Then I should not see group "TestGroup"
+
diff --git a/features/steps/shared/group.rb b/features/steps/shared/group.rb
index 6b4c47312a7..1b225dd61a6 100644
--- a/features/steps/shared/group.rb
+++ b/features/steps/shared/group.rb
@@ -21,6 +21,14 @@ module SharedGroup
is_member_of("Mary Jane", "Guest", Gitlab::Access::GUEST)
end
+ step 'I should see group "TestGroup"' do
+ page.should have_content "TestGroup"
+ end
+
+ step 'I should not see group "TestGroup"' do
+ page.should_not have_content "TestGroup"
+ end
+
protected
def is_member_of(username, groupname, role)
diff --git a/features/steps/shared/paths.rb b/features/steps/shared/paths.rb
index 2090b642059..d92c70c952e 100644
--- a/features/steps/shared/paths.rb
+++ b/features/steps/shared/paths.rb
@@ -332,6 +332,14 @@ module SharedPaths
end
# ----------------------------------------
+ # Public Groups
+ # ----------------------------------------
+
+ step 'I visit the public groups area' do
+ visit public_groups_path
+ end
+
+ # ----------------------------------------
# Snippets
# ----------------------------------------