diff --git a/app/controllers/admins_controller.rb b/app/controllers/admins_controller.rb index 12d3cdbf9f0e129648f3840827153e9328c55098..d433c71ba51bd8259b4070d337a4d80bf5d7a613 100644 --- a/app/controllers/admins_controller.rb +++ b/app/controllers/admins_controller.rb @@ -11,11 +11,12 @@ class AdminsController < ApplicationController end def admin_inviter - email = params[:idenitifer] + inviter = InvitationCode.default_inviter_or(current_user) + email = params[:identifier] user = User.find_by_email(email) unless user - EmailInviter.new(email).send! + EmailInviter.new(email, inviter).send! flash[:notice] = "invitation sent to #{email}" else flash[:notice]= "error sending invite to #{email}" @@ -23,6 +24,11 @@ class AdminsController < ApplicationController redirect_to user_search_path, :notice => flash[:notice] end + def add_invites + InvitationCode.find_by_token(params[:invite_code_id]).add_invites! + redirect_to user_search_path + end + def weekly_user_stats @created_users = User.where("username IS NOT NULL") @created_users_by_week = Hash.new{ |h,k| h[k] = [] } diff --git a/app/controllers/invitations_controller.rb b/app/controllers/invitations_controller.rb index cefd53162279e6b89c6ce5b9d99fef211dc5a499..560b9aeb7564ab6be2890e4254d950aeb1113b4e 100644 --- a/app/controllers/invitations_controller.rb +++ b/app/controllers/invitations_controller.rb @@ -26,7 +26,7 @@ class InvitationsController < ApplicationController def create - inviter = EmailInviter.new(params[:email_inviter][:emails], params[:email_inviter]) + inviter = EmailInviter.new(params[:email_inviter][:emails], current_user, params[:email_inviter]) inviter.send! redirect_to :back, :notice => "Great! Invites were sent off to #{inviter.emails.join(', ')}" end diff --git a/app/models/invitation.rb b/app/models/invitation.rb index 809872c10f6f31f9ef33ff226cb38c53dde00498..d19b462ae7075cbb0553e27b56cab90df37f151d 100644 --- a/app/models/invitation.rb +++ b/app/models/invitation.rb @@ -70,7 +70,7 @@ class Invitation < ActiveRecord::Base # @return [Invitation] self def send! if email_like_identifer - EmailInviter.new(self.identifier).send! + EmailInviter.new(self.identifier, sender).send! else puts "broken facebook invitation_token" end diff --git a/app/models/invitation_code.rb b/app/models/invitation_code.rb index ba31b74c915c13d5b22cda035c16d9d398ec57aa..33e25964253aa49708bb24f26bf6e53d15a042c6 100644 --- a/app/models/invitation_code.rb +++ b/app/models/invitation_code.rb @@ -3,15 +3,35 @@ class InvitationCode < ActiveRecord::Base validates_presence_of :user - before_create :generate_token + before_create :generate_token, :set_default_invite_count def to_param token end + def add_invites! + self.update_attributes(:count => self.count+100) + end + + def use! + self.update_attributes(:count => self.count-1) + end + def generate_token begin self.token = ActiveSupport::SecureRandom.hex(6) end while InvitationCode.exists?(:token => self[:token]) end -end + + def self.default_inviter_or(user) + if AppConfig[:admin_account].present? + inviter = User.find_by_username(AppConfig[:admin_account]) + end + inviter ||= user + inviter + end + + def set_default_invite_count + self.count = AppConfig[:invite_count] || 25 + end +end \ No newline at end of file diff --git a/app/models/user.rb b/app/models/user.rb index f03cf6ebfc73b9b74686fe882b93b94a86d2822c..1f7c9e5a1636e8387215cdb716d8e21c72b0ef35 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -83,7 +83,6 @@ class User < ActiveRecord::Base User.joins(:contacts).where(:contacts => {:person_id => person.id}) end -<<<<<<< HEAD def self.monthly_actives(start_day = Time.now) logged_in_since(start_day - 1.month) end @@ -108,28 +107,18 @@ class User < ActiveRecord::Base ConversationVisibility.sum(:unread, :conditions => "person_id = #{self.person.id}") end - # @return [User] - def self.find_by_invitation(invitation) - service = invitation.service - identifier = invitation.identifier - - if service == 'email' - existing_user = User.where(:email => identifier).first - else - existing_user = User.joins(:services).where(:services => {:type => "Services::#{service.titleize}", :uid => identifier}).first -======= #should be deprecated def ugly_accept_invitation_code begin self.invitations_to_me.first.sender.invitation_code rescue Exception => e nil ->>>>>>> invite_link functionailty mostly works end end def process_invite_acceptence(invite) self.invited_by = invite.user + invite.use! end diff --git a/app/views/admins/user_search.html.haml b/app/views/admins/user_search.html.haml index ff74732fff604c392ea28bb342f275a7ddce4a53..8736398e28db922fb6077693030ce091e3b13288 100644 --- a/app/views/admins/user_search.html.haml +++ b/app/views/admins/user_search.html.haml @@ -1,65 +1,47 @@ .span-24 = render :partial => 'admins/admin_bar.haml' -%br -%br +.span-24.prepend-4 -%h3 - = form_tag 'admin_inviter', :method => :get do - email to invite: - = text_field_tag 'identifier' - = submit_tag 'invite' + %h3 + you currently have + = current_user.invitation_code.count + invites left + = link_to "add_invites", add_invites_path(current_user.invitation_code) + = form_tag 'admin_inviter', :method => :get do + email to invite: + = text_field_tag 'identifier' + = submit_tag 'invite' -%h3 - user search -= form_tag 'user_search', :method => :get do - username: - = text_field_tag 'user[username]', params[:user][:username] - email: - = text_field_tag 'user[email]', params[:user][:email] + %h3 + user search + = form_tag 'user_search', :method => :get do + username: + = text_field_tag 'user[username]', params[:user][:username] - invitation identifier: - = text_field_tag 'user[invitation_identifier]', params[:user][:invitation_identifier] + email: + = text_field_tag 'user[email]', params[:user][:email] - invitation token: - = text_field_tag 'user[invitation_token]', params[:user][:invitation_token] - = submit_tag 'go' + = submit_tag 'go' -= "#{@users.count} users found" -%br -%br -= for user in @users - = user.inspect + = "#{@users.count} users found" %br - - if user.person - = user.person.inspect + %br + - @users.each do |user| + = user.inspect %br - - if user.person.profile - = user.person.profile.inspect + - if user.person + = user.person.inspect + %br + - if user.person.profile + = user.person.profile.inspect + %br + = "invite token: #{invite_code_url(user.invited_by.invite_code)}" if user.invited_by.present? + = link_to "add_invites", add_invites_path(user.invitation_code) %br - = "invite token: #{accept_invitation_url(user, :invitation_token => user.invitation_token)}" if user.invitation_token - %br - %br - %br -%br -= javascript_include_tag 'apiconsole' -#query - %h3 api console - = text_field_tag :api - = submit_tag 'ping this api', :id => 'api_submit' - - response: - %br - %br - #resp - - -%br - post to Diaspora v1 - - - + %br + %br \ No newline at end of file diff --git a/app/views/notifier/invite.html.erb b/app/views/notifier/invite.html.erb index be58a6716f6b243080f282833a4a21fa824701af..ead22fce250ea74df330a8254709c8b42ad5873a 100644 --- a/app/views/notifier/invite.html.erb +++ b/app/views/notifier/invite.html.erb @@ -1,4 +1,4 @@ -<%- self.extend NotifierHelper -%> + <%- self.extend NotifierHelper -%> <head> <title><%=invite_email_title %></title> </head> diff --git a/config/application.yml.example b/config/application.yml.example index d5e318f2771d50f3f22e20defdf659538b9a9d85..1de63b89a3988ff1e4ddbc61a8d0abf798664b20 100644 --- a/config/application.yml.example +++ b/config/application.yml.example @@ -49,6 +49,12 @@ defaults: &defaults # Set this to true if you want users to invite as many people as they want open_invitations: true + #the 'admin' account for your pod... ie for jd.com, this is diasporahq + admin_account: '' + + #the default amount of invitiations for an invite link + invite_count: 25 + # Set this to true if you don't want your users to follow the diasporahq@joindiaspora.com # account on account creation. The diasporahq account helps users start with some # activity in their stream and get news about Diaspora, but if you don't want your server diff --git a/config/routes.rb b/config/routes.rb index 0be9978c6a88f2697f79e3e2960a41155a6927ff..e22da84f0a6d605be73da66ac3b799082a0d0565 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -112,6 +112,7 @@ Diaspora::Application.routes.draw do get :weekly_user_stats get :correlations get :stats, :as => 'pod_stats' + get "add_invites/:invite_code_id" => 'admins#add_invites', :as => 'add_invites' end resource :profile, :only => [:edit, :update] diff --git a/db/migrate/20110105051803_create_import_tables.rb b/db/migrate/20110105051803_create_import_tables.rb index f514f3157a31c0dbef7f2cf74940d8f9c8cb30de..0388d2cefc00cf3ba3a03a904c96d0711506f9a8 100644 --- a/db/migrate/20110105051803_create_import_tables.rb +++ b/db/migrate/20110105051803_create_import_tables.rb @@ -166,7 +166,6 @@ class CreateImportTables < ActiveRecord::Migration t.string :language t.string :email t.database_authenticatable - t.invitable t.recoverable t.rememberable t.trackable diff --git a/features/step_definitions/user_steps.rb b/features/step_definitions/user_steps.rb index e60922eddb5eea21fb13b58f95814860670e6342..2dbf8c2819f52a4f7d4610b0733ea774a9271ae8 100644 --- a/features/step_definitions/user_steps.rb +++ b/features/step_definitions/user_steps.rb @@ -26,13 +26,15 @@ Given /^a nsfw user with email "([^\"]*)"$/ do |email| end Given /^I have been invited by an admin$/ do - i = EmailInviter.new("new_invitee@example.com") + admin = Factory(:user) + bob.invitation_code + i = EmailInviter.new("new_invitee@example.com", bob) i.send! end Given /^I have been invited by a user$/ do @inviter = Factory(:user) - i = EmailInviter.new("new_invitee@example.com", :inviter => @inviter) + i = EmailInviter.new("new_invitee@example.com", @inviter) i.send! end diff --git a/lib/email_inviter.rb b/lib/email_inviter.rb index 0585b866bba979fbb0074ef43cbd967264a7400f..298379c81feb71c936531a864369086f38a94152 100644 --- a/lib/email_inviter.rb +++ b/lib/email_inviter.rb @@ -1,10 +1,10 @@ class EmailInviter attr_accessor :emails, :message, :inviter, :locale - def initialize(emails, options={}) + def initialize(emails, inviter, options={}) self.message = options[:message] - self.inviter = options[:inviter] self.locale = options.fetch(:locale, 'en') + self.inviter = inviter self.emails = emails end @@ -15,12 +15,7 @@ class EmailInviter end def invitation_code - @invitation_code ||= inviter.nil? ? EmailInviter.admin_code : inviter.invitation_code - end - - def self.admin_code - puts "FIX ME" - "foo" + @invitation_code ||= inviter.invitation_code end def send! diff --git a/lib/rake_helpers.rb b/lib/rake_helpers.rb index d71fa3e83e44f9e1c603aeb186d53ce8064e57f4..f7a075277c75912d84004382fa6070324c8045c5 100644 --- a/lib/rake_helpers.rb +++ b/lib/rake_helpers.rb @@ -26,6 +26,11 @@ module RakeHelpers possible_invite = Invitation.find_by_identifier(backer_email) possible_user ||= possible_invite.recipient if possible_invite.present? + admin_account = User.find_by_username(AppConfig[:admin_account]) + raise "no admin_account in application.yml" unless admin_account.present? + admin_account.invitation_code.count += num_to_process + admin_account.invitation_code.save + unless possible_user puts "#{n}: sending email to: #{backer_name} #{backer_email}" unless Rails.env == 'test' unless test diff --git a/spec/controllers/admins_controller_spec.rb b/spec/controllers/admins_controller_spec.rb index 69299f01f70ef5194a25089b5911f997b3d337db..4f269d41952065fde2b1fee81666b5049a6afd5d 100644 --- a/spec/controllers/admins_controller_spec.rb +++ b/spec/controllers/admins_controller_spec.rb @@ -73,11 +73,6 @@ describe AdminsController do AppConfig[:admins] = [@user.username] end - it 'succeeds' do - get :admin_inviter, :identifier => 'bob@moms.com' - response.should be_redirect - end - it 'does not die if you do it twice' do get :admin_inviter, :identifier => 'bob@moms.com' get :admin_inviter, :identifier => 'bob@moms.com' @@ -85,7 +80,7 @@ describe AdminsController do end it 'invites a new user' do - Invitation.should_receive(:create) + EmailInviter.should_receive(:new).and_return(stub.as_null_object) get :admin_inviter, :identifier => 'bob@moms.com' response.should redirect_to user_search_path flash.notice.should include("invitation sent") diff --git a/spec/controllers/invitations_controller_spec.rb b/spec/controllers/invitations_controller_spec.rb index b2e6afe50e4c1e4ac1ff41f940b00f21233dd5f8..2f551c252f556316ce3bda6670790a159ae574d5 100644 --- a/spec/controllers/invitations_controller_spec.rb +++ b/spec/controllers/invitations_controller_spec.rb @@ -20,8 +20,8 @@ describe InvitationsController do end it 'creates an EmailInviter' do - inviter = stub(:emails => ['mbs@gmail.com']) - EmailInviter.should_receive(:new).with(@invite['email_inviter']['emails'], @invite['email_inviter']). + inviter = stub(:emails => ['mbs@gmail.com'], :send! => true) + EmailInviter.should_receive(:new).with(@invite['email_inviter']['emails'], @user, @invite['email_inviter']). and_return(inviter) post :create, @invite end @@ -41,7 +41,6 @@ describe InvitationsController do end end - describe '#new' do it 'renders' do sign_in :user, @user diff --git a/spec/lib/email_inviter_spec.rb b/spec/lib/email_inviter_spec.rb index 22e216da0fc2b7328406ea55c1607288bde50cb6..3d423d36201ba0a2ce63820aba434461788c7e73 100644 --- a/spec/lib/email_inviter_spec.rb +++ b/spec/lib/email_inviter_spec.rb @@ -4,65 +4,53 @@ describe EmailInviter do before do @user = stub(:invitation_code => 'coolcodebro', :present? => true, :email => 'foo@bar.com') - @emails = "mbs333@gmail.com, foo@bar.com maxwell@dude.com" + @emails = "mbs333@gmail.com, foo1@bar.com maxwell@dude.com" end it 'has a list of emails' do - inviter = EmailInviter.new(@emails) + inviter = EmailInviter.new(@emails, @user) inviter.emails.should_not be_empty end it 'should parse three emails' do - inviter = EmailInviter.new(@emails) + inviter = EmailInviter.new(@emails, @user) inviter.emails.count.should == 3 end - it 'an optional inviter' do - inviter = EmailInviter.new(@emails, :inviter => @user) + it 'has an inviter' do + inviter = EmailInviter.new(@emails, @user) inviter.inviter.should_not be_nil end it 'can have a message' do message = "you guys suck hard" - inviter = EmailInviter.new("emails", :message => message) + inviter = EmailInviter.new("emails", @user, :message => message) inviter.message.should == message end describe '#emails' do it 'rejects the inviter email if present' do - inviter = EmailInviter.new(@emails + " #{@user.email}", :inviter => @user) + inviter = EmailInviter.new(@emails + " #{@user.email}", @user) inviter.emails.should_not include(@user.email) end end describe 'language' do it 'defaults to english' do - inviter = EmailInviter.new(@emails) + inviter = EmailInviter.new(@emails, @user) inviter.locale.should == 'en' end it 'listens to the langauge option' do - inviter = EmailInviter.new(@emails, :locale => 'es') + inviter = EmailInviter.new(@emails, @user, :locale => 'es') inviter.locale.should == 'es' end end describe '#invitation_code' do - it 'delegates to the user if it exists' do - inviter = EmailInviter.new(@emails, :inviter => @user) + it 'delegates to the user' do + inviter = EmailInviter.new(@emails, @user) inviter.invitation_code.should == @user.invitation_code end - - it 'calls admin_code if it does not' do - inviter = EmailInviter.new(@emails) - inviter.should_receive(:admin_code).and_return("foo") - inviter.invitation_code.should == "foo" - end - end - - describe 'admin code' do - it 'is hella pending' do - pending - end end end \ No newline at end of file diff --git a/spec/lib/rake_helper_spec.rb b/spec/lib/rake_helper_spec.rb index b2b8de3c4a69d8c4efbef7f285de6e46495cfdee..48b617fc72dc570c7d31c2838eb440c107eeaff5 100644 --- a/spec/lib/rake_helper_spec.rb +++ b/spec/lib/rake_helper_spec.rb @@ -12,20 +12,18 @@ describe RakeHelpers do describe '#process_emails' do before do Devise.mailer.deliveries = [] + @old_admin = AppConfig[:admin_account] + AppConfig[:admin_account] = Factory(:user).username end - it 'should send emails to each backer' do - expect{ - process_emails(@csv, 100, 1, false) - }.to change(User, :count).by(3) + + after do + AppConfig[:admin_account] = @old_admin end - it 'should not send the email to the same email twice' do - process_emails(@csv, 100, 1, false) + it 'should send emails to each email' do - Devise.mailer.deliveries.count.should == 3 + EmailInviter.should_receive(:new).exactly(3).times.and_return(stub.as_null_object) process_emails(@csv, 100, 1, false) - - Devise.mailer.deliveries.count.should == 3 end end end diff --git a/spec/models/invitation_code_spec.rb b/spec/models/invitation_code_spec.rb index 142cc2944d31a71a7ddf94822c2b5f14493637cb..18d949f9822eee0ae2eb692b7c6a4fa4c4648a7f 100644 --- a/spec/models/invitation_code_spec.rb +++ b/spec/models/invitation_code_spec.rb @@ -4,4 +4,39 @@ describe InvitationCode do it 'has a valid factory' do Factory(:invitation_code).should be_valid end + + it 'sets the count to a default value' do + code = Factory(:invitation_code) + code.count.should > 0 + end + + describe '#use!' do + it 'decrements the count of the code' do + code = Factory(:invitation_code) + + expect{ + code.use! + }.to change(code, :count).by(-1) + end + end + + describe '.default_inviter_or' do + before do + @old_account = AppConfig[:admin_account] + AppConfig[:admin_account] = 'bob' + end + + after do + AppConfig[:admin_account] = @old_account + end + + it 'grabs the set admin account for the pod...' do + InvitationCode.default_inviter_or(alice).username.should == 'bob' + end + + it '..or the given user' do + AppConfig[:admin_account] = '' + InvitationCode.default_inviter_or(alice).username.should == 'alice' + end + end end