From 741b96757d18e1da213122fa5eedefaec7556240 Mon Sep 17 00:00:00 2001 From: Pascal Rettig Date: Thu, 28 Jul 2011 09:31:33 -0400 Subject: [PATCH] Added in address fields --- app/controllers/content_controller.rb | 1 + app/models/end_user_address_segment_field.rb | 53 +++++++++++++++++++ app/models/end_user_address_segment_type.rb | 30 +++++++++++ app/models/user_segment/core_type.rb | 1 + app/models/user_segment/field.rb | 5 ++ app/models/user_segment/operation_builder.rb | 4 ++ .../_operation_form_arguments.html.erb | 2 +- .../_operation_form_operation.html.erb | 1 + 8 files changed, 96 insertions(+), 1 deletion(-) create mode 100644 app/models/end_user_address_segment_field.rb create mode 100644 app/models/end_user_address_segment_type.rb diff --git a/app/controllers/content_controller.rb b/app/controllers/content_controller.rb index 3eafec85..c36902ab 100644 --- a/app/controllers/content_controller.rb +++ b/app/controllers/content_controller.rb @@ -36,6 +36,7 @@ class ContentController < ModuleController #:nodoc: all register_handler :user_segment, :fields, 'UserSubscriptionEntrySegmentField' register_handler :user_segment, :fields, 'EndUserTokenSegmentField' register_handler :user_segment, :fields, 'DomainLogEntrySegmentField' + register_handler :user_segment, :fields, "EndUserAddressSegmentField" register_handler :structure, :wizard, 'Wizards::SimpleSite' register_handler :structure, :wizard, 'Wizards::MembersSetup' diff --git a/app/models/end_user_address_segment_field.rb b/app/models/end_user_address_segment_field.rb new file mode 100644 index 00000000..74961cca --- /dev/null +++ b/app/models/end_user_address_segment_field.rb @@ -0,0 +1,53 @@ + +class EndUserAddressSegmentField < UserSegment::FieldHandler + + def self.user_segment_fields_handler_info + { + :name => 'User Address Fields', + :domain_model_class => EndUserAddress, + } + end + + register_field :home_address, EndUserAddressSegmentType::AddressStringType, :name => 'Home Address', :field => :address + register_field :home_address_2, EndUserAddressSegmentType::AddressStringType, :name => 'Home Address (2)', :field => :address_2 + register_field :home_phone, EndUserAddressSegmentType::AddressStringType, :name => 'Home Phone', :field => :phone + register_field :home_city, EndUserAddressSegmentType::AddressStringType, :name => 'Home City', :field => :city + register_field :home_state, EndUserAddressSegmentType::AddressStringType, :name => 'Home State', :field => :state + register_field :home_zip, EndUserAddressSegmentType::AddressStringType, :name => 'Home Zip', :field => :zip + register_field :home_country, EndUserAddressSegmentType::AddressStringType, :name => 'Home Country', :field => :country + + register_field :work_address, EndUserAddressSegmentType::WorkAddressStringType, :name => 'Work Address', :field => :address + register_field :work_address_2, EndUserAddressSegmentType::WorkAddressStringType, :name => 'Work Address (2)', :field => :address_2 + register_field :work_phone, EndUserAddressSegmentType::WorkAddressStringType, :name => 'Work Phone', :field => :phone + register_field :work_city, EndUserAddressSegmentType::WorkAddressStringType, :name => 'Work City', :field => :city + register_field :work_state, EndUserAddressSegmentType::WorkAddressStringType, :name => 'Work State', :field => :state + register_field :work_zip, EndUserAddressSegmentType::WorkAddressStringType, :name => 'Work Zip', :field => :zip + register_field :work_country, EndUserAddressSegmentType::WorkAddressStringType, :name => 'Work Country', :field => :country + + + def self.get_handler_data(ids, fields) + data = {} + field_prefix = fields.map { |fld| fld.to_s.split("_")[0] }.compact.uniq + field_mapping = { 'home' => 'address_id', 'work' => 'work_address_id' } + + field_prefix.each do |prefix| + address_type = field_mapping[prefix] + data[prefix] = EndUserAddress.find(:all, :conditions => ["end_user_id in (?) AND end_users.#{address_type} = end_user_addresses.id", ids ],:joins => :end_user).index_by(&:end_user_id) if address_type + + end + data + end + + + def self.field_output(user, handler_data, field) + prefix = field.to_s.split("_")[0] + + if handler_data[prefix] + UserSegment::FieldType.field_output(user, handler_data[prefix],field) + else + "" + end + end + + +end diff --git a/app/models/end_user_address_segment_type.rb b/app/models/end_user_address_segment_type.rb new file mode 100644 index 00000000..27c412af --- /dev/null +++ b/app/models/end_user_address_segment_type.rb @@ -0,0 +1,30 @@ + +class EndUserAddressSegmentType + + class AddressBaseType < UserSegment::FieldType + def self.address_field_name(user_field_name) + register_operation :like, [['String', :string]], :name => 'Contains', :description => 'use % for wild card matches' + + sing = class << self; self; end + + sing.send(:define_method, :user_field_name) do + user_field_name + end + end + + def self.like(cls, group_field, field, string) + cls.scoped(:conditions => ["#{field} like ? AND end_users.#{self.user_field_name} = end_user_addresses.id", "%" + string.to_s + "%" ],:joins => :end_user) + end + + end + + class AddressStringType < AddressBaseType + address_field_name :address_id + end + + class WorkAddressStringType < AddressBaseType + address_field_name :work_address_id + end + + +end diff --git a/app/models/user_segment/core_type.rb b/app/models/user_segment/core_type.rb index 3c0cf5f2..5ebb1855 100644 --- a/app/models/user_segment/core_type.rb +++ b/app/models/user_segment/core_type.rb @@ -104,6 +104,7 @@ def self.is(cls, group_field, field, string) end end + class BooleanType < UserSegment::FieldType register_operation :is, [['Boolean', :boolean]] diff --git a/app/models/user_segment/field.rb b/app/models/user_segment/field.rb index 2e3d8395..e923c354 100644 --- a/app/models/user_segment/field.rb +++ b/app/models/user_segment/field.rb @@ -126,6 +126,11 @@ def builder_name self.handler_class.user_segment_fields[self.field.to_sym][:builder_name] if self.handler_class && self.handler_class.user_segment_fields && self.handler_class.user_segment_fields[self.field.to_sym] end + def description + raise self.handler_class.user_segment_fields[self.field.to_sym].inspect + self.handler_class.user_segment_fields[self.field.to_sym][:description] if self.handler_class && self.handler_class.user_segment_fields && self.handler_class.user_segment_fields[self.field.to_sym] + end + def type_class @type_class ||= self.handler_class.user_segment_fields[self.field.to_sym][:type] if self.handler_class && self.handler_class.user_segment_fields && self.handler_class.user_segment_fields[self.field.to_sym] end diff --git a/app/models/user_segment/operation_builder.rb b/app/models/user_segment/operation_builder.rb index a6b24a9c..63c90670 100644 --- a/app/models/user_segment/operation_builder.rb +++ b/app/models/user_segment/operation_builder.rb @@ -97,6 +97,10 @@ def field_builder_name self.user_segment_field.builder_name if self.user_segment_field end + def field_builder_description + self.user_segment_field.type_class.user_segment_field_type_operations[operation.to_sym][:description] if self.user_segment_field.type_class.user_segment_field_type_operations[operation.to_sym] + end + def operation_options return @operation_options if @operation_options @operation_options = [] diff --git a/app/views/members/_operation_form_arguments.html.erb b/app/views/members/_operation_form_arguments.html.erb index 786a0d4a..f952ecbd 100644 --- a/app/views/members/_operation_form_arguments.html.erb +++ b/app/views/members/_operation_form_arguments.html.erb @@ -5,7 +5,7 @@ <% arg_options = builder.operation_argument_options[idx] description = arg_options[:description] - %> + %> <% if builder.operation_arguments[idx] == :model -%> <%= f.select("argument#{idx}", [["--Select %s--" / builder.operation_argument_names[idx], nil]] + UserSegment::FieldType.model_options(arg_options)) %> diff --git a/app/views/members/_operation_form_operation.html.erb b/app/views/members/_operation_form_operation.html.erb index f3f8d8c2..dec41ede 100644 --- a/app/views/members/_operation_form_operation.html.erb +++ b/app/views/members/_operation_form_operation.html.erb @@ -17,6 +17,7 @@ <% end -%> <%= render :partial => 'operation_form_arguments', :locals => {:form_id => form_id, :builder => builder} %> + <%= "#{builder.field_builder_description}" if builder.field_builder_description %>