iab-RailsGlue 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,87 @@
|
|
1
|
+
# Copyright (c) 2007-2008 Orangery Technology Limited
|
2
|
+
# You can redistribute it and/or modify it under the same terms as Ruby.
|
3
|
+
#
|
4
|
+
require 'rubygems'
|
5
|
+
require 'hooks/helpers/ActionView'
|
6
|
+
require 'hooks/helpers/ActiveRecord'
|
7
|
+
require 'hooks/helpers/paypal_helper'
|
8
|
+
require 'channel_manager'
|
9
|
+
|
10
|
+
require 'processengine/communicator'
|
11
|
+
|
12
|
+
class IabBaseController < ApplicationController
|
13
|
+
|
14
|
+
include PaypalHelper
|
15
|
+
helper_method :payment_amount
|
16
|
+
|
17
|
+
before_filter :set_channel_in_session, :load_changes_in_channel
|
18
|
+
|
19
|
+
|
20
|
+
def initialize()
|
21
|
+
@widgets = Hash.new
|
22
|
+
@assets = Hash.new
|
23
|
+
end
|
24
|
+
|
25
|
+
def render_for_file(template_path, status = nil, layout = nil, locals = {}) #:nodoc:
|
26
|
+
add_variables_to_assigns
|
27
|
+
assert_existence_of_template_file(template_path) if use_full_path
|
28
|
+
logger.info("Rendering #{template_path}" + (status ? " (#{status})" : '')) if logger
|
29
|
+
p = Hash.new
|
30
|
+
p[:product] = session[:product]
|
31
|
+
@template.setParmsForViewUse(p)
|
32
|
+
@template.setParmsForViewUse(@processMap)
|
33
|
+
text = @template.render(:file => template_path, :locals => locals, :layout => layout)
|
34
|
+
render_for_text text, status, true
|
35
|
+
end
|
36
|
+
|
37
|
+
def render_for_text(text = nil, status = nil, append_response = false) #:nodoc:
|
38
|
+
@performed_render = true
|
39
|
+
|
40
|
+
response.content_type = "text/html" #added this line over the standard rails method
|
41
|
+
|
42
|
+
response.headers['Status'] = interpret_status(status || DEFAULT_RENDER_STATUS_CODE)
|
43
|
+
|
44
|
+
if append_response
|
45
|
+
response.body ||= ''
|
46
|
+
response.body << text.to_s
|
47
|
+
else
|
48
|
+
response.body = case text
|
49
|
+
when Proc then text
|
50
|
+
when nil then " " # Safari doesn't pass the headers of the return if the response is zero length
|
51
|
+
else text.to_s
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
def massage(results)
|
57
|
+
#the search result will be an Array
|
58
|
+
#the normal response will be a hash of values to be displayed
|
59
|
+
#a hash entry maybe an array - this will be so when multiple occurrences of a relation is returned
|
60
|
+
#a url will be returned where's there is a redirection usually for paypal
|
61
|
+
if (results.is_a?(String) and results.include?("http"))
|
62
|
+
return results
|
63
|
+
elsif (results.is_a?(Hash))
|
64
|
+
results.each do |k,v|
|
65
|
+
if (v.is_a?(HashWithIndifferentAccess))
|
66
|
+
eval("@#{k} = #{k}.public_instantiate(v)")
|
67
|
+
elsif (v.is_a?(Array))
|
68
|
+
eval("@#{k} = Array.new")
|
69
|
+
#typically RAILS view code would interate over the instances for display purposes
|
70
|
+
v.each do |inst|
|
71
|
+
eval("@#{k}.push(#{k}.public_instantiate(inst))")
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
#nil implies there is no redirected URL
|
77
|
+
return nil
|
78
|
+
end
|
79
|
+
|
80
|
+
def sectionPremium
|
81
|
+
premium = Communicator.instance.handle(session,"SectionRating",params)
|
82
|
+
|
83
|
+
respond_to do |format|
|
84
|
+
format.js {render :text => "#{premium}" }
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
@@ -0,0 +1,93 @@
|
|
1
|
+
require 'hooks/helpers/instance_tag'
|
2
|
+
class ActionView::Template
|
3
|
+
def source
|
4
|
+
if (self.filename.include?("oil"))
|
5
|
+
require 'LayoutInterpreter'
|
6
|
+
open(self.filename) {|f| @contents = f.read }
|
7
|
+
if (@view)
|
8
|
+
dsl = "product \"#{@view.productInfo[:product]}\"\n#{@view.navigationSteps}\n"+@contents.to_s
|
9
|
+
else
|
10
|
+
#the JRuby version inside tomcat seems to pass thru here before @view is setup, but then again once it is
|
11
|
+
#this is to allow it to work until this issue is better understood
|
12
|
+
dsl = "product \"Retailer\"\nnavigation [:QNBRiskDataCollect,:QuoteSearch,:PolicySearch,:CancelConfirm]\n"+@contents.to_s
|
13
|
+
end
|
14
|
+
erb = "\t<% widgetROOT=\"#{WIDGET_ROOT2}\" %>\n"
|
15
|
+
erb << "\t<% teaserROOT=\"#{TEASER_ROOT}\" %>\n"
|
16
|
+
erb << LayoutInterpreter.execute(dsl)
|
17
|
+
source ||= erb
|
18
|
+
else
|
19
|
+
source ||= File.read(self.filename)
|
20
|
+
end
|
21
|
+
source
|
22
|
+
end
|
23
|
+
|
24
|
+
def registerView(view)
|
25
|
+
@view = view
|
26
|
+
end
|
27
|
+
end
|
28
|
+
class ActionView::Base
|
29
|
+
def productInfo
|
30
|
+
@productInfo
|
31
|
+
end
|
32
|
+
def setParmsForViewUse(productInfo)
|
33
|
+
if (@productInfo)
|
34
|
+
@productInfo.merge!(productInfo)
|
35
|
+
else
|
36
|
+
@productInfo = productInfo
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def navigationSteps
|
41
|
+
if @productInfo[@productInfo[:currentstep]] == nil
|
42
|
+
logger.error("Line of the form \"flow :#{@productInfo[:currentstep]} , [:nextstep1,:nextstep2,...]\" is missing in the \"valid_flows\" section of the product processes.oil file") if logger
|
43
|
+
end
|
44
|
+
steps = "navigation [:#{@productInfo[@productInfo[:currentstep]].first}"
|
45
|
+
@productInfo[@productInfo[:currentstep]].each do |action|
|
46
|
+
steps << ",:#{action}" unless action == @productInfo[@productInfo[:currentstep]].first
|
47
|
+
end
|
48
|
+
steps << "]"
|
49
|
+
steps
|
50
|
+
end
|
51
|
+
|
52
|
+
#added from ActionView::Base with additional call to registerView added in there
|
53
|
+
#not proud of the solution but need to quickly establish access to the base class from within the template
|
54
|
+
#to pick up some gui widget metadata used to control the navigation
|
55
|
+
#in rails 2.1 and below we had access to the ActionView::Base via @view instance var
|
56
|
+
def _pick_template(template_path)
|
57
|
+
return template_path if template_path.respond_to?(:render)
|
58
|
+
|
59
|
+
path = template_path.sub(/^\//, '')
|
60
|
+
if m = path.match(/(.*)\.(\w+)$/)
|
61
|
+
template_file_name, template_file_extension = m[1], m[2]
|
62
|
+
else
|
63
|
+
template_file_name = path
|
64
|
+
end
|
65
|
+
|
66
|
+
# OPTIMIZE: Checks to lookup template in view path
|
67
|
+
if template = self.view_paths["#{template_file_name}.#{template_format}"]
|
68
|
+
template
|
69
|
+
elsif template = self.view_paths[template_file_name]
|
70
|
+
template
|
71
|
+
elsif (first_render = @_render_stack.first) && first_render.respond_to?(:format_and_extension) &&
|
72
|
+
(template = self.view_paths["#{template_file_name}.#{first_render.format_and_extension}"])
|
73
|
+
template
|
74
|
+
elsif template_format == :js && template = self.view_paths["#{template_file_name}.html"]
|
75
|
+
@template_format = :html
|
76
|
+
template
|
77
|
+
else
|
78
|
+
template = ActionView::Template.new(template_path, view_paths)
|
79
|
+
template.registerView(self)
|
80
|
+
|
81
|
+
if self.class.warn_cache_misses && logger
|
82
|
+
logger.debug "[PERFORMANCE] Rendering a template that was " +
|
83
|
+
"not found in view path. Templates outside the view path are " +
|
84
|
+
"not cached and result in expensive disk operations. Move this " +
|
85
|
+
"file into #{view_paths.join(':')} or add the folder to your " +
|
86
|
+
"view path list"
|
87
|
+
end
|
88
|
+
|
89
|
+
template
|
90
|
+
end
|
91
|
+
end
|
92
|
+
#memoize :_pick_template
|
93
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
class ActiveRecord::Base
|
2
|
+
def method_missing(method_id, *args, &block)
|
3
|
+
begin
|
4
|
+
super
|
5
|
+
rescue
|
6
|
+
#needs to be less crude
|
7
|
+
#intention here is to trap RAILS failure when it cannot find/build an accessor method
|
8
|
+
#for a class property
|
9
|
+
#this will be the case with IAB because it only builds hashes that have values
|
10
|
+
#so properties in the data model that do not have values in an instance record
|
11
|
+
#in the DB will not result in an entry to the hash that defines the instance and hence
|
12
|
+
#RAILS will not be able to build a method via it's method missing with more sophisication
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,143 @@
|
|
1
|
+
require 'cgi'
|
2
|
+
|
3
|
+
module IabHelper
|
4
|
+
def resultsToRailsClass(rows)
|
5
|
+
results = []
|
6
|
+
if (rows != nil) then
|
7
|
+
rows.each do |r|
|
8
|
+
eval(r)
|
9
|
+
results.push(Searchresult.public_instantiate(@rowHash))
|
10
|
+
end
|
11
|
+
end
|
12
|
+
results
|
13
|
+
end
|
14
|
+
|
15
|
+
def format_mtas(mtas)
|
16
|
+
tab = "["
|
17
|
+
mtas.each do |mta|
|
18
|
+
applied_date = mta['AD']
|
19
|
+
start_date = mta['SD']
|
20
|
+
end_date = mta['ED']
|
21
|
+
rolled_back = mta['RB']
|
22
|
+
changes = mta['Changes']
|
23
|
+
tab << "{'AD':'#{applied_date}','SD':'#{start_date}','ED':'#{end_date}','RB':'#{rolled_back}','Changes':'#{changes}'}"
|
24
|
+
end
|
25
|
+
tab << "]"
|
26
|
+
CGI.escape(tab)
|
27
|
+
end
|
28
|
+
|
29
|
+
def mtaHeaderInfo
|
30
|
+
headers = '[
|
31
|
+
{"text":"MTA Applied Date","key":"AD","sortable":false,"fixedWidth":true,"defaultWidth":"100px"},
|
32
|
+
{"text":"MTA Start Date","key":"SD","sortable":false,"fixedWidth":true,"defaultWidth":"100px"},
|
33
|
+
{"text":"MTA End Date","key":"ED","sortable":false,"fixedWidth":true,"defaultWidth":"100px"},
|
34
|
+
{"text":"Rolled Back?","key":"RB","sortable":false,"fixedWidth":true,"defaultWidth":"100px"},
|
35
|
+
{"text":"What Changed?","key":"Changes","sortable":false,"defaultWidth":"280px"}]'
|
36
|
+
headers
|
37
|
+
end
|
38
|
+
|
39
|
+
#entity - substring after inClassname substring-before nodename <label class=\"rowLabel\" for=\"#{hashname}_#{property}\">#{property}</label>
|
40
|
+
#property - nodename #{inclassName} #{nodeN} result << widget :checkbox, inclassName, nodeN
|
41
|
+
|
42
|
+
|
43
|
+
def widgets(*args)
|
44
|
+
includes = ""
|
45
|
+
#pull in global jquery scripts used across all layouts
|
46
|
+
Dir.entries("#{JS_ROOT}").sort.each do |file_name|
|
47
|
+
if ((file_name =~ /.js$/) != nil and !@assets.has_key?(file_name.to_sym))
|
48
|
+
@assets[file_name.to_sym] = 1
|
49
|
+
includes << "<script src=\"#{JS_ROOT2}/#{file_name}\" type=\"text/javascript\" language=\"javascript\"></script>\n"
|
50
|
+
end
|
51
|
+
end
|
52
|
+
args.each do |a|
|
53
|
+
if (!@widgets.has_key?(a.to_sym))
|
54
|
+
@widgets[a.to_sym] = 1
|
55
|
+
Dir.entries("#{WIDGET_ROOT}/#{a}").each do |file_name|
|
56
|
+
if ((file_name =~ /.js$/) != nil or (file_name =~ /.css$/) != nil)
|
57
|
+
if ((file_name =~ /.js$/) != nil and !@assets.has_key?(file_name.to_sym))
|
58
|
+
@assets[file_name.to_sym] = 1
|
59
|
+
includes << "<script src=\"#{WIDGET_ROOT3}/#{a}/#{file_name}\" type=\"text/javascript\" language=\"javascript\"></script>\n"
|
60
|
+
elsif ((file_name =~ /.css$/) != nil and !@assets.has_key?(file_name.to_sym))
|
61
|
+
@assets[file_name.to_sym] = 1
|
62
|
+
includes << "<link href=\"#{WIDGET_ROOT3}/#{a}/#{file_name}\" media=\"screen\" rel=\"stylesheet\" type=\"text/css\" />\n"
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
Dir.entries("#{BRANDS_ROOT}/#{session[:brand]}").each do |file_name|
|
69
|
+
if (file_name =~ /.css$/) != nil
|
70
|
+
includes << "<link href=\"/#{GIT}/brands/#{session[:brand]}/#{file_name}\" media=\"screen\" rel=\"stylesheet\" type=\"text/css\" />\n"
|
71
|
+
end
|
72
|
+
end
|
73
|
+
includes
|
74
|
+
end
|
75
|
+
|
76
|
+
def getCSS(sheet)
|
77
|
+
open(File.join("#{LIBRARY_ROOT}/genericlayoutgrids/stylesheets/#{sheet}")) {|f| @css = f.read }
|
78
|
+
result = "<style type=\"text/css\">"+@css.to_s+"</style>"
|
79
|
+
result
|
80
|
+
end
|
81
|
+
|
82
|
+
# Only need this helper once, it will provide an interface to convert a block into a partial.
|
83
|
+
# 1. Capture is a Rails helper which will 'capture' the output of a block into a variable
|
84
|
+
# 2. Merge the 'body' variable into our options hash
|
85
|
+
# 3. Render the partial with the given options hash. Just like calling the partial directly.
|
86
|
+
|
87
|
+
def block_to_partial(partial_name, options = {}, &block)
|
88
|
+
#puts "PARTIAL_NAME=#{partial_name},OPTIONS=#{options},BLOCK=#{block}"
|
89
|
+
options.merge!(:body => capture(&block))
|
90
|
+
concat(render(:partial => partial_name, :locals => options))
|
91
|
+
end
|
92
|
+
|
93
|
+
def method_missing(m, *args, &block)
|
94
|
+
if (args[0] != nil and args[0].include?("widgets"))
|
95
|
+
puts "There's no method called #{m} with arg.length= #{args.length}, args=#{args} and block=#{block} here -- please try again."
|
96
|
+
#this will trap missing methods
|
97
|
+
#it traps missing widget methods with can take up to n args
|
98
|
+
#partialROOT, some arg 1...some arg n, properties
|
99
|
+
#OR
|
100
|
+
#partialROOT, some arg1... some arg n
|
101
|
+
props = {}
|
102
|
+
if (args.length > 1)
|
103
|
+
#last arg may be serialized array of metadata passed
|
104
|
+
#from the coverage interpreter (used to interpret the oil based data model)
|
105
|
+
props = eval(args.last) if args.last.include?("=>")
|
106
|
+
|
107
|
+
#now build up a block_to_partial method call that contains all the parameters
|
108
|
+
#passed, plus any property metadata loaded by the coverage interpreter
|
109
|
+
#we are building something of the form kike what appears on the line below
|
110
|
+
#block_to_partial("#{partialROOT}/extending_panel", props.merge(:arg1 => 'arg1 value'...), &block)
|
111
|
+
|
112
|
+
len = 1
|
113
|
+
metaData = false
|
114
|
+
if (args.last.include?("=>"))
|
115
|
+
len = 2
|
116
|
+
metaData = true
|
117
|
+
end
|
118
|
+
|
119
|
+
i = 0
|
120
|
+
comma = ""
|
121
|
+
arguments = "props"
|
122
|
+
if (args.length > len)
|
123
|
+
#arguments = "props.merge("
|
124
|
+
arguments = "["
|
125
|
+
args.each do |a|
|
126
|
+
comma = "," unless i < 2
|
127
|
+
arguments<< "#{comma}\"#{a}\"" unless (a == args.first or (a == args.last and metaData))
|
128
|
+
i = i + 1
|
129
|
+
end
|
130
|
+
#arguments << ")"
|
131
|
+
arguments << "]"
|
132
|
+
end
|
133
|
+
|
134
|
+
props["args"] = arguments
|
135
|
+
btp = "block_to_partial(\"#{args[0]}/#{m}\",props, &block)"
|
136
|
+
eval(btp)
|
137
|
+
else
|
138
|
+
block_to_partial("#{args[0]}/#{m}", props, &block)
|
139
|
+
end
|
140
|
+
end
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
@@ -0,0 +1,16 @@
|
|
1
|
+
class ActionView::Helpers::InstanceTag
|
2
|
+
def to_input_field_tag(field_type, options = {})
|
3
|
+
options = options.stringify_keys
|
4
|
+
options["size"] = options["maxlength"] || DEFAULT_FIELD_OPTIONS["size"] unless options.key?("size")
|
5
|
+
options = DEFAULT_FIELD_OPTIONS.merge(options)
|
6
|
+
if field_type == "hidden"
|
7
|
+
options.delete("size")
|
8
|
+
end
|
9
|
+
options["type"] = field_type
|
10
|
+
if (field_type != "file")
|
11
|
+
options["value"] = value_before_type_cast(object) unless !value_before_type_cast(object)
|
12
|
+
end
|
13
|
+
add_default_name_and_id(options)
|
14
|
+
tag("input", options)
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module PaypalHelper
|
2
|
+
PAYMENT_AMOUNT_SESSION_KEY = :payment_amount
|
3
|
+
|
4
|
+
def payment_amount
|
5
|
+
session[PAYMENT_AMOUNT_SESSION_KEY]
|
6
|
+
end
|
7
|
+
|
8
|
+
#the following methods are automatically called from the iab_controller actions that are created at runtime
|
9
|
+
#the rule is that if a method whose name is the lowercase equivalent of the process 'do' step then it will get fired
|
10
|
+
#prior to calling communicator which controls access to the server logic
|
11
|
+
def checkout
|
12
|
+
session[PAYMENT_AMOUNT_SESSION_KEY] = "3000"
|
13
|
+
params = {
|
14
|
+
:payment_amount => payment_amount,
|
15
|
+
:ip => request.remote_ip,
|
16
|
+
:return_url => url_for(:action => 'PaymentConfirm', :only_path => false),
|
17
|
+
#TODO where do we go if the user cancels from making payment?
|
18
|
+
:cancel_return_url => url_for(:action => 'ProductSelection', :only_path => false)
|
19
|
+
}
|
20
|
+
params
|
21
|
+
end
|
22
|
+
|
23
|
+
def confirmpayment
|
24
|
+
params = { :token => @_params[:token] }
|
25
|
+
params
|
26
|
+
end
|
27
|
+
|
28
|
+
def completedpayment
|
29
|
+
params = {
|
30
|
+
:payment_amount => payment_amount,
|
31
|
+
:ip => request.remote_ip,
|
32
|
+
:payer_id => @_params[:payer_id],
|
33
|
+
:token => @_params[:token] }
|
34
|
+
params
|
35
|
+
end
|
36
|
+
end
|
metadata
ADDED
@@ -0,0 +1,81 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: iab-RailsGlue
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Gary Mawdsley
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2009-03-31 00:00:00 -07:00
|
13
|
+
default_executable:
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: mime-types
|
17
|
+
type: :runtime
|
18
|
+
version_requirement:
|
19
|
+
version_requirements: !ruby/object:Gem::Requirement
|
20
|
+
requirements:
|
21
|
+
- - ">="
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: "1.15"
|
24
|
+
version:
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: diff-lcs
|
27
|
+
type: :runtime
|
28
|
+
version_requirement:
|
29
|
+
version_requirements: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 1.1.2
|
34
|
+
version:
|
35
|
+
description: RailsGlue is a series hooks that allow other iab components to work atop of RAILS
|
36
|
+
email: garymawdsley@gmail.com
|
37
|
+
executables: []
|
38
|
+
|
39
|
+
extensions: []
|
40
|
+
|
41
|
+
extra_rdoc_files: []
|
42
|
+
|
43
|
+
files:
|
44
|
+
- lib/hooks
|
45
|
+
- lib/hooks/controllers
|
46
|
+
- lib/hooks/controllers/iabbase_controller.rb
|
47
|
+
- lib/hooks/helpers
|
48
|
+
- lib/hooks/helpers/instance_tag.rb
|
49
|
+
- lib/hooks/helpers/paypal_helper.rb
|
50
|
+
- lib/hooks/helpers/ActionView.rb
|
51
|
+
- lib/hooks/helpers/ActiveRecord.rb
|
52
|
+
- lib/hooks/helpers/iab_helper.rb
|
53
|
+
has_rdoc: true
|
54
|
+
homepage: http://github.com/iab/RailsGlue
|
55
|
+
post_install_message:
|
56
|
+
rdoc_options:
|
57
|
+
- --inline-source
|
58
|
+
- --charset=UTF-8
|
59
|
+
require_paths:
|
60
|
+
- lib
|
61
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
62
|
+
requirements:
|
63
|
+
- - ">="
|
64
|
+
- !ruby/object:Gem::Version
|
65
|
+
version: "0"
|
66
|
+
version:
|
67
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
68
|
+
requirements:
|
69
|
+
- - ">="
|
70
|
+
- !ruby/object:Gem::Version
|
71
|
+
version: "0"
|
72
|
+
version:
|
73
|
+
requirements: []
|
74
|
+
|
75
|
+
rubyforge_project: RailsGlue
|
76
|
+
rubygems_version: 1.2.0
|
77
|
+
signing_key:
|
78
|
+
specification_version: 2
|
79
|
+
summary: RailsGlue is a series hooks that allow other iab components to work atop of RAILS
|
80
|
+
test_files: []
|
81
|
+
|