radiant-vhost-extension 2.2.0 → 2.3.0
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 +42 -0
- data/VERSION +1 -1
- data/app/controllers/admin/sites_controller.rb +15 -1
- data/app/models/hostname.rb +5 -0
- data/app/models/site.rb +18 -0
- data/app/views/admin/hostnames/_hostname.html.haml +4 -0
- data/app/views/admin/sites/_form.html.haml +8 -3
- data/app/views/admin/sites/index.html.haml +1 -1
- data/app/views/admin/sites/remove.html.haml +2 -2
- data/config/locales/en.yml +3 -0
- data/cucumber.yml +1 -0
- data/db/migrate/20100716175246_add_config_to_sites.rb +16 -0
- data/db/migrate/20100716180924_create_hostnames.rb +20 -0
- data/db/migrate/20100718021117_remove_site_hostname_field.rb +16 -0
- data/features/support/env.rb +16 -0
- data/features/support/paths.rb +14 -0
- data/lib/site_scope.rb +1 -2
- data/lib/tasks/vhost_extension_tasks.rake +37 -0
- data/lib/vhost/admin_users_helper_extensions.rb +1 -1
- data/lib/vhost/application_controller_extensions.rb +3 -3
- data/lib/vhost/application_helper_extensions.rb +1 -1
- data/lib/vhost/site_scoped_model_extensions.rb +0 -2
- data/public/javascripts/admin/vhost.js +38 -0
- data/radiant-vhost-extension.gemspec +14 -4
- data/spec/controllers/admin/pages_controller_spec.rb +1 -1
- data/spec/controllers/site_controller_spec.rb +1 -1
- data/vhost_extension.rb +2 -2
- metadata +16 -6
- data/README +0 -64
data/README.md
ADDED
@@ -0,0 +1,42 @@
|
|
1
|
+
Host multiple separate websites on the same Radiant installation each with their
|
2
|
+
own users, pages, snippets and layouts (soon to be supporting other extensions).
|
3
|
+
Administer users and sites from any domain using your administrative accounts
|
4
|
+
and manage website content by logging into each domain.
|
5
|
+
|
6
|
+
## IMPORTANT NOTES ABOUT VHOST
|
7
|
+
|
8
|
+
* Not compatible with the multi_site extension
|
9
|
+
* Uses the scoped_access plugin, make sure none of your extensions have a
|
10
|
+
conflicting version of the plugin.
|
11
|
+
* Hooks into the Radiant 'bootstrap' functionality and currently overwrites the
|
12
|
+
standard templates with a modified version of the Simple Blog (i.e. no Styled
|
13
|
+
Blog or Coffee template)
|
14
|
+
|
15
|
+
## INSTRUCTIONS
|
16
|
+
|
17
|
+
gem install radiant-vhost-extension
|
18
|
+
|
19
|
+
## VHOST SUPPORT FOR OTHER EXTENSIONS
|
20
|
+
|
21
|
+
Vhost support for other extensions is enabled by creating a /config/vhost.yml
|
22
|
+
file containing the names of the models that should be scoped down per site. If
|
23
|
+
site scoping for an extension cannot be specified through the model (i.e. it
|
24
|
+
uses the file system to present data or otherwise doesn't use an ActiveRecord)
|
25
|
+
then currently you cannot enable site scoping.
|
26
|
+
|
27
|
+
Example vhost.yml:
|
28
|
+
|
29
|
+
models:
|
30
|
+
# Class name
|
31
|
+
ManagedFile:
|
32
|
+
# Property requiring definition of validates_uniqueness_of
|
33
|
+
filename:
|
34
|
+
# Parameters to pass to validates_uniqueness_of
|
35
|
+
scope:
|
36
|
+
- site_id
|
37
|
+
message:
|
38
|
+
'file name is already in use'
|
39
|
+
# Any classes used in Single Table Inheritance(STI)
|
40
|
+
sti_classes:
|
41
|
+
- OneClass
|
42
|
+
- TwoClass
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
2.
|
1
|
+
2.3.0
|
@@ -4,13 +4,27 @@ class Admin::SitesController < Admin::ResourceController
|
|
4
4
|
:denied_url => { :controller => 'pages', :action => 'index' },
|
5
5
|
:denied_message => 'You must have administrative privileges to perform this action.'
|
6
6
|
|
7
|
+
def new
|
8
|
+
model.hostnames.build
|
9
|
+
end
|
10
|
+
|
7
11
|
def switch_to
|
8
12
|
site = Site.find(params[:id])
|
9
13
|
if site
|
10
|
-
redirect_to "http://#{site.
|
14
|
+
redirect_to "http://#{site.hostnames.first.domain}#{request.port.to_s == '80' ? '' : ":#{request.port}"}/admin"
|
11
15
|
else
|
12
16
|
render :index
|
13
17
|
end
|
14
18
|
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
def load_model
|
23
|
+
self.model = if params[:id]
|
24
|
+
model_class.find(params[:id], :include => [:hostnames])
|
25
|
+
else
|
26
|
+
model_class.new
|
27
|
+
end
|
28
|
+
end
|
15
29
|
|
16
30
|
end
|
data/app/models/site.rb
CHANGED
@@ -1,8 +1,26 @@
|
|
1
1
|
class Site < ActiveRecord::Base
|
2
2
|
has_and_belongs_to_many :users
|
3
3
|
has_many :pages
|
4
|
+
has_many :hostnames
|
5
|
+
|
6
|
+
serialize :config
|
7
|
+
|
8
|
+
def title=(val)
|
9
|
+
self.config ||= {}
|
10
|
+
self.config['title'] = val
|
11
|
+
end
|
12
|
+
|
13
|
+
def title
|
14
|
+
self.config ||= {}
|
15
|
+
self.config['title']
|
16
|
+
end
|
17
|
+
|
18
|
+
def hostname=(val)
|
19
|
+
hostnames.first.update_attributes(:domain => val)
|
20
|
+
end
|
4
21
|
|
5
22
|
accepts_nested_attributes_for :users
|
23
|
+
accepts_nested_attributes_for :hostnames, :allow_destroy => true
|
6
24
|
VhostExtension.MODELS.each do |model|
|
7
25
|
has_many model.tableize.to_sym unless model.tableize.match(/pages|users/) # unless already defined
|
8
26
|
end
|
@@ -2,10 +2,14 @@
|
|
2
2
|
= render_region :form_top
|
3
3
|
.form-area
|
4
4
|
- render_region :form do |form|
|
5
|
+
- form.edit_title do
|
6
|
+
%p.title
|
7
|
+
= f.label :title
|
8
|
+
= f.text_field :title, :class => 'textbox', :maxlength => 100
|
5
9
|
- form.edit_hostname do
|
6
|
-
|
7
|
-
|
8
|
-
|
10
|
+
#hostnames
|
11
|
+
- f.fields_for :hostnames do |fields|
|
12
|
+
= render 'admin/hostnames/hostname', :fields => fields, :collection => @site.hostnames
|
9
13
|
- form.edit_users do
|
10
14
|
%p.users
|
11
15
|
%label{:for=>"site_users"} Users
|
@@ -17,3 +21,4 @@
|
|
17
21
|
= save_model_and_continue_editing_button(@site)
|
18
22
|
or
|
19
23
|
= link_to 'Cancel', admin_sites_url
|
24
|
+
- include_javascript 'admin/vhost'
|
@@ -11,7 +11,7 @@
|
|
11
11
|
- for site in @sites
|
12
12
|
%tr.node.level-1
|
13
13
|
%td.site
|
14
|
-
= link_to site.
|
14
|
+
= link_to site.config['title'], edit_admin_site_url(:id => site)
|
15
15
|
%td.site
|
16
16
|
= link_to 'Go', switch_to_admin_site_url(site)
|
17
17
|
%td.users= site.users.collect(&:name).join(', ')
|
data/cucumber.yml
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
default: --format progress features --tags ~@proposed,~@in_progress
|
@@ -0,0 +1,16 @@
|
|
1
|
+
class AddConfigToSites < ActiveRecord::Migration
|
2
|
+
def self.up
|
3
|
+
add_column :sites, :config, :text
|
4
|
+
Site.reset_column_information
|
5
|
+
Site.find_in_batches do |sites|
|
6
|
+
sites.each do |site|
|
7
|
+
site.title = site.hostname
|
8
|
+
site.save
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.down
|
14
|
+
remove_column :sites, :config
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
class CreateHostnames < ActiveRecord::Migration
|
2
|
+
def self.up
|
3
|
+
create_table :hostnames, :force => true do |t|
|
4
|
+
t.string :domain, :unique => true
|
5
|
+
t.string :port, :default => 80
|
6
|
+
t.integer :site_id
|
7
|
+
t.timestamps
|
8
|
+
end
|
9
|
+
Hostname.reset_column_information
|
10
|
+
Site.find_in_batches do |sites|
|
11
|
+
sites.each { |site|
|
12
|
+
site.hostnames.find_or_create_by_domain(:domain => site.hostname)
|
13
|
+
}
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.down
|
18
|
+
drop_table :hostnames
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
class RemoveSiteHostnameField < ActiveRecord::Migration
|
2
|
+
def self.up
|
3
|
+
remove_column :sites, :hostname
|
4
|
+
end
|
5
|
+
|
6
|
+
def self.down
|
7
|
+
add_column :sites, :hostname, :string
|
8
|
+
Site.reset_column_information
|
9
|
+
Site.find_in_batches do |sites|
|
10
|
+
sites.each do |site|
|
11
|
+
site.hostname = site.hostnames.first.domain
|
12
|
+
site.save
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# Sets up the Rails environment for Cucumber
|
2
|
+
ENV["RAILS_ENV"] = "test"
|
3
|
+
# Extension root
|
4
|
+
extension_env = File.expand_path(File.dirname(__FILE__) + '/../../../../../config/environment')
|
5
|
+
require extension_env+'.rb'
|
6
|
+
|
7
|
+
Dir.glob(File.join(RADIANT_ROOT, "features", "**", "*.rb")).each {|step| require step}
|
8
|
+
|
9
|
+
Cucumber::Rails::World.class_eval do
|
10
|
+
include Dataset
|
11
|
+
datasets_directory "#{RADIANT_ROOT}/spec/datasets"
|
12
|
+
Dataset::Resolver.default = Dataset::DirectoryResolver.new("#{RADIANT_ROOT}/spec/datasets", File.dirname(__FILE__) + '/../../spec/datasets', File.dirname(__FILE__) + '/../datasets')
|
13
|
+
self.datasets_database_dump_path = "#{Rails.root}/tmp/dataset"
|
14
|
+
|
15
|
+
# dataset :vhost
|
16
|
+
end
|
data/lib/site_scope.rb
CHANGED
@@ -12,8 +12,7 @@ module SiteScope
|
|
12
12
|
# Remove the 'www.' from the site so we don't have to always include a www.
|
13
13
|
# in addition to the regular domain name.
|
14
14
|
host.gsub!(/^www\./, '')
|
15
|
-
@current_site ||=
|
16
|
-
raise "No site found to match #{host}." unless @current_site
|
15
|
+
@current_site ||= Hostname.find_by_domain(host).try(:site) || Hostname.find_by_domain('*').try(:site) || begin Hostname.find(:first, :conditions => ["hostname LIKE ?", "%#{host}%"]) rescue raise "No site found to match #{host}." unless @current_site end
|
17
16
|
Thread.current[:current_site_id] = @current_site.id
|
18
17
|
@current_site
|
19
18
|
end
|
@@ -14,6 +14,43 @@ namespace :radiant do
|
|
14
14
|
VhostExtension.migrator.migrate
|
15
15
|
end
|
16
16
|
end
|
17
|
+
|
18
|
+
desc "Copies public assets of the Vhost to the instance public/ directory."
|
19
|
+
task :update => :environment do
|
20
|
+
is_svn_or_dir = proc {|path| path =~ /\.svn/ || File.directory?(path) }
|
21
|
+
puts "Copying assets from VhostExtension"
|
22
|
+
Dir[VhostExtension.root + "/public/**/*"].reject(&is_svn_or_dir).each do |file|
|
23
|
+
path = file.sub(VhostExtension.root, '')
|
24
|
+
directory = File.dirname(path)
|
25
|
+
mkdir_p RAILS_ROOT + directory, :verbose => false
|
26
|
+
cp file, RAILS_ROOT + path, :verbose => false
|
27
|
+
end
|
28
|
+
unless VhostExtension.root.starts_with? RAILS_ROOT # don't need to copy vendored tasks
|
29
|
+
puts "Copying rake tasks from VhostExtension"
|
30
|
+
local_tasks_path = File.join(RAILS_ROOT, %w(lib tasks))
|
31
|
+
mkdir_p local_tasks_path, :verbose => false
|
32
|
+
Dir[File.join VhostExtension.root, %w(lib tasks *.rake)].each do |file|
|
33
|
+
cp file, local_tasks_path, :verbose => false
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
desc "Syncs all available translations for this ext to the English ext master"
|
39
|
+
task :sync => :environment do
|
40
|
+
# The main translation root, basically where English is kept
|
41
|
+
language_root = VhostExtension.root + "/config/locales"
|
42
|
+
words = TranslationSupport.get_translation_keys(language_root)
|
43
|
+
|
44
|
+
Dir["#{language_root}/*.yml"].each do |filename|
|
45
|
+
next if filename.match('_available_tags')
|
46
|
+
basename = File.basename(filename, '.yml')
|
47
|
+
puts "Syncing #{basename}"
|
48
|
+
(comments, other) = TranslationSupport.read_file(filename, basename)
|
49
|
+
words.each { |k,v| other[k] ||= words[k] } # Initializing hash variable as empty if it does not exist
|
50
|
+
other.delete_if { |k,v| !words[k] } # Remove if not defined in en.yml
|
51
|
+
TranslationSupport.write_file(filename, basename, comments, other)
|
52
|
+
end
|
53
|
+
end
|
17
54
|
|
18
55
|
|
19
56
|
# @todo the following method should accept a direction. We should also
|
@@ -2,7 +2,7 @@ module Vhost::AdminUsersHelperExtensions
|
|
2
2
|
def self.included(receiver)
|
3
3
|
receiver.send :alias_method_chain, :roles, :site_admin
|
4
4
|
receiver.send :define_method, :sites do |user|
|
5
|
-
sites = user.sites.collect{|site| site.
|
5
|
+
sites = user.sites.collect{|site| site.title}
|
6
6
|
sites.join("<br/>")
|
7
7
|
end
|
8
8
|
end
|
@@ -9,14 +9,14 @@ module Vhost::ApplicationControllerExtensions
|
|
9
9
|
if VhostExtension.REDIRECT_TO_PRIMARY_SITE
|
10
10
|
site = current_site
|
11
11
|
return if site.nil? || site.hostname.include?("*")
|
12
|
-
primary_host = site.
|
12
|
+
primary_host = site.hostnames.first.domain
|
13
13
|
redirect_to(primary_site_url + request.request_uri) if request.host != primary_host
|
14
14
|
end
|
15
15
|
end
|
16
16
|
|
17
17
|
def primary_site_url
|
18
18
|
site = current_site
|
19
|
-
return nil if site.nil? || site.
|
19
|
+
return nil if site.nil? || site.hostnames.map(&:domain).include?("*")
|
20
20
|
|
21
21
|
# Rebuild the current URL. Check if it matches the URL of the
|
22
22
|
# primary site and redirect if it does not.
|
@@ -25,7 +25,7 @@ module Vhost::ApplicationControllerExtensions
|
|
25
25
|
port = request.port_string
|
26
26
|
|
27
27
|
# Primary site is the first site
|
28
|
-
primary_host = site.
|
28
|
+
primary_host = site.hostnames.first.domain
|
29
29
|
|
30
30
|
# Return the concatenation
|
31
31
|
prefix+primary_host+port
|
@@ -3,8 +3,6 @@ module Vhost::SiteScopedModelExtensions
|
|
3
3
|
module InstanceMethods
|
4
4
|
def self.included(base)
|
5
5
|
base.class_eval {
|
6
|
-
Rails.logger.debug("Applying SiteScope to '"+self.name+"'")
|
7
|
-
|
8
6
|
self.clear_callbacks_by_calling_method_name(:validate, :validates_uniqueness_of)
|
9
7
|
validates_presence_of :site_id
|
10
8
|
belongs_to :site
|
@@ -0,0 +1,38 @@
|
|
1
|
+
document.observe('dom:loaded',function(){
|
2
|
+
|
3
|
+
$('hostnames').insert({
|
4
|
+
after: new Element('p').update(new Element('a',{href: '#', id: 'add_domain'}).update('Add domain'))
|
5
|
+
})
|
6
|
+
|
7
|
+
$$('p.hostname').each(function(item){
|
8
|
+
item.insert({
|
9
|
+
bottom: new Element('img', {src: '/images/admin/minus.png', className: 'domain_remover'})
|
10
|
+
});
|
11
|
+
});
|
12
|
+
|
13
|
+
Event.addBehavior({
|
14
|
+
'#add_domain:click': function(){
|
15
|
+
var new_hostname = $$('#hostnames p.hostname')[0].cloneNode(true)
|
16
|
+
var label = $(new_hostname).down('label'); $(label).writeAttribute('id','')
|
17
|
+
var input = $(new_hostname).down('input.domain'); $(input).writeAttribute('id','')
|
18
|
+
var destroy = $(new_hostname).down('input.delete_input').remove();
|
19
|
+
var new_hostname_id = $(input).identify();
|
20
|
+
$(label).writeAttribute('for',new_hostname_id)
|
21
|
+
$(input).writeAttribute('name','site[hostnames_attributes]['+ $$('input[name*=domain]').size() + '][domain]')
|
22
|
+
$(input).writeAttribute('value','')
|
23
|
+
$('hostnames').insert({bottom: new_hostname})
|
24
|
+
Event.addBehavior.reload()
|
25
|
+
return false;
|
26
|
+
},
|
27
|
+
|
28
|
+
'.domain_remover:click': function(){
|
29
|
+
p = $(this).up('p.hostname');
|
30
|
+
var destroyer = p.down('input[name*=destroy]')
|
31
|
+
if(destroyer) destroyer.setValue('1');
|
32
|
+
|
33
|
+
var removed_element = p.remove()
|
34
|
+
if(destroyer) $('hostnames').insert(removed_element.down('input[name*=destroy]'))
|
35
|
+
}
|
36
|
+
});
|
37
|
+
|
38
|
+
});
|
@@ -5,24 +5,26 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{radiant-vhost-extension}
|
8
|
-
s.version = "2.
|
8
|
+
s.version = "2.3.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Jason Garber", "Kaleb Walton", "Jim Gay"]
|
12
|
-
s.date = %q{2010-
|
12
|
+
s.date = %q{2010-07-17}
|
13
13
|
s.description = %q{Host more than one site in a single instance of Radiant.}
|
14
14
|
s.email = %q{jim@saturnflyer.com}
|
15
15
|
s.extra_rdoc_files = [
|
16
|
-
"README"
|
16
|
+
"README.md"
|
17
17
|
]
|
18
18
|
s.files = [
|
19
19
|
".gitmodules",
|
20
|
-
"README",
|
20
|
+
"README.md",
|
21
21
|
"Rakefile",
|
22
22
|
"VERSION",
|
23
23
|
"app/controllers/admin/sites_controller.rb",
|
24
|
+
"app/models/hostname.rb",
|
24
25
|
"app/models/site.rb",
|
25
26
|
"app/models/site_association_observer.rb",
|
27
|
+
"app/views/admin/hostnames/_hostname.html.haml",
|
26
28
|
"app/views/admin/sites/_form.html.haml",
|
27
29
|
"app/views/admin/sites/edit.html.haml",
|
28
30
|
"app/views/admin/sites/index.html.haml",
|
@@ -32,13 +34,20 @@ Gem::Specification.new do |s|
|
|
32
34
|
"app/views/admin/users/_site_admin_roles.html.haml",
|
33
35
|
"app/views/admin/users/_sites_td.html.haml",
|
34
36
|
"app/views/admin/users/_sites_th.html.haml",
|
37
|
+
"config/locales/en.yml",
|
35
38
|
"config/routes.rb",
|
39
|
+
"cucumber.yml",
|
36
40
|
"db/migrate/001_create_sites.rb",
|
37
41
|
"db/migrate/002_add_sites_users.rb",
|
38
42
|
"db/migrate/003_replace_snippet_name_unique_index.rb",
|
39
43
|
"db/migrate/004_add_site_admin_to_users.rb",
|
44
|
+
"db/migrate/20100716175246_add_config_to_sites.rb",
|
45
|
+
"db/migrate/20100716180924_create_hostnames.rb",
|
46
|
+
"db/migrate/20100718021117_remove_site_hostname_field.rb",
|
40
47
|
"db/templates/empty.yml",
|
41
48
|
"db/templates/simple-blog.yml",
|
49
|
+
"features/support/env.rb",
|
50
|
+
"features/support/paths.rb",
|
42
51
|
"lib/bootstrap_with_site_id.rb",
|
43
52
|
"lib/radiant-vhost-extension.rb",
|
44
53
|
"lib/site_scope.rb",
|
@@ -53,6 +62,7 @@ Gem::Specification.new do |s|
|
|
53
62
|
"lib/vhost/radiant_cache_extensions.rb",
|
54
63
|
"lib/vhost/site_scoped_model_extensions.rb",
|
55
64
|
"lib/vhost_default_config.yml",
|
65
|
+
"public/javascripts/admin/vhost.js",
|
56
66
|
"radiant-vhost-extension.gemspec",
|
57
67
|
"spec/controllers/admin/pages_controller_spec.rb",
|
58
68
|
"spec/controllers/admin/sites_controller_spec.rb",
|
@@ -4,7 +4,7 @@ describe Admin::PagesController do
|
|
4
4
|
dataset :sites_site_users_and_site_pages
|
5
5
|
|
6
6
|
before :each do
|
7
|
-
VhostExtension.HOST = sites(:site_a).
|
7
|
+
VhostExtension.HOST = sites(:site_a).hostnames.first.domain # Pretend we're connected to site_a so the SiteScope works right
|
8
8
|
rescue_action_in_public! # ActionController::TestCase no longer considers this request a local request
|
9
9
|
|
10
10
|
# don't bork results with stale cache items
|
@@ -5,7 +5,7 @@ describe SiteController do
|
|
5
5
|
|
6
6
|
before(:each) do
|
7
7
|
logout
|
8
|
-
VhostExtension.HOST = sites(:site_a).
|
8
|
+
VhostExtension.HOST = sites(:site_a).hostnames.first.domain # Pretend we're connected to site_a so the SiteScope works right
|
9
9
|
rescue_action_in_public! # ActionController::TestCase no longer considers this request a local request
|
10
10
|
|
11
11
|
# don't bork results with stale cache items
|
data/vhost_extension.rb
CHANGED
@@ -140,12 +140,12 @@ class VhostExtension < Radiant::Extension
|
|
140
140
|
returning OpenStruct.new do |site|
|
141
141
|
site.edit = Radiant::AdminUI::RegionSet.new do |edit|
|
142
142
|
edit.main.concat %w{edit_header edit_form}
|
143
|
-
edit.form.concat %w{edit_hostname edit_users}
|
143
|
+
edit.form.concat %w{edit_title edit_hostname edit_users}
|
144
144
|
edit.form_bottom.concat %w{edit_buttons}
|
145
145
|
end
|
146
146
|
site.new = Radiant::AdminUI::RegionSet.new do |new|
|
147
147
|
new.main.concat %w{edit_header edit_form}
|
148
|
-
new.form.concat %w{edit_hostname edit_users}
|
148
|
+
new.form.concat %w{edit_title edit_hostname edit_users}
|
149
149
|
new.form_bottom.concat %w{edit_buttons}
|
150
150
|
end
|
151
151
|
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: radiant-vhost-extension
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 3
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 2
|
8
|
-
-
|
8
|
+
- 3
|
9
9
|
- 0
|
10
|
-
version: 2.
|
10
|
+
version: 2.3.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Jason Garber
|
@@ -17,7 +17,7 @@ autorequire:
|
|
17
17
|
bindir: bin
|
18
18
|
cert_chain: []
|
19
19
|
|
20
|
-
date: 2010-
|
20
|
+
date: 2010-07-17 00:00:00 -04:00
|
21
21
|
default_executable:
|
22
22
|
dependencies:
|
23
23
|
- !ruby/object:Gem::Dependency
|
@@ -41,15 +41,17 @@ executables: []
|
|
41
41
|
extensions: []
|
42
42
|
|
43
43
|
extra_rdoc_files:
|
44
|
-
- README
|
44
|
+
- README.md
|
45
45
|
files:
|
46
46
|
- .gitmodules
|
47
|
-
- README
|
47
|
+
- README.md
|
48
48
|
- Rakefile
|
49
49
|
- VERSION
|
50
50
|
- app/controllers/admin/sites_controller.rb
|
51
|
+
- app/models/hostname.rb
|
51
52
|
- app/models/site.rb
|
52
53
|
- app/models/site_association_observer.rb
|
54
|
+
- app/views/admin/hostnames/_hostname.html.haml
|
53
55
|
- app/views/admin/sites/_form.html.haml
|
54
56
|
- app/views/admin/sites/edit.html.haml
|
55
57
|
- app/views/admin/sites/index.html.haml
|
@@ -59,13 +61,20 @@ files:
|
|
59
61
|
- app/views/admin/users/_site_admin_roles.html.haml
|
60
62
|
- app/views/admin/users/_sites_td.html.haml
|
61
63
|
- app/views/admin/users/_sites_th.html.haml
|
64
|
+
- config/locales/en.yml
|
62
65
|
- config/routes.rb
|
66
|
+
- cucumber.yml
|
63
67
|
- db/migrate/001_create_sites.rb
|
64
68
|
- db/migrate/002_add_sites_users.rb
|
65
69
|
- db/migrate/003_replace_snippet_name_unique_index.rb
|
66
70
|
- db/migrate/004_add_site_admin_to_users.rb
|
71
|
+
- db/migrate/20100716175246_add_config_to_sites.rb
|
72
|
+
- db/migrate/20100716180924_create_hostnames.rb
|
73
|
+
- db/migrate/20100718021117_remove_site_hostname_field.rb
|
67
74
|
- db/templates/empty.yml
|
68
75
|
- db/templates/simple-blog.yml
|
76
|
+
- features/support/env.rb
|
77
|
+
- features/support/paths.rb
|
69
78
|
- lib/bootstrap_with_site_id.rb
|
70
79
|
- lib/radiant-vhost-extension.rb
|
71
80
|
- lib/site_scope.rb
|
@@ -80,6 +89,7 @@ files:
|
|
80
89
|
- lib/vhost/radiant_cache_extensions.rb
|
81
90
|
- lib/vhost/site_scoped_model_extensions.rb
|
82
91
|
- lib/vhost_default_config.yml
|
92
|
+
- public/javascripts/admin/vhost.js
|
83
93
|
- radiant-vhost-extension.gemspec
|
84
94
|
- spec/controllers/admin/pages_controller_spec.rb
|
85
95
|
- spec/controllers/admin/sites_controller_spec.rb
|
data/README
DELETED
@@ -1,64 +0,0 @@
|
|
1
|
-
Host multiple separate websites on the same Radiant installation each with their
|
2
|
-
own users, pages, snippets and layouts (soon to be supporting other extensions).
|
3
|
-
Administer users and sites from any domain using your administrative accounts
|
4
|
-
and manage website content by logging into each domain.
|
5
|
-
|
6
|
-
IMPORTANT NOTES ABOUT VHOST
|
7
|
-
- Not compatible with the multi_site extension
|
8
|
-
- Uses the scoped_access plugin, make sure none of your extensions have a
|
9
|
-
conflicting version of the plugin.
|
10
|
-
- Hooks into the Radiant 'bootstrap' functionality and currently overwrites the
|
11
|
-
standard templates with a modified version of the Simple Blog (i.e. no Styled
|
12
|
-
Blog or Coffee template)
|
13
|
-
|
14
|
-
INSTRUCTIONS
|
15
|
-
Currently (April 26th, 2009) you need the freshest version of Radiant (0.7.1)
|
16
|
-
which includes Rails 2.2.2 to run vhost. The following instructions use git
|
17
|
-
to directly check out the latest version of Radiant so you may need to adjust
|
18
|
-
them slightly. Once the Radiant gem supports Rails 2.2.2 these instructions
|
19
|
-
will reflect the proper way to run and install vhost.
|
20
|
-
|
21
|
-
* Run 'git clone git://github.com/radiant/radiant.git yoursite'
|
22
|
-
* In /yoursite run:
|
23
|
-
* git submodule init
|
24
|
-
* git submodule update
|
25
|
-
* Create production, development and test database schemas
|
26
|
-
* Update /yoursite/config/database.yml to point to the schemas
|
27
|
-
* In /yoursite/vendor/extensions run:
|
28
|
-
* git clone git://github.com/saturnflyer/radiant-vhost-extension.git vhost
|
29
|
-
* In /yoursite/vendor/extensions/vhost run:
|
30
|
-
* git submodule init
|
31
|
-
* git submodule update
|
32
|
-
* In /yoursite run:
|
33
|
-
* rake development db:bootstrap
|
34
|
-
* rake db:test:clone_structure (this one may be unnecessary)
|
35
|
-
* rake db:test:clone
|
36
|
-
* Finally, in /yoursite run:
|
37
|
-
* rake spec:extensions EXT=vhost
|
38
|
-
|
39
|
-
You should see a number of spec examples running and passing. If you don't,
|
40
|
-
or they're failing, something has gone wrong!
|
41
|
-
|
42
|
-
VHOST SUPPORT FOR OTHER EXTENSIONS
|
43
|
-
Vhost support for other extensions is enabled by creating a /config/vhost.yml
|
44
|
-
file containing the names of the models that should be scoped down per site. If
|
45
|
-
site scoping for an extension cannot be specified through the model (i.e. it
|
46
|
-
uses the file system to present data or otherwise doesn't use an ActiveRecord)
|
47
|
-
then currently you cannot enable site scoping.
|
48
|
-
|
49
|
-
Example vhost.yml:
|
50
|
-
|
51
|
-
models:
|
52
|
-
# Class name
|
53
|
-
ManagedFile:
|
54
|
-
# Property requiring definition of validates_uniqueness_of
|
55
|
-
filename:
|
56
|
-
# Parameters to pass to validates_uniqueness_of
|
57
|
-
scope:
|
58
|
-
- site_id
|
59
|
-
message:
|
60
|
-
'file name is already in use'
|
61
|
-
# Any classes used in Single Table Inheritance(STI)
|
62
|
-
sti_classes:
|
63
|
-
- OneClass
|
64
|
-
- TwoClass
|