diff --git a/app/assets/stylesheets/application/learning_objects.scss b/app/assets/stylesheets/application/learning_objects.scss index 688c9a085ea688e08622af7b3925fc6484151656..ce5fc3173fc5b2c93e48141ed62d9d58ea2801af 100644 --- a/app/assets/stylesheets/application/learning_objects.scss +++ b/app/assets/stylesheets/application/learning_objects.scss @@ -24,6 +24,13 @@ $checked_icon: 'icons/checked.png'; padding: 2px; } + .learning-object-icon-suspended { + color: red; + top: calc(50% - 41px) ; + left: calc(50% - 31px) ; + position: absolute; + } + .learning-object-actions { position: absolute; bottom: 10px; diff --git a/app/controllers/learning_objects_controller.rb b/app/controllers/learning_objects_controller.rb index 923ea7fb1bf39f08b33be7d05a5551bccc2a0c56..54bb27e7990fcc02bddf07bfd8709350186baacd 100644 --- a/app/controllers/learning_objects_controller.rb +++ b/app/controllers/learning_objects_controller.rb @@ -2,16 +2,21 @@ require 'uri' class LearningObjectsController < ApplicationController include Reportable + include Pundit + + rescue_from Pundit::NotAuthorizedError, with: :user_not_authorized before_action :authenticate_user!, except: [:index, :show] before_action :set_learning_object, only: [:show, :edit, :update, :destroy, :like, :bookmarks, - :collections, :upload, :upload_link, :download] + :collections, :upload, :upload_link, :download, + :user_not_authorized] after_action :increment_learning_object_views, only: [:show] # GET /learning_objects/1 # GET /learning_objects/1.json def show + authorize @learning_object @liked = !@learning_object.liked?(current_user) if user_signed_in? @reviews = Review.where(reviewable: @learning_object) end @@ -74,7 +79,7 @@ class LearningObjectsController < ApplicationController def like if @learning_object.liked? current_user @learning_object.dislike current_user - elseg + else @learning_object.like current_user end @@ -128,4 +133,13 @@ class LearningObjectsController < ApplicationController redirect_to upload_learning_object_path(id: id), notice: 'Seu objeto foi criado! Para que ele seja publicado é necessário enviar o arquivo.' end end + + private + + def user_not_authorized + flash[:notice] = "Este objeto está suspenso!" + flash[:alert] = "Razões: #{Complaint.where(complaintable_id: @learning_object.id).map(&:reason).join(',').to_s}" + redirect_to (root_path) + end + end diff --git a/app/controllers/management/complaints_controller.rb b/app/controllers/management/complaints_controller.rb index 25f54e9b58a37b721136fe292e49336487c85223..4659bdf7068968cd286ea4802ef9e7e4ae1e77a2 100644 --- a/app/controllers/management/complaints_controller.rb +++ b/app/controllers/management/complaints_controller.rb @@ -27,13 +27,21 @@ class Management::ComplaintsController < ManagementController end def suspend_object - @learning_object = LearningObject.find (params[:object_id]) + @learning_object = LearningObject.find params[:object_id] @learning_object.update(state: 'suspended') respond_to do |format| format.html { redirect_to :back, notice: 'Objeto suspenso com sucesso.' } end + end + + def publish_object + @learning_object = LearningObject.find params[:object_id] + @learning_object.update(state: 'published') + respond_to do |format| + format.html { redirect_to :back, notice: 'Objeto publicado com sucesso.' } + end end def destroy diff --git a/app/controllers/management/learning_objects_controller.rb b/app/controllers/management/learning_objects_controller.rb new file mode 100644 index 0000000000000000000000000000000000000000..da061b6624efbe437a78dd006aaa31859da29a19 --- /dev/null +++ b/app/controllers/management/learning_objects_controller.rb @@ -0,0 +1,8 @@ +class Management::LearningObjectsController < ManagementController + + + def index + @learning_objects = LearningObject.includes(:object_type).where(state: 'suspended') + end + +end diff --git a/app/controllers/search_controller.rb b/app/controllers/search_controller.rb index 14657b512f9c9d294ea13996ec1d272f94c43e80..e05c08a68b05485fdfae7fe50ad8228124874f52 100644 --- a/app/controllers/search_controller.rb +++ b/app/controllers/search_controller.rb @@ -1,6 +1,7 @@ class SearchController < ApplicationController include LearningObjectsHelper + include Pundit def index @types = ObjectType.all.map(&:name) @@ -13,6 +14,7 @@ class SearchController < ApplicationController end def fetch + params[:query] = "*" if params[:query].blank? case params[:search_class] @@ -43,7 +45,7 @@ class SearchController < ApplicationController when "User" params_hash = { fields: ['name'] } get_thumbnail = Proc.new { |obj| image_tag(obj.avatar.url(:thumb), 32) } - else + else raise "Wrong search class parameter" end render json: autocomplete_search(Object.const_get(params[:search_class]), params_hash, get_thumbnail) @@ -53,8 +55,8 @@ class SearchController < ApplicationController def autocomplete_search(search_class, params_hash={}, get_thumbnail) response = [] - search_params = { limit: 10, misspellings: { below: 5 } } - objs = search_class.search(params[:query],search_params.merge(params_hash)) + search_params = { limit: 10, misspellings: { below: 5 }, where: {state: validate_object} } + objs = search_class.search(params[:query], search_params.merge(params_hash)) objs.each do |obj| hash = {} hash["name"] = obj.name @@ -80,6 +82,7 @@ class SearchController < ApplicationController hash[:topics_name] = topics.split(', ') unless topics.nil? hash[:object_type] = params[:type].split(', ') unless params[:type].blank? hash[:publisher] = params[:source].split("-s- ") unless params[:source].blank? + hash[:state] = validate_object # year = params[:year].blank? ? nil : params[:year].split('-').take(2) hash.blank? ? nil : hash @@ -120,4 +123,11 @@ class SearchController < ApplicationController { name: {order: :asc, unmapped_type: :string} } end + private + + def validate_object + return 'published' if current_user.nil? || !current_user.is_admin? + return ['published', 'suspended', 'draft'] + end + end diff --git a/app/controllers/welcome_controller.rb b/app/controllers/welcome_controller.rb index a3cadaaa7b851c19dde512e557cb4fefcf4abc35..001bf77582f308194c6736e5ccfdc64d71018d45 100644 --- a/app/controllers/welcome_controller.rb +++ b/app/controllers/welcome_controller.rb @@ -1,9 +1,9 @@ class WelcomeController < ApplicationController + include Pundit def index @carousel = Carousel.all || [] - - @highlights = LearningObject.limit(8) + @highlights = policy_scope(LearningObject).limit(8) end def faq diff --git a/app/models/learning_object.rb b/app/models/learning_object.rb index dba093fe9e114a7dc3c5b009385ddd44a2133671..56b649336b9314fa1f8486b26a256d59e1b53b37 100644 --- a/app/models/learning_object.rb +++ b/app/models/learning_object.rb @@ -36,8 +36,9 @@ class LearningObject < ActiveRecord::Base object_type: type, score: score, published_at: published_at, + topics_name: topics.map(&:name), source: source, - topics_name: topics.map(&:name) + state: state } end @@ -57,8 +58,8 @@ class LearningObject < ActiveRecord::Base get_metadata_value_of 'dc.object.url' end - ##checks if learning object link to an url. - #returns boolean + ## checks if learning object link to an url. + # returns boolean def has_url_reference? !url_reference.blank? end diff --git a/app/policies/application_policy.rb b/app/policies/application_policy.rb new file mode 100644 index 0000000000000000000000000000000000000000..2a0bbc5213576eb96894310c120ea00520aab607 --- /dev/null +++ b/app/policies/application_policy.rb @@ -0,0 +1,53 @@ +class ApplicationPolicy + attr_reader :user, :record + + def initialize(user, record) + @user = user + @record = record + end + + def index? + false + end + + def show? + scope.where(:id => record.id).exists? + end + + def create? + false + end + + def new? + create? + end + + def update? + false + end + + def edit? + update? + end + + def destroy? + false + end + + def scope + Pundit.policy_scope!(user, record.class) + end + + class Scope + attr_reader :user, :scope + + def initialize(user, scope) + @user = user + @scope = scope + end + + def resolve + scope + end + end +end diff --git a/app/policies/learning_object_policy.rb b/app/policies/learning_object_policy.rb new file mode 100644 index 0000000000000000000000000000000000000000..f5829e1d918af8a1f64728e5d0c87c9ba920a450 --- /dev/null +++ b/app/policies/learning_object_policy.rb @@ -0,0 +1,23 @@ +class LearningObjectPolicy < ApplicationPolicy + class Scope < Scope + def resolve + if user.nil? + scope.where(state: 'published') + elsif user.is_admin? + scope.all + else + scope.where(state: 'published') + end + end + end + + def show? + if user.nil? + record.state == 'published' + elsif user.is_admin? + record + else + record.state == 'published' + end + end +end diff --git a/app/policies/search_policy.rb b/app/policies/search_policy.rb new file mode 100644 index 0000000000000000000000000000000000000000..441469b63a9139414365770650ffca9a7c959fcf --- /dev/null +++ b/app/policies/search_policy.rb @@ -0,0 +1,13 @@ +class SearchPolicy < ApplicationPolicy + class Scope < Scope + def resolve + if user.nil? + scope.where(state: 'published') + elsif user.is_admin? + scope.all + else + scope.where(state: 'published') + end + end + end +end diff --git a/app/policies/welcome_policy.rb b/app/policies/welcome_policy.rb new file mode 100644 index 0000000000000000000000000000000000000000..5d5ae66c95e757dbb5bf6b88f8dbd8c09710abbd --- /dev/null +++ b/app/policies/welcome_policy.rb @@ -0,0 +1,11 @@ +class WelcomePolicy < ApplicationPolicy + class Scope < Scope + def resolve + if user.is_admin? + scope.all + else + scope.where(state: 'published') + end + end + end +end diff --git a/app/views/learning_objects/_learning_object_horizontal.erb b/app/views/learning_objects/_learning_object_horizontal.erb index 134f597c6e652ff6319623ab7c046487f6584773..77865f67d44eac4f3e991d0c14d7b5a237a0de43 100644 --- a/app/views/learning_objects/_learning_object_horizontal.erb +++ b/app/views/learning_objects/_learning_object_horizontal.erb @@ -4,9 +4,15 @@ <!-- <div class="col-md-5"> --> <div class="learning-object-thumbnail"> <%= link_to link do - image_tag learning_object_thumbnail(learning_object), alt: learning_object_title(learning_object), class: "thumbnail" + image_tag learning_object_thumbnail(learning_object), alt: learning_object_title(learning_object), class: "thumbnail" end %> + <% if learning_object.state == 'suspended' %> + <div class="learning-object-icon-suspended"> + <i class="fa fa-times fa-5x fa-lg" ></i> + </div> + <% end %> + <% if user_signed_in? %> <%= render 'learning_objects/actions_buttons', learning_object: learning_object %> <% end %> diff --git a/app/views/learning_objects/_learning_object_vertical.erb b/app/views/learning_objects/_learning_object_vertical.erb index 61282aeb66ada3527eb238c766b1bb4a49eb97dd..4b5fdd51d16671de75a66ace74bdb67bf8ce4e73 100644 --- a/app/views/learning_objects/_learning_object_vertical.erb +++ b/app/views/learning_objects/_learning_object_vertical.erb @@ -4,6 +4,9 @@ <%= link_to learning_object_path(id: learning_object.id) do image_tag learning_object_thumbnail(learning_object), alt: learning_object_title(learning_object), class: "thumbnail" end %> + <% if learning_object.state == 'suspended' %> + <i class="fa fa-times fa-5x fa-lg learning-object-icon-suspended" ></i> + <% end %> <% if user_signed_in? %> <%= render 'learning_objects/actions_buttons', learning_object: learning_object %> <% end %> diff --git a/app/views/learning_objects/show.html.erb b/app/views/learning_objects/show.html.erb index 5db4c16d007042160794937093bc4c123c60d113..250a7ec4d106f8cd16cb983f523c16368a94e34e 100644 --- a/app/views/learning_objects/show.html.erb +++ b/app/views/learning_objects/show.html.erb @@ -1,4 +1,9 @@ <% content_for(:body_attributes) do %>data-no-turbolink="true"<% end %> + +<% if @learning_object.state == 'suspended' %> + <h2> Este conteúdo está suspenso! </h2> +<% end %> + <div class="row learning-object"> <div class="col-md-7"> <div class="view"> @@ -10,7 +15,7 @@ </div> <br/><br/> - <h2 class="title"><%= @learning_object.name %></h2> + <h2 class="title"><%= learning_object_title(@learning_object) %></h2> <% unless @learning_object.description.nil? %> <p class="description"><%= @learning_object.description %></p> <% end %> diff --git a/app/views/management/complaints/index.html.erb b/app/views/management/complaints/index.html.erb index a2d9d0069dfec0d52c350396764acc1d3083aba2..6deb1c4a88d9e3f6f0280ebc50bfdb561a99e80c 100644 --- a/app/views/management/complaints/index.html.erb +++ b/app/views/management/complaints/index.html.erb @@ -32,7 +32,7 @@ <div class="row"> <div class="col-md-6 col-sm-6"><p>Número de vezes que os usuários marcaram objetos educacionais como spam.</p></div> <div class="col-md-6 col-sm-6"> - <p class="ls-float-right ls-float-none-xs">Período selecionado: <strong><%= @date_limit %></strong></p></div> + <p class="ls-float-right ls-float-none-xs">Período selecionado: <strong><%= @date %></strong></p></div> </div> <div class="ls-clearfix"></div> @@ -103,13 +103,17 @@ <a href="#" class="ls-btn-primary" aria-expanded="false" role="combobox">Administrar</a> <ul class="ls-dropdown-nav" aria-hidden="true"> <li> + <% if complaint.complaintable.state == "published" %> <%= link_to 'Suspender Objeto', management_complaint_suspend_object_path(complaint_id: complaint.id, object_id: complaint.complaintable_id), {method: :post, data: {confirm: 'Tem certeza que deseja suspender este objeto?'}, title: 'Suspender Objeto', class: 'ls-btn ls-btn-sm', role: 'option'} %> - </li> - <li> + <% else %> + <%= link_to 'Publicar Objeto', management_complaint_publish_object_path(complaint_id: complaint.id, object_id: complaint.complaintable_id), {method: :post, data: {confirm: 'Tem certeza que deseja publicar este objeto?'}, title: 'Suspender Objeto', class: 'ls-btn ls-btn-sm', role: 'option'} %> + <% end %> + </li> <% @complaints.select{ |x| x.complaintable.name == complaint.complaintable.name }.each do |complaint_ignore| %> - <%= link_to 'Ignorar denúncia', 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'} %> + <li> + <%= link_to "Ignorar denúncia de #{User.find(complaint_ignore.user_id).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'} %> + </li> <% end %> - </li> </ul> </div> </div> diff --git a/app/views/management/learning_objects/index.html.erb b/app/views/management/learning_objects/index.html.erb new file mode 100644 index 0000000000000000000000000000000000000000..86aa4a6479ddfd5c1f1ad50d3dc458fc9ad2c354 --- /dev/null +++ b/app/views/management/learning_objects/index.html.erb @@ -0,0 +1,34 @@ +<h1 class="ls-title-intro ls-ico-bullhorn">Conteúdos Suspensos</h1> + +<div class="ls-clearfix"></div> + +<div class="ls-board-box"> + + <div id="sending-stats" class="row ls-box-group"> + <div class="col-sm-12 col-lg-7"> + <div class="ls-box"> + <div class="ls-box-head"> + <h6 class="ls-title-4">Total de conteúdos suspensos</h6> + </div> + <div class="ls-box-body"> + <strong class="ls-color-theme"><%= @learning_objects.size %></strong> + </div> + </div> + </div> + </div> + + <% @learning_objects.sort{|x,y| x.name <=> y.name}.each do |learning_object| %> + <div class="ls-list"> + <header class="ls-list-header"> + <div class="ls-list-title col-md-9"> + <%= link_to "#{learning_object.name}", learning_object_path(id: learning_object.id) %></a> + <small><%= learning_object.description %> </small> + </div> + <div class="col-md-3 ls-txt-right"> + <%= link_to 'Publicar Objeto', management_complaint_publish_object_path(complaint_id: Complaint.where(complaintable_id: learning_object.id).first, object_id: learning_object.id), {method: :post, data: {confirm: 'Tem certeza que deseja publicar este objeto?'}, title: 'Suspender Objeto', class: 'ls-btn-primary ls-btn-sm', role: 'option'} %> + </div> + </header> + </div> + <% end %> + + </div> diff --git a/app/views/shared/management/_nav_menu.html.erb b/app/views/shared/management/_nav_menu.html.erb index 494562c642e3d22ecbdd15f91a72e48d7e861d85..0dbbb0c17f55d809370b6246cdb03250ff32187b 100644 --- a/app/views/shared/management/_nav_menu.html.erb +++ b/app/views/shared/management/_nav_menu.html.erb @@ -29,9 +29,9 @@ <ul role="menu"> <li><%= link_to "Denúncias", management_complaints_path, class: 'ls-submenu-item' %> <li><%= link_to "Razões", management_complaint_reasons_path, class: 'ls-submenu-item' %> + <li><%= link_to "Conteúdos suspensos", management_learning_objects_path, class: 'ls-submenu-item' %> </ul> </li> - <li> <%= link_to "Score", management_scores_path, class: 'ls-ico-bars' %> </li> <li> <%= link_to "Voltar ao Portal", root_path, class: 'ls-ico-chevron-left' %> </li> </ul> diff --git a/config/routes.rb b/config/routes.rb index e26762f7119cb178d425197debb04d8a3597f0f1..6bcac782b0cd390458818e6c2cebaddb6925a20f 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -11,6 +11,7 @@ Rails.application.routes.draw do root 'welcome#index' resources :complaints do post '/suspend_object/:object_id', as: :suspend_object, action: :suspend_object + post '/publish_object/:object_id', as: :publish_object, action: :publish_object end resources :institutions do member do @@ -22,6 +23,7 @@ Rails.application.routes.draw do resources :complaint_reasons resources :highlights resources :carousels + resources :learning_objects, only: [:index] resources :scores, :score_user_categories, :user_categories resources :statistics do