Allow dashboard view for admins and update permissions in internal/users (#1742)
* allow admins to see dashboards * add more info to internal users * add more info to internal users * add video permission toggle * specify banished user traits
This commit is contained in:
parent
1793956bdb
commit
009001272a
5 changed files with 199 additions and 148 deletions
|
|
@ -4,7 +4,7 @@ class DashboardsController < ApplicationController
|
|||
after_action :verify_authorized
|
||||
|
||||
def show
|
||||
@user = if params[:username] && current_user.admin?
|
||||
@user = if params[:username] && current_user.any_admin?
|
||||
User.find_by_username(params[:username])
|
||||
else
|
||||
current_user
|
||||
|
|
|
|||
|
|
@ -39,7 +39,6 @@ class Internal::UsersController < Internal::ApplicationController
|
|||
@user = User.find(params[:id])
|
||||
@new_mentee = user_params[:add_mentee]
|
||||
@new_mentor = user_params[:add_mentor]
|
||||
ban_from_mentorship
|
||||
make_matches
|
||||
update_role
|
||||
add_note
|
||||
|
|
@ -52,25 +51,50 @@ class Internal::UsersController < Internal::ApplicationController
|
|||
end
|
||||
|
||||
def update_role
|
||||
ban_user if user_params[:ban_user] == "1"
|
||||
warn_user if user_params[:warn_user] == "1"
|
||||
return_to_good_standing if user_params[:good_standing_user] == "1"
|
||||
toggle_ban_user if user_params[:ban_user]
|
||||
toggle_warn_user if user_params[:warn_user]
|
||||
toggle_trust_user if user_params[:trusted_user]
|
||||
toggle_ban_from_mentorship if user_params[:ban_from_mentorship]
|
||||
toggle_video_permission if user_params[:video_permission]
|
||||
end
|
||||
|
||||
def return_to_good_standing
|
||||
@user.remove_role :banned if @user.banned
|
||||
@user.remove_role :warned if @user.warned
|
||||
create_note("good_standing", user_params[:note_for_current_role])
|
||||
def toggle_video_permission
|
||||
if user_params[:video_permission] == "1"
|
||||
@user.add_role :video_permission
|
||||
else
|
||||
@user.remove_role :video_permission
|
||||
end
|
||||
end
|
||||
|
||||
def ban_user
|
||||
@user.add_role :banned
|
||||
create_note("banned", user_params[:note_for_current_role])
|
||||
def toggle_ban_user
|
||||
if user_params[:ban_user] == "1"
|
||||
@user.add_role :banned
|
||||
@user.remove_role :trusted
|
||||
@user.remove_role :video_permission
|
||||
create_note("banned", user_params[:note_for_current_role])
|
||||
else
|
||||
@user.remove_role :banned
|
||||
create_note("good_standing", user_params[:note_for_current_role])
|
||||
end
|
||||
end
|
||||
|
||||
def warn_user
|
||||
@user.add_role :warned
|
||||
create_note("warned", user_params[:note_for_current_role])
|
||||
def toggle_trust_user
|
||||
if user_params[:trusted_user] == "1"
|
||||
@user.add_role :trusted
|
||||
else
|
||||
@user.remove_role :trusted
|
||||
end
|
||||
end
|
||||
|
||||
def toggle_warn_user
|
||||
if user_params[:warn_user] == "1"
|
||||
@user.add_role :warned
|
||||
@user.remove_role :trusted
|
||||
create_note("warned", user_params[:note_for_current_role])
|
||||
else
|
||||
@user.remove_role :warned
|
||||
create_note("good_standing", user_params[:note_for_current_role])
|
||||
end
|
||||
end
|
||||
|
||||
def add_note
|
||||
|
|
@ -107,16 +131,18 @@ class Internal::UsersController < Internal::ApplicationController
|
|||
end
|
||||
end
|
||||
|
||||
def ban_from_mentorship
|
||||
return unless user_params[:ban_from_mentorship] == "1"
|
||||
|
||||
@user.add_role :banned_from_mentorship
|
||||
mentee_relationships = MentorRelationship.where(mentor_id: @user.id)
|
||||
mentor_relationships = MentorRelationship.where(mentee_id: @user.id)
|
||||
deactivate_mentorship(mentee_relationships)
|
||||
deactivate_mentorship(mentor_relationships)
|
||||
@user.update(offering_mentorship: false, seeking_mentorship: false)
|
||||
create_note("banned_from_mentorship", user_params[:note_for_mentorship_ban])
|
||||
def toggle_ban_from_mentorship
|
||||
if user_params[:ban_from_mentorship] == "1"
|
||||
@user.add_role :banned_from_mentorship
|
||||
mentee_relationships = MentorRelationship.where(mentor_id: @user.id)
|
||||
mentor_relationships = MentorRelationship.where(mentee_id: @user.id)
|
||||
deactivate_mentorship(mentee_relationships)
|
||||
deactivate_mentorship(mentor_relationships)
|
||||
@user.update(offering_mentorship: false, seeking_mentorship: false)
|
||||
create_note("banned_from_mentorship", user_params[:note_for_mentorship_ban])
|
||||
else
|
||||
@user.remove_role :banned_from_mentorship
|
||||
end
|
||||
end
|
||||
|
||||
def deactivate_mentorship(relationships)
|
||||
|
|
@ -158,8 +184,10 @@ class Internal::UsersController < Internal::ApplicationController
|
|||
:ban_from_mentorship,
|
||||
:ban_user,
|
||||
:warn_user,
|
||||
:good_standing_user, :note_for_mentorship_ban,
|
||||
:note_for_mentorship_ban,
|
||||
:note_for_current_role,
|
||||
:reason_for_mentorship_ban)
|
||||
:reason_for_mentorship_ban,
|
||||
:trusted_user,
|
||||
:video_permission)
|
||||
end
|
||||
end
|
||||
|
|
|
|||
|
|
@ -1,9 +1,9 @@
|
|||
class User < ApplicationRecord
|
||||
include CloudinaryHelper
|
||||
|
||||
attr_accessor :scholar_email, :note, :ban_from_mentorship, :quick_match, :ban_user, :warn_user, :good_standing_user,
|
||||
attr_accessor :scholar_email, :note, :ban_from_mentorship, :quick_match, :ban_user, :warn_user,
|
||||
:note_for_mentorship_ban, :reason_for_mentorship_ban,
|
||||
:note_for_current_role, :add_mentor, :add_mentee
|
||||
:note_for_current_role, :add_mentor, :add_mentee, :trusted_user, :video_permission
|
||||
|
||||
rolify
|
||||
include AlgoliaSearch
|
||||
|
|
@ -287,7 +287,7 @@ class User < ApplicationRecord
|
|||
end
|
||||
|
||||
def banished?
|
||||
user.notes.where(reason: "banned", content: "spam account").any? && user.banned
|
||||
user.notes.where(reason: "banned", content: "spam account").any? && user.banned && user.comments.none? && user.articles.none?
|
||||
end
|
||||
|
||||
def banned_from_mentorship
|
||||
|
|
@ -298,6 +298,10 @@ class User < ApplicationRecord
|
|||
has_role?(:super_admin)
|
||||
end
|
||||
|
||||
def any_admin?
|
||||
has_role?(:super_admin) || has_role?(:admin)
|
||||
end
|
||||
|
||||
def trusted
|
||||
Rails.cache.fetch("user-#{id}/has_trusted_role", expires_in: 200.hours) do
|
||||
has_role? :trusted
|
||||
|
|
|
|||
66
app/views/internal/users/_mentee_match.erb
Normal file
66
app/views/internal/users/_mentee_match.erb
Normal file
|
|
@ -0,0 +1,66 @@
|
|||
<% if @user.seeking_mentorship && @user.mentee_description.present? && !@user.banned_from_mentorship %>
|
||||
<h2> Mentee Description </h2>
|
||||
<div class="row" style="font-size:0.85em;position:sticky;top:50px;background:white;z-index:1000;border:2px solid black">
|
||||
<div class="col-md-2">
|
||||
<img src="<%= @user.profile_image_90 %>" style="border-radius:100px;width:50px;height:50px;" />
|
||||
<br/>
|
||||
<a href="/<%= @user.username %>" target="_blank">@<%= @user.username %></a>
|
||||
<br/>
|
||||
</div>
|
||||
<div class="col-md-3" style="border-left:1px solid black">
|
||||
<h4>Tags</h4>
|
||||
<%= @user.cached_followed_tag_names.join(", ") %>
|
||||
</div>
|
||||
<div class="col-md-3" style="max-height: 22vh;overflow:auto">
|
||||
<h4>Mentee description</h4>
|
||||
<%= @user.mentee_description %>
|
||||
</div>
|
||||
<div class="col-md-3">
|
||||
<h4>Skills/Languages</h4>
|
||||
<%= @user.mostly_work_with %>
|
||||
</div>
|
||||
<div class="col-md-1">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<h2> Possible Mentors </h2>
|
||||
<% count = 0 %>
|
||||
<% MentorRelationship.
|
||||
unmatched_mentors.where.not(mentor_form_updated_at: nil, id: @user.id, mentor_description: [nil,""]).
|
||||
order("mentor_form_updated_at DESC").limit(175).
|
||||
sort_by { |possible_mentor| UserSimilarity.new(@user, possible_mentor).score }.reverse.
|
||||
first(40).each do |possible_mentor| %>
|
||||
|
||||
<% if !possible_mentor.banned_from_mentorship %>
|
||||
<div class="row" style="font-size:0.9em">
|
||||
<div class="col-md-2">
|
||||
<img src="<%= possible_mentor.profile_image_90 %>" style="border-radius:100px;width:50px;height:50px;" />
|
||||
<br/>
|
||||
<a href="/<%= possible_mentor.username %>" target="_blank">@<%= possible_mentor.username %></a>
|
||||
<br/>
|
||||
<a href="/internal/users/<%= possible_mentor.id %>" target="_blank">Internal Profile (id #<%= possible_mentor.id %>)</a>
|
||||
</div>
|
||||
<div class="col-md-3" style="border-left:1px solid black">
|
||||
<h4>Tag Intersection</h4>
|
||||
<%= UserSimilarity.new(@user, possible_mentor).tag_intersection.join(", ") %>
|
||||
</div>
|
||||
<div class="col-md-3">
|
||||
<h4>Mentor description</h4>
|
||||
<%= possible_mentor.mentor_description %>
|
||||
</div>
|
||||
<div class="col-md-3">
|
||||
<h4>Skills/Languages</h4>
|
||||
<%= possible_mentor.mostly_work_with %>
|
||||
</div>
|
||||
<div class="col-md-1">
|
||||
<h4>Action</h4>
|
||||
<%= form_for ([:internal, @user]) do |f| %>
|
||||
<%= f.hidden_field :quick_match, value: true %>
|
||||
<%= f.hidden_field :add_mentor, value: possible_mentor.id %>
|
||||
<%= f.submit "Match!" %>
|
||||
<% end %>
|
||||
</div>
|
||||
</div>
|
||||
<% end %>
|
||||
<% end %>
|
||||
<% end %>
|
||||
|
|
@ -1,66 +1,84 @@
|
|||
<style>
|
||||
dt {
|
||||
width: calc(20% - 1rem);
|
||||
float: left;
|
||||
}
|
||||
dd {
|
||||
width: calc(80% - 1rem)
|
||||
}
|
||||
</style>
|
||||
<div class="row">
|
||||
<h1>
|
||||
<%= @user.name%><a href="/<%= @user.username %>" target="_blank"> (@<%= @user.username %>)</a>
|
||||
<%= @user.name %><a href="/<%= @user.username %>" target="_blank"> (@<%= @user.username %>)</a>
|
||||
</h1>
|
||||
<p><u><a style="color: red" href="/internal/users/<%= @user.id %>/edit">click here to banish or delete user</a></u></p>
|
||||
<p><em>Member since <%= @user.created_at.strftime("%b %e '%y") %></em></p>
|
||||
<p><strong>Email:</strong> <%= @user.email %></p>
|
||||
<p><strong>Activity:</strong></p>
|
||||
<p><strong><u>General Info</u></strong></p>
|
||||
<dl>
|
||||
<dt>ID:</dt><dd><%= @user.id %></span></dd>
|
||||
<dt>Username:</dt><dd><%= @user.username %></dd>
|
||||
<dt>Name:</dt><dd><%= @user.name %></dd>
|
||||
<dt>Email:</dt><dd><%= @user.email %></dd>
|
||||
<dt>Twitter:</dt><dd><%= @user.twitter_username || "N/A" %></dd>
|
||||
<dt>GitHub:</dt><dd><%= @user.github_username || "N/A" %></dd>
|
||||
<dt>Sustaining Member:</dt><dd><%= @user.a_sustaining_member? %></dd>
|
||||
<% if @user.a_sustaining_member? %>
|
||||
<dt>Monthly Dues:</dt><dd><%= @user.monthly_dues %></dd>
|
||||
<% end %>
|
||||
</dl>
|
||||
|
||||
<p><strong><u>Activity</u></strong></p>
|
||||
<ul>
|
||||
<li><%= @user.comments.size %> comments</li>
|
||||
<li><%= @user.articles.size %> articles</li>
|
||||
<li><%= @user.reactions.size %> reactions</li>
|
||||
<li><%= @user.followers.size %> followers</li>
|
||||
<li><%= @user.following_users_count %> users following</li>
|
||||
<li><%= @user.badge_achievements_count %> Badges</li>
|
||||
|
||||
</ul>
|
||||
|
||||
</div>
|
||||
<div class="row">
|
||||
<h3><u>Current Roles</u></h3>
|
||||
<p>(view full history in notes below)</p>
|
||||
<ul>
|
||||
<% @user.roles.each do |role| %>
|
||||
<li><%= role.name %> - <em><%= role.created_at.strftime("%b %e '%y") %></em></li>
|
||||
<% end %>
|
||||
</ul>
|
||||
<%= form_for ([:internal, @user]) do |f| %>
|
||||
<% if @user.banned && current_user.has_role?(:super_admin) %>
|
||||
<p style="background-color:red;color:white">🚨 Banned User 🚨</p>
|
||||
<%= f.label "Un-ban User (return to good standing)" %>
|
||||
<%= f.check_box :good_standing_user %>
|
||||
<br>
|
||||
|
||||
<br>
|
||||
<%= f.submit "Update User Status" %>
|
||||
<% elsif @user.banned %>
|
||||
<p style="background-color:red;color:white">🚨 Banned User 🚨</p>
|
||||
<p>Only super-admins can unban users.</p>
|
||||
<% elsif @user.warned %>
|
||||
<p style="background-color: orange;color:white">Warned User</p>
|
||||
<%= f.label :ban_user %>
|
||||
<%= f.check_box :ban_user %>
|
||||
<br>
|
||||
<%= f.label "Un-Warn User (return to good standing)" %>
|
||||
<%= f.check_box :good_standing_user %>
|
||||
<br>
|
||||
<%= f.label "Reason for action:" %>
|
||||
<br>
|
||||
<%= f.text_area :note_for_current_role, required: true %>
|
||||
<br>
|
||||
<%= f.submit "Update User Status" %>
|
||||
<br>
|
||||
<h3><u>Privileges</u></h3>
|
||||
<% if !@user.banned && !@user.warned %>
|
||||
<%= form_for [:internal, @user] do |f| %>
|
||||
<p>Add Trusted Role (Community Moderator)
|
||||
<%= f.check_box :trusted_user, checked: @user.trusted %></p>
|
||||
<p>Allow Video Uploads
|
||||
<%= f.check_box :video_permission, checked: @user.has_role?(:video_permission) %> </p>
|
||||
<%= f.submit "Update Privileges" %>
|
||||
<% end %>
|
||||
<% else %>
|
||||
<p style="color:green">Member in good standing</p>
|
||||
<%= f.label :ban_user %>
|
||||
<%= f.check_box :ban_user %>
|
||||
<br>
|
||||
<%= f.label :warn_user %>
|
||||
<%= f.check_box :warn_user %>
|
||||
<br>
|
||||
<%= f.label "Reason for action:" %>
|
||||
<br>
|
||||
<%= f.text_area :note_for_current_role, required: true %>
|
||||
<br>
|
||||
<%= f.submit "Update User Status" %>
|
||||
<br>
|
||||
User must be in good standing to have heigtened privileges of any kind.
|
||||
<% end %>
|
||||
<br>
|
||||
<h3><u>Warn or Ban User</u></h3>
|
||||
<% if @user.banned %>
|
||||
<p style="background-color:red;color:white">🚨 Banned User 🚨</p>
|
||||
<% elsif @user.warned %>
|
||||
<p style="background-color: orange;color:white">Warned User</p>
|
||||
<% else %>
|
||||
<p style="color:green">Member in good standing</p>
|
||||
<% end %>
|
||||
<%= form_for [:internal, @user] do |f| %>
|
||||
<%= f.label "Ban User" %>
|
||||
<%= f.check_box :ban_user, checked: @user.banned %>
|
||||
<br>
|
||||
<%= f.label "Warn User" %>
|
||||
<%= f.check_box :warn_user, checked: @user.warned %>
|
||||
<br>
|
||||
<%= f.label "Reason for action:" %>
|
||||
<%= f.text_area :note_for_current_role, required: true %>
|
||||
<br>
|
||||
<%= f.submit "Update User Status" %>
|
||||
<% end %>
|
||||
</div>
|
||||
<div class="row">
|
||||
|
|
@ -94,16 +112,15 @@
|
|||
<% end %>
|
||||
</ul>
|
||||
<% end %>
|
||||
<%= form_for ([:internal, @user]) do |f| %>
|
||||
<%= form_for [:internal, @user] do |f| %>
|
||||
<% if @user.banned_from_mentorship %>
|
||||
<p style="background-color:red; color:white;">User is banned from mentorship program</p>
|
||||
<% else %>
|
||||
<p>Ban user from mentorship program <%= f.check_box :ban_from_mentorship %></p>
|
||||
<%= f.label "Reason: "%>
|
||||
<%= f.text_area :note_for_mentorship_ban, required: true %>
|
||||
<br>
|
||||
<%= f.submit "Ban From Mentorship" %>
|
||||
<% end %>
|
||||
<p>Ban user from mentorship program <%= f.check_box :ban_from_mentorship, checked: @user.has_role?(:banned_from_mentorship) %></p>
|
||||
<%= f.label "Reason: " %>
|
||||
<%= f.text_area :note_for_mentorship_ban, required: true %>
|
||||
<br>
|
||||
<%= f.submit "Update Mentorship Status" %>
|
||||
<% end %>
|
||||
</div>
|
||||
<div class="row">
|
||||
|
|
@ -116,81 +133,17 @@
|
|||
<% else %>
|
||||
<p><em>No notes yet!</em></p>
|
||||
<% end %>
|
||||
<%= form_for ([:internal, @user]) do |f| %>
|
||||
<%= f.label "Add new note: "%>
|
||||
<%= form_for [:internal, @user] do |f| %>
|
||||
<%= f.label "Add new note: " %>
|
||||
<br>
|
||||
<%= f.text_area :note %>
|
||||
<br/>
|
||||
<br>
|
||||
<%= f.submit "Submit Note" %>
|
||||
<% end %>
|
||||
</div>
|
||||
|
||||
<% if @user.seeking_mentorship && @user.mentee_description.present? && !@user.banned_from_mentorship %>
|
||||
<h2> Mentee Description </h2>
|
||||
<div class="row" style="font-size:0.85em;position:sticky;top:50px;background:white;z-index:1000;border:2px solid black">
|
||||
<div class="col-md-2">
|
||||
<img src="<%= @user.profile_image_90 %>" style="border-radius:100px;width:50px;height:50px;" />
|
||||
<br/>
|
||||
<a href="/<%= @user.username %>" target="_blank">@<%= @user.username %></a>
|
||||
<br/>
|
||||
</div>
|
||||
<div class="col-md-3" style="border-left:1px solid black">
|
||||
<h4>Tags</h4>
|
||||
<%= @user.cached_followed_tag_names.join(", ") %>
|
||||
</div>
|
||||
<div class="col-md-3" style="max-height: 22vh;overflow:auto">
|
||||
<h4>Mentee description</h4>
|
||||
<%= @user.mentee_description %>
|
||||
</div>
|
||||
<div class="col-md-3">
|
||||
<h4>Skills/Languages</h4>
|
||||
<%= @user.mostly_work_with %>
|
||||
</div>
|
||||
<div class="col-md-1">
|
||||
</div>
|
||||
</div>
|
||||
<%= render "mentee_match" %>
|
||||
|
||||
<h2> Possible Mentors </h2>
|
||||
<% count = 0 %>
|
||||
<% MentorRelationship.
|
||||
unmatched_mentors.where.not(mentor_form_updated_at: nil, id: @user.id, mentor_description: [nil,""]).
|
||||
order("mentor_form_updated_at DESC").limit(175).
|
||||
sort_by { |possible_mentor| UserSimilarity.new(@user, possible_mentor).score }.reverse.
|
||||
first(40).each do |possible_mentor| %>
|
||||
|
||||
<% if !possible_mentor.banned_from_mentorship %>
|
||||
<div class="row" style="font-size:0.9em">
|
||||
<div class="col-md-2">
|
||||
<img src="<%= possible_mentor.profile_image_90 %>" style="border-radius:100px;width:50px;height:50px;" />
|
||||
<br/>
|
||||
<a href="/<%= possible_mentor.username %>" target="_blank">@<%= possible_mentor.username %></a>
|
||||
<br/>
|
||||
<a href="/internal/users/<%= possible_mentor.id %>" target="_blank">Internal Profile (id #<%= possible_mentor.id %>)</a>
|
||||
</div>
|
||||
<div class="col-md-3" style="border-left:1px solid black">
|
||||
<h4>Tag Intersection</h4>
|
||||
<%= UserSimilarity.new(@user, possible_mentor).tag_intersection.join(", ") %>
|
||||
</div>
|
||||
<div class="col-md-3">
|
||||
<h4>Mentor description</h4>
|
||||
<%= possible_mentor.mentor_description %>
|
||||
</div>
|
||||
<div class="col-md-3">
|
||||
<h4>Skills/Languages</h4>
|
||||
<%= possible_mentor.mostly_work_with %>
|
||||
</div>
|
||||
<div class="col-md-1">
|
||||
<h4>Action</h4>
|
||||
<%= form_for ([:internal, @user]) do |f| %>
|
||||
<%= f.hidden_field :quick_match, value: true %>
|
||||
<%= f.hidden_field :add_mentor, value: possible_mentor.id %>
|
||||
<%= f.submit "Match!" %>
|
||||
<% end %>
|
||||
</div>
|
||||
</div>
|
||||
<% end %>
|
||||
<% end %>
|
||||
<% end %>
|
||||
<h2><u>Recent Emails</u></h2>
|
||||
<ul>
|
||||
<% @user.email_messages.order("sent_at DESC").limit(50).each do |email| %>
|
||||
|
|
@ -199,4 +152,4 @@
|
|||
</ul>
|
||||
</div>
|
||||
<br>
|
||||
<br>
|
||||
<br>
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue