diff --git a/app/controllers/admins_controller.rb b/app/controllers/admins_controller.rb
index 12d3cdbf9..d433c71ba 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 cefd53162..560b9aeb7 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 809872c10..d19b462ae 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 ba31b74c9..33e259642 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 f03cf6ebf..1f7c9e5a1 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 ff74732ff..8736398e2 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]
+ %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]
+ email:
+ = text_field_tag 'user[email]', params[:user][:email]
- invitation identifier:
- = text_field_tag 'user[invitation_identifier]', params[:user][:invitation_identifier]
-
- 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 be58a6716..ead22fce2 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 -%>
<%=invite_email_title %>
diff --git a/config/application.yml.example b/config/application.yml.example
index d5e318f27..1de63b89a 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 0be9978c6..e22da84f0 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 f514f3157..0388d2cef 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 e60922edd..2dbf8c281 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 0585b866b..298379c81 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 d71fa3e83..f7a075277 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 69299f01f..4f269d419 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 b2e6afe50..2f551c252 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 22e216da0..3d423d362 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 b2b8de3c4..48b617fc7 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 = []
- end
- it 'should send emails to each backer' do
- expect{
- process_emails(@csv, 100, 1, false)
- }.to change(User, :count).by(3)
+ @old_admin = AppConfig[:admin_account]
+ AppConfig[:admin_account] = Factory(:user).username
end
- it 'should not send the email to the same email twice' do
- process_emails(@csv, 100, 1, false)
+ after do
+ AppConfig[:admin_account] = @old_admin
+ end
- Devise.mailer.deliveries.count.should == 3
- 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)
end
end
end
diff --git a/spec/models/invitation_code_spec.rb b/spec/models/invitation_code_spec.rb
index 142cc2944..18d949f98 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