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:
Jess Lee 2019-02-06 12:24:42 -05:00 committed by Ben Halpern
parent 1793956bdb
commit 009001272a
5 changed files with 199 additions and 148 deletions

View file

@ -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

View file

@ -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

View file

@ -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

View 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 %>

View file

@ -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>