From 26361944f6f737a29388ab5a989a2174fe8475eb Mon Sep 17 00:00:00 2001 From: Evandro Junior Date: Wed, 16 Sep 2015 16:30:18 -0300 Subject: [PATCH] avoid duplicated proposal, can be improved --- db/migrate/20150903210329_add_proposal_discussion_plugin_simplified_abstract_to_tasks.rb | 9 +++++++++ lib/proposals_discussion_plugin/api.rb | 2 +- lib/proposals_discussion_plugin/proposal_task.rb | 25 ++++++++++++++++++++++--- test/unit/proposal_task_test.rb | 14 ++++++++++++++ 4 files changed, 46 insertions(+), 4 deletions(-) create mode 100644 db/migrate/20150903210329_add_proposal_discussion_plugin_simplified_abstract_to_tasks.rb diff --git a/db/migrate/20150903210329_add_proposal_discussion_plugin_simplified_abstract_to_tasks.rb b/db/migrate/20150903210329_add_proposal_discussion_plugin_simplified_abstract_to_tasks.rb new file mode 100644 index 0000000..c3d016a --- /dev/null +++ b/db/migrate/20150903210329_add_proposal_discussion_plugin_simplified_abstract_to_tasks.rb @@ -0,0 +1,9 @@ +class AddProposalDiscussionPluginSimplifiedAbstractToTasks < ActiveRecord::Migration + def change + add_column :tasks, :proposal_discussion_plugin_simplified_abstract, :text + add_index :tasks, :proposal_discussion_plugin_simplified_abstract + ProposalsDiscussionPlugin::ProposalTask.find_each do |t| + t.update_attribute :proposal_discussion_plugin_simplified_abstract, ProposalsDiscussionPlugin::ProposalTask.simplify(t.abstract) + end + end +end diff --git a/lib/proposals_discussion_plugin/api.rb b/lib/proposals_discussion_plugin/api.rb index e0dd4d3..182e910 100644 --- a/lib/proposals_discussion_plugin/api.rb +++ b/lib/proposals_discussion_plugin/api.rb @@ -23,7 +23,7 @@ class ProposalsDiscussionPlugin::API < Grape::API proposal_task.requestor = current_person unless proposal_task.save - render_api_errors!(proposal_task.article_object.errors.full_messages) + render_api_errors!(proposal_task.errors) end {:success => true} #present proposal_task, :with => Entities::Task, :fields => params[:fields] diff --git a/lib/proposals_discussion_plugin/proposal_task.rb b/lib/proposals_discussion_plugin/proposal_task.rb index 743a920..875afb2 100644 --- a/lib/proposals_discussion_plugin/proposal_task.rb +++ b/lib/proposals_discussion_plugin/proposal_task.rb @@ -1,5 +1,4 @@ class ProposalsDiscussionPlugin::ProposalTask < Task - has_and_belongs_to_many :categories, class_name: "ProposalsDiscussionPlugin::TaskCategory", join_table: :proposals_discussion_plugin_task_categories, @@ -10,8 +9,11 @@ class ProposalsDiscussionPlugin::ProposalTask < Task validates_presence_of :requestor_id, :target_id validates_associated :article_object - + before_save(on: :create) do + self.proposal_discussion_plugin_simplified_abstract = ProposalsDiscussionPlugin::ProposalTask.simplify(abstract) + end validate :require_category + validate :unique_simplified_abstract? settings_items :name, :type => String settings_items :ip_address, :type => String @@ -20,7 +22,6 @@ class ProposalsDiscussionPlugin::ProposalTask < Task settings_items :article, :type => Hash, :default => {} settings_items :closing_statment, :article_parent_id - scope :pending_evaluated, lambda { |profile, filter_type, filter_text| self .to(profile) @@ -258,6 +259,14 @@ class ProposalsDiscussionPlugin::ProposalTask < Task parent.name if parent end + def self.simplify(s) + return nil if s.nil? + s=I18n.transliterate(s) + s.gsub!(/(^\s)|([',.?!])|(\s$)/, "") + s.gsub!(/\s{2,}/, " ") + s.downcase + end + protected def require_category @@ -266,4 +275,14 @@ class ProposalsDiscussionPlugin::ProposalTask < Task end end + def unique_simplified_abstract? + ActiveRecord::Base.logger = Logger.new(STDOUT) + sa = ProposalsDiscussionPlugin::ProposalTask.simplify(abstract) + if id.present? + r = ProposalsDiscussionPlugin::ProposalTask.find_by_sql ["SELECT 1 AS one FROM tasks WHERE tasks.id <> ? and tasks.type IN ('ProposalsDiscussionPlugin::ProposalTask') AND (tasks.proposal_discussion_plugin_simplified_abstract = ? AND tasks.target_id = ?) LIMIT 1", id, sa, target_id] + else + r = ProposalsDiscussionPlugin::ProposalTask.find_by_sql ["SELECT 1 AS one FROM tasks WHERE tasks.type IN ('ProposalsDiscussionPlugin::ProposalTask') AND (tasks.proposal_discussion_plugin_simplified_abstract = ? AND tasks.target_id = ?) LIMIT 1", sa, target_id] + end + errors.add :base, _('This proposal has been previously registered') unless r.empty? + end end diff --git a/test/unit/proposal_task_test.rb b/test/unit/proposal_task_test.rb index fe9606b..e6196ae 100644 --- a/test/unit/proposal_task_test.rb +++ b/test/unit/proposal_task_test.rb @@ -1,3 +1,4 @@ +# encoding: UTF-8 require_relative '../test_helper' class ProposalTaskTest < ActiveSupport::TestCase @@ -83,4 +84,17 @@ class ProposalTaskTest < ActiveSupport::TestCase assert task.information.present? end + should 'not register duplicate task' do + task = ProposalsDiscussionPlugin::ProposalTask.create!(:requestor => person, :target => profile, :article => {:name => 'proposal 1', :abstract => ' é Á e ef KDsk we32UiIÍ?!. '}) + task.categories = [fast_create(ProposalsDiscussionPlugin::TaskCategory)] + task.save! + task = ProposalsDiscussionPlugin::ProposalTask.new(:requestor => person, :target => profile, :article => {:name => 'proposal 1', :abstract => 'e a e ef kdsk we32uiii '}) + task.categories = [fast_create(ProposalsDiscussionPlugin::TaskCategory)] + assert !task.valid? + end + + should 'simplify abstract' do + assert_equal ProposalsDiscussionPlugin::ProposalTask.simplify(' é Á e ef KDsk we32UiIÍ?!. '), "e a e ef kdsk we32uiii " + end + end -- libgit2 0.21.2