Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Site customization #1484

Merged
merged 14 commits into from
Apr 11, 2017
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -30,4 +30,5 @@
.DS_Store
.ruby-gemset

public/sitemap.xml
public/sitemap.xml
public/system/
2 changes: 2 additions & 0 deletions Gemfile
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,8 @@ gem 'browser'
gem 'turnout', '~> 2.4.0'
gem 'redcarpet', '~> 3.4.0'

gem 'paperclip'

group :development, :test do
# Call 'byebug' anywhere in the code to stop execution and get a debugger console
gem 'byebug'
Expand Down
10 changes: 9 additions & 1 deletion Gemfile.lock
Original file line number Diff line number Diff line change
Expand Up @@ -238,6 +238,7 @@ GEM
mime-types (3.1)
mime-types-data (~> 3.2015)
mime-types-data (3.2016.0521)
mimemagic (0.3.2)
mini_portile2 (2.1.0)
minitest (5.10.1)
multi_json (1.12.1)
Expand Down Expand Up @@ -277,6 +278,12 @@ GEM
omniauth-oauth (~> 1.1)
rack
orm_adapter (0.5.0)
paperclip (5.1.0)
activemodel (>= 4.2.0)
activesupport (>= 4.2.0)
cocaine (~> 0.5.5)
mime-types
mimemagic (~> 0.3.0)
paranoia (2.2.1)
activerecord (>= 4.0, < 5.1)
parser (2.4.0.0)
Expand Down Expand Up @@ -504,6 +511,7 @@ DEPENDENCIES
omniauth-facebook (~> 4.0.0)
omniauth-google-oauth2 (~> 0.4.0)
omniauth-twitter
paperclip
paranoia (~> 2.2.1)
pg (~> 0.20.0)
pg_search
Expand Down Expand Up @@ -533,4 +541,4 @@ DEPENDENCIES
whenever

BUNDLED WITH
1.13.7
1.14.6
10 changes: 10 additions & 0 deletions app/assets/stylesheets/admin.scss
Original file line number Diff line number Diff line change
Expand Up @@ -529,3 +529,13 @@ table {
padding: 0 $line-height/2;
}
}

// 07. CMS
// --------------
.cms_page_list {

[class^="icon-"] {
padding-right: $menu-icon-spacing;
vertical-align: middle;
}
}
10 changes: 10 additions & 0 deletions app/controllers/admin/site_customization/base_controller.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
class Admin::SiteCustomization::BaseController < Admin::BaseController
helper_method :namespace

private

def namespace
"admin"
end

end
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
class Admin::SiteCustomization::ContentBlocksController < Admin::SiteCustomization::BaseController
load_and_authorize_resource :content_block, class: "SiteCustomization::ContentBlock"

def index
@content_blocks = SiteCustomization::ContentBlock.order(:name, :locale)
end

def create
if @content_block.save
redirect_to admin_site_customization_content_blocks_path, notice: t('admin.site_customization.content_blocks.create.notice')
else
flash.now[:error] = t('admin.site_customization.content_blocks.create.error')
render :new
end
end

def update
if @content_block.update(content_block_params)
redirect_to admin_site_customization_content_blocks_path, notice: t('admin.site_customization.content_blocks.update.notice')
else
flash.now[:error] = t('admin.site_customization.content_blocks.update.error')
render :edit
end
end

def destroy
@content_block.destroy
redirect_to admin_site_customization_content_blocks_path, notice: t('admin.site_customization.content_blocks.destroy.notice')
end

private

def content_block_params
params.require(:site_customization_content_block).permit(
:name,
:locale,
:body
)
end
end
43 changes: 43 additions & 0 deletions app/controllers/admin/site_customization/images_controller.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
class Admin::SiteCustomization::ImagesController < Admin::SiteCustomization::BaseController
load_and_authorize_resource :image, class: "SiteCustomization::Image"

def index
@images = SiteCustomization::Image.all_images
end

def update
if params[:site_customization_image].nil?
redirect_to admin_site_customization_images_path
return
end

if @image.update(image_params)
redirect_to admin_site_customization_images_path, notice: t('admin.site_customization.images.update.notice')
else
flash.now[:error] = t('admin.site_customization.images.update.error')

@images = SiteCustomization::Image.all_images
idx = @images.index {|e| e.name == @image.name }
@images[idx] = @image

render :index
end
end

def destroy
@image.image = nil
if @image.save
redirect_to admin_site_customization_images_path, notice: t('admin.site_customization.images.destroy.notice')
else
redirect_to admin_site_customization_images_path, notice: t('admin.site_customization.images.destroy.error')
end
end

private

def image_params
params.require(:site_customization_image).permit(
:image
)
end
end
44 changes: 44 additions & 0 deletions app/controllers/admin/site_customization/pages_controller.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
class Admin::SiteCustomization::PagesController < Admin::SiteCustomization::BaseController
load_and_authorize_resource :page, class: "SiteCustomization::Page"

def index
@pages = SiteCustomization::Page.order('slug').page(params[:page])
end

def create
if @page.save
redirect_to admin_site_customization_pages_path, notice: t('admin.site_customization.pages.create.notice')
else
flash.now[:error] = t('admin.site_customization.pages.create.error')
render :new
end
end

def update
if @page.update(page_params)
redirect_to admin_site_customization_pages_path, notice: t('admin.site_customization.pages.update.notice')
else
flash.now[:error] = t('admin.site_customization.pages.update.error')
render :edit
end
end

def destroy
@page.destroy
redirect_to admin_site_customization_pages_path, notice: t('admin.site_customization.pages.destroy.notice')
end

private

def page_params
params.require(:site_customization_page).permit(
:slug,
:title,
:subtitle,
:content,
:more_info_flag,
:print_content_flag,
:status
)
end
end
6 changes: 5 additions & 1 deletion app/controllers/pages_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,11 @@ class PagesController < ApplicationController
skip_authorization_check

def show
render action: params[:id]
if @custom_page = SiteCustomization::Page.published.find_by(slug: params[:id])
render action: :custom_page
else
render action: params[:id]
end
rescue ActionView::MissingTemplate
head 404
end
Expand Down
8 changes: 8 additions & 0 deletions app/helpers/application_helper.rb
Original file line number Diff line number Diff line change
Expand Up @@ -47,4 +47,12 @@ def back_link_to(destination_path)
"<span class='icon-angle-left'></span>".html_safe + t("shared.back")
end
end

def image_path_for(filename)
SiteCustomization::Image.image_path_for(filename) || filename
end

def content_block(name, locale)
SiteCustomization::ContentBlock.block_for(name, locale)
end
end
4 changes: 4 additions & 0 deletions app/models/abilities/administrator.rb
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,10 @@ def initialize(user)
can [:create, :destroy], ::Poll::OfficerAssignment
can [:read, :create, :update], Poll::Question
can :destroy, Poll::Question # , comments_count: 0, votes_up: 0

can :manage, SiteCustomization::Page
can :manage, SiteCustomization::Image
can :manage, SiteCustomization::ContentBlock
end
end
end
5 changes: 5 additions & 0 deletions app/models/site_customization.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
module SiteCustomization
def self.table_name_prefix
'site_customization_'
end
end
11 changes: 11 additions & 0 deletions app/models/site_customization/content_block.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
class SiteCustomization::ContentBlock < ActiveRecord::Base
VALID_BLOCKS = %w(top_links footer)

validates :locale, presence: true, inclusion: { in: I18n.available_locales.map(&:to_s) }
validates :name, presence: true, uniqueness: { scope: :locale }, inclusion: { in: VALID_BLOCKS }

def self.block_for(name, locale)
locale ||= I18n.default_locale
find_by(name: name, locale: locale).try(:body)
end
end
48 changes: 48 additions & 0 deletions app/models/site_customization/image.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
class SiteCustomization::Image < ActiveRecord::Base
VALID_IMAGES = {
"icon_home" => [330, 240],
"logo_header" => [80, 80],
"social-media-icon" => [200, 200],
"apple-touch-icon-200" => [200, 200]
}

has_attached_file :image

validates :name, presence: true, uniqueness: true, inclusion: { in: VALID_IMAGES.keys }
validates_attachment_content_type :image, :content_type => ["image/png"]
validate :check_image

def self.all_images
VALID_IMAGES.keys.map do |image_name|
find_by(name: image_name) || create!(name: image_name.to_s)
end
end

def self.image_path_for(filename)
image_name = filename.split(".").first

if i = find_by(name: image_name)
i.image.exists? ? i.image.url : nil
end
end

def required_width
VALID_IMAGES[name].try(:first)
end

def required_height
VALID_IMAGES[name].try(:second)
end

private

def check_image
return unless image?

dimensions = Paperclip::Geometry.from_file(image.queued_for_write[:original].path)

errors.add(:image, :image_width, required_width: required_width) unless dimensions.width == required_width
errors.add(:image, :image_height, required_height: required_height) unless dimensions.height == required_height
end

end
16 changes: 16 additions & 0 deletions app/models/site_customization/page.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
class SiteCustomization::Page < ActiveRecord::Base
VALID_STATUSES = %w(draft published)

validates :slug, presence: true,
uniqueness: { case_sensitive: false },
format: { with: /\A[0-9a-zA-Z\-_]*\Z/, message: :slug_format }
validates :title, presence: true
validates :status, presence: true, inclusion: { in: VALID_STATUSES }

scope :published, -> { where(status: 'published').order('id DESC') }
scope :with_more_info_flag, -> { where(status: 'published', more_info_flag: true).order('id ASC') }

def url
"/#{slug}"
end
end
20 changes: 20 additions & 0 deletions app/views/admin/_menu.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -142,5 +142,25 @@
<% end %>
</li>
<% end %>

<li class="section-title">
<a href="#">
<span class="icon-settings"></span>
<strong><%= t("admin.menu.title_site_customization") %></strong>
</a>
<ul <%= "class=is-active" if menu_profiles? %>>
<li <%= "class=active" if controller_name == "pages" %>>
<%= link_to t("admin.menu.site_customization.pages"), admin_site_customization_pages_path %>
</li>

<li <%= "class=active" if controller_name == "images" %>>
<%= link_to t("admin.menu.site_customization.images"), admin_site_customization_images_path %>
</li>

<li <%= 'class=active' if controller_name == 'content_blocks' %>>
<%= link_to t("admin.menu.site_customization.content_blocks"), admin_site_customization_content_blocks_path%>
</li>
</ul>
</li>
</ul>
</div>
Loading