popolo 0.0.1 → 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README.md +4 -2
- data/app/controllers/popolo/areas_controller.rb +0 -5
- data/app/controllers/popolo/organizations_controller.rb +10 -7
- data/app/controllers/popolo/posts_controller.rb +0 -5
- data/app/models/popolo/address.rb +7 -7
- data/app/models/popolo/post.rb +6 -6
- data/app/views/popolo/addresses/_address.html.erb +16 -0
- data/app/views/popolo/areas_or_organizations/_breadcrumb.html.erb +13 -0
- data/app/views/popolo/areas_or_organizations/_index.html.erb +2 -2
- data/app/views/popolo/areas_or_organizations/_show.html.erb +3 -15
- data/app/views/popolo/organizations/post.html.erb +27 -0
- data/app/views/popolo/organizations/posts.html.erb +23 -0
- data/config/routes.rb +3 -0
- data/lib/popolo/mixins/sluggable.rb +2 -0
- data/lib/popolo/version.rb +1 -1
- data/spec/controllers/popolo/areas_controller_spec.rb +0 -6
- data/spec/controllers/popolo/organizations_controller_spec.rb +17 -6
- data/spec/controllers/popolo/posts_controller_spec.rb +0 -6
- data/spec/dummy/log/test.log +13753 -0
- data/spec/factories.rb +1 -0
- data/spec/models/popolo/post_spec.rb +3 -1
- data/spec/routing/popolo/areas_routing_spec.rb +0 -4
- data/spec/routing/popolo/organizations_routing_spec.rb +8 -4
- data/spec/routing/popolo/posts_routing_spec.rb +0 -4
- metadata +6 -2
data/README.md
CHANGED
@@ -18,17 +18,19 @@ First, create your Rails application:
|
|
18
18
|
|
19
19
|
rails new myapp --skip-active-record
|
20
20
|
|
21
|
-
Add the `popolo` gem to your `Gemfile
|
21
|
+
Add the `popolo` gem to your `Gemfile` and bundle your dependencies:
|
22
22
|
|
23
23
|
gem 'popolo'
|
24
|
+
bundle
|
24
25
|
|
25
26
|
If you didn't run `rails new` with the `--skip-active-record` option, follow Mongoid's [installation instructions](http://mongoid.org/en/mongoid/docs/installation.html). Otherwise:
|
26
27
|
|
27
28
|
rails generate mongoid:config
|
28
29
|
|
29
|
-
Finally, run the `popolo` generator:
|
30
|
+
Finally, run the `popolo` generator and create the MongoDB indexes:
|
30
31
|
|
31
32
|
rails generate popolo
|
33
|
+
bundle exec rake db:mongoid:create_indexes
|
32
34
|
|
33
35
|
## Bugs? Questions?
|
34
36
|
|
@@ -7,20 +7,15 @@ module Popolo
|
|
7
7
|
|
8
8
|
respond_to :html, :json
|
9
9
|
actions :index, :show
|
10
|
-
custom_actions collection: :nested_index, resource: :nested_show
|
10
|
+
custom_actions collection: :nested_index, resource: [:nested_show, :posts, :post]
|
11
11
|
|
12
|
-
before_filter :validate_path, only: [:nested_index, :nested_show]
|
12
|
+
before_filter :validate_path, only: [:nested_index, :nested_show, :posts, :post]
|
13
13
|
|
14
14
|
def index
|
15
15
|
@organizations = Organization.roots
|
16
16
|
index!
|
17
17
|
end
|
18
18
|
|
19
|
-
def show
|
20
|
-
@organization = Organization.find_by_slug_or_id(params[:id])
|
21
|
-
show!
|
22
|
-
end
|
23
|
-
|
24
19
|
def nested_index
|
25
20
|
@organizations = @organization.children
|
26
21
|
|
@@ -35,6 +30,14 @@ module Popolo
|
|
35
30
|
end
|
36
31
|
end
|
37
32
|
|
33
|
+
def posts
|
34
|
+
@posts = @organization.posts
|
35
|
+
end
|
36
|
+
|
37
|
+
def post
|
38
|
+
@post = Post.find_by(organization_id: @organization, slug: params[:id])
|
39
|
+
end
|
40
|
+
|
38
41
|
protected
|
39
42
|
|
40
43
|
# @raises [Mongoid::Errors::DocumentNotFound] if a resource is improperly nested
|
@@ -10,18 +10,18 @@ module Popolo
|
|
10
10
|
# The postal address.
|
11
11
|
field :address, type: String
|
12
12
|
# A voice telephone number.
|
13
|
-
field :voice, type:
|
13
|
+
field :voice, type: String
|
14
14
|
# A facsimile telephone number.
|
15
|
-
field :fax, type:
|
15
|
+
field :fax, type: String
|
16
16
|
# A mobile telephone number.
|
17
|
-
field :cell, type:
|
17
|
+
field :cell, type: String
|
18
18
|
# A toll-free telephone number.
|
19
|
-
field :tollfree, type:
|
19
|
+
field :tollfree, type: String
|
20
20
|
# A video conferencing telephone number.
|
21
|
-
field :video, type:
|
21
|
+
field :video, type: String
|
22
22
|
# A paging device telephone number.
|
23
|
-
field :pager, type:
|
23
|
+
field :pager, type: String
|
24
24
|
# A telecommunication device for people with hearing or speech difficulties.
|
25
|
-
field :textphone, type:
|
25
|
+
field :textphone, type: String
|
26
26
|
end
|
27
27
|
end
|
data/app/models/popolo/post.rb
CHANGED
@@ -4,12 +4,8 @@ module Popolo
|
|
4
4
|
class Post
|
5
5
|
include Mongoid::Document
|
6
6
|
|
7
|
-
def self.slug_source
|
8
|
-
:role
|
9
|
-
end
|
10
|
-
|
11
7
|
include Popolo::Sluggable
|
12
|
-
index({slug: 1}, unique: true)
|
8
|
+
index({slug: 1, organization_id: 1}, unique: true)
|
13
9
|
|
14
10
|
# An area related to the post, e.g. an electoral riding.
|
15
11
|
belongs_to :area, index: true, class_name: 'Popolo::Area'
|
@@ -20,6 +16,10 @@ module Popolo
|
|
20
16
|
# The address at which the post is based.
|
21
17
|
embeds_many :addresses, as: :addressable, class_name: 'Popolo::Address'
|
22
18
|
|
23
|
-
|
19
|
+
# The role that the holder of the post fulfills. Roles should preferably
|
20
|
+
# belong to a controlled vocabulary.
|
21
|
+
field :role, type: String
|
22
|
+
|
23
|
+
validates_presence_of :role, :organization_id
|
24
24
|
end
|
25
25
|
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
<section>
|
2
|
+
<% if address.type? %>
|
3
|
+
<header>
|
4
|
+
<%=t address.type, default: address.type %>
|
5
|
+
</header>
|
6
|
+
<% end %>
|
7
|
+
<% if address.voice? %>
|
8
|
+
<p>Phone: <%= address.voice %></p>
|
9
|
+
<% end %>
|
10
|
+
<% if address.fax? %>
|
11
|
+
<p>Fax: <%= address.fax %></p>
|
12
|
+
<% end %>
|
13
|
+
<% if address.address? %>
|
14
|
+
<%= simple_format address.address %>
|
15
|
+
<% end %>
|
16
|
+
</section>
|
@@ -0,0 +1,13 @@
|
|
1
|
+
<nav>
|
2
|
+
<ul class="breadcrumb">
|
3
|
+
<li><%= link_to resource_collection_name.capitalize, collection_path %> <span class="divider">/</span></li>
|
4
|
+
<% ancestors = object.ancestors %>
|
5
|
+
<% ancestors.each_with_index do |ancestor,index| %>
|
6
|
+
<li>
|
7
|
+
<%= link_to ancestor.name, nested_resource_path(ancestors[0..index]) %>
|
8
|
+
<span class="divider">/</span>
|
9
|
+
</li>
|
10
|
+
<% end %>
|
11
|
+
<li class="active"><%= object.name %></li>
|
12
|
+
</ul>
|
13
|
+
</nav>
|
@@ -21,11 +21,11 @@
|
|
21
21
|
<header>
|
22
22
|
<h1><%= t(classification, scope: [:popolo, resource_collection_name, :classifications]) %></h1>
|
23
23
|
</header>
|
24
|
-
<
|
24
|
+
<ol>
|
25
25
|
<% documents.each do |document| %>
|
26
26
|
<li><%= link_to document.name, nested_resources_path([object, document].compact) %></li>
|
27
27
|
<% end %>
|
28
|
-
</
|
28
|
+
</ol>
|
29
29
|
</section>
|
30
30
|
<% end %>
|
31
31
|
<% end %>
|
@@ -1,16 +1,4 @@
|
|
1
|
-
|
2
|
-
<ul class="breadcrumb">
|
3
|
-
<li><%= link_to resource_collection_name.capitalize, collection_path %> <span class="divider">/</span></li>
|
4
|
-
<% ancestors = object.ancestors %>
|
5
|
-
<% ancestors.each_with_index do |ancestor,index| %>
|
6
|
-
<li>
|
7
|
-
<%= link_to ancestor.name, nested_resource_path(ancestors[0..index]) %>
|
8
|
-
<span class="divider">/</span>
|
9
|
-
</li>
|
10
|
-
<% end %>
|
11
|
-
<li class="active"><%= object.name %></li>
|
12
|
-
</ul>
|
13
|
-
</nav>
|
1
|
+
<%= render partial: 'popolo/areas_or_organizations/breadcrumb', locals: {object: object} %>
|
14
2
|
|
15
3
|
<% collection = object.children %>
|
16
4
|
<% unless collection.empty? %>
|
@@ -20,11 +8,11 @@
|
|
20
8
|
<header>
|
21
9
|
<h1><%= t(classification, scope: [:popolo, resource_collection_name, :classifications]) %></h1>
|
22
10
|
</header>
|
23
|
-
<
|
11
|
+
<ol>
|
24
12
|
<% documents.each do |document| %>
|
25
13
|
<li><%= link_to document.name, nested_resource_path([object, document]) %></li>
|
26
14
|
<% end %>
|
27
|
-
</
|
15
|
+
</ol>
|
28
16
|
</section>
|
29
17
|
<% end %>
|
30
18
|
<% end %>
|
@@ -0,0 +1,27 @@
|
|
1
|
+
<%= render partial: 'popolo/areas_or_organizations/breadcrumb', locals: {object: @organization} %>
|
2
|
+
|
3
|
+
<section>
|
4
|
+
<div class="media">
|
5
|
+
<% if @post.person && @post.person.image? %>
|
6
|
+
<span class="pull-left">
|
7
|
+
<%= image_tag(@post.person.image, class: 'media-object') %>
|
8
|
+
</span>
|
9
|
+
<% end %>
|
10
|
+
<div class="media-body">
|
11
|
+
<h4 class="media-heading"><%= @post.name %></h4>
|
12
|
+
<% if @post.person %>
|
13
|
+
<%= @post.person.name %>
|
14
|
+
<% end %>
|
15
|
+
</div>
|
16
|
+
</div>
|
17
|
+
<% if @post.person && @post.person.summary? %>
|
18
|
+
<p><%= @post.person.summary %></p>
|
19
|
+
<% end %>
|
20
|
+
|
21
|
+
<aside>
|
22
|
+
<% if @post.person && @post.person.email? %>
|
23
|
+
<p>Email: <%= mail_to @post.person.email %></p>
|
24
|
+
<% end %>
|
25
|
+
<%= render @post.addresses %>
|
26
|
+
</aside>
|
27
|
+
</section>
|
@@ -0,0 +1,23 @@
|
|
1
|
+
<%= render partial: 'popolo/areas_or_organizations/breadcrumb', locals: {object: @organization} %>
|
2
|
+
|
3
|
+
<section>
|
4
|
+
<h1><%= @organization.name %></h1>
|
5
|
+
|
6
|
+
<ol class="media-list">
|
7
|
+
<% @posts.asc(:sort_name).each do |post| %>
|
8
|
+
<li class="media">
|
9
|
+
<% if post.person && post.person.image? %>
|
10
|
+
<span class="pull-left">
|
11
|
+
<%= image_tag(post.person.image, class: 'image-object') %>
|
12
|
+
</span>
|
13
|
+
<% end %>
|
14
|
+
<div class="media-body">
|
15
|
+
<h4 class="media-heading"><%= link_to post.name, nested_organization_post_path(@organization.ancestors_and_self, post) %></h4>
|
16
|
+
<% if post.person %>
|
17
|
+
<%= post.person.name %>
|
18
|
+
<% end %>
|
19
|
+
</div>
|
20
|
+
</li>
|
21
|
+
<% end %>
|
22
|
+
</ol>
|
23
|
+
</section>
|
data/config/routes.rb
CHANGED
@@ -6,7 +6,10 @@ Popolo::Engine.routes.draw do
|
|
6
6
|
|
7
7
|
match 'areas/*path/areas' => 'areas#nested_index', as: 'nested_areas'
|
8
8
|
match 'areas/*path' => 'areas#nested_show', as: 'nested_area'
|
9
|
+
|
9
10
|
match 'organizations/*path/organizations' => 'organizations#nested_index', as: 'nested_organizations'
|
11
|
+
match 'organizations/*path/posts/:id' => 'organizations#post', as: 'nested_organization_post'
|
12
|
+
match 'organizations/*path/posts' => 'organizations#posts', as: 'nested_organization_posts'
|
10
13
|
match 'organizations/*path' => 'organizations#nested_show', as: 'nested_organization'
|
11
14
|
|
12
15
|
# A host application will sometimes complain about a missing `root_path`, even
|
data/lib/popolo/version.rb
CHANGED
@@ -25,12 +25,6 @@ describe Popolo::AreasController do
|
|
25
25
|
assigns(:area).should == @area
|
26
26
|
response.should be_success
|
27
27
|
end
|
28
|
-
|
29
|
-
it 'gets the requested area by slug' do
|
30
|
-
get :show, id: @area.slug
|
31
|
-
assigns(:area).should == @area
|
32
|
-
response.should be_success
|
33
|
-
end
|
34
28
|
end
|
35
29
|
|
36
30
|
describe 'GET nested_index' do
|
@@ -9,6 +9,7 @@ describe Popolo::OrganizationsController do
|
|
9
9
|
@xyz = @organization.children.create name: 'XYZ, Inc.'
|
10
10
|
@department = @xyz.children.create name: "Marketing Department"
|
11
11
|
@branch = @department.children.create name: "Youth Branch"
|
12
|
+
@post = FactoryGirl.create :post, organization: @xyz
|
12
13
|
end
|
13
14
|
|
14
15
|
describe 'GET index' do
|
@@ -25,12 +26,6 @@ describe Popolo::OrganizationsController do
|
|
25
26
|
assigns(:organization).should == @organization
|
26
27
|
response.should be_success
|
27
28
|
end
|
28
|
-
|
29
|
-
it 'gets the requested organization by slug' do
|
30
|
-
get :show, id: @organization.slug
|
31
|
-
assigns(:organization).should == @organization
|
32
|
-
response.should be_success
|
33
|
-
end
|
34
29
|
end
|
35
30
|
|
36
31
|
describe 'GET nested_index' do
|
@@ -56,4 +51,20 @@ describe Popolo::OrganizationsController do
|
|
56
51
|
expect {get :nested_show, path: 'acme-corporation/abc-inc/marketing-department'}.to raise_error(Mongoid::Errors::DocumentNotFound)
|
57
52
|
end
|
58
53
|
end
|
54
|
+
|
55
|
+
describe 'GET posts' do
|
56
|
+
it 'assigns the requested posts as @posts' do
|
57
|
+
get :posts, path: 'acme-corporation/xyz-inc'
|
58
|
+
assigns(:posts).to_a.should == [@post]
|
59
|
+
response.should be_success
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
describe 'GET post' do
|
64
|
+
it 'assigns the requested post as @post' do
|
65
|
+
get :post, path: 'acme-corporation/xyz-inc', id: 'marketing-director'
|
66
|
+
assigns(:post).should == @post
|
67
|
+
response.should be_success
|
68
|
+
end
|
69
|
+
end
|
59
70
|
end
|
@@ -20,11 +20,5 @@ describe Popolo::PostsController do
|
|
20
20
|
assigns(:post).should == @post
|
21
21
|
response.should be_success
|
22
22
|
end
|
23
|
-
|
24
|
-
it 'gets the requested post by slug' do
|
25
|
-
get :show, id: @post.slug
|
26
|
-
assigns(:post).should == @post
|
27
|
-
response.should be_success
|
28
|
-
end
|
29
23
|
end
|
30
24
|
end
|