diff --git a/app/controllers/module_controller.rb b/app/controllers/module_controller.rb index 202be008..a6eb0a04 100644 --- a/app/controllers/module_controller.rb +++ b/app/controllers/module_controller.rb @@ -78,6 +78,7 @@ def self.get_module_handlers def self.register_handler(component,handler,class_name,options={}) component = component.to_sym; handler = handler.to_sym + options[:handler] = handler handlers = self.get_module_handlers handlers[component] ||= {} handlers[component][handler] ||= [] diff --git a/app/models/end_user_action_segment_field.rb b/app/models/end_user_action_segment_field.rb index b6ef5df7..754fd96e 100644 --- a/app/models/end_user_action_segment_field.rb +++ b/app/models/end_user_action_segment_field.rb @@ -9,7 +9,7 @@ def self.user_segment_fields_handler_info end register_field :renderer, UserSegment::CoreType::StringType - register_field :action, UserSegment::CoreType::StringType + register_field :action, EndUserActionSegmentType::ActionType register_field :created, UserSegment::CoreType::DateTimeType, :field => :created_at register_field :occurred, UserSegment::CoreType::DateTimeType, :field => :action_at diff --git a/app/models/end_user_action_segment_type.rb b/app/models/end_user_action_segment_type.rb new file mode 100644 index 00000000..c1327bb0 --- /dev/null +++ b/app/models/end_user_action_segment_type.rb @@ -0,0 +1,17 @@ + +class EndUserActionSegmentType + + class ActionType < UserSegment::FieldType + include HandlerActions + + def self.action_options + self.get_handlers(:action).collect { |handler| [handler[1][:description], handler[1][:handler].to_s] } + end + + register_operation :is, [['Action', :option, {:options => EndUserActionSegmentType::ActionType.action_options}]] + + def self.is(cls, field, action) + cls.scoped(:conditions => ["#{field} = ?", action]) + end + end +end diff --git a/app/models/handler_actions.rb b/app/models/handler_actions.rb index ad73e01b..f1860c12 100644 --- a/app/models/handler_actions.rb +++ b/app/models/handler_actions.rb @@ -7,7 +7,7 @@ def self.append_features(base) #:nodoc: base.extend(ClassMethods) end - def get_handlers(component,handler,initialized=false) + def get_handlers(component,handler=nil,initialized=false) self.class.get_handlers(component,handler,initialized) end @@ -40,8 +40,7 @@ def get_handler_instance(component,handler_name,identifier,*initialize_args) module ClassMethods - def get_handlers(component,handler,initialized = false) - component = component.to_sym; handler = handler.to_sym + def get_handlers(component,handler=nil,initialized = false) handlers = DataCache.get_cached_container("Handlers","Active") unless initialized || RAILS_ENV != 'production' unless handlers mods = initialized ? SiteModule.initialized_modules_info : SiteModule.enabled_modules_info @@ -68,10 +67,14 @@ def get_handlers(component,handler,initialized = false) end DataCache.put_container("Handlers","Active",handlers) unless initialized || RAILS_ENV == 'development' end - return (handlers[component]||{})[handler] || [] + if handler + (handlers[component.to_sym]||{})[handler.to_sym] || [] + else + (handlers[component.to_sym] || {}).values.inject([]) { |a,b| a.concat(b) } + end end - + def get_handler_options(component,handler_name,initialized=false) handlers = get_handlers(component,handler_name,initialized) handlers.collect do |handler| diff --git a/app/models/user_segment/field_type.rb b/app/models/user_segment/field_type.rb index bd722608..b70b3e43 100644 --- a/app/models/user_segment/field_type.rb +++ b/app/models/user_segment/field_type.rb @@ -42,6 +42,8 @@ def self.register_operation(operation, args=[], options={}) # converts a string to the correct type # supported types are :integer, :float, :double, :date, :datetime, :option, :boolean def self.convert_to(value, type, opts={}) + return value if value.nil? + case type when :integer return value.to_i if value.is_a?(Integer) || value =~ /^\d+$/ @@ -56,7 +58,15 @@ def self.convert_to(value, type, opts={}) rescue end when :option - value = opts[:options].find { |o| o.downcase == value.downcase } + value = opts[:options].find do |o| + if o.is_a?(Array) + o[1].downcase == value.downcase + else + o.downcase == value.downcase + end + end + + return value[1] if value.is_a?(Array) return value if value when :boolean return value if value.is_a?(TrueClass) || value.is_a?(FalseClass)