Skip to content

Commit

Permalink
bugfix: most of the time, site registrations would fail because of ti…
Browse files Browse the repository at this point in the history
…meouts. This should fix it (moved registration to a backgroundrb task).
  • Loading branch information
Kieran Pilkington committed Oct 31, 2008
1 parent fc0d27f commit abd4e15
Show file tree
Hide file tree
Showing 5 changed files with 191 additions and 76 deletions.
114 changes: 63 additions & 51 deletions app/controllers/configure_controller.rb
Expand Up @@ -7,6 +7,8 @@ class ConfigureController < ApplicationController

permit "tech_admin of :site"

include SiteRegistration

def index
@advanced = params[:advanced] || false
@sections = SETUP_SECTIONS.collect { |s| s}
Expand Down Expand Up @@ -217,50 +219,79 @@ def prime_zebra
# that we also at site configure in index
def add_link_from_kete_net
# check to see if the site is already listed
# loads variable used in the reload-site-index section
site_listing
end

def send_information
register_url = "http://kete.net.nz"
kete_sites_link = register_url + "/site/kete_sites"
register_new_link = "#{kete_sites_link}/new"
set_kete_net_urls
if !request.xhr?
redirect_to register_new_link
redirect_to @kete_sites_register
else
# this will break if reached when these constants aren't set
raise "Pretty Site Name and Site URL constants are not set, are you sure you restarted your server after you configured your Kete site?" if SITE_URL.blank? || PRETTY_SITE_NAME.blank?
begin
register = RegisterSiteResource.create(:name => PRETTY_SITE_NAME, :url => SITE_URL, :description => params[:site_description])
rescue
register = nil
@register_error = $!
@worker_type = "site_registration_worker".to_sym
if backgroundrb_is_running?(@worker_type)
MiddleMan.worker(@worker_type, @worker_type.to_s).delete
sleep 5 # give it time to kill the worker
end
render :update do |page|
top_message = String.new
if !register.nil? && register && register.errors.empty? && register.id > 0
top_message = "Your Kete installation has been registered. Thank you. You can view the whole directory of Kete sites at " + link_to(kete_sites_link) + "."
elsif !register.nil? && !register.errors.empty?
register_message = "<strong>Some fields were incorrect:</strong><br />"
register.errors.each do |field, error|
register_message += "&nbsp;&nbsp;#{field.humanize} #{error}<br />"

unless backgroundrb_is_running?(@worker_type)
MiddleMan.new_worker( :worker => @worker_type, :worker_key => @worker_type.to_s )
MiddleMan.worker(@worker_type, @worker_type.to_s).async_do_work( :arg => { :params => params } )
render :update do |page|
page.replace_html("updater", periodically_call_remote(:url => { :action => 'get_registration_progress' }, :frequency => 3))
end
else
render :update do |page|
page.replace_html("top_message", "There is already a site registration worker active. Weird! Try refreshing the page.")
page.hide('spinner')
end
end
end
end

include WorkerControllerHelpers

def get_registration_progress
set_kete_net_urls
begin
@worker_type = "site_registration_worker".to_sym
status = MiddleMan.worker(@worker_type, @worker_type.to_s).ask_result(:results)
logger.debug(status.inspect)
if !status.blank?
if status[:registration_complete] == true
# the following lines means the periodic calls to this method wont cause errors
# when trying to process the registration again
MiddleMan.worker(@worker_type, @worker_type.to_s).reset_worker
MiddleMan.worker(@worker_type, @worker_type.to_s).delete

if status[:registration_success] == true
top_message = "Your Kete installation has been registered. Thank you. You can view the whole directory of Kete sites at <a href='#{@kete_sites}'>#{@kete_sites}</a>."
render :update do |page|
page.hide('spinner')
page.replace_html("top_message", top_message)
end
elsif !status[:registration_validation_errors].blank?
register_errors = "<strong>Some fields were incorrect:</strong><br />"
status[:registration_validation_errors].each do |field, error|
register_errors += "&nbsp;&nbsp;#{field.humanize} #{error}<br />"
end
render :update do |page|
page.replace_html("register_errors", register_errors)
page.hide('spinner')
page.show('form_fields')
end
else
error_registering_site
end
page.replace_html("register_errors", register_message)
page.show('form_fields')
page.show('site_description')
page.show('data-button')
page.hide('top_message')
else
logger.error("Error linking from Kete.net.nz: " + @register_error) if @register_error
top_message = "There was an error linking to your site. "
site_listing
if @site_listing.blank?
top_message += "You can do it manually at "+ link_to(register_new_link) + "."
else
top_message += "However, it appears that your site is now listed. Please check the listing to make sure it is correct at " + link_to(@site_listing) + '.'
render :update do |page| # we don't update anything, this just licenses errors
end
end
page.replace_html("top_message", top_message)
else
error_registering_site
end
rescue
error_registering_site
end
end

Expand All @@ -281,19 +312,6 @@ def set_not_completed
@not_completed = SystemSetting.not_completed
end

def site_listing
# we empty @site_listing in case it already exists
@site_listing = String.new
require 'net/http'
require 'uri'
remote_url = URI.parse("http://kete.net.nz/site/kete_sites/has_link_to")
remote_url.path = "/" if remote_url.path.length < 1
http = Net::HTTP.new(remote_url.host, 80)
@site_listing = http.request_post(remote_url.path, "url=#{SITE_URL}").body
end

helper_method :site_listing

private

def ssl_required?
Expand All @@ -307,9 +325,3 @@ def ssl_allowed?
end

end

class RegisterSiteResource < ActiveResource::Base
self.site = "http://kete.net.nz/site/"
self.element_name = "kete_site"
self.timeout = 60
end
55 changes: 32 additions & 23 deletions app/views/configure/_link_to_site.html.erb
@@ -1,29 +1,38 @@
<h3>List your site on Kete.net.nz (optional)</h3>

<% if @site_listing.blank? -%>
<div id="send_information">
<div id="top_message"><p>Would you like to send your site name,
site url and a short description of your site for to a public list of Kete installations?</p></div>

<% form_remote_tag ( :url => { :action => 'send_information' },
:before => "Element.hide('form_fields');Element.show('data-spinner')",
:complete => "Element.hide('data-spinner')",
:href => url_for( :action => 'send_information' ) ) do %>
<div id="form_fields">
<div id="register_errors"></div>
<div>
<label for="site_description">Site description: <small>(optional)</small></label><br />
<input type="text" id="site_description" name="site_description" size="45" />

<div id="send_information">
<div id="top_message">
<p>
Would you like to send your site name, site url and a short description of your site for to a public list of Kete installations?
</p>
</div>
<div><%= submit_tag 'Send Information', :id => 'data-button' -%></div>

<% form_remote_tag ( :url => { :action => 'send_information' },
:before => "Element.hide('form_fields'); Element.show('spinner')",
:href => url_for( :action => 'send_information' ) ) do -%>
<div id="form_fields">
<div id="register_errors"></div>
<div>
<label for="site_description">Site description: <small>(optional)</small></label><br />
<input type="text" id="site_description" name="site_description" size="45" />
</div>
<div><%= submit_tag 'Send Information', :id => 'data-button' -%></div>
</div>
<% end -%>
</div>

<div id="updater"></div>

<div id="spinner" style="display:none;">
<img src="/images/indicator.gif" width="16" height="16" alt="Completed. ">
</div>
<% end -%>
</div>
<div id="data-spinner" style="display:none; text-align:center">
<img src="/images/indicator.gif" width="16" height="16" alt="Sending. " />
</div>

<% else -%>
<div id="site_is_listed">
Kete.net.nz already lists the site. You can see details at
<%= link_to(@site_listing, @site_listing) -%>.
</div>

<div id="site_is_listed">
Kete.net.nz already lists the site. You can see details at <%= link_to(@site_listing, @site_listing) -%>.
</div>

<% end -%>
3 changes: 1 addition & 2 deletions app/views/importers/create.html.erb
Expand Up @@ -25,8 +25,7 @@
<div id="done">...in progress.</div>

<div id="exit">
<% # stop action broken because of bug in backgroundrb? %>
<%= button_to 'Stop Import Early', :action => 'stop', :id => @import, :worker_type => @worker_type %>
<%= button_to 'Stop Import Early', :action => 'stop', :id => @import, :worker_type => @worker_type %>
</div>

<%= render(:partial => "topics/content_wrapper_end" ) %>
46 changes: 46 additions & 0 deletions lib/site_registration.rb
@@ -0,0 +1,46 @@
module SiteRegistration
unless included_modules.include? SiteRegistration
def set_kete_net_urls
@kete_net = "http://localhost:3000/site"
@kete_sites = "#{@kete_net}/kete_sites"
@kete_sites_register = "#{@kete_sites}/new"
end

def check_nessesary_constants_set
raise "Pretty Site Name and Site URL constants are not set, are you sure you restarted your server after you configured your Kete site?" if SITE_URL.blank? || PRETTY_SITE_NAME.blank?
end

def site_listing
check_nessesary_constants_set
set_kete_net_urls
@site_listing = RegisterSiteResource.find(:all, :params => { :url => SITE_URL })
if @site_listing.blank?
@site_listing = ''
else
@site_listing = @site_listing.first.attributes
@site_listing = "#{@kete_sites}/#{@site_listing['id']}"
end
end

def error_registering_site
set_kete_net_urls
top_message = "There was an error linking to your site. "
site_listing
if @site_listing.blank?
top_message += "You can do it manually at <a href='#{@kete_sites_register}'>#{@kete_sites_register}</a>."
else
top_message += "However, it appears that your site is now listed. Please check the listing to make sure it is correct at <a href='#{@site_listing}'>#{@site_listing}</a>."
end
render :update do |page|
page.hide('spinner')
page.replace_html("top_message", top_message)
end
end
end
end

class RegisterSiteResource < ActiveResource::Base
self.site = "http://localhost:3000/site/"
self.element_name = "kete_site"
self.timeout = 60
end
49 changes: 49 additions & 0 deletions lib/workers/site_registration_worker.rb
@@ -0,0 +1,49 @@
class SiteRegistrationWorker < BackgrounDRb::MetaWorker
set_worker_name :site_registration_worker
set_no_auto_load true

include SiteRegistration

def create(args = nil)
results = { :registration_success => false,
:registration_validation_errors => Array.new,
:registration_complete => false }

cache[:results] = results
end

def do_work(args = nil)
@results = cache[:results]
params = args[:params]

check_nessesary_constants_set

begin
register = RegisterSiteResource.create(:name => PRETTY_SITE_NAME, :url => SITE_URL, :description => params[:site_description])
rescue
register = nil
@kete_net_error = $!
end

if !register.nil? && register && register.errors.empty? && register.id > 0
@results[:registration_success] = true
elsif !register.nil? && !register.errors.empty?
@results[:registration_validation_errors] = register.errors
else
logger.error("Error linking from Kete.net.nz: " + @kete_net_error) if @kete_net_error
end

@results[:registration_complete] = true

cache[:results] = @results
end

def reset_worker
results = { :registration_success => false,
:registration_validation_errors => Array.new,
:registration_complete => false }

cache[:results] = results
end

end

0 comments on commit abd4e15

Please sign in to comment.