From 4fd3d51f579d35be8868e413db4e83c3e1f8edfa Mon Sep 17 00:00:00 2001 From: Tal Hayon Date: Mon, 13 Nov 2017 07:38:28 +0200 Subject: [PATCH 01/20] AO3-4855 Started working on extending works controller tests Also implemented show multiple for pseuds --- app/controllers/works_controller.rb | 16 ++--- app/models/work.rb | 68 +++++++++++++++++++ app/views/users/_header_navigation.html.erb | 5 +- config/routes.rb | 6 +- features/works/work_edit_multiple.feature | 42 ++++++++++-- .../works/default_rails_actions_spec.rb | 45 ++++++++++++ spec/spec_helper.rb | 18 +++++ 7 files changed, 181 insertions(+), 19 deletions(-) diff --git a/app/controllers/works_controller.rb b/app/controllers/works_controller.rb index 0b7efdb4574..526b1278b48 100755 --- a/app/controllers/works_controller.rb +++ b/app/controllers/works_controller.rb @@ -3,9 +3,9 @@ class WorksController < ApplicationController # only registered users and NOT admin should be able to create new works before_action :load_collection - before_action :load_owner, only: [:index] - before_action :users_only, except: [:index, :show, :navigate, :search, :collected, :edit_tags, :update_tags, :drafts, :share] - before_action :check_user_status, except: [:index, :show, :navigate, :search, :collected, :share] + before_action :load_owner, only: [:index, :show_multiple] + before_action :users_only, except: [:index, :show, :navigate, :search, :collected, :edit_tags, :update_tags, :drafts, :share, :reindex] + before_action :check_user_status, except: [:index, :show, :navigate, :search, :collected, :share, :reindex] before_action :load_work, except: [:new, :create, :import, :index, :show_multiple, :edit_multiple, :update_multiple, :delete_multiple, :search, :drafts, :collected] # this only works to check ownership of a SINGLE item and only if load_work has happened beforehand before_action :check_ownership, except: [:index, :show, :navigate, :new, :create, :import, :show_multiple, :edit_multiple, :edit_tags, :update_tags, :update_multiple, :delete_multiple, :search, :mark_for_later, :mark_as_read, :drafts, :collected, :share] @@ -613,12 +613,6 @@ def in_moderated_collection def post_draft @user = current_user - @work = Work.find(params[:id]) - - unless @user.is_author_of?(@work) - flash[:error] = ts('You can only post your own works.') - redirect_to(current_user) && return - end if @work.posted flash[:error] = ts('That work is already posted. Do you want to edit it instead?') @@ -647,8 +641,8 @@ def post_draft def show_multiple @user = current_user - if params[:pseud_id] - @works = Work.joins(:pseuds).where(pseud_id: params[:pseud_id]) + if @pseud + @works = Work.joins(:pseuds).where("pseuds.id = ?", @pseud.id) else @works = Work.joins(pseuds: :user).where('users.id = ?', @user.id) end diff --git a/app/models/work.rb b/app/models/work.rb index de401564e61..ce16e9e1871 100755 --- a/app/models/work.rb +++ b/app/models/work.rb @@ -1084,6 +1084,74 @@ def self.in_series(series) where("series.id = ?", series.id) end + scope :for_recipient, lambda {|recipient| + select("DISTINCT works.*"). + joins(:gifts). + where('gifts.recipient_name = ?', recipient) + } + + # shouldn't really use a named scope for this, but I'm afraid to try + # to change the way work filtering works + scope :by_language, lambda {|lang_id| where('language_id = ?', lang_id)} + + # returns an array, must come last + # TODO: if you know how to turn this into a scope, please do! + # find all the works that do not have a tag in the given category (i.e. no fandom, no characters etc.) + def self.no_tags(tag_category, options = {}) + tags = tag_category.tags + where(options).collect{|w| w if (w.tags & tags).empty? }.compact.uniq + end + + # Used when admins have disabled filtering + def self.list_without_filters(owner, options) + works = case owner.class.to_s + when 'Pseud' + works = Work.written_by_id([owner.id]) + when 'User' + works = Work.owned_by(owner) + when 'Collection' + works = Work.in_collection(owner) + else + if owner.is_a?(Tag) + works = owner.filtered_works + end + end + + # Need to support user + fandom and collection + tag pages + if options[:fandom_id] || options[:filter_ids] + id = options[:fandom_id] || options[:filter_ids].first + tag = Tag.find_by(id: id) + if tag.present? + works = works.with_filter(tag) + end + end + + if %w(Pseud User).include?(owner.class.to_s) + works = works.where(in_anon_collection: false) + end + unless owner.is_a?(Collection) + works = works.revealed + end + if User.current_user.nil? || User.current_user == :false + works = works.unrestricted + end + + works = works.posted + works = works.order("revised_at DESC") + works = works.paginate(page: options[:page], per_page: ArchiveConfig.ITEMS_PER_PAGE) + end + + def self.collected_without_filters(user, options) + works = Work.written_by_id([user.id]) + works = works.joins(:collection_items) + unless User.current_user == user + works = works.where(in_anon_collection: false) + works = works.posted + end + works = works.order("revised_at DESC") + works = works.paginate(page: options[:page], per_page: ArchiveConfig.ITEMS_PER_PAGE) + end + ######################################################################## # SORTING ######################################################################## diff --git a/app/views/users/_header_navigation.html.erb b/app/views/users/_header_navigation.html.erb index f767bd36b1f..452414a6655 100644 --- a/app/views/users/_header_navigation.html.erb +++ b/app/views/users/_header_navigation.html.erb @@ -2,8 +2,9 @@