grandstand 0.2.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +2 -0
- data/MIT-LICENSE +20 -0
- data/README +7 -0
- data/Rakefile +44 -0
- data/VERSION +1 -0
- data/app/controllers/admin/galleries_controller.rb +52 -0
- data/app/controllers/admin/images_controller.rb +68 -0
- data/app/controllers/admin/main_controller.rb +36 -0
- data/app/controllers/admin/pages_controller.rb +51 -0
- data/app/controllers/admin/posts_controller.rb +48 -0
- data/app/controllers/admin/sessions_controller.rb +41 -0
- data/app/controllers/admin/templates_controller.rb +6 -0
- data/app/controllers/admin/users_controller.rb +48 -0
- data/app/controllers/galleries_controller.rb +5 -0
- data/app/controllers/pages_controller.rb +5 -0
- data/app/controllers/posts_controller.rb +5 -0
- data/app/helpers/admin/main_helper.rb +31 -0
- data/app/helpers/admin/pages_helper.rb +2 -0
- data/app/helpers/admin/posts_helper.rb +2 -0
- data/app/helpers/admin/sessions_helper.rb +2 -0
- data/app/helpers/admin/templates_helper.rb +2 -0
- data/app/helpers/admin/users_helper.rb +2 -0
- data/app/helpers/pages_helper.rb +2 -0
- data/app/helpers/posts_helper.rb +2 -0
- data/app/helpers/site_helper.rb +2 -0
- data/app/models/gallery.rb +22 -0
- data/app/models/image.rb +61 -0
- data/app/models/page.rb +45 -0
- data/app/models/page_section.rb +6 -0
- data/app/models/post.rb +27 -0
- data/app/models/template.rb +33 -0
- data/app/models/user.rb +68 -0
- data/app/stylesheets/_buttons.less +76 -0
- data/app/stylesheets/_dialogs.less +85 -0
- data/app/stylesheets/application.less +238 -0
- data/app/stylesheets/global.less +435 -0
- data/app/stylesheets/login.less +30 -0
- data/app/stylesheets/wysiwyg.less +96 -0
- data/app/views/admin/galleries/_form.html.erb +11 -0
- data/app/views/admin/galleries/_gallery.html.erb +16 -0
- data/app/views/admin/galleries/_list.html.erb +17 -0
- data/app/views/admin/galleries/delete.html.erb +8 -0
- data/app/views/admin/galleries/edit.html.erb +8 -0
- data/app/views/admin/galleries/editor.html.erb +13 -0
- data/app/views/admin/galleries/editor_with_images.html.erb +19 -0
- data/app/views/admin/galleries/index.html.erb +13 -0
- data/app/views/admin/galleries/new.html.erb +8 -0
- data/app/views/admin/galleries/show.html.erb +15 -0
- data/app/views/admin/images/_form.html.erb +11 -0
- data/app/views/admin/images/delete.html.erb +8 -0
- data/app/views/admin/images/edit.html.erb +8 -0
- data/app/views/admin/images/new.html.erb +8 -0
- data/app/views/admin/images/upload.html.erb +11 -0
- data/app/views/admin/main/index.html.erb +10 -0
- data/app/views/admin/pages/_form.html.erb +33 -0
- data/app/views/admin/pages/_left.html.erb +3 -0
- data/app/views/admin/pages/_row.html.erb +9 -0
- data/app/views/admin/pages/delete.html.erb +8 -0
- data/app/views/admin/pages/edit.html.erb +8 -0
- data/app/views/admin/pages/index.html.erb +20 -0
- data/app/views/admin/pages/new.html.erb +8 -0
- data/app/views/admin/pages/show.html.erb +3 -0
- data/app/views/admin/posts/_form.html.erb +29 -0
- data/app/views/admin/posts/_left.html.erb +3 -0
- data/app/views/admin/posts/_list.html.erb +22 -0
- data/app/views/admin/posts/delete.html.erb +9 -0
- data/app/views/admin/posts/edit.html.erb +10 -0
- data/app/views/admin/posts/index.html.erb +10 -0
- data/app/views/admin/posts/new.html.erb +10 -0
- data/app/views/admin/posts/show.html.erb +4 -0
- data/app/views/admin/sessions/forgot.html.erb +8 -0
- data/app/views/admin/sessions/show.html.erb +12 -0
- data/app/views/admin/shared/_flash.html.erb +3 -0
- data/app/views/admin/users/_form.html.erb +16 -0
- data/app/views/admin/users/_left.html.erb +3 -0
- data/app/views/admin/users/delete.html.erb +10 -0
- data/app/views/admin/users/edit.html.erb +8 -0
- data/app/views/admin/users/index.html.erb +22 -0
- data/app/views/admin/users/new.html.erb +8 -0
- data/app/views/admin/users/show.html.erb +12 -0
- data/app/views/galleries/index.html.erb +0 -0
- data/app/views/galleries/show.html.erb +12 -0
- data/app/views/layouts/admin.html.erb +80 -0
- data/app/views/layouts/admin_login.html.erb +17 -0
- data/app/views/layouts/admin_xhr.html.erb +3 -0
- data/app/views/pages/show.html.erb +8 -0
- data/app/views/posts/show.html.erb +3 -0
- data/app/views/shared/404.html.erb +5 -0
- data/app/views/shared/gallery.html +14 -0
- data/app/views/shared/image.html +1 -0
- data/app/views/shared/page.html +0 -0
- data/app/views/shared/post.html +3 -0
- data/grandstand.gemspec +189 -0
- data/lib/grandstand/application.rb +50 -0
- data/lib/grandstand/controller/development.rb +15 -0
- data/lib/grandstand/controller.rb +104 -0
- data/lib/grandstand/helper.rb +117 -0
- data/lib/grandstand/routes.rb +59 -0
- data/lib/grandstand/session.rb +25 -0
- data/lib/grandstand.rb +27 -0
- data/public/.DS_Store +0 -0
- data/public/admin/.DS_Store +0 -0
- data/public/admin/images/.DS_Store +0 -0
- data/public/admin/images/background-input.gif +0 -0
- data/public/admin/images/background-progress-bar.png +0 -0
- data/public/admin/images/background-progress-complete.gif +0 -0
- data/public/admin/images/background-progress.gif +0 -0
- data/public/admin/images/icons/.DS_Store +0 -0
- data/public/admin/images/icons/add.png +0 -0
- data/public/admin/images/icons/collapse.png +0 -0
- data/public/admin/images/icons/delete.png +0 -0
- data/public/admin/images/icons/edit.png +0 -0
- data/public/admin/images/icons/editor/bold.png +0 -0
- data/public/admin/images/icons/editor/gallery.png +0 -0
- data/public/admin/images/icons/editor/image-center.png +0 -0
- data/public/admin/images/icons/editor/image-left.png +0 -0
- data/public/admin/images/icons/editor/image-right.png +0 -0
- data/public/admin/images/icons/editor/image.png +0 -0
- data/public/admin/images/icons/editor/italic.png +0 -0
- data/public/admin/images/icons/editor/ordered-list.png +0 -0
- data/public/admin/images/icons/editor/quote.png +0 -0
- data/public/admin/images/icons/editor/source.png +0 -0
- data/public/admin/images/icons/editor/strikethrough.png +0 -0
- data/public/admin/images/icons/editor/underline.png +0 -0
- data/public/admin/images/icons/editor/unordered-list.png +0 -0
- data/public/admin/images/icons/error.png +0 -0
- data/public/admin/images/icons/expand.png +0 -0
- data/public/admin/images/icons/galleries.png +0 -0
- data/public/admin/images/icons/gallery.png +0 -0
- data/public/admin/images/icons/image.png +0 -0
- data/public/admin/images/icons/okay.png +0 -0
- data/public/admin/images/icons/pages.png +0 -0
- data/public/admin/images/icons/posts.png +0 -0
- data/public/admin/images/icons/upload.png +0 -0
- data/public/admin/images/icons/users.png +0 -0
- data/public/admin/images/logo.png +0 -0
- data/public/admin/images/spinner-dark.gif +0 -0
- data/public/admin/images/uploader.swf +0 -0
- data/public/admin/javascripts/application.js +231 -0
- data/public/admin/javascripts/jquery.js +404 -0
- data/public/admin/javascripts/mustache.js +324 -0
- data/public/admin/javascripts/selection.js +280 -0
- data/public/admin/javascripts/string.js +264 -0
- data/public/admin/javascripts/wysiwyg.js +335 -0
- data/public/admin/stylesheets/application.css +1 -0
- data/public/admin/stylesheets/global.css +1 -0
- data/public/admin/stylesheets/login.css +1 -0
- data/public/admin/stylesheets/wysiwyg-content.css +20 -0
- data/public/admin/stylesheets/wysiwyg.css +1 -0
- data/vendor/cache/more-0.1.1.gem +0 -0
- metadata +216 -0
data/.gitignore
ADDED
data/MIT-LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2010 [name of plugin creator]
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
Grandstand
|
2
|
+
==========
|
3
|
+
|
4
|
+
Grandstand is a Rails 3 (only!) Gem that allows you to build totally simple blogs and portfolios using a gallery and blog post
|
5
|
+
editor. It's under active development, so don't get all excited just yet!
|
6
|
+
|
7
|
+
Copyright (c) 2010 Flip Sasser, released under the MIT license
|
data/Rakefile
ADDED
@@ -0,0 +1,44 @@
|
|
1
|
+
require 'rake'
|
2
|
+
require 'rake/testtask'
|
3
|
+
require 'rake/rdoctask'
|
4
|
+
|
5
|
+
desc 'Default: run unit tests.'
|
6
|
+
task :default => :test
|
7
|
+
|
8
|
+
desc 'Test the grandstand plugin.'
|
9
|
+
Rake::TestTask.new(:test) do |t|
|
10
|
+
t.libs << 'lib'
|
11
|
+
t.libs << 'test'
|
12
|
+
t.pattern = 'test/**/*_test.rb'
|
13
|
+
t.verbose = true
|
14
|
+
end
|
15
|
+
|
16
|
+
desc 'Generate documentation for the grandstand plugin.'
|
17
|
+
Rake::RDocTask.new(:rdoc) do |rdoc|
|
18
|
+
rdoc.rdoc_dir = 'rdoc'
|
19
|
+
rdoc.title = 'Grandstand'
|
20
|
+
rdoc.options << '--line-numbers' << '--inline-source'
|
21
|
+
rdoc.rdoc_files.include('README')
|
22
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
23
|
+
end
|
24
|
+
|
25
|
+
begin
|
26
|
+
require "jeweler"
|
27
|
+
Jeweler::Tasks.new do |gemspec|
|
28
|
+
gemspec.name = "grandstand"
|
29
|
+
gemspec.summary = "A blog / gallery gem for Rails 3 that's dead-simple to configure, override, and rebuild"
|
30
|
+
# gem.files = Dir["{lib}/**/*", "{app}/**/*", "{config}/**/*", "{public}/**/*", "{rails}/**/*", "README"]
|
31
|
+
# other fields that would normally go in your gemspec
|
32
|
+
# like authors, email and has_rdoc can also be included here
|
33
|
+
gemspec.description = %{
|
34
|
+
Grandstand is a simple blog and photo gallery application. It takes a minimal amount of configuration and can
|
35
|
+
be built installed as a gem and used like any other thingymagig. It's totally cool.
|
36
|
+
}
|
37
|
+
gemspec.email = "flip@x451.com"
|
38
|
+
gemspec.homepage = "http://github.com/flipsasser/grandstand"
|
39
|
+
gemspec.authors = ["Flip Sasser"]
|
40
|
+
gemspec.test_files = []
|
41
|
+
end
|
42
|
+
rescue
|
43
|
+
puts "Jeweler or one of its dependencies is not installed."
|
44
|
+
end
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
0.2.1
|
@@ -0,0 +1,52 @@
|
|
1
|
+
class Admin::GalleriesController < Admin::MainController
|
2
|
+
before_filter :find_gallery, :except => [:create, :index, :new, :reorder]
|
3
|
+
|
4
|
+
def create
|
5
|
+
@gallery = Gallery.new(params[:gallery].merge(:user => current_user))
|
6
|
+
if @gallery.save
|
7
|
+
flash[:success] = "#{@gallery.name} was successfully added"
|
8
|
+
redirect_to admin_gallery_path(@gallery)
|
9
|
+
else
|
10
|
+
flash[:error] = 'There was a problem creating this gallery'
|
11
|
+
render :new
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def destroy
|
16
|
+
@gallery.destroy
|
17
|
+
flash[:delete] = 'Your gallery has been deleted'
|
18
|
+
redirect_to admin_galleries_path
|
19
|
+
end
|
20
|
+
|
21
|
+
def index
|
22
|
+
@galleries = Gallery.all
|
23
|
+
if request.xhr?
|
24
|
+
if params.has_key?(:image)
|
25
|
+
render :editor_with_images
|
26
|
+
else
|
27
|
+
render :editor
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def new
|
33
|
+
@gallery = Gallery.new
|
34
|
+
end
|
35
|
+
|
36
|
+
def reorder
|
37
|
+
params[:galleries].each_with_index do |gallery_id, index|
|
38
|
+
Gallery.update(gallery_id, :position => index + 1)
|
39
|
+
end if params[:galleries]
|
40
|
+
render :json => {:status => :ok}
|
41
|
+
end
|
42
|
+
|
43
|
+
def update
|
44
|
+
if @gallery.update_attributes(params[:gallery])
|
45
|
+
flash[:success] = "#{@gallery.name} was successfully saved"
|
46
|
+
request.xhr? ? render(:json => {:status => :ok}) : redirect_to(admin_gallery_path(@gallery))
|
47
|
+
else
|
48
|
+
flash[:error] = 'There was a problem saving this gallery'
|
49
|
+
render :edit
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
class Admin::ImagesController < Admin::MainController
|
2
|
+
before_filter :find_gallery
|
3
|
+
before_filter :find_image, :only => [:delete, :destroy, :edit, :show, :update]
|
4
|
+
prepend_before_filter :relax_session, :only => :create
|
5
|
+
# session :cookies_only => false, :only => :create
|
6
|
+
|
7
|
+
def create
|
8
|
+
@image = @gallery.images.new(params[:image])
|
9
|
+
if @image.save
|
10
|
+
flash[:success] = 'Your image was successfully uploaded'
|
11
|
+
params.has_key?('Filename') || request.xhr? ? render(:json => {:status => :ok}) : redirect_to(admin_gallery_path(@gallery))
|
12
|
+
else
|
13
|
+
render :new
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def delete
|
18
|
+
end
|
19
|
+
|
20
|
+
def destroy
|
21
|
+
@image.destroy
|
22
|
+
flash[:delete] = 'Your image has been deleted'
|
23
|
+
redirect_to admin_gallery_path(@gallery)
|
24
|
+
end
|
25
|
+
|
26
|
+
def edit
|
27
|
+
@image = @gallery.images.find(params[:id])
|
28
|
+
end
|
29
|
+
|
30
|
+
def editor
|
31
|
+
end
|
32
|
+
|
33
|
+
def index
|
34
|
+
redirect_to admin_gallery_path(@gallery)
|
35
|
+
end
|
36
|
+
|
37
|
+
def new
|
38
|
+
@image = Image.new
|
39
|
+
end
|
40
|
+
|
41
|
+
def reorder
|
42
|
+
params[:images].each_with_index do |image_id, index|
|
43
|
+
@gallery.images.update(image_id, :position => index + 1)
|
44
|
+
end if params[:images]
|
45
|
+
render :json => {:status => :ok}
|
46
|
+
end
|
47
|
+
|
48
|
+
def update
|
49
|
+
if @image.update_attributes(params[:image])
|
50
|
+
flash[:success] = 'Your image was successfully saved'
|
51
|
+
request.xhr? ? render(:json => {:status => :ok}) : redirect_to(admin_gallery_path(@gallery))
|
52
|
+
else
|
53
|
+
render :new
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
def upload
|
58
|
+
end
|
59
|
+
|
60
|
+
protected
|
61
|
+
def find_image
|
62
|
+
@image = @gallery.images.find(params[:id])
|
63
|
+
end
|
64
|
+
|
65
|
+
def relax_session
|
66
|
+
request.session_options[:cookies_only] = false
|
67
|
+
end
|
68
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
class Admin::MainController < ApplicationController
|
2
|
+
skip_before_filter :find_page
|
3
|
+
before_filter :require_user, :except => [:login]
|
4
|
+
before_filter :set_return_path, :only => [:index, :show]
|
5
|
+
|
6
|
+
layout :admin_layout
|
7
|
+
|
8
|
+
def expand
|
9
|
+
session[:expand] ||= []
|
10
|
+
if params[:add] == 'yup' && !session[:expand].include?(params[:section])
|
11
|
+
session[:expand].push(params[:section])
|
12
|
+
elsif params[:add] == 'nope'
|
13
|
+
session[:expand].delete(params[:section])
|
14
|
+
end
|
15
|
+
render :text => ''
|
16
|
+
end
|
17
|
+
|
18
|
+
protected
|
19
|
+
def admin_layout
|
20
|
+
request.xhr? ? 'admin_xhr' : 'admin'
|
21
|
+
end
|
22
|
+
|
23
|
+
def admin_not_found
|
24
|
+
options = {:layout => 'minimal', :status => 404, :template => 'shared/404'}.merge(options)
|
25
|
+
render options
|
26
|
+
false
|
27
|
+
end
|
28
|
+
|
29
|
+
def find_gallery
|
30
|
+
return admin_not_found unless @gallery = Gallery.where(:id => params[:gallery_id] || params[:id]).first
|
31
|
+
end
|
32
|
+
|
33
|
+
def require_no_user
|
34
|
+
redirect_to return_path || admin_root_path if current_user
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
class Admin::PagesController < Admin::MainController
|
2
|
+
before_filter :find_page, :except => [:create, :index, :new]
|
3
|
+
before_filter :build_page_sections, :only => [:edit]
|
4
|
+
|
5
|
+
def create
|
6
|
+
@page = Page.new(params[:page])
|
7
|
+
if @page.save
|
8
|
+
flash[:success] = "#{@page.name} was successfully added"
|
9
|
+
redirect_to admin_page_path(@page)
|
10
|
+
else
|
11
|
+
flash[:error] = 'There was a problem creating this page'
|
12
|
+
render :new
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def destroy
|
17
|
+
@page.destroy
|
18
|
+
flash[:delete] = 'Your page has been deleted'
|
19
|
+
redirect_to admin_pages_path
|
20
|
+
end
|
21
|
+
|
22
|
+
def index
|
23
|
+
@pages = Page.where(:parent_id => nil).all
|
24
|
+
end
|
25
|
+
|
26
|
+
def new
|
27
|
+
@page = Page.new
|
28
|
+
build_page_sections
|
29
|
+
end
|
30
|
+
|
31
|
+
def update
|
32
|
+
if @page.update_attributes(params[:page])
|
33
|
+
flash[:success] = "#{@page.name} was successfully saved"
|
34
|
+
request.xhr? ? render(:json => {:status => :ok}) : redirect_to(admin_page_path(@page))
|
35
|
+
else
|
36
|
+
flash[:error] = 'There was a problem saving this page'
|
37
|
+
render :edit
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
protected
|
42
|
+
def build_page_sections
|
43
|
+
Grandstand::Application.page_sections.each do |page_section|
|
44
|
+
@page.page_sections.where(:section => page_section).first || @page.page_sections.build(:section => page_section)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def find_page
|
49
|
+
return admin_not_found unless @page = Page.where(:id => params[:id]).first
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
class Admin::PostsController < Admin::MainController
|
2
|
+
before_filter :find_post, :except => [:create, :index, :new]
|
3
|
+
layout :check_form_layout
|
4
|
+
|
5
|
+
def create
|
6
|
+
@post = Post.new(params[:post].merge(:user => current_user))
|
7
|
+
if @post.save
|
8
|
+
flash[:success] = "#{@post.name} was successfully added"
|
9
|
+
redirect_to admin_post_path(@post)
|
10
|
+
else
|
11
|
+
flash[:error] = 'There was a problem creating this post'
|
12
|
+
render :new
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def destroy
|
17
|
+
@post.destroy
|
18
|
+
flash[:delete] = 'Your post has been deleted'
|
19
|
+
redirect_to admin_posts_path
|
20
|
+
end
|
21
|
+
|
22
|
+
def index
|
23
|
+
@posts = Post.all
|
24
|
+
end
|
25
|
+
|
26
|
+
def new
|
27
|
+
@post = Post.new
|
28
|
+
end
|
29
|
+
|
30
|
+
def update
|
31
|
+
if @post.update_attributes(params[:post])
|
32
|
+
flash[:success] = "#{@post.name} was successfully saved"
|
33
|
+
request.xhr? ? render(:json => {:status => :ok}) : redirect_to(admin_post_path(@post))
|
34
|
+
else
|
35
|
+
flash[:error] = 'There was a problem saving this post'
|
36
|
+
render :edit
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
protected
|
41
|
+
def check_form_layout
|
42
|
+
%w(create edit new update).include?(params[:action]) && params[:preview] == 'yup' ? 'application' : admin_layout
|
43
|
+
end
|
44
|
+
|
45
|
+
def find_post
|
46
|
+
return admin_not_found unless @post = Post.where(:id => params[:id]).first
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
class Admin::SessionsController < Admin::MainController
|
2
|
+
before_filter :require_no_user, :except => [:destroy]
|
3
|
+
skip_before_filter :require_user, :except => [:destroy]
|
4
|
+
skip_before_filter :set_return_path
|
5
|
+
layout 'admin_login'
|
6
|
+
|
7
|
+
def create
|
8
|
+
login_attempts = (session[:login_attempts] || 0).next
|
9
|
+
if !params[:email].blank? && user = User.authenticates_with(:email => params[:email])
|
10
|
+
if user.authenticates_with?(params[:password])
|
11
|
+
saved_return_path = return_path
|
12
|
+
reset_session
|
13
|
+
session[:user_id] = user.id
|
14
|
+
redirect_to saved_return_path || admin_root_path
|
15
|
+
return
|
16
|
+
else
|
17
|
+
flash.now[:error] = 'The password you entered is incorrect. Please try again.'
|
18
|
+
end
|
19
|
+
else
|
20
|
+
flash.now[:error] = 'An account with that e-mail could not be found. Please try again.'
|
21
|
+
end
|
22
|
+
session[:login_attempts] = login_attempts
|
23
|
+
render :show
|
24
|
+
end
|
25
|
+
|
26
|
+
def destroy
|
27
|
+
reset_session
|
28
|
+
redirect_to admin_session_path
|
29
|
+
end
|
30
|
+
|
31
|
+
def reset
|
32
|
+
if user = User.where(:email => params[:email]).first
|
33
|
+
user.reset_password
|
34
|
+
flash[:notice] = "A link containing password reset instructions has been sent to #{user.email}"
|
35
|
+
redirect_to admin_session_path
|
36
|
+
else
|
37
|
+
flash[:error] = "There is no user account with that e-mail address!"
|
38
|
+
redirect_to forgot_admin_session_path
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
class Admin::UsersController < Admin::MainController
|
2
|
+
before_filter :find_user, :except => [:create, :index, :new]
|
3
|
+
|
4
|
+
def create
|
5
|
+
@user = User.new(params[:user])
|
6
|
+
if @user.save
|
7
|
+
flash[:success] = "#{@user.name} was successfully added"
|
8
|
+
redirect_to admin_user_path(@user)
|
9
|
+
else
|
10
|
+
flash[:error] = 'There was a problem creating this user'
|
11
|
+
render :new
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def delete
|
16
|
+
return admin_not_found if @user.id == current_user.id
|
17
|
+
end
|
18
|
+
|
19
|
+
def destroy
|
20
|
+
return admin_not_found if @user.id == current_user.id
|
21
|
+
@user.destroy
|
22
|
+
flash[:delete] = 'Your user has been deleted'
|
23
|
+
redirect_to admin_users_path
|
24
|
+
end
|
25
|
+
|
26
|
+
def index
|
27
|
+
@users = User.all
|
28
|
+
end
|
29
|
+
|
30
|
+
def new
|
31
|
+
@user = User.new
|
32
|
+
end
|
33
|
+
|
34
|
+
def update
|
35
|
+
if @user.update_attributes(params[:user])
|
36
|
+
flash[:success] = "#{@user.name} was successfully saved"
|
37
|
+
request.xhr? ? render(:json => {:status => :ok}) : redirect_to(admin_user_path(@user))
|
38
|
+
else
|
39
|
+
flash[:error] = 'There was a problem saving this user'
|
40
|
+
render :edit
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
protected
|
45
|
+
def find_user
|
46
|
+
return admin_not_found unless @user = User.where(:id => params[:id]).first
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,5 @@
|
|
1
|
+
class PostsController < ApplicationController
|
2
|
+
def show
|
3
|
+
return not_found unless @post = Post.where("#{Post.extract_year('created_at')} = ? AND #{Post.extract_month('created_at')} = ? AND url = ?", params[:year], params[:month].rjust(2, '0'), params[:id]).first
|
4
|
+
end
|
5
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module Admin::MainHelper
|
2
|
+
def expand(*controllers)
|
3
|
+
options = controllers.extract_options!
|
4
|
+
options[:class] = Array(options[:class]).compact
|
5
|
+
options[:class].push(:expandable)
|
6
|
+
section = controllers.first
|
7
|
+
controllers.map!(&:to_s)
|
8
|
+
if controllers.include?(controller_name) || !((session[:expand] ||= []) & controllers).empty?
|
9
|
+
options[:class].push(:expanded)
|
10
|
+
end
|
11
|
+
raw %( class="#{options[:class].join(' ')}")
|
12
|
+
end
|
13
|
+
|
14
|
+
def expand_link(section)
|
15
|
+
link_to(raw('<span></span>'), '#', :class => 'expand', :rel => section)
|
16
|
+
end
|
17
|
+
|
18
|
+
def hide(condition)
|
19
|
+
raw ' style="display:none;"' if condition
|
20
|
+
end
|
21
|
+
|
22
|
+
# A form wrapper that's used to override the default field_error_proc in a thread-safeish way.
|
23
|
+
# The new field_error_proc returns a <div> with class "errors" on it, instead of an irritating
|
24
|
+
# "fieldWithErrors" classname that nobody likes or wants to use. Only used in admin at the moment.
|
25
|
+
def wrap_admin_form(&block)
|
26
|
+
field_error_proc = ActionView::Base.field_error_proc
|
27
|
+
ActionView::Base.field_error_proc = Proc.new {|html_tag, instance| raw("<div class=\"errors\">#{html_tag}</div>") }
|
28
|
+
concat(capture(&block))
|
29
|
+
ActionView::Base.field_error_proc = field_error_proc
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
class Gallery < ActiveRecord::Base
|
2
|
+
before_save :set_url
|
3
|
+
belongs_to :user
|
4
|
+
default_scope order('position, id')
|
5
|
+
has_many :images, :dependent => :destroy
|
6
|
+
|
7
|
+
validates_presence_of :name, :message => 'Your gallery needs a name'
|
8
|
+
validates_uniqueness_of :name, :message => 'A gallery with that name already exists'
|
9
|
+
|
10
|
+
def cover_image
|
11
|
+
images.first || Image.new
|
12
|
+
end
|
13
|
+
|
14
|
+
# def to_param
|
15
|
+
# url
|
16
|
+
# end
|
17
|
+
|
18
|
+
protected
|
19
|
+
def set_url
|
20
|
+
self.url ||= name.parameterize
|
21
|
+
end
|
22
|
+
end
|
data/app/models/image.rb
ADDED
@@ -0,0 +1,61 @@
|
|
1
|
+
class Image < ActiveRecord::Base
|
2
|
+
belongs_to :gallery
|
3
|
+
belongs_to :user
|
4
|
+
default_scope order('position, id')
|
5
|
+
|
6
|
+
has_attached_file :file,
|
7
|
+
:default_url => "http://dummyimage.com/:dimensions",
|
8
|
+
:path => '/images/:padded_id-:style.:extension',
|
9
|
+
:styles => {
|
10
|
+
:admin_icon => '16x16#',
|
11
|
+
:admin_medium => '200x200#'
|
12
|
+
}.merge(Grandstand::Application.image_sizes),
|
13
|
+
:storage => :s3,
|
14
|
+
:s3_credentials => Grandstand::Application.s3[:credentials],
|
15
|
+
:bucket => Grandstand::Application.s3[:bucket]
|
16
|
+
|
17
|
+
delegate :url, :to => :file
|
18
|
+
|
19
|
+
validates_presence_of :gallery
|
20
|
+
validate :file_attached
|
21
|
+
|
22
|
+
class << self
|
23
|
+
# Returns the image sizes available for embedding in the public-facing pages. Sorts by potential pixel dimensions,
|
24
|
+
# so icon sizes (75x75) return as smaller than page-width sizes (500x500 or whatever). Also adds a fun description
|
25
|
+
# for the WYSIWYG editor, so '1024x768#' becomes '1024 x 768 (cropped)' in the event that the user is unhappy with
|
26
|
+
# whatever goddamn sizes they're intended to accept.
|
27
|
+
def sizes
|
28
|
+
return @sizes if defined? @sizes
|
29
|
+
sorted_sizes = ActiveSupport::OrderedHash.new
|
30
|
+
Image.attachment_definitions[:file][:styles].reject {|style, dimensions| style.to_s =~ /^admin_/ }.inject({}) do |sizes, style_definition|
|
31
|
+
style, dimensions = style_definition
|
32
|
+
width, height = dimensions.gsub(/[^0-9x]/, '').split('x').map(&:to_i)
|
33
|
+
width ||= 0
|
34
|
+
height ||= 0
|
35
|
+
if width.zero?
|
36
|
+
description = "#{height} pixel#{'s' unless height == 1} tall; width to scale"
|
37
|
+
elsif height.zero?
|
38
|
+
description = "#{width} pixel#{'s' unless width == 1} wide; height to scale"
|
39
|
+
else
|
40
|
+
description = "#{width} x #{height}"
|
41
|
+
end
|
42
|
+
additional = []
|
43
|
+
clean_dimensions = dimensions.gsub(/[0-9x]/, '')
|
44
|
+
if clean_dimensions =~ /\#$/
|
45
|
+
additional.push('cropped')
|
46
|
+
end
|
47
|
+
description << " (#{additional.join(', ')})" unless additional.empty?
|
48
|
+
sizes[style.to_sym] = {:description => description, :dimensions => dimensions, :size => (width.zero? ? height : width) * (height.zero? ? width : height)}
|
49
|
+
sizes
|
50
|
+
end.sort {|a, b| a[1][:size] <=> b[1][:size] }.each do |key, value|
|
51
|
+
sorted_sizes[key] = value
|
52
|
+
end
|
53
|
+
sorted_sizes
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
protected
|
58
|
+
def file_attached
|
59
|
+
errors.add(:file, 'You must upload a file!') if file_file_name.blank?
|
60
|
+
end
|
61
|
+
end
|
data/app/models/page.rb
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
class Page < ActiveRecord::Base
|
2
|
+
attr_writer :new_parent_slug
|
3
|
+
|
4
|
+
after_update :update_children
|
5
|
+
before_validation :set_slug_and_url
|
6
|
+
|
7
|
+
belongs_to :parent, :class_name => 'Page'
|
8
|
+
belongs_to :user
|
9
|
+
|
10
|
+
has_many :children, :class_name => 'Page', :foreign_key => :parent_id
|
11
|
+
has_many :page_sections, :dependent => :destroy
|
12
|
+
accepts_nested_attributes_for :page_sections, :reject_if => lambda {|page_section| page_section['content'].try(:strip).blank? }
|
13
|
+
|
14
|
+
scope :roots, where(:parent_id => nil)
|
15
|
+
|
16
|
+
validates_presence_of :name, :slug, :url
|
17
|
+
|
18
|
+
class << self
|
19
|
+
def per_page
|
20
|
+
10
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def class_name
|
25
|
+
@class_name ||= class_names.join(' ')
|
26
|
+
end
|
27
|
+
|
28
|
+
def class_names
|
29
|
+
@class_names ||= page_sections.group_by(&:section).map{|section, page_sections| "has-#{section}"}
|
30
|
+
end
|
31
|
+
|
32
|
+
protected
|
33
|
+
def set_slug_and_url
|
34
|
+
self.slug ||= name.parameterize
|
35
|
+
if new_record? || slug_changed? || parent_id_changed? || @new_parent_slug
|
36
|
+
self.url = [parent.try(:url), slug].compact.join('/')
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def update_children
|
41
|
+
if slug_changed? || parent_id_changed?
|
42
|
+
children.each{|child| child.update_attributes(:new_parent_slug => true, :updated_at => Time.now) }
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|