- <%= avatar_image(@debate.author, seed: @debate.author_id, size: 32, class: 'author-photo') %>
-
- <% if @debate.author.hidden? %>
-
- <% if @debate.author.official? %>
- •
-
- <% end %>
- <% end %>
-
- <% if @debate.author.verified_organization? %>
- •
-
- <% end %>
+ <%= render '/shared/author_info', resource: @debate %>
<%= l @debate.created_at.to_date %>
diff --git a/app/views/proposals/_proposal.html.erb b/app/views/proposals/_proposal.html.erb
index c536c897f..ac2f0ec2f 100644
--- a/app/views/proposals/_proposal.html.erb
+++ b/app/views/proposals/_proposal.html.erb
@@ -13,7 +13,7 @@
<%= l proposal.created_at.to_date %>
- <% if proposal.author.hidden? %>
+ <% if proposal.author.hidden? || proposal.author.erased? %>
<%= t("proposals.show.author_deleted") %>
diff --git a/app/views/proposals/show.html.erb b/app/views/proposals/show.html.erb
index 06e61937a..4cc5f5e17 100644
--- a/app/views/proposals/show.html.erb
+++ b/app/views/proposals/show.html.erb
@@ -27,31 +27,7 @@
<% end %>
- <%= avatar_image(@proposal.author, seed: @proposal.author_id, size: 32, class: 'author-photo') %>
-
- <% if @proposal.author.hidden? %>
-
-
- <%= t("proposals.show.author_deleted") %>
-
- <% else %>
-
- <%= @proposal.author.name %>
-
- <% if @proposal.author.official? %>
- •
-
- <%= @proposal.author.official_position %>
-
- <% end %>
- <% end %>
-
- <% if @proposal.author.verified_organization? %>
- •
-
- <%= t("shared.collective") %>
-
- <% end %>
+ <%= render '/shared/author_info', resource: @proposal %>
•
<%= l @proposal.created_at.to_date %>
diff --git a/app/views/shared/_author_info.html.erb b/app/views/shared/_author_info.html.erb
new file mode 100644
index 000000000..ee5c1f749
--- /dev/null
+++ b/app/views/shared/_author_info.html.erb
@@ -0,0 +1,25 @@
+<%= avatar_image(resource.author, seed: resource.author_id, size: 32, class: 'author-photo') %>
+
+<% if resource.author.hidden? || resource.author.erased? %>
+
+
+ <%= t("shared.author_info.author_deleted") %>
+
+<% else %>
+
+ <%= resource.author.name %>
+
+ <% if resource.author.official? %>
+ •
+
+ <%= resource.author.official_position %>
+
+ <% end %>
+<% end %>
+
+<% if resource.author.verified_organization? %>
+ •
+
+ <%= t("shared.collective") %>
+
+<% end %>
diff --git a/config/locales/en.yml b/config/locales/en.yml
index e2d604c72..bd0a6ce3a 100644
--- a/config/locales/en.yml
+++ b/config/locales/en.yml
@@ -310,6 +310,8 @@ en:
debate: "secret code did not match with the image"
proposal: "secret code did not match with the image"
shared:
+ author_info:
+ author_deleted: Deleted user
tags_cloud:
tags: Trend
print:
diff --git a/config/locales/es.yml b/config/locales/es.yml
index c20524f47..a31572432 100644
--- a/config/locales/es.yml
+++ b/config/locales/es.yml
@@ -310,6 +310,8 @@ es:
debate: "el código secreto no coincide con la imagen"
proposal: "el código secreto no coincide con la imagen"
shared:
+ author_info:
+ author_deleted: Usuario eliminado
tags_cloud:
tags: Tendencias
print:
diff --git a/db/migrate/20151021113348_add_erased_at_to_users.rb b/db/migrate/20151021113348_add_erased_at_to_users.rb
new file mode 100644
index 000000000..9431c3861
--- /dev/null
+++ b/db/migrate/20151021113348_add_erased_at_to_users.rb
@@ -0,0 +1,5 @@
+class AddErasedAtToUsers < ActiveRecord::Migration
+ def change
+ add_column :users, :erased_at, :datetime
+ end
+end
diff --git a/db/schema.rb b/db/schema.rb
index 8b03adc9e..703ddd0d7 100644
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -11,7 +11,7 @@
#
# It's strongly recommended that you check this file into your version control system.
-ActiveRecord::Schema.define(version: 20151020112354) do
+ActiveRecord::Schema.define(version: 20151021113348) do
# These are extensions that must be enabled in order to support this database
enable_extension "plpgsql"
@@ -294,6 +294,7 @@ ActiveRecord::Schema.define(version: 20151020112354) do
t.integer "failed_census_calls_count", default: 0
t.datetime "level_two_verified_at"
t.string "erase_reason"
+ t.datetime "erased_at"
end
add_index "users", ["confirmation_token"], name: "index_users_on_confirmation_token", unique: true, using: :btree
diff --git a/spec/features/comments/debates_spec.rb b/spec/features/comments/debates_spec.rb
index 4b8b23ce8..1fad7affe 100644
--- a/spec/features/comments/debates_spec.rb
+++ b/spec/features/comments/debates_spec.rb
@@ -193,6 +193,18 @@ feature 'Commenting debates' do
end
end
+ scenario "Erasing a comment's author" do
+ debate = create(:debate)
+ comment = create(:comment, commentable: debate, body: 'this should be visible')
+ comment.user.erase
+
+ visit debate_path(debate)
+ within "#comment_#{comment.id}" do
+ expect(page).to have_content('Deleted user')
+ expect(page).to have_content('this should be visible')
+ end
+ end
+
feature "Moderators" do
scenario "can create comment as a moderator", :js do
moderator = create(:moderator)
diff --git a/spec/features/comments/proposals_spec.rb b/spec/features/comments/proposals_spec.rb
index 9c6b99a6a..ad3c26be9 100644
--- a/spec/features/comments/proposals_spec.rb
+++ b/spec/features/comments/proposals_spec.rb
@@ -193,6 +193,18 @@ feature 'Commenting proposals' do
end
end
+ scenario "Erasing a comment's author" do
+ proposal = create(:proposal)
+ comment = create(:comment, commentable: proposal, body: "this should be visible")
+ comment.user.erase
+
+ visit proposal_path(proposal)
+ within "#comment_#{comment.id}" do
+ expect(page).to have_content('Deleted user')
+ expect(page).to have_content('this should be visible')
+ end
+ end
+
feature "Moderators" do
scenario "can create comment as a moderator", :js do
moderator = create(:moderator)
diff --git a/spec/features/debates_spec.rb b/spec/features/debates_spec.rb
index c633f1b2f..717f02c20 100644
--- a/spec/features/debates_spec.rb
+++ b/spec/features/debates_spec.rb
@@ -523,4 +523,16 @@ feature 'Debates' do
visit debate_path(good_debate)
expect(page).to_not have_content "This debate has been flag as innapropiate for some users."
end
+
+ scenario 'Erased author' do
+ user = create(:user)
+ debate = create(:debate, author: user)
+ user.erase
+
+ visit debates_path
+ expect(page).to have_content('Deleted user')
+
+ visit debate_path(debate)
+ expect(page).to have_content('Deleted user')
+ end
end
diff --git a/spec/features/proposals_spec.rb b/spec/features/proposals_spec.rb
index 7bb1146ec..d15ade63b 100644
--- a/spec/features/proposals_spec.rb
+++ b/spec/features/proposals_spec.rb
@@ -605,4 +605,16 @@ feature 'Proposals' do
expect(Flag.flagged?(user, proposal)).to_not be
end
+
+ scenario 'Erased author' do
+ user = create(:user)
+ proposal = create(:proposal, author: user)
+ user.erase
+
+ visit proposals_path
+ expect(page).to have_content('Deleted user')
+
+ visit proposal_path(proposal)
+ expect(page).to have_content('Deleted user')
+ end
end
diff --git a/spec/models/comment_spec.rb b/spec/models/comment_spec.rb
index fdb632986..6d37eb71b 100644
--- a/spec/models/comment_spec.rb
+++ b/spec/models/comment_spec.rb
@@ -57,6 +57,11 @@ describe Comment do
.to change { [comment.reload.updated_at, comment.author.updated_at] }
end
+ it "expires cache when the author is erased" do
+ expect { comment.user.erase }
+ .to change { [comment.reload.updated_at, comment.author.updated_at] }
+ end
+
it "expires cache when the author changes" do
expect { comment.user.update(username: "Isabel") }
.to change { [comment.reload.updated_at, comment.author.updated_at] }
diff --git a/spec/models/debate_spec.rb b/spec/models/debate_spec.rb
index a9ef3892a..159ebdbb1 100644
--- a/spec/models/debate_spec.rb
+++ b/spec/models/debate_spec.rb
@@ -380,6 +380,11 @@ describe Debate do
.to change { [debate.reload.updated_at, debate.author.updated_at] }
end
+ it "should expire cache when the author is erased" do
+ expect { debate.author.erase }
+ .to change { [debate.reload.updated_at, debate.author.updated_at] }
+ end
+
it "should expire cache when its author changes" do
expect { debate.author.update(username: "Eva") }
.to change { [debate.reload.updated_at, debate.author.updated_at] }
diff --git a/spec/models/proposal_spec.rb b/spec/models/proposal_spec.rb
index 964f8f057..bb13f0769 100644
--- a/spec/models/proposal_spec.rb
+++ b/spec/models/proposal_spec.rb
@@ -304,4 +304,55 @@ describe Proposal do
end
end
+
+ describe "cache" do
+ let(:proposal) { create(:proposal) }
+
+ it "should expire cache when it has a new comment" do
+ expect { create(:comment, commentable: proposal) }
+ .to change { proposal.updated_at }
+ end
+
+ it "should expire cache when it has a new vote" do
+ expect { create(:vote, votable: proposal) }
+ .to change { proposal.updated_at }
+ end
+
+ it "should expire cache when it has a new flag" do
+ expect { create(:flag, flaggable: proposal) }
+ .to change { proposal.reload.updated_at }
+ end
+
+ it "should expire cache when it has a new tag" do
+ expect { proposal.update(tag_list: "new tag") }
+ .to change { proposal.updated_at }
+ end
+
+ it "should expire cache when hidden" do
+ expect { proposal.hide }
+ .to change { proposal.updated_at }
+ end
+
+ it "should expire cache when the author is hidden" do
+ expect { proposal.author.hide }
+ .to change { [proposal.reload.updated_at, proposal.author.updated_at] }
+ end
+
+ it "should expire cache when the author is erased" do
+ expect { proposal.author.erase }
+ .to change { [proposal.reload.updated_at, proposal.author.updated_at] }
+ end
+
+ it "should expire cache when its author changes" do
+ expect { proposal.author.update(username: "Eva") }
+ .to change { [proposal.reload.updated_at, proposal.author.updated_at] }
+ end
+
+ it "should expire cache when the author's organization get verified" do
+ create(:organization, user: proposal.author)
+ expect { proposal.author.organization.verify }
+ .to change { [proposal.reload.updated_at, proposal.author.updated_at] }
+ end
+ end
+
end
diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb
index 2e92ced35..9b045a7ed 100644
--- a/spec/models/user_spec.rb
+++ b/spec/models/user_spec.rb
@@ -317,7 +317,7 @@ describe User do
user.reload
expect(user.erase_reason).to eq('a test')
- expect(user.hidden_at).to be
+ expect(user.erased_at).to be
expect(user.username).to be_nil