Skip to content

Commit

Permalink
Add publication_status to initiative (#99)
Browse files Browse the repository at this point in the history
* show publication status drop down, restrict results to only show published initiatives

* disable validation when saving in draft mode

* don't allow editing of archived initiatives

* only show published initiatives

* update schema

* if an initiative has been rejected then don't allow regular users to change the publication status

* fixed linting issues
  • Loading branch information
dereke authored Jan 15, 2021
1 parent cfa8926 commit 25ce9fd
Show file tree
Hide file tree
Showing 20 changed files with 184 additions and 51 deletions.
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -38,3 +38,5 @@ yarn-debug.log*

# these images are copied in at install time
/public/leaflet
*.dump
.envrc
2 changes: 1 addition & 1 deletion app/controllers/districts_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ class DistrictsController < ApplicationController
def show
@district = District.find(params['id'])
initiatives =
Initiative.includes(parish: %i[ward]).where(
Initiative.published.includes(parish: %i[ward]).where(
parishes: { wards: { district_id: @district.id } }
)
@map_data = MapData.new(initiatives)
Expand Down
2 changes: 1 addition & 1 deletion app/controllers/home_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ class HomeController < ApplicationController

def index
@initiatives_json = Initiative.approved.to_json
initiatives = Initiative.all
initiatives = Initiative.published
@map_data = MapData.new(initiatives)
@sectors = Sector.all
@districts = District.all
Expand Down
29 changes: 21 additions & 8 deletions app/controllers/initiatives_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,16 @@ class InitiativesController < ApplicationController
helper_method :can_edit?

def can_edit?(initiative)
initiative.owner == current_user
initiative.owner == current_user || current_user&.role == 'admin'
end

def index
@initiatives = Initiative.all
current_users_initiatives = current_user&.initiatives || []
@initiatives = if current_user&.role == 'admin'
Initiative.all.sort_by(&:name)
else
(Initiative.published + current_users_initiatives).uniq.sort_by(&:name)
end
end

def show
Expand All @@ -37,12 +42,11 @@ def edit; end
# rubocop:disable Metrics/MethodLength
def create
create_proposed_solutions
@initiative = Initiative.new(initiative_params)
@initiative.owner = current_user
@initiative = Initiative.new(initiative_params.merge(owner: current_user))
find_or_create_group
@initiative.update_location_from_postcode

if @initiative.save
if @initiative.save(validate: @initiative.publication_status != 'draft')
redirect_to edit_initiative_path(@initiative),
notice: 'Initiative was successfully created.'
else
Expand All @@ -51,23 +55,31 @@ def create
end
# rubocop:enable Metrics/MethodLength

# rubocop:disable Metrics/MethodLength
# rubocop:disable Metrics/MethodLength, Metrics/AbcSize, Metrics/PerceivedComplexity, Metrics/CyclomaticComplexity
def update
publication_status = @initiative.publication_status
if publication_status == 'archived'
redirect_to initiatives_path, notice: "'#{@initiative.name}' has been archived and cannot be edited"
return
end

initiative_params.delete(:publication_status) if publication_status == 'rejected' && current_user.role != 'admin'

clear_solutions_and_themes && create_proposed_solutions
images = initiative_params.delete 'images'
find_or_create_group
@initiative.assign_attributes initiative_params
@initiative.update_location_from_postcode

if @initiative.save
if @initiative.save(validate: publication_status != 'draft')
@initiative.images.attach images if images
redirect_to edit_initiative_path(@initiative),
notice: 'Initiative was successfully updated.'
else
render :edit
end
end
# rubocop:enable Metrics/MethodLength
# rubocop:enable Metrics/MethodLength, Metrics/AbcSize, Metrics/PerceivedComplexity, Metrics/CyclomaticComplexity

private

Expand Down Expand Up @@ -182,6 +194,7 @@ def initiative_params
:contact_phone,
:partner_groups_role,
:status_id,
:publication_status,
:consent_to_share,
:related_initiatives,
:administrative_notes,
Expand Down
2 changes: 1 addition & 1 deletion app/controllers/parishes_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ def show
@parish = Parish.find(params['id'])
@ward = @parish.ward
@district = @ward.district
initiatives = Initiative.where(parish_id: @parish.id)
initiatives = Initiative.published.where(parish_id: @parish.id)
@map_data = MapData.new(initiatives)
@sectors = Sector.all
end
Expand Down
2 changes: 1 addition & 1 deletion app/controllers/wards_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ class WardsController < ApplicationController
def show
@ward = Ward.find(params['id'])
initiatives =
Initiative.includes(parish: %i[ward]).where(
Initiative.published.includes(parish: %i[ward]).where(
parishes: { ward_id: @ward.id }
)
@district = @ward.district
Expand Down
8 changes: 8 additions & 0 deletions app/helpers/initiatives_helper.rb
Original file line number Diff line number Diff line change
Expand Up @@ -18,4 +18,12 @@ def solutions_as_json(initiative)

solution_map.to_json
end

def publication_statuses
statuses = Initiative.publication_statuses.to_h
statuses.reject! { |status| %w[rejected archived].include?(status) } unless user_is_admin?
statuses.map do |key, value|
[value.titlecase, key]
end
end
end
48 changes: 30 additions & 18 deletions app/models/initiative.rb
Original file line number Diff line number Diff line change
Expand Up @@ -4,17 +4,26 @@

# rubocop:disable Metrics/ClassLength
class Initiative < ApplicationRecord
after_initialize :set_default_location
after_initialize :set_default_publication_status

belongs_to :owner, class_name: 'User'
belongs_to :lead_group, class_name: 'Group'
belongs_to :status, class_name: 'InitiativeStatus'
belongs_to :parish

delegate :name, prefix: true, to: :status
delegate :name, prefix: true, to: :lead_group
after_initialize :set_default_location
delegate :ward, to: :parish
delegate :district, to: :ward
delegate :county, to: :district
delegate :region, to: :county

has_many :solutions, class_name: 'InitiativeSolution', dependent: :destroy
has_many :themes, class_name: 'InitiativeTheme', dependent: :destroy
has_many_attached :images
has_many :websites, class_name: 'InitiativeWebsite', dependent: :destroy

accepts_nested_attributes_for :solutions
accepts_nested_attributes_for :themes
accepts_nested_attributes_for :lead_group
Expand All @@ -29,14 +38,13 @@ class Initiative < ApplicationRecord
:contact_email,
:contact_phone,
:lead_group,
:publication_status,
presence: true

validate :at_least_one_solution_or_theme
validate :validate_postcode

def website_empty?(attributes)
attributes['url'].blank?
end
enum publication_status: { draft: 'draft', published: 'published', archived: 'archived', rejected: 'rejected' }

def validate_postcode
ukpc = UKPostcode.parse(postcode)
Expand All @@ -51,11 +59,6 @@ def at_least_one_solution_or_theme
errors.add(:solution, 'at least one equired') if solutions.empty? && themes.empty?
end

def set_default_location
self.latitude ||= 51.742
self.longitude ||= -2.222
end

def public_attributes
if consent_to_share
attributes
Expand All @@ -65,6 +68,8 @@ def public_attributes
end

def fetch_location
return unless postcode

postcodes_url = "https://api.postcodes.io/postcodes/#{postcode.delete(' ')}"
json_response = Net::HTTP.get(URI(postcodes_url))
JSON.parse(json_response)['result']
Expand All @@ -91,21 +96,13 @@ def create_location(location)
end

def self.approved
Initiative.all.map(&:to_public_initiative)
Initiative.published.map(&:to_public_initiative)
end

def to_public_initiative
PublicInitiative.new(self)
end

delegate :ward, to: :parish

delegate :district, to: :ward

delegate :county, to: :district

delegate :region, to: :county

def location
return unless parish

Expand All @@ -129,5 +126,20 @@ def location_attributes
}
end
# rubocop:enable Metrics/MethodLength

private

def set_default_location
self.latitude ||= 51.742
self.longitude ||= -2.222
end

def set_default_publication_status
self.publication_status = 'draft' if publication_status.blank?
end

def website_empty?(attributes)
attributes['url'].blank?
end
end
# rubocop:enable Metrics/ClassLength
7 changes: 7 additions & 0 deletions app/views/initiatives/_form.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -170,6 +170,13 @@
<%= f.text_area :administrative_notes %>
<% end %>

<% if publication_statuses.map {|s| s[1]}.include?(initiative.publication_status) %>
<%= f.form_field :publication_status, required: true do %>
<%= f.label :publication_status, 'Publication Status' %>
<%= f.select :publication_status, publication_statuses %>
<% end %>
<% end %>

<div class="FormField-actions">
<%= f.submit class: 'Button Button--success Button--large' %>
</div>
Expand Down
2 changes: 1 addition & 1 deletion app/views/initiatives/index.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@

<tbody>
<% @initiatives.each do |initiative| %>
<tr class="Initiative">
<tr class="Initiative Initiative-<%=initiative.publication_status%>">
<td><%= link_to initiative.name, initiative_path(initiative) %></td>
<td><%= initiative.location %></td>
<td><%= initiative.status_name %></td>
Expand Down
12 changes: 6 additions & 6 deletions app/views/parishes/show.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -14,12 +14,12 @@
] do %>
<div class="sidebar-pane Explore-navigation" id="initiatives">
<h1 class="sidebar-header">Initiatives</h1>
<% @parish.initiatives.each do |initiative| %>
<%=link_to initiative.name, initiative%>
<% unless @parish.initiatives.last == initiative %>
<hr />
<% end %>
<% initiatives = @parish.initiatives.published %>
<% initiatives.each do |initiative| %>
<%=link_to initiative.name, initiative%>
<% unless initiatives.last == initiative %>
<hr />
<% end %>
<% end %>
</div>
<% end %>

2 changes: 1 addition & 1 deletion config/rails_best_practices.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ MoveCodeIntoControllerCheck: {}
MoveCodeIntoHelperCheck: { array_count: 3 }
MoveCodeIntoModelCheck: { use_count: 2 }
MoveFinderToNamedScopeCheck: {}
MoveModelLogicIntoModelCheck: { use_count: 4 }
MoveModelLogicIntoModelCheck: { use_count: 6 }
NeedlessDeepNestingCheck: { nested_count: 2 }
NotRescueExceptionCheck: {}
NotUseDefaultRouteCheck: {}
Expand Down
17 changes: 17 additions & 0 deletions db/migrate/20200616193415_add_publication_status_to_initiative.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# frozen_string_literal: true

class AddPublicationStatusToInitiative < ActiveRecord::Migration[6.0]
def change
add_column :initiatives, :publication_status, :string
add_index :initiatives, :publication_status

reversible do |dir|
dir.up do
ActiveRecord::Base.connection.execute("update initiatives set publication_status = 'published'")
end
end

change_column_null :initiatives, :lead_group_id, true
change_column_null :initiatives, :status_id, true
end
end
9 changes: 5 additions & 4 deletions db/schema.rb
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
#
# It's strongly recommended that you check this file into your version control system.

ActiveRecord::Schema.define(version: 2020_01_18_113424) do
ActiveRecord::Schema.define(version: 2020_06_16_193415) do

# These are extensions that must be enabled in order to support this database
enable_extension "plpgsql"
Expand Down Expand Up @@ -127,12 +127,12 @@
t.string "name"
t.string "description_further_information"
t.integer "carbon_saving_amount"
t.bigint "lead_group_id", null: false
t.bigint "lead_group_id"
t.string "contact_name"
t.string "contact_email"
t.string "contact_phone"
t.string "partner_groups_role"
t.bigint "status_id", null: false
t.bigint "status_id"
t.datetime "created_at", precision: 6, null: false
t.datetime "updated_at", precision: 6, null: false
t.float "latitude"
Expand All @@ -146,11 +146,12 @@
t.string "administrative_notes"
t.boolean "carbon_saving_anticipated", default: false, null: false
t.boolean "carbon_saving_quantified", default: false, null: false
t.boolean "draft", default: false, null: false
t.bigint "owner_id"
t.string "publication_status"
t.index ["lead_group_id"], name: "index_initiatives_on_lead_group_id"
t.index ["owner_id"], name: "index_initiatives_on_owner_id"
t.index ["parish_id"], name: "index_initiatives_on_parish_id"
t.index ["publication_status"], name: "index_initiatives_on_publication_status"
t.index ["status_id"], name: "index_initiatives_on_status_id"
end

Expand Down
Loading

0 comments on commit 25ce9fd

Please sign in to comment.