diff --git a/admin/app/admin/affiliate_users.rb b/admin/app/admin/affiliate_users.rb new file mode 100644 index 000000000..b21d512eb --- /dev/null +++ b/admin/app/admin/affiliate_users.rb @@ -0,0 +1,31 @@ +ActiveAdmin.register JamRuby::User, :as => 'Referrals' do + + menu :label => 'Referrals', :parent => 'Affiliates' + + config.batch_actions = false + config.clear_action_items! + config.filters = false + + index do + column 'User' do |oo| link_to(oo.name, "http://www.jamkazam.com/client#/profile/#{oo.id}", {:title => oo.name}) end + column 'Email' do |oo| oo.email end + column 'Created' do |oo| oo.created_at end + column 'Partner' do |oo| oo.affiliate_referral.partner_name end + end + + controller do + + def scoped_collection + rel = end_of_association_chain + .includes([:affiliate_referral]) + .order('created_at DESC') + if (ref_id = params[AffiliatePartner::PARAM_REFERRAL]).present? + qq = ['affiliate_referral_id = ?', ref_id] + else + qq = ['affiliate_referral_id IS NOT NULL'] + end + @users ||= rel.where(qq) + end + + end +end diff --git a/admin/app/admin/affiliates.rb b/admin/app/admin/affiliates.rb new file mode 100644 index 000000000..d0e7e5466 --- /dev/null +++ b/admin/app/admin/affiliates.rb @@ -0,0 +1,48 @@ +ActiveAdmin.register JamRuby::AffiliatePartner, :as => 'Affiliates' do + + menu :label => 'Partners', :parent => 'Affiliates' + + config.sort_order = 'created_at DESC' + config.batch_actions = false + # config.clear_action_items! + config.filters = false + + form :partial => 'form' + + index do + column 'User' do |oo| link_to(oo.partner_user.name, "http://www.jamkazam.com/client#/profile/#{oo.partner_user.id}", {:title => oo.partner_user.name}) end + column 'Email' do |oo| oo.partner_user.email end + column 'Name' do |oo| oo.partner_name end + column 'Code' do |oo| oo.partner_code end + column 'Referral Count' do |oo| oo.referral_user_count end + # column 'Referrals' do |oo| link_to('View', admin_referrals_path(AffiliatePartner::PARAM_REFERRAL => oo.id)) end + default_actions + end + + controller do + + def show + redirect_to admin_referrals_path(AffiliatePartner::PARAM_REFERRAL => resource.id) + end + + def create + obj = AffiliatePartner.create_with_params(params[:jam_ruby_affiliate_partner]) + if obj.errors.present? + set_resource_ivar(obj) + render active_admin_template('new') + else + redirect_to admin_affiliates_path + end + end + + def update + obj = resource + vals = params[:jam_ruby_affiliate_partner] + obj.partner_name = vals[:partner_name] + obj.user_email = vals[:user_email] if vals[:user_email].present? + obj.save! + redirect_to admin_affiliates_path + end + + end +end diff --git a/admin/app/models/admin_authorization.rb b/admin/app/models/admin_authorization.rb index 692d118f1..809991226 100644 --- a/admin/app/models/admin_authorization.rb +++ b/admin/app/models/admin_authorization.rb @@ -1,7 +1,13 @@ class AdminAuthorization < ActiveAdmin::AuthorizationAdapter def authorized?(action, subject = nil) - subject.is_a?(EmailBatch) && :update == action ? subject.can_run_batch? : true + if subject.is_a?(EmailBatch) && :update == action + subject.can_run_batch? + elsif subject.is_a?(AffiliatePartner) && :destroy == action + false + else + true + end end end diff --git a/admin/app/views/admin/affiliates/_form.html.erb b/admin/app/views/admin/affiliates/_form.html.erb new file mode 100644 index 000000000..a4f14416e --- /dev/null +++ b/admin/app/views/admin/affiliates/_form.html.erb @@ -0,0 +1,13 @@ +<%= semantic_form_for([:admin, resource], :url => resource.new_record? ? admin_affiliates_path : "/admin/affiliates/#{resource.id}") do |f| %> + <%= f.semantic_errors *f.object.errors.keys %> + <%= f.inputs do %> + <%= f.input(:user_email, :input_html => {:maxlength => 255}) %> + <%= f.input(:partner_name, :input_html => {:maxlength => 128}) %> + <% if resource.new_record? %> + <%= f.input(:partner_code, :input_html => {:maxlength => 128}) %> + <% else %> + <%= f.input(:partner_code, :input_html => {:maxlength => 128, :readonly => 'readonly'}) %> + <% end %> + <% end %> + <%= f.actions %> +<% end %> diff --git a/ruby/lib/jam_ruby/models/affiliate_partner.rb b/ruby/lib/jam_ruby/models/affiliate_partner.rb index 8b1951f45..6aee0df77 100644 --- a/ruby/lib/jam_ruby/models/affiliate_partner.rb +++ b/ruby/lib/jam_ruby/models/affiliate_partner.rb @@ -1,9 +1,12 @@ class JamRuby::AffiliatePartner < ActiveRecord::Base - has_one :partner_user, :class_name => "JamRuby::User", :foreign_key => :partner_user_id + belongs_to :partner_user, :class_name => "JamRuby::User", :foreign_key => :partner_user_id has_many :user_referrals, :class_name => "JamRuby::User", :foreign_key => :affiliate_referral_id attr_accessible :partner_name, :partner_code, :partner_user_id + PARAM_REFERRAL = :ref + PARAM_COOKIE = :affiliate_ref + PARTNER_CODE_REGEX = /^[#{Regexp.escape('abcdefghijklmnopqrstuvwxyz0123456789-._+,')}]+{2,128}$/i validates :user_email, format: {with: JamRuby::User::VALID_EMAIL_REGEX}, :if => :user_email @@ -17,7 +20,7 @@ class JamRuby::AffiliatePartner < ActiveRecord::Base oo.partner_code = params[:partner_code].try(:strip) oo.partner_user = User.where(:email => params[:user_email].try(:strip)).limit(1).first oo.partner_user_id = oo.partner_user.try(:id) - oo.save! + oo.save oo end diff --git a/web/app/controllers/application_controller.rb b/web/app/controllers/application_controller.rb index d28b4ea46..52b7a6548 100644 --- a/web/app/controllers/application_controller.rb +++ b/web/app/controllers/application_controller.rb @@ -8,12 +8,17 @@ class ApplicationController < ActionController::Base # inject username/email into bugsnag data before_bugsnag_notify :add_user_info_to_bugsnag - def affiliate_code - cookies[:affiliate_code] + before_filter do + if current_user.nil? + if (code = params[AffiliatePartner::PARAM_REFERRAL]).present? && + cookies[AffiliatePartner::PARAM_COOKIE].blank? + cookies[AffiliatePartner::PARAM_COOKIE] = code + end + end end - def affiliate_code=(code) - cookies[:affiliate_code] = code if code.present? + def affiliate_code + cookies[AffiliatePartner::PARAM_COOKIE] end private