Skip to content

Commit

Permalink
elevate a user's user_level as they engage with the site more.
Browse files Browse the repository at this point in the history
  • Loading branch information
Doug Youch committed Aug 24, 2010
1 parent b913269 commit af553df
Show file tree
Hide file tree
Showing 10 changed files with 82 additions and 20 deletions.
30 changes: 28 additions & 2 deletions app/controllers/editor/auth_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -41,14 +41,16 @@ class UserRegisterOptions < HashModel
:address_required_fields => [],
:content_publication_id => nil, :source => nil, :lockout_redirect => false,
:require_activation => false, :activation_page_id => nil,
:features => [], :require_captcha => false
:features => [], :require_captcha => false, :user_level => 4

boolean_options :lockout_redirect, :require_activation, :require_captcha

page_options :success_page_id, :activation_page_id

validates_presence_of :success_page_id, :user_class_id

integer_options :user_level
integer_array_options :include_subscriptions

def validate
self.required_fields = [] if @passed_hash[:required_fields].blank?
Expand Down Expand Up @@ -104,6 +106,7 @@ def any_field_list
end
fields.map { |elm| flds[elm.to_sym] ? [ elm.to_sym, flds[elm.to_sym] ] : nil }.compact
end

def always_required_fields
flds = [ 'email']
flds += [ 'password','password_confirmation'] if self.registration_type == 'account'
Expand Down Expand Up @@ -179,6 +182,15 @@ def register_features
end
end

def subscriptions
@subscriptions ||= self.include_subscriptions.collect do |subscription_id|
UserSubscription.find_by_id subscription_id
end.compact
end

def self.user_level_options
EndUser.user_level_select_options.select { |lvl| lvl[1] >= 4 && lvl[1] <= 5 }
end
end

class UserActivationOptions < HashModel
Expand All @@ -203,10 +215,14 @@ class UserEditAccountOptions < HashModel
:work_address_required_fields => [],
:address_required_fields => [],
:content_publication_id => nil, :content_publication_user_field => nil,
:access_token_id => nil
:access_token_id => nil, :user_level => 4

page_options :success_page_id

integer_options :user_level

integer_array_options :include_subscriptions

validates_presence_of :user_class_id

def validate
Expand Down Expand Up @@ -337,6 +353,16 @@ def publication_options
def publication_field_options
self.publication.content_model.content_model_fields.find(:all, :conditions => "field_type = 'belongs_to' AND field_module = 'content/core_field'").collect { |elm| [elm.name, elm.field] } if self.publication
end

def subscriptions
@subscriptions ||= self.include_subscriptions.collect do |subscription_id|
UserSubscription.find_by_id subscription_id
end.compact
end

def self.user_level_options
UserRegisterOptions.user_level_options
end
end

class LoginOptions < HashModel
Expand Down
13 changes: 9 additions & 4 deletions app/controllers/editor/auth_renderer.rb
Original file line number Diff line number Diff line change
Expand Up @@ -119,7 +119,7 @@ def user_register
# Make sure save is successful - will recheck validation and
# rescan for uniques
if(@usr.save)

@usr.elevate_user_level @options.user_level

@usr.tag_names_add(@options.add_tags) unless @options.add_tags.blank?
@usr.tag_names_add(session[:user_tags]) if session[:user_tags]
Expand All @@ -131,7 +131,9 @@ def user_register
@business.update_attribute(:end_user_id,@usr.id) if @business.id

if @options.include_subscriptions.is_a?(Array) && @options.include_subscriptions.length > 0
update_subscriptions(@usr,@options.include_subscriptions,params[:subscription])
@options.subscriptions.each do |sub|
sub.subscribe_user @usr, :ip_address => request.remote_ip
end
end

@options.register_features.each do |feature|
Expand Down Expand Up @@ -262,14 +264,17 @@ def user_edit_account
# Make sure save is sucessful - will recheck validation and
# rescan for uniques
if(@usr.save)
@usr.elevate_user_level @options.user_level

@usr.tag_names_add(@options.add_tags) unless @options.add_tags.blank?

@address.update_attribute(:end_user_id,@usr.id) if @address.id
@business.update_attribute(:end_user_id,@usr.id) if @business.id

if @options.include_subscriptions.is_a?(Array) && @options.include_subscriptions.length > 0
update_subscriptions(@usr,@options.include_subscriptions,params[:subscription])
@options.subscriptions.each do |sub|
sub.subscribe_user @usr, :ip_address => request.remote_ip
end
end

@model.save if @model
Expand Down Expand Up @@ -592,7 +597,7 @@ def edit_account
:reset_password => flash['reset_password'] }
end

# update users subscriptions
# update users subscriptions
def update_subscriptions(user,available_subscriptions,subscriptions)

subscription_conditions = "user_subscription_id IN (#{available_subscriptions.collect {|sub| DomainModel.connection.quote(sub) }.join(",")})"
Expand Down
10 changes: 7 additions & 3 deletions app/models/content/core_feature/email_target_connect.rb
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,9 @@ def self.options(val)
end

class EmailTargetConnectOptions < HashModel
attributes :add_target_tags => '', :update_target_tags => '',:add_target_source => '', :matched_fields => {}, :override_content_node_user => 'never'
attributes :add_target_tags => '', :update_target_tags => '',:add_target_source => '', :matched_fields => {}, :override_content_node_user => 'never', :user_level => 4

integer_options :user_level

def validate
self.errors.add(:matched_fields,'must match email address') unless self.matched_fields.values.include?('end_user.email')
Expand All @@ -54,7 +56,7 @@ def model_generator(content_model,cls)
opts = self.options # Need to bind this locally

cls.send(:define_method,:email_target_connect) do
{ :fields => arr, :add_tags => opts.add_target_tags, :update_tags => opts.update_target_tags, :add_source => opts.add_target_source }
{ :fields => arr, :add_tags => opts.add_target_tags, :update_tags => opts.update_target_tags, :add_source => opts.add_target_source, :user_level => opts.user_level }
end

cls.send(:before_save,:email_target_connect_update)
Expand All @@ -69,7 +71,7 @@ def webform(form, result)

opts = self.options # Need to bind this locally

update_data = { :fields => arr, :add_tags => opts.add_target_tags, :update_tags => opts.update_target_tags, :add_source => opts.add_target_source }
update_data = { :fields => arr, :add_tags => opts.add_target_tags, :update_tags => opts.update_target_tags, :add_source => opts.add_target_source, :user_level => opts.user_level }

target = ContentTypeMethods.email_target_connect_update(update_data, result.data_model)
result.end_user_id = target.id if target && result.end_user_id.nil?
Expand Down Expand Up @@ -168,6 +170,8 @@ def self.email_target_connect_update(update_data, entry)
address.update_attribute(:end_user_id,target.id)
end

target.elevate_user_level(update_data[:user_level]) if ok

target
end
end
Expand Down
25 changes: 19 additions & 6 deletions app/models/end_user.rb
Original file line number Diff line number Diff line change
Expand Up @@ -477,10 +477,6 @@ def before_save #:nodoc:
end
self.options ||= {}

if self.user_level < 3 && self.registered?
self.user_level = 3
end

self.source = 'import' if self.source.blank?
self.registered_at = Time.now if self.registered? && self.registered_at.blank?

Expand All @@ -505,7 +501,23 @@ def before_save #:nodoc:

true
end


def elevate_user_level(level)
self.class.elevate_user_level self.id, level
end

def self.elevate_user_level(end_user_id, user_level)
self.connection.execute "UPDATE end_users SET acknowledged = 0, user_level = #{user_level} WHERE id = #{end_user_id} AND user_level < #{user_level}"
end

def unsubscribe
self.class.unsubscribe self.id
end

def self.unsubscribe(end_user_id)
self.connection.execute "UPDATE end_users SET acknowledged = 0, user_level = 0 WHERE id = #{end_user_id} AND user_level > 0"
end

def update_editor_login #:nodoc:
if self.registered? && self.activated? && self.editor?
editor_login= EditorLogin.find_by_domain_id_and_email(Configuration.domain_id,self.email) || EditorLogin.new
Expand All @@ -532,6 +544,7 @@ def self.find_target(email,options = {})
if !target
target = EndUser.new(:email => email)
target.user_class_id = options[:user_class_id] || UserClass.default_user_class_id
target.source = options[:source] if options[:source]
target.save unless options[:no_create]
end
target
Expand Down Expand Up @@ -565,7 +578,7 @@ def self.push_target(email,options = {})
opts.symbolize_keys!

user_class_id = opts.delete(:user_class_id) || UserClass.default_user_class_id
target = self.find_target(email, :user_class_id => user_class_id, :no_create => true)
target = self.find_target(email, :user_class_id => user_class_id, :no_create => true, :source => opts.delete(:source))

# Don't mess with registered users if no_register is set
no_register = opts.delete(:no_register)
Expand Down
8 changes: 6 additions & 2 deletions app/models/end_user_segment_field.rb
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ def self.user_segment_fields_handler_info
register_field :created, UserSegment::CoreType::DateTimeType, :field => :created_at, :name => 'Created', :sortable => true, :builder_name => 'Created when?'
register_field :registered, UserSegment::CoreType::BooleanType, :name => 'Registered', :sortable => true, :builder_name => 'Show registered accounts?'
register_field :activated, UserSegment::CoreType::BooleanType, :name => 'Activated', :sortable => true, :builder_name => 'Show activated accounts?'
register_field :user_level, UserSegment::CoreType::SimpleNumberType, :name => 'User Level', :sortable => true
register_field :user_level, EndUserSegmentType::UserLevelType, :name => 'User Level', :sortable => true
register_field :dob, UserSegment::CoreType::DateTimeType, :name => 'DOB', :sortable => true
register_field :last_name, UserSegment::CoreType::StringType, :name => 'Last Name', :sortable => true
register_field :first_name, UserSegment::CoreType::StringType, :name => 'First Name', :sortable => true
Expand All @@ -36,6 +36,10 @@ def self.get_handler_data(ids, fields)
end

def self.field_output(user, handler_data, field)
UserSegment::FieldType.field_output(user, handler_data, field)
if field == :user_level
user.user_level_display
else
UserSegment::FieldType.field_output(user, handler_data, field)
end
end
end
8 changes: 8 additions & 0 deletions app/models/end_user_segment_type.rb
Original file line number Diff line number Diff line change
Expand Up @@ -49,4 +49,12 @@ def self.is(cls, group_field, field, source)
cls.scoped(:conditions => ["#{field} = ?", source])
end
end

class UserLevelType < UserSegment::FieldType
register_operation :is, [['User Level', :option, {:options => EndUser.user_level_select_options}]]

def self.is(cls, group_field, field, user_level)
cls.scoped(:conditions => ["#{field} = ?", user_level])
end
end
end
3 changes: 0 additions & 3 deletions app/models/user_subscription.rb
Original file line number Diff line number Diff line change
Expand Up @@ -42,9 +42,6 @@ def subscribe_user(user,options={})
:subscribed_at => Time.now,
:subscribed_ip => options[:ip_address],
:verified => self.double_opt_in? ? false : true)



end


Expand Down
1 change: 1 addition & 0 deletions app/views/content/core_feature/_email_target_connect.rhtml
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
<%= f.text_field :add_target_tags, :description => 'Tags to add on target creation', :label => 'New Target Tags' %>
<%= f.text_field :update_target_tags, :description => 'Tags to add to all affected targets', :label => 'Target Tags' %>
<%= f.text_field :add_target_source, :label => 'Target Source Label' %>
<%= f.select :user_level, EndUser.user_level_select_options.select{|lvl| lvl[1] >= 2 && lvl[1] <= 5} %>
<% @matching_fields = ContentModel.matching_fields_select_options -%>
<%= f.custom_field :matched_fields, :value => '' %>
Expand Down
2 changes: 2 additions & 0 deletions app/views/editor/auth/user_edit_account.rhtml
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
<%= f.text_field :add_tags, :description => 'Tag Names to add on edit account' %>
<%= f.country_select :country, :label => 'Default Country' %>
<%= f.select :access_token_id, [['--Select Access Token--', nil]] + AccessToken.user_token_options %>
<%= f.select :user_level, @options.class.user_level_options %>
<% end -%>
<% t.tabled_tab do %>
<%= f.ordered_array :required_fields, @options.available_field_options %>
Expand All @@ -21,6 +22,7 @@
<%= f.ordered_array :work_address_required_fields, @options.available_address_field_options(true), :description => "All address fields are available but the above must be filled out" %>
<%= f.select :content_publication_id, @options.publication_options %>
<%= f.select :content_publication_user_field, @options.publication_field_options() if @options.publication %>
<%= f.ordered_array :include_subscriptions, UserSubscription.select_options %>
<% end -%>
<% t.tab do %>
<div id='cms_triggered_actions'>
Expand Down
2 changes: 2 additions & 0 deletions app/views/editor/auth/user_register.rhtml
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@ UserRegisterEditor = {
<%= f.radio_buttons :modify_profile, [['Yes'.t,'modify'],['No'.t,'keep']], :label => 'Modify Profile', :description => 'Modify profile of existing user?' %>
<%= f.text_field :add_tags, :description => 'Tag Names to add on registrations' %>
<%= f.country_select :country, :label => 'Default Country' %>
<%= f.select :user_level, @options.class.user_level_options %>
<% end -%>
<% t.tabled_tab do %>
<%= f.ordered_array :required_fields, @options.available_field_options, :description => "Email will always be required, password and password confirmation\n are required for account registration type" %>
Expand All @@ -69,6 +70,7 @@ UserRegisterEditor = {
<%= f.ordered_array :work_address_required_fields, @options.available_address_field_options(true), :description => "All address fields are available but the above must be filled out" %>
<%= f.select :content_publication_id, ContentPublication.select_options_with_nil('Publication',:conditions => { :publication_type => 'create', :publication_module => 'content/core_publication' }) %>
<%= f.ordered_array :include_subscriptions, UserSubscription.select_options %>
<% end -%>
<% t.tab do %>
Expand Down

0 comments on commit af553df

Please sign in to comment.