mirror of
https://github.com/discourse/discourse.git
synced 2025-04-15 15:30:52 +08:00
FEATURE: Resend all pending invitations
This commit is contained in:
parent
a3d72efee9
commit
c4e1ad0953
@ -10,6 +10,7 @@ export default Ember.Controller.extend({
|
|||||||
invitesCount: null,
|
invitesCount: null,
|
||||||
canLoadMore: true,
|
canLoadMore: true,
|
||||||
invitesLoading: false,
|
invitesLoading: false,
|
||||||
|
reinvitedAll: false,
|
||||||
|
|
||||||
init: function() {
|
init: function() {
|
||||||
this._super();
|
this._super();
|
||||||
@ -32,6 +33,10 @@ export default Ember.Controller.extend({
|
|||||||
|
|
||||||
inviteRedeemed: Em.computed.equal('filter', 'redeemed'),
|
inviteRedeemed: Em.computed.equal('filter', 'redeemed'),
|
||||||
|
|
||||||
|
showReinviteAllButton: function() {
|
||||||
|
return (this.get('filter') === "pending" && this.get('model').invites.length > 4);
|
||||||
|
}.property('filter'),
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Can the currently logged in user invite users to the site
|
Can the currently logged in user invite users to the site
|
||||||
|
|
||||||
@ -87,6 +92,13 @@ export default Ember.Controller.extend({
|
|||||||
return false;
|
return false;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
reinviteAll() {
|
||||||
|
const self = this;
|
||||||
|
Invite.reinviteAll().then(function() {
|
||||||
|
self.set('reinvitedAll', true);
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
loadMore() {
|
loadMore() {
|
||||||
var self = this;
|
var self = this;
|
||||||
var model = self.get('model');
|
var model = self.get('model');
|
||||||
|
@ -48,6 +48,10 @@ Invite.reopenClass({
|
|||||||
findInvitedCount(user) {
|
findInvitedCount(user) {
|
||||||
if (!user) { return Em.RSVP.resolve(); }
|
if (!user) { return Em.RSVP.resolve(); }
|
||||||
return Discourse.ajax("/users/" + user.get('username_lower') + "/invited_count.json").then(result => Em.Object.create(result.counts));
|
return Discourse.ajax("/users/" + user.get('username_lower') + "/invited_count.json").then(result => Em.Object.create(result.counts));
|
||||||
|
},
|
||||||
|
|
||||||
|
reinviteAll() {
|
||||||
|
return Discourse.ajax('/invites/reinvite-all', { type: 'POST' });
|
||||||
}
|
}
|
||||||
|
|
||||||
});
|
});
|
||||||
|
@ -17,6 +17,13 @@
|
|||||||
{{#if canBulkInvite}}
|
{{#if canBulkInvite}}
|
||||||
{{resumable-upload target="/invites/upload" success="uploadSuccess" error="uploadError" uploadText=uploadText}}
|
{{resumable-upload target="/invites/upload" success="uploadSuccess" error="uploadError" uploadText=uploadText}}
|
||||||
{{/if}}
|
{{/if}}
|
||||||
|
{{#if showReinviteAllButton}}
|
||||||
|
{{#if reinvitedAll}}
|
||||||
|
{{i18n 'user.invited.reinvited_all'}}
|
||||||
|
{{else}}
|
||||||
|
{{d-button icon="refresh" action="reinviteAll" class="btn" label="user.invited.reinvite_all"}}
|
||||||
|
{{/if}}
|
||||||
|
{{/if}}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
|
@ -4,7 +4,7 @@ class InvitesController < ApplicationController
|
|||||||
skip_before_filter :check_xhr, :preload_json
|
skip_before_filter :check_xhr, :preload_json
|
||||||
skip_before_filter :redirect_to_login_if_required
|
skip_before_filter :redirect_to_login_if_required
|
||||||
|
|
||||||
before_filter :ensure_logged_in, only: [:destroy, :create, :create_invite_link, :resend_invite, :check_csv_chunk, :upload_csv_chunk]
|
before_filter :ensure_logged_in, only: [:destroy, :create, :create_invite_link, :resend_invite, :resend_all_invites, :check_csv_chunk, :upload_csv_chunk]
|
||||||
before_filter :ensure_new_registrations_allowed, only: [:show, :redeem_disposable_invite]
|
before_filter :ensure_new_registrations_allowed, only: [:show, :redeem_disposable_invite]
|
||||||
before_filter :ensure_not_logged_in, only: [:show, :redeem_disposable_invite]
|
before_filter :ensure_not_logged_in, only: [:show, :redeem_disposable_invite]
|
||||||
|
|
||||||
@ -135,6 +135,13 @@ class InvitesController < ApplicationController
|
|||||||
render nothing: true
|
render nothing: true
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def resend_all_invites
|
||||||
|
guardian.ensure_can_invite_to_forum!
|
||||||
|
|
||||||
|
Invite.resend_all_invites_from(current_user.id)
|
||||||
|
render nothing: true
|
||||||
|
end
|
||||||
|
|
||||||
def check_csv_chunk
|
def check_csv_chunk
|
||||||
guardian.ensure_can_bulk_invite_to_forum!(current_user)
|
guardian.ensure_can_bulk_invite_to_forum!(current_user)
|
||||||
|
|
||||||
|
@ -233,6 +233,12 @@ class Invite < ActiveRecord::Base
|
|||||||
Jobs.enqueue(:invite_email, invite_id: self.id)
|
Jobs.enqueue(:invite_email, invite_id: self.id)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def self.resend_all_invites_from(user_id)
|
||||||
|
Invite.where('invites.user_id IS NULL AND invites.email IS NOT NULL AND invited_by_id = ?', user_id).find_each do |invite|
|
||||||
|
invite.resend_invite unless invite.blank?
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
def limit_invites_per_day
|
def limit_invites_per_day
|
||||||
RateLimiter.new(invited_by, "invites-per-day", SiteSetting.max_invites_per_day, 1.day.to_i)
|
RateLimiter.new(invited_by, "invites-per-day", SiteSetting.max_invites_per_day, 1.day.to_i)
|
||||||
end
|
end
|
||||||
|
@ -723,7 +723,9 @@ en:
|
|||||||
rescind: "Remove"
|
rescind: "Remove"
|
||||||
rescinded: "Invite removed"
|
rescinded: "Invite removed"
|
||||||
reinvite: "Resend Invite"
|
reinvite: "Resend Invite"
|
||||||
|
reinvite_all: "Resend all Invites"
|
||||||
reinvited: "Invite re-sent"
|
reinvited: "Invite re-sent"
|
||||||
|
reinvited_all: "All Invites re-sent!"
|
||||||
time_read: "Read Time"
|
time_read: "Read Time"
|
||||||
days_visited: "Days Visited"
|
days_visited: "Days Visited"
|
||||||
account_age_days: "Account age in days"
|
account_age_days: "Account age in days"
|
||||||
|
@ -580,6 +580,7 @@ Discourse::Application.routes.draw do
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
post "invites/reinvite" => "invites#resend_invite"
|
post "invites/reinvite" => "invites#resend_invite"
|
||||||
|
post "invites/reinvite-all" => "invites#resend_all_invites"
|
||||||
post "invites/link" => "invites#create_invite_link"
|
post "invites/link" => "invites#create_invite_link"
|
||||||
post "invites/disposable" => "invites#create_disposable_invite"
|
post "invites/disposable" => "invites#create_disposable_invite"
|
||||||
get "invites/redeem/:token" => "invites#redeem_disposable_invite"
|
get "invites/redeem/:token" => "invites#redeem_disposable_invite"
|
||||||
|
Loading…
x
Reference in New Issue
Block a user