Commit 26361944f6f737a29388ab5a989a2174fe8475eb
1 parent
a1650079
Exists in
avoid_duplicated_tasks
avoid duplicated proposal, can be improved
Showing
4 changed files
with
46 additions
and
4 deletions
Show diff stats
db/migrate/20150903210329_add_proposal_discussion_plugin_simplified_abstract_to_tasks.rb
0 → 100644
@@ -0,0 +1,9 @@ | @@ -0,0 +1,9 @@ | ||
1 | +class AddProposalDiscussionPluginSimplifiedAbstractToTasks < ActiveRecord::Migration | ||
2 | + def change | ||
3 | + add_column :tasks, :proposal_discussion_plugin_simplified_abstract, :text | ||
4 | + add_index :tasks, :proposal_discussion_plugin_simplified_abstract | ||
5 | + ProposalsDiscussionPlugin::ProposalTask.find_each do |t| | ||
6 | + t.update_attribute :proposal_discussion_plugin_simplified_abstract, ProposalsDiscussionPlugin::ProposalTask.simplify(t.abstract) | ||
7 | + end | ||
8 | + end | ||
9 | +end |
lib/proposals_discussion_plugin/api.rb
@@ -23,7 +23,7 @@ class ProposalsDiscussionPlugin::API < Grape::API | @@ -23,7 +23,7 @@ class ProposalsDiscussionPlugin::API < Grape::API | ||
23 | proposal_task.requestor = current_person | 23 | proposal_task.requestor = current_person |
24 | 24 | ||
25 | unless proposal_task.save | 25 | unless proposal_task.save |
26 | - render_api_errors!(proposal_task.article_object.errors.full_messages) | 26 | + render_api_errors!(proposal_task.errors) |
27 | end | 27 | end |
28 | {:success => true} | 28 | {:success => true} |
29 | #present proposal_task, :with => Entities::Task, :fields => params[:fields] | 29 | #present proposal_task, :with => Entities::Task, :fields => params[:fields] |
lib/proposals_discussion_plugin/proposal_task.rb
1 | class ProposalsDiscussionPlugin::ProposalTask < Task | 1 | class ProposalsDiscussionPlugin::ProposalTask < Task |
2 | - | ||
3 | has_and_belongs_to_many :categories, | 2 | has_and_belongs_to_many :categories, |
4 | class_name: "ProposalsDiscussionPlugin::TaskCategory", | 3 | class_name: "ProposalsDiscussionPlugin::TaskCategory", |
5 | join_table: :proposals_discussion_plugin_task_categories, | 4 | join_table: :proposals_discussion_plugin_task_categories, |
@@ -10,8 +9,11 @@ class ProposalsDiscussionPlugin::ProposalTask < Task | @@ -10,8 +9,11 @@ class ProposalsDiscussionPlugin::ProposalTask < Task | ||
10 | 9 | ||
11 | validates_presence_of :requestor_id, :target_id | 10 | validates_presence_of :requestor_id, :target_id |
12 | validates_associated :article_object | 11 | validates_associated :article_object |
13 | - | 12 | + before_save(on: :create) do |
13 | + self.proposal_discussion_plugin_simplified_abstract = ProposalsDiscussionPlugin::ProposalTask.simplify(abstract) | ||
14 | + end | ||
14 | validate :require_category | 15 | validate :require_category |
16 | + validate :unique_simplified_abstract? | ||
15 | 17 | ||
16 | settings_items :name, :type => String | 18 | settings_items :name, :type => String |
17 | settings_items :ip_address, :type => String | 19 | settings_items :ip_address, :type => String |
@@ -20,7 +22,6 @@ class ProposalsDiscussionPlugin::ProposalTask < Task | @@ -20,7 +22,6 @@ class ProposalsDiscussionPlugin::ProposalTask < Task | ||
20 | settings_items :article, :type => Hash, :default => {} | 22 | settings_items :article, :type => Hash, :default => {} |
21 | settings_items :closing_statment, :article_parent_id | 23 | settings_items :closing_statment, :article_parent_id |
22 | 24 | ||
23 | - | ||
24 | scope :pending_evaluated, lambda { |profile, filter_type, filter_text| | 25 | scope :pending_evaluated, lambda { |profile, filter_type, filter_text| |
25 | self | 26 | self |
26 | .to(profile) | 27 | .to(profile) |
@@ -258,6 +259,14 @@ class ProposalsDiscussionPlugin::ProposalTask < Task | @@ -258,6 +259,14 @@ class ProposalsDiscussionPlugin::ProposalTask < Task | ||
258 | parent.name if parent | 259 | parent.name if parent |
259 | end | 260 | end |
260 | 261 | ||
262 | + def self.simplify(s) | ||
263 | + return nil if s.nil? | ||
264 | + s=I18n.transliterate(s) | ||
265 | + s.gsub!(/(^\s)|([',.?!])|(\s$)/, "") | ||
266 | + s.gsub!(/\s{2,}/, " ") | ||
267 | + s.downcase | ||
268 | + end | ||
269 | + | ||
261 | protected | 270 | protected |
262 | 271 | ||
263 | def require_category | 272 | def require_category |
@@ -266,4 +275,14 @@ class ProposalsDiscussionPlugin::ProposalTask < Task | @@ -266,4 +275,14 @@ class ProposalsDiscussionPlugin::ProposalTask < Task | ||
266 | end | 275 | end |
267 | end | 276 | end |
268 | 277 | ||
278 | + def unique_simplified_abstract? | ||
279 | + ActiveRecord::Base.logger = Logger.new(STDOUT) | ||
280 | + sa = ProposalsDiscussionPlugin::ProposalTask.simplify(abstract) | ||
281 | + if id.present? | ||
282 | + 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] | ||
283 | + else | ||
284 | + 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] | ||
285 | + end | ||
286 | + errors.add :base, _('This proposal has been previously registered') unless r.empty? | ||
287 | + end | ||
269 | end | 288 | end |
test/unit/proposal_task_test.rb
1 | +# encoding: UTF-8 | ||
1 | require_relative '../test_helper' | 2 | require_relative '../test_helper' |
2 | 3 | ||
3 | class ProposalTaskTest < ActiveSupport::TestCase | 4 | class ProposalTaskTest < ActiveSupport::TestCase |
@@ -83,4 +84,17 @@ class ProposalTaskTest < ActiveSupport::TestCase | @@ -83,4 +84,17 @@ class ProposalTaskTest < ActiveSupport::TestCase | ||
83 | assert task.information.present? | 84 | assert task.information.present? |
84 | end | 85 | end |
85 | 86 | ||
87 | + should 'not register duplicate task' do | ||
88 | + task = ProposalsDiscussionPlugin::ProposalTask.create!(:requestor => person, :target => profile, :article => {:name => 'proposal 1', :abstract => ' é Á e ef KDsk we32UiIÍ?!. '}) | ||
89 | + task.categories = [fast_create(ProposalsDiscussionPlugin::TaskCategory)] | ||
90 | + task.save! | ||
91 | + task = ProposalsDiscussionPlugin::ProposalTask.new(:requestor => person, :target => profile, :article => {:name => 'proposal 1', :abstract => 'e a e ef kdsk we32uiii '}) | ||
92 | + task.categories = [fast_create(ProposalsDiscussionPlugin::TaskCategory)] | ||
93 | + assert !task.valid? | ||
94 | + end | ||
95 | + | ||
96 | + should 'simplify abstract' do | ||
97 | + assert_equal ProposalsDiscussionPlugin::ProposalTask.simplify(' é Á e ef KDsk we32UiIÍ?!. '), "e a e ef kdsk we32uiii " | ||
98 | + end | ||
99 | + | ||
86 | end | 100 | end |