diff --git a/app/assets/javascripts/management.js b/app/assets/javascripts/management.js index 18dfb4b228f40b77cbd57316bdbd77150eb614cf..4f0fe00313a423f28ab33a651fd3ea1da2186065 100644 --- a/app/assets/javascripts/management.js +++ b/app/assets/javascripts/management.js @@ -35,8 +35,18 @@ $(document).ready(function(){ var data_users = dataUsers(teachers,curators,admins); } + if(document.getElementById("lcomplaints") != null) { - var charts = ["colections","users","learning_objects","accesses"]; + false_user = document.getElementById("lcomplaints").value; + agressive_user = document.getElementById("lcomplaints_false").value; + offensive_object = document.getElementById("lcomplaints_offensive").value; + violates_copyright = document.getElementById("lcomplaints_violates").value; + + var data_complaints = dataComplaints(false_user,agressive_user,offensive_object,violates_copyright); + } + + + var charts = ["colections","users","learning_objects","accesses","complaints"]; for(i=0;i<charts.length;i++) { if ( document.getElementById(charts[i]) ) { @@ -58,6 +68,10 @@ $(document).ready(function(){ new Chart(ctx).Line(data_accesses,line_options); var accesses_chart = new Chart(ctx).Line(data_accesses); break; + case "complaints": + new Chart(ctx).Pie(data_complaints,pie_options); + var complaints_chart = new Chart(ctx).Pie(data_complaints); + break; default: null; break; diff --git a/app/assets/javascripts/management/complaints.js b/app/assets/javascripts/management/complaints.js new file mode 100644 index 0000000000000000000000000000000000000000..c86edd8190206abdae0a338a3a79534d81c798c9 --- /dev/null +++ b/app/assets/javascripts/management/complaints.js @@ -0,0 +1,69 @@ + + +//confurações dos gráficos de linha +//mais infos: www.chartjs.org/docs/ + + + +//var visual = document.getElementById("object").value; +//alert(visual); +function dataComplaints(false_user,agressive_user,offensive_object,violates_copyright) { + var data = [ + { + value: false_user, + color:"#68F000", + highlight: "#a9ff67", + label: "Usuários Falsos" + }, + { + value: agressive_user, + color: "#F55858", + highlight: "#FC8787", + label: "Usuários Ofensivos/Agressivos" + }, + { + value: offensive_object, + color: "#F9D60A", + highlight: "#fbe357", + label: "Objetos contém conteúdo Ofensivo/Abusivo" + }, + { + value: violates_copyright, + color: "#46BFBD", + highlight: "#5AD3D1", + label: "Objeto viola direitos Autorais" + }, + + ]; + return data; +} + +var pie_options = { + //Boolean - Whether we should show a stroke on each segment + segmentShowStroke : true, + + //String - The colour of each segment stroke + segmentStrokeColor : "#fff", + + //Number - The width of each segment stroke + segmentStrokeWidth : 2, + + //Number - The percentage of the chart that we cut out of the middle + percentageInnerCutout : 0, // This is 0 for Pie charts + + //Number - Amount of animation steps + animationSteps : 100, + + //String - Animation easing effect + animationEasing : "easeOutBounce", + + //Boolean - Whether we animate the rotation of the Doughnut + animateRotate : true, + + //Boolean - Whether we animate scaling the Doughnut from the centre + animateScale : false, + + //String - A legend template + legendTemplate : "<ul class=\"<%=name.toLowerCase()%>-legend\"><% for (var i=0; i<segments.length; i++){%><li><span style=\"background-color:<%=segments[i].fillColor%>\"></span><%if(segments[i].label){%><%=segments[i].label%><%}%></li><%}%></ul>" + +}; diff --git a/app/controllers/management/complaints_controller.rb b/app/controllers/management/complaints_controller.rb index 97499cf9bf1054a169890850d4e44725b927f1c6..82dc018da6bcae8348757f34e96d6c027c7e4ef0 100644 --- a/app/controllers/management/complaints_controller.rb +++ b/app/controllers/management/complaints_controller.rb @@ -3,9 +3,31 @@ class Management::ComplaintsController < ManagementController before_action :set_complaint, only: :destroy def index - @complaints = Complaint.includes(:complaint_reason, :complaintable, :user) + @date = params[:period] + @date_limit = case @date.to_i + when 1 then + Date.today + when 2 then + Date.yesterday + when 3 then + 1.week.ago + when 4 then + 1.month.ago + when 5 then + 6.month.ago + when 7 then + 1.year.ago + else + 10.year.ago + end + + @complaints = Complaint.all + @complaints_in_period = @complaints.select{ |complaint| complaint.created_at >= @date_limit} + @complaints_objs = @complaints_in_period.uniq{|x| x.complaintable.name}.size + end + def destroy Complaint.destroy @complaint diff --git a/app/controllers/management/statistics_controller.rb b/app/controllers/management/statistics_controller.rb index a2b32010c871c2ac8f53c744fc2f319300f56ef0..f52676287a3d768351ca07f9d0e714c8b5f96e84 100644 --- a/app/controllers/management/statistics_controller.rb +++ b/app/controllers/management/statistics_controller.rb @@ -1,23 +1,18 @@ class Management::StatisticsController < ManagementController include RepositoriesProxy - #before_action :set_statistics + before_action :set_statistics before_action :authenticate_user!, except: [:index, :show, :like] #inicialização, primeira query @@flag = 0 def index - #a cada novo login atualiza as estatÃsticas - if @@flag == 0 || @@user != current_user - @@user = current_user - set_statistics - @@flag = 1 - end - + set_statistics @n_users = @@n_users @n_collections = @@n_collections @n_non_visualised = @@n_non_visualised @n_learning_objects = @@n_learning_objects + @n_complaints == @@n_complaints @total_accesses= User.sum("sign_in_count") end @@ -30,43 +25,51 @@ class Management::StatisticsController < ManagementController end def accesses - #usar o logstash e kibana - #enquanto isso, uso o sign_in_count do ActiveRecord @total_accesses= User.sum("sign_in_count") - - end def collections - if @@flag == 0 || @@user != current_user - @@user = current_user - set_statistics - @@flag = 1 - end @n_collections = @@n_collections || [] end def learning_objects - if @@flag == 0 || @@user != current_user - @@user = current_user - @@flag = 1 - set_statistics - end @n_learning_objects = @@n_learning_objects @most_visualised = @@most_visualised @n_non_visualised = @@n_non_visualised end + def complaints + @complaints = Complaint.all + @n_complaints = @@n_complaints + @complaints_objs = @@complaints_objs + @complaints_per_message = @@complaints_per_message + end + def set_statistics - @@n_users = User.count - @@n_collections = Collection.all.size - @@n_learning_objects = LearningObject.all.size - @@n_non_visualised = LearningObject.where(views_count: 0).size - @@most_visualised = LearningObject.order(:views_count) - @@n_views = LearningObject.sum(:views_count) + + Rails.cache.fetch("cache/management_statistics", expires_in: 1.hours) do + @complaints = Complaint.all + @@n_users = User.count + @@n_collections = Collection.all.size + @@n_learning_objects = LearningObject.all.size + @@n_non_visualised = LearningObject.where(views_count: 0).size + @@most_visualised = LearningObject.order(:views_count) + @@n_views = LearningObject.sum(:views_count) + @@n_complaints = Complaint.all.size + @@complaints_per_message = Hash.new(0) + @@complaints_objs = Hash.new(0) + + @complaints.map{ |complaint| complaint.reason }.each do |message| + @@complaints_per_message[message] += 1 + end + + @complaints.map{ |complaint| complaint.complaintable }.each do |object| + @@complaints_objs[object] += 1 + end + end end def views diff --git a/app/views/management/complaints/index.html.erb b/app/views/management/complaints/index.html.erb index 8fec592834e1440f070463db171b7562e8036ab0..30845f6ee9553eeebdf191654f7860a693bb43d4 100644 --- a/app/views/management/complaints/index.html.erb +++ b/app/views/management/complaints/index.html.erb @@ -1,3 +1,5 @@ + + <h1 class="ls-title-intro ls-ico-stats">Denúncias</h1> <div class="ls-box-filter"> @@ -11,12 +13,13 @@ <div class="ls-custom-select"> <select name="period" id="select_period" class="ls-select"> - <option>Hoje</option> - <option>Ontem</option> - <option>Última semana</option> - <option>Últimos 30 dias</option> - <option>Últimos 6 meses</option> - <option>Últimos 12 meses</option> + <option value=6>Últimos 12 meses</option> + <option value=1>Hoje</option> + <option value=2>Ontem</option> + <option value=3>Última semana</option> + <option value=4>Últimos 30 dias</option> + <option value=5>Últimos 6 meses</option> + </select> </div> </label> @@ -27,6 +30,7 @@ </div> + <h2 class="ls-title-4">Relatório de Denúncias</h2> <div class="row"> @@ -46,8 +50,7 @@ <h6 class="ls-title-4">Total de denúncias</h6> </div> <div class="ls-box-body"> - <strong>80</strong> - <small>spam</small> + <strong><%= @complaints_in_period.size %></strong> </div> </div> </div> @@ -55,66 +58,88 @@ <div class="col-sm-12 col-lg-7"> <div class="ls-box"> <div class="ls-box-head"> - <h6 class="ls-title-4">Percentual comparado ao último mês</h6> + <h6 class="ls-title-4">Total de objetos denunciados</h6> </div> <div class="ls-box-body"> - <div class="col-lg-offset-3 col-lg-3 col-xs-6"> - <strong class="ls-color-theme" data-prefix="%">-3,60</strong> - <small>usuário falso</small> - </div> - <div class="col-lg-3 col-xs-6"> - <strong class="ls-color-danger" data-prefix="%">+0,90</strong> - <small>direitos autorais</small> - </div> - <div class="col-lg-3 col-xs-6"> - <strong class="ls-color-danger" data-prefix="%">+32</strong> - <small>conteúdo ofensivo</small> - </div> + <strong class="ls-color-theme"><%= @complaints_objs %></strong> </div> </div> </div> + </div> <div class="ls-tabs-container" id="awesome-tab-content"> <div id="infoAll" class="ls-tab-content" role="tabpanel" style="display: block;"> - <% @complaints.each do |complaint| %> - + <% (@complaints.sort{|x,y| x.created_at <=> y.created_at}.reverse.uniq{ |x| x.complaintable.name}).each do |complaint| %> + <% if Date.parse(complaint.created_at.to_s) >= @date_limit %> <div class="ls-list"> <header class="ls-list-header"> - <div class="ls-list-title col-md-9"> - <strong><%= complaint.complaintable.name %></strong> - <small><%= complaint.reason %></small> - - <% if !complaint.description.blank? %> - <p><%= complaint.description %></p> - <% end %> - - </div> + <div class="ls-list-title col-md-9"> + <strong><%= complaint.complaintable.name %></strong> + <small><%= @complaints.select{ |x| x.complaintable.name == complaint.complaintable.name}.map{|x| x.reason }.each_with_object(Hash.new(0)){ |frequency,message| message[frequency] += 1 }.sort_by{ |k,v| v }.reverse.each{|x| x}.map{ |k,v| "#{k}(#{v})"}.join(",")%></small> + + <div data-ls-module="collapse" data-target="#<%= complaint.complaintable.name.tr('^A-Za-z0-9', '') %>" class="ls-collapse "> + <a href="#" class="ls-collapse-header"><h5 class="ls-collapse-title"><strong>Descrições</strong></h5></a> + <div class="ls-collapse-body" id="<%= complaint.complaintable.name.tr('^A-Za-z0-9', '') %>"> + <% @complaints.sort {|left, right| left.description.length <=> right.description.length}.reverse.select{ |x| x.complaintable.name == complaint.complaintable.name }.each do |complaint_description| %> + <table class="ls-table ls-no-hover ls-table-striped"> + <thead> + <tr> + <th><%= complaint_description.user.name %>(<%= complaint_description.description %>)</th> + </tr> + </thead> + <tbody> + <tr> + <td class="hidden-xs"><%= complaint_description.description %></td> + </tr> + </tbody> + </table> + <%end%> + </div> + </div> + </div> <div class="col-md-3 ls-txt-right"> <div data-ls-module="dropdown" class="ls-dropdown ls-pos-right"> <a href="#" class="ls-btn-primary" aria-expanded="false" role="combobox">Administrar</a> <ul class="ls-dropdown-nav" aria-hidden="true"> <li><a href="#" role="option" title="Funcionalidade em desenvolvimento!">Suspender conteúdo</a></li> <li> - <%= link_to 'Ignorar denúncia', management_complaint_path(id: complaint.id), {method: :delete, data: {confirm: 'Tem certeza que deseja ignorar esta denúncia?'}, title: 'Ignorar denúncia', class: 'ls-btn ls-btn-sm', role: 'option'} %> + <% @complaints.select{ |x| x.complaintable.name == complaint.complaintable.name }.each do |complaint_ignore| %> + <%= link_to 'Ignorar denúncia de ' + complaint_ignore.user.name , management_complaint_path(id: complaint_ignore.id), {method: :delete, data: {confirm: 'Tem certeza que deseja ignorar esta denúncia?'}, title: 'Ignorar denúncia', class: 'ls-btn ls-btn-sm', role: 'option'} %> + <% end %> </li> </ul> </div> </div> + </header> <div class="ls-list-content "> <div class="col-xs-12 col-md-6"> - <span class="ls-list-label">Denunciado por</span> - <strong><%= complaint.user.name unless complaint.user.nil?%></strong> + + <div data-ls-module="collapse" data-target="#<%= complaint.complaintable.name.tr('^A-Za-z0-9', '') + "complaint"%>" class="ls-collapse "> + <a href="#" class="ls-collapse-header"><strong class="ls-collapse-title">Denunciado por</strong></a> + <div class="ls-collapse-body" id="<%= complaint.complaintable.name.tr('^A-Za-z0-9', '') + "complaint" %>"> + <% @complaints.select{ |x| x.complaintable.name == complaint.complaintable.name}.map{|x| x.user }.each do |user| %> + <table class="ls-table ls-no-hover ls-table-striped"> + <tbody> + <tr> + <td><a href="#"><%= user.name %></a></td> + </tr> + </tbody> + </table> + <%end%> + </div> + </div> </div> <div class="col-xs-12 col-md-6"> - <span class="ls-list-label">Data</span> + <span class="ls-list-label">Data da última denúncia</span> <strong><%= complaint.created_at %></strong> </div> </div> </div> - + </div> + <% end %> <% end %> </div> </div> diff --git a/app/views/management/statistics/complaints.html.erb b/app/views/management/statistics/complaints.html.erb new file mode 100644 index 0000000000000000000000000000000000000000..086c8219b7041332e59be768fc8519abc1683478 --- /dev/null +++ b/app/views/management/statistics/complaints.html.erb @@ -0,0 +1,59 @@ + + +<ol class="ls-breadcrumb"> + <li><%= link_to "InÃcio", management_root_path %></li> + <li><%= link_to "EstatÃsticas", management_statistics_path %></li> + <li> Usuários </li> +</ol> + +<body> +<div class="ls-box ls-board-box"> + <header class="ls-info-header"> + <h2 class="ls-title-3">Denúncias</h2> + <p class="ls-float-right ls-float-none-xs ls-small-info">Apurado em <strong><%= Date.today.to_s %></strong></p> + </header> + <div id="sending-stats" class="row"> + <div class="col-sm-6 col-md-12"> + <div class="ls-box"> + <h6 class="ls-title-6">Total</h6> + <strong class="ls-color-theme"><%=@n_complaints%></strong> + </div> + </div> + + + <% @complaints.map{|x| x.reason}.uniq.each do |message| %> + <div class="col-sm-6 col-md-3"> + <div class="ls-box"> + <h6 class="ls-title-4"><%= message %></h6> + <strong class="ls-color-theme"><%= @complaints_per_message[message] %></strong> + </div> + </div> + + <% end %> + + </div> +</div> + +<input type="hidden" id="lcomplaints" value="<%= @complaints_per_message["Usuário falso"] %>"/> +<input type="hidden" id="lcomplaints_false" value="<%= @complaints_per_message["Usuário ofensivo/agressivo"] %>"/> +<input type="hidden" id="lcomplaints_offensive" value="<%= @complaints_per_message["Objeto contém conteúdo ofensivo/abusivo"] %>"/> +<input type="hidden" id="lcomplaints_violates" value="<%= @complaints_per_message["Objeto viola direitos autorais"] %>"/> + +<div align="right" > +</div> + +<div> + <div style="float: left; margin-left: 85px; margin-top: 100px"> + <canvas id="complaints" width="700" height="600"></canvas> + </div> + +</div> +<div style="margin-left: 900px"> + <h3><th><b>10 Mais denunciados </b></th></h3><br> + <div class="row learning-object-columns"> + <% @complaints_objs.sort_by{|name,frequency| frequency }.reverse.first(10).each do |object| %> + <li><%= link_to object[0].name + '->' + object[1].to_s + ' denúncia(s)' , learning_object_path(object[0].id) %></li><BR> + <%end %> + </div> +</div> +</body> diff --git a/app/views/management/statistics/learning_objects.html.erb b/app/views/management/statistics/learning_objects.html.erb index 68d09eb00dcedd06336bfd4407b71b3145727a05..d80c432fc9b07c5cd48b08a7862b53716fa80ebd 100644 --- a/app/views/management/statistics/learning_objects.html.erb +++ b/app/views/management/statistics/learning_objects.html.erb @@ -51,7 +51,7 @@ <div style="margin-left: 900px"> <h3><th><b> 10 mais visualisados </b></th></h3><br> <div class="row learning-object-columns"> - <% @most_visualised.each do |most| %> + <% @most_visualised.first(10).each do |most| %> <%#= render_learning_object("vertical", most) %> <li><%= link_to most["name"], learning_object_path(most["id"]) %></li><BR> <% end %> diff --git a/app/views/shared/management/_nav_menu.html.erb b/app/views/shared/management/_nav_menu.html.erb index 91e1b4206b675da9cbeeb7ca00451b64926105bd..63ab58f6fd496591d2e8eac7b5e749d8aa3d896d 100644 --- a/app/views/shared/management/_nav_menu.html.erb +++ b/app/views/shared/management/_nav_menu.html.erb @@ -11,6 +11,7 @@ <li><%= link_to "Coleções", collections_management_statistics_path, class: 'ls-submenu-item' %></li> <li><%= link_to "Objetos", learning_objects_management_statistics_path, class: 'ls-submenu-item' %></li> <li><%= link_to "Acessos", accesses_management_statistics_path, class: 'ls-submenu-item' %></li> + <li><%= link_to "Denúncias", complaints_management_statistics_path, class: 'ls-submenu-item' %></li> </ul> </li> <li><%= link_to "Instituições", management_institutions_path, class: 'ls-submenu-item' %></li> @@ -25,7 +26,7 @@ <li><%= link_to "Denúncias", management_complaints_path, class: 'ls-ico-bullhorn' %> <li> </ul> - + <li> <%= link_to "Voltar ao Portal", root_path %> </li> diff --git a/config/routes.rb b/config/routes.rb index f5a3db21c2ed045ea6813c6447df56b12d71790d..901caf7ad79087e03c4e6f8b20dee6f65a9710bf 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -25,6 +25,7 @@ Rails.application.routes.draw do get :collections get :accesses get :learning_objects + get :complaints end end