popolo 0.0.2 → 0.0.3
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.
- checksums.yaml +7 -0
- data/README.md +65 -7
- data/app/assets/javascripts/popolo.js +1 -0
- data/app/assets/stylesheets/popolo/bootstrap.min.scss +7 -0
- data/app/assets/stylesheets/popolo/main.css.scss +14 -0
- data/app/assets/stylesheets/popolo.css +3 -0
- data/app/controllers/popolo/memberships_controller.rb +7 -0
- data/app/controllers/popolo/organizations_controller.rb +0 -39
- data/app/controllers/popolo/people_controller.rb +1 -6
- data/app/controllers/popolo/posts_controller.rb +1 -1
- data/app/helpers/popolo_helper.rb +0 -8
- data/app/models/popolo/area.rb +20 -12
- data/app/models/popolo/contact_detail.rb +22 -0
- data/app/models/popolo/count.rb +24 -0
- data/app/models/popolo/date_string.rb +23 -0
- data/app/models/popolo/group_result.rb +15 -0
- data/app/models/popolo/identifier.rb +1 -1
- data/app/models/popolo/link.rb +7 -3
- data/app/models/popolo/membership.rb +34 -9
- data/app/models/popolo/motion.rb +37 -0
- data/app/models/popolo/organization.rb +37 -16
- data/app/models/popolo/other_name.rb +5 -5
- data/app/models/popolo/person.rb +57 -27
- data/app/models/popolo/post.rb +27 -13
- data/app/models/popolo/vote.rb +28 -0
- data/app/models/popolo/vote_event.rb +35 -0
- data/app/views/popolo/contact_details/_contact_detail.html.erb +17 -0
- data/app/views/popolo/identifiers/_identifier.html.erb +2 -0
- data/app/views/popolo/links/_link.html.erb +1 -0
- data/app/views/popolo/memberships/show.html.erb +81 -0
- data/app/views/popolo/organizations/index.html.erb +16 -1
- data/app/views/popolo/organizations/show.html.erb +146 -1
- data/app/views/popolo/other_names/other_name.html.erb +9 -0
- data/app/views/popolo/people/show.html.erb +120 -0
- data/app/views/popolo/posts/show.html.erb +90 -0
- data/config/routes.rb +4 -12
- data/lib/generators/popolo_generator.rb +4 -0
- data/lib/popolo/initializers/pupa_compat.rb +11 -0
- data/lib/popolo/version.rb +1 -1
- data/lib/popolo.rb +17 -5
- data/spec/controllers/popolo/memberships_controller_spec.rb +16 -0
- data/spec/controllers/popolo/organizations_controller_spec.rb +1 -47
- data/spec/controllers/popolo/people_controller_spec.rb +0 -14
- data/spec/controllers/popolo/posts_controller_spec.rb +0 -8
- data/spec/dummy/app/assets/stylesheets/application.css +1 -0
- data/spec/dummy/app/models/cat.rb +0 -3
- data/spec/dummy/app/models/dog.rb +0 -7
- data/spec/dummy/app/views/layouts/application.html.erb +2 -0
- data/spec/dummy/config/locales/en.yml +30 -0
- data/spec/dummy/config/routes.rb +1 -1
- data/spec/dummy/log/test.log +8670 -48801
- data/spec/factories.rb +3 -8
- data/spec/models/popolo/{source_spec.rb → contact_detail_spec.rb} +2 -2
- data/spec/models/popolo/count_spec.rb +7 -0
- data/spec/models/popolo/date_string_spec.rb +121 -0
- data/spec/models/popolo/group_result_spec.rb +7 -0
- data/spec/models/popolo/membership_spec.rb +1 -17
- data/spec/models/popolo/motion_spec.rb +5 -0
- data/spec/models/popolo/organization_spec.rb +1 -19
- data/spec/models/popolo/other_name_spec.rb +1 -17
- data/spec/models/popolo/person_spec.rb +23 -19
- data/spec/models/popolo/post_spec.rb +1 -3
- data/spec/models/popolo/vote_event_spec.rb +4 -0
- data/spec/models/popolo/vote_spec.rb +4 -0
- data/spec/popolo_spec.rb +65 -0
- data/spec/routing/popolo/memberships_routing_spec.rb +11 -0
- data/spec/routing/popolo/organizations_routing_spec.rb +1 -19
- data/spec/routing/popolo/people_routing_spec.rb +1 -11
- data/spec/routing/popolo/posts_routing_spec.rb +1 -7
- data/spec/spec_helper.rb +6 -1
- data/spec/support/shared_examples.rb +19 -0
- metadata +99 -109
- data/app/assets/javascripts/popolo/application.js +0 -13
- data/app/assets/stylesheets/popolo/application.css +0 -13
- data/app/controllers/popolo/areas_controller.rb +0 -43
- data/app/models/popolo/address.rb +0 -27
- data/app/models/popolo/event.rb +0 -46
- data/app/models/popolo/source.rb +0 -29
- data/app/views/popolo/addresses/_address.html.erb +0 -16
- data/app/views/popolo/areas/index.html.erb +0 -1
- data/app/views/popolo/areas/show.html.erb +0 -1
- data/app/views/popolo/areas_or_organizations/_breadcrumb.html.erb +0 -13
- data/app/views/popolo/areas_or_organizations/_index.html.erb +0 -31
- data/app/views/popolo/areas_or_organizations/_show.html.erb +0 -18
- data/app/views/popolo/organizations/post.html.erb +0 -27
- data/app/views/popolo/organizations/posts.html.erb +0 -23
- data/app/views/popolo/people/index.html.erb +0 -0
- data/app/views/popolo/posts/index.html.erb +0 -0
- data/lib/popolo/mixins/eventable.rb +0 -15
- data/lib/popolo/mixins/sluggable.rb +0 -66
- data/spec/controllers/popolo/areas_controller_spec.rb +0 -53
- data/spec/dummy/log/development.log +0 -6
- data/spec/models/popolo/address_spec.rb +0 -4
- data/spec/models/popolo/event_spec.rb +0 -7
- data/spec/popolo/mixins/sluggable_spec.rb +0 -153
- data/spec/routing/popolo/areas_routing_spec.rb +0 -25
data/app/models/popolo/link.rb
CHANGED
|
@@ -1,16 +1,20 @@
|
|
|
1
1
|
module Popolo
|
|
2
|
-
# A URL
|
|
2
|
+
# A URL.
|
|
3
3
|
class Link
|
|
4
4
|
include Mongoid::Document
|
|
5
5
|
|
|
6
|
-
embedded_in :
|
|
6
|
+
embedded_in :linkable, polymorphic: true
|
|
7
7
|
|
|
8
|
-
# A URL
|
|
8
|
+
# A URL.
|
|
9
9
|
field :url, type: String
|
|
10
10
|
# A note, e.g. 'Wikipedia page'.
|
|
11
11
|
field :note, type: String
|
|
12
12
|
|
|
13
13
|
validates_presence_of :url
|
|
14
14
|
# @note Add URL validation to match JSON Schema?
|
|
15
|
+
|
|
16
|
+
def to_s
|
|
17
|
+
note || url
|
|
18
|
+
end
|
|
15
19
|
end
|
|
16
20
|
end
|
|
@@ -2,24 +2,49 @@ module Popolo
|
|
|
2
2
|
# A relationship between a person and an organization.
|
|
3
3
|
class Membership
|
|
4
4
|
include Mongoid::Document
|
|
5
|
+
include Mongoid::Timestamps
|
|
5
6
|
|
|
6
|
-
|
|
7
|
+
store_in Popolo.storage_options_per_class.fetch(:Membership, Popolo.storage_options)
|
|
8
|
+
|
|
9
|
+
# The geographic area to which the membership is related.
|
|
7
10
|
belongs_to :area, index: true, class_name: 'Popolo::Area'
|
|
8
11
|
# The person who is a party to the relationship.
|
|
9
|
-
belongs_to :organization, index: true, class_name: 'Popolo::Organization'
|
|
10
|
-
# The organization that is a party to the relationship.
|
|
11
12
|
belongs_to :person, index: true, class_name: 'Popolo::Person'
|
|
13
|
+
# The organization that is a party to the relationship.
|
|
14
|
+
belongs_to :organization, index: true, class_name: 'Popolo::Organization'
|
|
15
|
+
# The organization on whose behalf the person is a party to the relationship.
|
|
16
|
+
belongs_to :on_behalf_of, index: true, class_name: 'Popolo::Organization'
|
|
17
|
+
# The post held by the person in the organization through this membership.
|
|
18
|
+
belongs_to :post, index: true, class_name: 'Popolo::Post'
|
|
19
|
+
# Means of contacting the person who is a party to the relationship.
|
|
20
|
+
embeds_many :contact_details, as: :contactable, class_name: 'Popolo::ContactDetail'
|
|
21
|
+
# URLs to documents about the membership.
|
|
22
|
+
embeds_many :links, as: :linkable, class_name: 'Popolo::Link'
|
|
23
|
+
# URLs to documents from which the membership is derived.
|
|
24
|
+
embeds_many :sources, as: :linkable, class_name: 'Popolo::Link'
|
|
12
25
|
|
|
13
|
-
#
|
|
14
|
-
|
|
26
|
+
# A label describing the membership.
|
|
27
|
+
field :label, type: String
|
|
28
|
+
# The role that the person fulfills in the organization.
|
|
15
29
|
field :role, type: String
|
|
16
30
|
# The date on which the relationship began.
|
|
17
|
-
field :start_date, type:
|
|
31
|
+
field :start_date, type: DateString
|
|
18
32
|
# The date on which the relationship ended.
|
|
19
|
-
field :end_date, type:
|
|
33
|
+
field :end_date, type: DateString
|
|
20
34
|
|
|
21
35
|
validates_presence_of :organization_id, :person_id
|
|
22
|
-
validates_format_of :start_date, with:
|
|
23
|
-
validates_format_of :end_date, with:
|
|
36
|
+
validates_format_of :start_date, with: DATE_STRING_FORMAT, allow_blank: true
|
|
37
|
+
validates_format_of :end_date, with: DATE_STRING_FORMAT, allow_blank: true
|
|
38
|
+
|
|
39
|
+
def to_s(options = {})
|
|
40
|
+
label || case options[:format]
|
|
41
|
+
when :person
|
|
42
|
+
person.to_s
|
|
43
|
+
when :organization
|
|
44
|
+
organization.to_s
|
|
45
|
+
else
|
|
46
|
+
"#{organization.to_s} / #{person.to_s}"
|
|
47
|
+
end
|
|
48
|
+
end
|
|
24
49
|
end
|
|
25
50
|
end
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
module Popolo
|
|
2
|
+
# A formal step to introduce a matter for consideration by an organization.
|
|
3
|
+
class Motion
|
|
4
|
+
include Mongoid::Document
|
|
5
|
+
include Mongoid::Timestamps
|
|
6
|
+
|
|
7
|
+
store_in Popolo.storage_options_per_class.fetch(:Motion, Popolo.storage_options)
|
|
8
|
+
|
|
9
|
+
# The organization in which the motion is proposed.
|
|
10
|
+
belongs_to :organization, class_name: 'Popolo::Organization'
|
|
11
|
+
# The legislative session in which the motion is proposed.
|
|
12
|
+
# @todo belongs to :legislative_session, class_name: 'Popolo::Event'
|
|
13
|
+
# The person who proposed the motion.
|
|
14
|
+
belongs_to :creator, class_name: 'Popolo::Person'
|
|
15
|
+
# Events at which people vote on the motion.
|
|
16
|
+
has_many :vote_events, class_name: 'Popolo::VoteEvent', dependent: :destroy
|
|
17
|
+
# URLs to documents from which the motion is derived.
|
|
18
|
+
embeds_many :sources, as: :linkable, class_name: 'Popolo::Link'
|
|
19
|
+
|
|
20
|
+
# The transcript or text of the motion.
|
|
21
|
+
field :text, type: String
|
|
22
|
+
# A motion category, e.g. adjournment.
|
|
23
|
+
field :classification, type: String
|
|
24
|
+
# The date on which the motion was proposed.
|
|
25
|
+
field :date, type: DateString
|
|
26
|
+
# The requirement for the motion to be adopted.
|
|
27
|
+
field :requirement, type: String
|
|
28
|
+
# The result of the motion.
|
|
29
|
+
field :result, type: String
|
|
30
|
+
|
|
31
|
+
validates_format_of :date, with: DATE_STRING_FORMAT, allow_blank: true
|
|
32
|
+
|
|
33
|
+
def to_s
|
|
34
|
+
text.to_s[0...140]
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
@@ -1,32 +1,53 @@
|
|
|
1
1
|
module Popolo
|
|
2
2
|
# A group with a common purpose or reason for existence that goes beyond the
|
|
3
|
-
# set of people belonging to it
|
|
3
|
+
# set of people belonging to it.
|
|
4
4
|
class Organization
|
|
5
5
|
include Mongoid::Document
|
|
6
|
+
include Mongoid::Timestamps
|
|
6
7
|
include Mongoid::Tree
|
|
7
8
|
|
|
8
|
-
|
|
9
|
-
index({slug: 1, parent_id: 1}, unique: true)
|
|
9
|
+
store_in Popolo.storage_options_per_class.fetch(:Organization, Popolo.storage_options)
|
|
10
10
|
|
|
11
|
-
#
|
|
11
|
+
# The geographic area to which the organization is related.
|
|
12
12
|
belongs_to :area, index: true, class_name: 'Popolo::Area'
|
|
13
13
|
# The relationships to which the organization is a party.
|
|
14
|
-
has_many :memberships, class_name: 'Popolo::Membership', dependent: :destroy
|
|
15
|
-
# The
|
|
14
|
+
has_many :memberships, class_name: 'Popolo::Membership', dependent: :destroy, inverse_of: :organization
|
|
15
|
+
# The organization in which the motion is proposed.
|
|
16
|
+
has_many :motions, class_name: 'Popolo::Motion', dependent: :destroy
|
|
17
|
+
# Posts within the organization.
|
|
16
18
|
has_many :posts, class_name: 'Popolo::Post', dependent: :destroy
|
|
17
|
-
# The organization
|
|
19
|
+
# The organization whose members are voting.
|
|
20
|
+
has_many :vote_events, class_name: 'Popolo::VoteEvent', dependent: :destroy
|
|
21
|
+
# The organization that is voting.
|
|
22
|
+
has_many :votes, as: :voter, class_name: 'Popolo::Vote'
|
|
23
|
+
# Alternate or former names.
|
|
18
24
|
embeds_many :other_names, as: :nameable, class_name: 'Popolo::OtherName'
|
|
19
|
-
#
|
|
20
|
-
embeds_many :identifiers, class_name: 'Popolo::Identifier'
|
|
25
|
+
# Issued identifiers.
|
|
26
|
+
embeds_many :identifiers, as: :identifiable, class_name: 'Popolo::Identifier'
|
|
27
|
+
# Means of contacting the organization.
|
|
28
|
+
embeds_many :contact_details, as: :contactable, class_name: 'Popolo::ContactDetail'
|
|
29
|
+
# URLs to documents about the organization.
|
|
30
|
+
embeds_many :links, as: :linkable, class_name: 'Popolo::Link'
|
|
31
|
+
# URLs to documents from which the organization is derived.
|
|
32
|
+
embeds_many :sources, as: :linkable, class_name: 'Popolo::Link'
|
|
21
33
|
|
|
22
|
-
#
|
|
34
|
+
# A primary name, e.g. a legally recognized name.
|
|
35
|
+
field :name, type: String
|
|
36
|
+
# An organization category, e.g. committee.
|
|
23
37
|
field :classification, type: String
|
|
24
|
-
#
|
|
25
|
-
field :founding_date, type:
|
|
26
|
-
#
|
|
27
|
-
field :dissolution_date, type:
|
|
38
|
+
# A date of founding.
|
|
39
|
+
field :founding_date, type: DateString
|
|
40
|
+
# A date of dissolution.
|
|
41
|
+
field :dissolution_date, type: DateString
|
|
42
|
+
# A URL of an image.
|
|
43
|
+
field :image, type: String
|
|
28
44
|
|
|
29
|
-
validates_format_of :founding_date, with:
|
|
30
|
-
validates_format_of :dissolution_date, with:
|
|
45
|
+
validates_format_of :founding_date, with: DATE_STRING_FORMAT, allow_blank: true
|
|
46
|
+
validates_format_of :dissolution_date, with: DATE_STRING_FORMAT, allow_blank: true
|
|
47
|
+
# @note Add URL validation to match JSON Schema?
|
|
48
|
+
|
|
49
|
+
def to_s
|
|
50
|
+
name
|
|
51
|
+
end
|
|
31
52
|
end
|
|
32
53
|
end
|
|
@@ -8,14 +8,14 @@ module Popolo
|
|
|
8
8
|
# An alternate or former name.
|
|
9
9
|
field :name, type: String
|
|
10
10
|
# The date on which the name was adopted.
|
|
11
|
-
field :start_date, type:
|
|
11
|
+
field :start_date, type: DateString
|
|
12
12
|
# The date on which the name was abandoned.
|
|
13
|
-
field :end_date, type:
|
|
14
|
-
# A note, e.g.
|
|
13
|
+
field :end_date, type: DateString
|
|
14
|
+
# A note, e.g. 'Birth name'.
|
|
15
15
|
field :note, type: String
|
|
16
16
|
|
|
17
17
|
validates_presence_of :name
|
|
18
|
-
validates_format_of :start_date, with:
|
|
19
|
-
validates_format_of :end_date, with:
|
|
18
|
+
validates_format_of :start_date, with: DATE_STRING_FORMAT, allow_blank: true
|
|
19
|
+
validates_format_of :end_date, with: DATE_STRING_FORMAT, allow_blank: true
|
|
20
20
|
end
|
|
21
21
|
end
|
data/app/models/popolo/person.rb
CHANGED
|
@@ -2,48 +2,78 @@ module Popolo
|
|
|
2
2
|
# A real person, alive or dead.
|
|
3
3
|
class Person
|
|
4
4
|
include Mongoid::Document
|
|
5
|
+
include Mongoid::Timestamps
|
|
5
6
|
|
|
6
|
-
|
|
7
|
-
index({slug: 1}, unique: true)
|
|
7
|
+
store_in Popolo.storage_options_per_class.fetch(:Person, Popolo.storage_options)
|
|
8
8
|
|
|
9
9
|
# The relationships to which the person is a party.
|
|
10
|
-
has_many :memberships, class_name: 'Popolo::Membership'
|
|
11
|
-
# The
|
|
12
|
-
has_many :
|
|
13
|
-
# The person
|
|
10
|
+
has_many :memberships, class_name: 'Popolo::Membership', dependent: :destroy
|
|
11
|
+
# The person who proposed the motion.
|
|
12
|
+
has_many :motions, class_name: 'Popolo::Motion'
|
|
13
|
+
# The person that is voting.
|
|
14
|
+
has_many :votes, as: :voter, class_name: 'Popolo::Vote'
|
|
15
|
+
# Alternate or former names.
|
|
14
16
|
embeds_many :other_names, as: :nameable, class_name: 'Popolo::OtherName'
|
|
15
|
-
#
|
|
16
|
-
|
|
17
|
-
|
|
17
|
+
# Issued identifiers.
|
|
18
|
+
embeds_many :identifiers, as: :identifiable, class_name: 'Popolo::Identifier'
|
|
19
|
+
# Means of contacting the person.
|
|
20
|
+
embeds_many :contact_details, as: :contactable, class_name: 'Popolo::ContactDetail'
|
|
21
|
+
# URLs to documents about the person.
|
|
22
|
+
embeds_many :links, as: :linkable, class_name: 'Popolo::Link'
|
|
23
|
+
# URLs to documents from which the person is derived.
|
|
24
|
+
embeds_many :sources, as: :linkable, class_name: 'Popolo::Link'
|
|
18
25
|
|
|
19
|
-
#
|
|
26
|
+
# A person's preferred full name.
|
|
27
|
+
field :name, type: String
|
|
28
|
+
# One or more family names.
|
|
20
29
|
field :family_name, type: String
|
|
21
|
-
#
|
|
30
|
+
# One or more primary given names.
|
|
22
31
|
field :given_name, type: String
|
|
23
|
-
#
|
|
32
|
+
# One or more secondary given names.
|
|
24
33
|
field :additional_name, type: String
|
|
25
|
-
#
|
|
34
|
+
# One or more honorifics preceding a person's name.
|
|
26
35
|
field :honorific_prefix, type: String
|
|
27
|
-
#
|
|
36
|
+
# One or more honorifics following a person's name.
|
|
28
37
|
field :honorific_suffix, type: String
|
|
29
|
-
#
|
|
38
|
+
# One or more patronymic names.
|
|
39
|
+
field :patronymic_name, type: String
|
|
40
|
+
# A name to use in an lexicographically ordered list.
|
|
41
|
+
field :sort_name, type: String
|
|
42
|
+
# A preferred email address.
|
|
30
43
|
field :email, type: String
|
|
31
|
-
#
|
|
44
|
+
# A gender.
|
|
32
45
|
field :gender, type: String
|
|
33
|
-
#
|
|
34
|
-
field :birth_date, type:
|
|
35
|
-
#
|
|
36
|
-
field :death_date, type:
|
|
37
|
-
#
|
|
46
|
+
# A date of birth.
|
|
47
|
+
field :birth_date, type: DateString
|
|
48
|
+
# A date of death.
|
|
49
|
+
field :death_date, type: DateString
|
|
50
|
+
# A URL of a head shot.
|
|
38
51
|
field :image, type: String
|
|
39
|
-
#
|
|
52
|
+
# A one-line account of a person's life.
|
|
40
53
|
field :summary, type: String
|
|
41
|
-
#
|
|
54
|
+
# An extended account of a person's life.
|
|
42
55
|
field :biography, type: String
|
|
56
|
+
# A national identity.
|
|
57
|
+
field :national_identity, type: String
|
|
43
58
|
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
59
|
+
validates_format_of :birth_date, with: DATE_STRING_FORMAT, allow_blank: true
|
|
60
|
+
validates_format_of :death_date, with: DATE_STRING_FORMAT, allow_blank: true
|
|
61
|
+
# @note Add email address validation and URL validation to match JSON Schema?
|
|
62
|
+
|
|
63
|
+
def to_s
|
|
64
|
+
if name.blank?
|
|
65
|
+
if given_name.present? && family_name.present?
|
|
66
|
+
"#{given_name} #{family_name}"
|
|
67
|
+
elsif given_name.present?
|
|
68
|
+
given_name
|
|
69
|
+
elsif family_name.present?
|
|
70
|
+
family_name
|
|
71
|
+
else
|
|
72
|
+
name
|
|
73
|
+
end
|
|
74
|
+
else
|
|
75
|
+
name
|
|
76
|
+
end
|
|
77
|
+
end
|
|
48
78
|
end
|
|
49
79
|
end
|
data/app/models/popolo/post.rb
CHANGED
|
@@ -1,25 +1,39 @@
|
|
|
1
1
|
module Popolo
|
|
2
|
-
# A position
|
|
3
|
-
# holding it.
|
|
2
|
+
# A position that exists independent of the person holding it.
|
|
4
3
|
class Post
|
|
5
4
|
include Mongoid::Document
|
|
5
|
+
include Mongoid::Timestamps
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
index({slug: 1, organization_id: 1}, unique: true)
|
|
7
|
+
store_in Popolo.storage_options_per_class.fetch(:Post, Popolo.storage_options)
|
|
9
8
|
|
|
10
|
-
#
|
|
9
|
+
# The geographic area to which the post is related.
|
|
11
10
|
belongs_to :area, index: true, class_name: 'Popolo::Area'
|
|
12
|
-
# The organization in which the post
|
|
11
|
+
# The organization in which the post is held.
|
|
13
12
|
belongs_to :organization, index: true, class_name: 'Popolo::Organization'
|
|
14
|
-
# The
|
|
15
|
-
|
|
16
|
-
#
|
|
17
|
-
embeds_many :
|
|
13
|
+
# The memberships through which people hold the post in the organization.
|
|
14
|
+
has_many :memberships, class_name: 'Popolo::Membership'
|
|
15
|
+
# Means of contacting the holder of the post.
|
|
16
|
+
embeds_many :contact_details, as: :contactable, class_name: 'Popolo::ContactDetail'
|
|
17
|
+
# URLs to documents about the post.
|
|
18
|
+
embeds_many :links, as: :linkable, class_name: 'Popolo::Link'
|
|
19
|
+
# URLs to documents from which the post is derived.
|
|
20
|
+
embeds_many :sources, as: :linkable, class_name: 'Popolo::Link'
|
|
18
21
|
|
|
19
|
-
#
|
|
20
|
-
|
|
22
|
+
# A label describing the post.
|
|
23
|
+
field :label, type: String
|
|
24
|
+
# The function that the holder of the post fulfills.
|
|
21
25
|
field :role, type: String
|
|
26
|
+
# The date on which the post was created.
|
|
27
|
+
field :start_date, type: DateString
|
|
28
|
+
# The date on which the post was eliminated.
|
|
29
|
+
field :end_date, type: DateString
|
|
22
30
|
|
|
23
|
-
validates_presence_of :
|
|
31
|
+
validates_presence_of :organization_id
|
|
32
|
+
validates_format_of :start_date, with: DATE_STRING_FORMAT, allow_blank: true
|
|
33
|
+
validates_format_of :end_date, with: DATE_STRING_FORMAT, allow_blank: true
|
|
34
|
+
|
|
35
|
+
def to_s
|
|
36
|
+
label
|
|
37
|
+
end
|
|
24
38
|
end
|
|
25
39
|
end
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
module Popolo
|
|
2
|
+
# A voter's vote in a vote event.
|
|
3
|
+
class Vote
|
|
4
|
+
include Mongoid::Document
|
|
5
|
+
|
|
6
|
+
store_in Popolo.storage_options_per_class.fetch(:Vote, Popolo.storage_options)
|
|
7
|
+
|
|
8
|
+
# A vote event.
|
|
9
|
+
belongs_to :vote_event, class_name: 'Popolo::VoteEvent'
|
|
10
|
+
# The person or organization that is voting.
|
|
11
|
+
belongs_to :voter, polymorphic: true
|
|
12
|
+
# The voter's primary political group.
|
|
13
|
+
belongs_to :group, class_name: 'Popolo::Organization'
|
|
14
|
+
# The person with whom the voter is paired.
|
|
15
|
+
belongs_to :pair, class_name: 'Popolo::Person'
|
|
16
|
+
|
|
17
|
+
# The option chosen by the voter, whether actively or passively.
|
|
18
|
+
field :option, type: String
|
|
19
|
+
# The voter's role in the event.
|
|
20
|
+
field :role, type: String
|
|
21
|
+
# The weight of the voter's vote.
|
|
22
|
+
field :weight, type: Float, default: 1.0
|
|
23
|
+
|
|
24
|
+
def to_s
|
|
25
|
+
"#{voter.name}: #{option}"
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
module Popolo
|
|
2
|
+
# An event at which people's votes are recorded.
|
|
3
|
+
class VoteEvent
|
|
4
|
+
include Mongoid::Document
|
|
5
|
+
include Mongoid::Timestamps
|
|
6
|
+
|
|
7
|
+
store_in Popolo.storage_options_per_class.fetch(:VoteEvent, Popolo.storage_options)
|
|
8
|
+
|
|
9
|
+
# The organization whose members are voting.
|
|
10
|
+
belongs_to :organization, class_name: 'Popolo::Organization'
|
|
11
|
+
# The legislative session in which the vote occurs.
|
|
12
|
+
# @todo belongs to :legislative_session, class_name: 'Popolo::Event'
|
|
13
|
+
# The motion being decided.
|
|
14
|
+
belongs_to :motion, class_name: 'Popolo::Motion'
|
|
15
|
+
# The result of the vote event within groups of voters.
|
|
16
|
+
embeds_many :group_results, class_name: 'Popolo::GroupResult'
|
|
17
|
+
# The number of votes for options.
|
|
18
|
+
has_many :counts, class_name: 'Popolo::Count', dependent: :destroy
|
|
19
|
+
# Voters' votes.
|
|
20
|
+
has_many :votes, class_name: 'Popolo::Vote', dependent: :destroy
|
|
21
|
+
|
|
22
|
+
# An issued identifier.
|
|
23
|
+
field :identifier, type: String
|
|
24
|
+
# The date on which the relationship began.
|
|
25
|
+
field :start_date, type: DateTime
|
|
26
|
+
# The date on which the relationship ended.
|
|
27
|
+
field :end_date, type: DateTime
|
|
28
|
+
# The result of the vote event.
|
|
29
|
+
field :result, type: String
|
|
30
|
+
|
|
31
|
+
def to_s
|
|
32
|
+
identifier
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
<dt>
|
|
2
|
+
<% if contact_detail.label? %>
|
|
3
|
+
<%= contact_detail.label %>
|
|
4
|
+
<% else %>
|
|
5
|
+
<%=t contact_detail.type, scope: [:popolo, :contact_details, :types], default: contact_detail.type %>
|
|
6
|
+
<% end %>
|
|
7
|
+
</dt>
|
|
8
|
+
<dd>
|
|
9
|
+
<% if contact_detail.type == 'email' %>
|
|
10
|
+
<%= mail_to contact_detail.value %>
|
|
11
|
+
<% else %>
|
|
12
|
+
<%= contact_detail.value %>
|
|
13
|
+
<% end %>
|
|
14
|
+
<% if contact_detail.note? %>
|
|
15
|
+
<span class="label label-info"><%= contact_detail.note %></span>
|
|
16
|
+
<% end %>
|
|
17
|
+
</dd>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<li><%= link_to link, link.url %></li>
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
<nav>
|
|
2
|
+
<ol class="breadcrumb">
|
|
3
|
+
<li><%= link_to Popolo::Organization.model_name.human(count: Float::INFINITY), organizations_path %></li>
|
|
4
|
+
<% @membership.organization.ancestors_and_self.each do |ancestor| %>
|
|
5
|
+
<li><%= link_to ancestor, ancestor %></li>
|
|
6
|
+
<% end %>
|
|
7
|
+
<li class="active"><%= @membership %></li>
|
|
8
|
+
</ol>
|
|
9
|
+
</nav>
|
|
10
|
+
|
|
11
|
+
<section>
|
|
12
|
+
<header class="page-header">
|
|
13
|
+
<div class="media">
|
|
14
|
+
<div class="media-body">
|
|
15
|
+
<h1 class="media-heading">
|
|
16
|
+
<%= @membership %>
|
|
17
|
+
</h1>
|
|
18
|
+
</div>
|
|
19
|
+
</div>
|
|
20
|
+
</header>
|
|
21
|
+
|
|
22
|
+
<dl>
|
|
23
|
+
<dt><%= Popolo::Membership.human_attribute_name(:organization) %></dt>
|
|
24
|
+
<dd><%= link_to @membership.organization, @membership.organization %></dd>
|
|
25
|
+
<dt><%= Popolo::Membership.human_attribute_name(:person) %></dt>
|
|
26
|
+
<dd><%= link_to @membership.person, @membership.person %></dd>
|
|
27
|
+
<% if @membership.on_behalf_of? %>
|
|
28
|
+
<dt><%= Popolo::Membership.human_attribute_name(:on_behalf_of) %></dt>
|
|
29
|
+
<dd><%= link_to @membership.on_behalf_of, @membership.on_behalf_of %></dd>
|
|
30
|
+
<% end %>
|
|
31
|
+
<% if @membership.post? %>
|
|
32
|
+
<dt><%= Popolo::Membership.human_attribute_name(:post) %></dt>
|
|
33
|
+
<dd><%= link_to @membership.post, @membership.post %></dd>
|
|
34
|
+
<% end %>
|
|
35
|
+
<% if @membership.role? %>
|
|
36
|
+
<dt><%= Popolo::Membership.human_attribute_name(:role) %></dt>
|
|
37
|
+
<dd><%= @membership.role %></dd>
|
|
38
|
+
<% end %>
|
|
39
|
+
<% if @membership.start_date? %>
|
|
40
|
+
<dt><%= Popolo::Membership.human_attribute_name(:start_date) %></dt>
|
|
41
|
+
<dd><%=l @membership.start_date %></dd>
|
|
42
|
+
<% end %>
|
|
43
|
+
<% if @membership.end_date? %>
|
|
44
|
+
<dt><%= Popolo::Membership.human_attribute_name(:end_date) %></dt>
|
|
45
|
+
<dd><%=l @membership.end_date %></dd>
|
|
46
|
+
<% end %>
|
|
47
|
+
</dl>
|
|
48
|
+
|
|
49
|
+
<aside>
|
|
50
|
+
<% unless @membership.contact_details.empty? %>
|
|
51
|
+
<section>
|
|
52
|
+
<header>
|
|
53
|
+
<h2><%= Popolo::ContactDetail.model_name.human(count: @membership.contact_details.size) %></h2>
|
|
54
|
+
</header>
|
|
55
|
+
<dl class="dl-horizontal">
|
|
56
|
+
<%= render @membership.contact_details %>
|
|
57
|
+
</dl>
|
|
58
|
+
</section>
|
|
59
|
+
<% end %>
|
|
60
|
+
<% unless @membership.links.empty? %>
|
|
61
|
+
<section>
|
|
62
|
+
<header>
|
|
63
|
+
<h2><%= Popolo::Link.model_name.human(count: @membership.links.size) %></h2>
|
|
64
|
+
</header>
|
|
65
|
+
<ul>
|
|
66
|
+
<%= render @membership.links %>
|
|
67
|
+
</ul>
|
|
68
|
+
</section>
|
|
69
|
+
<% end %>
|
|
70
|
+
<% unless @membership.sources.empty? %>
|
|
71
|
+
<section>
|
|
72
|
+
<header>
|
|
73
|
+
<h2><%=t 'popolo/source', count: @membership.sources.size, scope: [:popolo] %></h2>
|
|
74
|
+
</header>
|
|
75
|
+
<ul>
|
|
76
|
+
<%= render @membership.sources %>
|
|
77
|
+
</ul>
|
|
78
|
+
</section>
|
|
79
|
+
<% end %>
|
|
80
|
+
</aside>
|
|
81
|
+
</section>
|
|
@@ -1 +1,16 @@
|
|
|
1
|
-
|
|
1
|
+
<% @organizations.group_by(&:classification).each do |classification,organizations| %>
|
|
2
|
+
<section>
|
|
3
|
+
<header>
|
|
4
|
+
<h1>
|
|
5
|
+
<%=t classification, count: organizations.size, scope: [:popolo, :organizations, :classifications], default: classification %>
|
|
6
|
+
</h1>
|
|
7
|
+
</header>
|
|
8
|
+
<ol>
|
|
9
|
+
<% organizations.each do |organization| %>
|
|
10
|
+
<li>
|
|
11
|
+
<%= link_to organization, organization %>
|
|
12
|
+
</li>
|
|
13
|
+
<% end %>
|
|
14
|
+
</ol>
|
|
15
|
+
</section>
|
|
16
|
+
<% end %>
|