mirror of
https://github.com/chenasraf/snpr.git
synced 2026-05-18 01:39:01 +00:00
upgrading Rails to 3.1
This commit is contained in:
2
Gemfile
2
Gemfile
@@ -1,6 +1,6 @@
|
||||
source 'http://rubygems.org'
|
||||
|
||||
gem 'rails', '~> 3.0.20'
|
||||
gem 'rails', '~> 3.1.0'
|
||||
gem 'authlogic' # lots of user-related magic
|
||||
gem 'rails3-generators'
|
||||
gem "jquery-rails"
|
||||
|
||||
146
Gemfile.lock
146
Gemfile.lock
@@ -14,7 +14,7 @@ GIT
|
||||
|
||||
GIT
|
||||
remote: git://github.com/ryanb/nested_form.git
|
||||
revision: f6744578d25a73c23608668fde2a20f7ae9d7d77
|
||||
revision: 8655e352c8f8dd26a6918e72f6d152954b65676a
|
||||
specs:
|
||||
nested_form (0.3.1)
|
||||
|
||||
@@ -38,43 +38,44 @@ GIT
|
||||
GEM
|
||||
remote: http://rubygems.org/
|
||||
specs:
|
||||
abstract (1.0.0)
|
||||
actionmailer (3.0.20)
|
||||
actionpack (= 3.0.20)
|
||||
mail (~> 2.2.19)
|
||||
actionpack (3.0.20)
|
||||
activemodel (= 3.0.20)
|
||||
activesupport (= 3.0.20)
|
||||
builder (~> 2.1.2)
|
||||
erubis (~> 2.6.6)
|
||||
i18n (~> 0.5.0)
|
||||
rack (~> 1.2.5)
|
||||
rack-mount (~> 0.6.14)
|
||||
rack-test (~> 0.5.7)
|
||||
tzinfo (~> 0.3.23)
|
||||
activemodel (3.0.20)
|
||||
activesupport (= 3.0.20)
|
||||
builder (~> 2.1.2)
|
||||
i18n (~> 0.5.0)
|
||||
activerecord (3.0.20)
|
||||
activemodel (= 3.0.20)
|
||||
activesupport (= 3.0.20)
|
||||
arel (~> 2.0.10)
|
||||
tzinfo (~> 0.3.23)
|
||||
actionmailer (3.1.10)
|
||||
actionpack (= 3.1.10)
|
||||
mail (~> 2.3.3)
|
||||
actionpack (3.1.10)
|
||||
activemodel (= 3.1.10)
|
||||
activesupport (= 3.1.10)
|
||||
builder (~> 3.0.0)
|
||||
erubis (~> 2.7.0)
|
||||
i18n (~> 0.6)
|
||||
rack (~> 1.3.6)
|
||||
rack-cache (~> 1.2)
|
||||
rack-mount (~> 0.8.2)
|
||||
rack-test (~> 0.6.1)
|
||||
sprockets (~> 2.0.4)
|
||||
activemodel (3.1.10)
|
||||
activesupport (= 3.1.10)
|
||||
builder (~> 3.0.0)
|
||||
i18n (~> 0.6)
|
||||
activerecord (3.1.10)
|
||||
activemodel (= 3.1.10)
|
||||
activesupport (= 3.1.10)
|
||||
arel (~> 2.2.3)
|
||||
tzinfo (~> 0.3.29)
|
||||
activerecord-import (0.2.11)
|
||||
activerecord (~> 3.0)
|
||||
activerecord (~> 3.0)
|
||||
activeresource (3.0.20)
|
||||
activemodel (= 3.0.20)
|
||||
activesupport (= 3.0.20)
|
||||
activesupport (3.0.20)
|
||||
arel (2.0.10)
|
||||
activeresource (3.1.10)
|
||||
activemodel (= 3.1.10)
|
||||
activesupport (= 3.1.10)
|
||||
activesupport (3.1.10)
|
||||
multi_json (>= 1.0, < 1.3)
|
||||
arel (2.2.3)
|
||||
authlogic (3.2.0)
|
||||
activerecord (>= 3.0.0)
|
||||
activesupport (>= 3.0.0)
|
||||
bartt-ssl_requirement (1.4.2)
|
||||
bcrypt-ruby (3.0.1)
|
||||
builder (2.1.2)
|
||||
builder (3.0.4)
|
||||
capistrano (2.14.1)
|
||||
highline
|
||||
net-scp (>= 1.0.0)
|
||||
@@ -83,27 +84,26 @@ GEM
|
||||
net-ssh-gateway (>= 1.1.0)
|
||||
cocaine (0.4.2)
|
||||
columnize (0.3.6)
|
||||
debugger (1.3.0)
|
||||
debugger (1.3.1)
|
||||
columnize (>= 0.3.1)
|
||||
debugger-linecache (~> 1.1.1)
|
||||
debugger-ruby_core_source (~> 1.1.7)
|
||||
debugger-ruby_core_source (~> 1.1.8)
|
||||
debugger-linecache (1.1.2)
|
||||
debugger-ruby_core_source (>= 1.1.1)
|
||||
debugger-ruby_core_source (1.1.7)
|
||||
erubis (2.6.6)
|
||||
abstract (>= 1.0.0)
|
||||
debugger-ruby_core_source (1.1.8)
|
||||
erubis (2.7.0)
|
||||
factory_girl (4.2.0)
|
||||
activesupport (>= 3.0.0)
|
||||
fitgem (0.5.2)
|
||||
oauth
|
||||
highline (1.6.15)
|
||||
i18n (0.5.0)
|
||||
hike (1.2.1)
|
||||
i18n (0.6.1)
|
||||
jquery-rails (2.2.0)
|
||||
railties (>= 3.0, < 5.0)
|
||||
thor (>= 0.14, < 2.0)
|
||||
json (1.7.6)
|
||||
mail (2.2.19)
|
||||
activesupport (>= 2.3.6)
|
||||
mail (2.3.3)
|
||||
i18n (>= 0.4.0)
|
||||
mime-types (~> 1.16)
|
||||
treetop (~> 1.4.8)
|
||||
@@ -111,19 +111,19 @@ GEM
|
||||
activesupport
|
||||
rest-client (>= 1.3.0)
|
||||
metaclass (0.0.1)
|
||||
mime-types (1.19)
|
||||
mime-types (1.20.1)
|
||||
minitest (4.3.3)
|
||||
mocha (0.13.2)
|
||||
metaclass (~> 0.0.1)
|
||||
multi_json (1.5.0)
|
||||
net-scp (1.0.4)
|
||||
net-ssh (>= 1.99.1)
|
||||
net-sftp (2.0.5)
|
||||
net-ssh (>= 2.0.9)
|
||||
net-ssh (2.6.3)
|
||||
net-ssh-gateway (1.1.0)
|
||||
net-ssh (>= 1.99.1)
|
||||
newrelic_rpm (3.5.5.38)
|
||||
multi_json (1.2.0)
|
||||
net-scp (1.1.0)
|
||||
net-ssh (>= 2.6.5)
|
||||
net-sftp (2.1.1)
|
||||
net-ssh (>= 2.6.5)
|
||||
net-ssh (2.6.5)
|
||||
net-ssh-gateway (1.2.0)
|
||||
net-ssh (>= 2.6.5)
|
||||
newrelic_rpm (3.5.6.46)
|
||||
nokogiri (1.5.6)
|
||||
oauth (0.4.7)
|
||||
paperclip (3.4.0)
|
||||
@@ -135,29 +135,36 @@ GEM
|
||||
pg (0.14.1)
|
||||
polyglot (0.3.3)
|
||||
pr_geohash (1.0.0)
|
||||
rack (1.2.7)
|
||||
rack-mount (0.6.14)
|
||||
rack (1.3.9)
|
||||
rack-cache (1.2)
|
||||
rack (>= 0.4)
|
||||
rack-mount (0.8.3)
|
||||
rack (>= 1.0.0)
|
||||
rack-test (0.5.7)
|
||||
rack-protection (1.3.2)
|
||||
rack
|
||||
rack-ssl (1.3.3)
|
||||
rack
|
||||
rack-test (0.6.2)
|
||||
rack (>= 1.0)
|
||||
rails (3.0.20)
|
||||
actionmailer (= 3.0.20)
|
||||
actionpack (= 3.0.20)
|
||||
activerecord (= 3.0.20)
|
||||
activeresource (= 3.0.20)
|
||||
activesupport (= 3.0.20)
|
||||
rails (3.1.10)
|
||||
actionmailer (= 3.1.10)
|
||||
actionpack (= 3.1.10)
|
||||
activerecord (= 3.1.10)
|
||||
activeresource (= 3.1.10)
|
||||
activesupport (= 3.1.10)
|
||||
bundler (~> 1.0)
|
||||
railties (= 3.0.20)
|
||||
railties (= 3.1.10)
|
||||
rails3-generators (1.0.0)
|
||||
railties (>= 3.0.0)
|
||||
railties (3.0.20)
|
||||
actionpack (= 3.0.20)
|
||||
activesupport (= 3.0.20)
|
||||
railties (3.1.10)
|
||||
actionpack (= 3.1.10)
|
||||
activesupport (= 3.1.10)
|
||||
rack-ssl (~> 1.3.2)
|
||||
rake (>= 0.8.7)
|
||||
rdoc (~> 3.4)
|
||||
thor (~> 0.14.4)
|
||||
thor (~> 0.14.6)
|
||||
rake (10.0.3)
|
||||
rdoc (3.12)
|
||||
rdoc (3.12.1)
|
||||
json (~> 1.4)
|
||||
recaptcha (0.3.4)
|
||||
redis (3.0.2)
|
||||
@@ -184,9 +191,14 @@ GEM
|
||||
multi_json (~> 1.0)
|
||||
simplecov-html (~> 0.7.1)
|
||||
simplecov-html (0.7.1)
|
||||
sinatra (1.2.8)
|
||||
rack (~> 1.1)
|
||||
tilt (>= 1.2.2, < 2.0)
|
||||
sinatra (1.3.3)
|
||||
rack (~> 1.3, >= 1.3.6)
|
||||
rack-protection (~> 1.2)
|
||||
tilt (~> 1.3, >= 1.3.3)
|
||||
sprockets (2.0.4)
|
||||
hike (~> 1.2)
|
||||
rack (~> 1.0)
|
||||
tilt (~> 1.1, != 1.3.0)
|
||||
sunspot (1.3.3)
|
||||
pr_geohash (~> 1.0)
|
||||
rsolr (~> 1.0.7)
|
||||
@@ -227,7 +239,7 @@ DEPENDENCIES
|
||||
newrelic_rpm
|
||||
paperclip (~> 3.0)
|
||||
pg
|
||||
rails (~> 3.0.20)
|
||||
rails (~> 3.1.0)
|
||||
rails3-generators
|
||||
recaptcha
|
||||
recommendify!
|
||||
|
||||
@@ -34,7 +34,7 @@ class GenotypesController < ApplicationController
|
||||
@award = Achievement.find_by_award("Published genotyping")
|
||||
user_achievement_attrs = { achievement_id: @award.id,
|
||||
user_id: current_user.id }
|
||||
if UserAchievement.where(user_achievement_attrs).count == 0
|
||||
if UserAchievement.where(user_achievement_attrs).count.zero?
|
||||
UserAchievement.create(user_achievement_attrs)
|
||||
flash[:achievement] = "Congratulations! You've unlocked an achievement:" +
|
||||
" <a href=\"#{url_for(@award)}\">#{@award.award}</a>"
|
||||
|
||||
@@ -74,9 +74,9 @@ class PhenotypesController < ApplicationController
|
||||
check_and_award_additional_phenotypes(20, "Entered 20 additional phenotypes")
|
||||
check_and_award_additional_phenotypes(50, "Entered 50 additional phenotypes")
|
||||
check_and_award_additional_phenotypes(100, "Entered 100 additional phenotypes")
|
||||
|
||||
|
||||
Resque.enqueue(Recommendvariations)
|
||||
Resque.enqueue(Recommendphenotypes)
|
||||
Resque.enqueue(Recommendphenotypes)
|
||||
|
||||
redirect_to current_user
|
||||
else
|
||||
@@ -90,68 +90,28 @@ class PhenotypesController < ApplicationController
|
||||
end
|
||||
end
|
||||
|
||||
class PhenotypeRecommender < Recommendify::Base
|
||||
|
||||
max_neighbors 50
|
||||
|
||||
input_matrix :users_to_phenotypes,
|
||||
:similarity_func => :jaccard,
|
||||
:weight => 5.0
|
||||
|
||||
end
|
||||
|
||||
class VariationRecommender < Recommendify::Base
|
||||
|
||||
max_neighbors 50
|
||||
|
||||
input_matrix :users_to_variations,
|
||||
:similarity_func => :jaccard,
|
||||
:weight => 5.0
|
||||
|
||||
end
|
||||
|
||||
def show
|
||||
#@phenotypes = Phenotype.where(:user_id => current_user.id).all
|
||||
#@title = "Phenotypes"
|
||||
@phenotype = Phenotype.find(params[:id]) || not_found
|
||||
@comments = PhenotypeComment.where(:phenotype_id => params[:id]).all(:order => "created_at ASC")
|
||||
@phenotype_comment = PhenotypeComment.new
|
||||
@user_phenotype = UserPhenotype.new
|
||||
|
||||
|
||||
|
||||
@recommender = PhenotypeRecommender.new
|
||||
|
||||
@similar_ids = @recommender.for(params[:id])
|
||||
@similar_phenotypes = []
|
||||
@it_counter = 0
|
||||
|
||||
@similar_ids.each do |s|
|
||||
if @it_counter < 6
|
||||
@similar_phenotypes << Phenotype.find(s.item_id)
|
||||
@it_counter += 1
|
||||
else
|
||||
break
|
||||
end
|
||||
end
|
||||
|
||||
respond_to do |format|
|
||||
format.html
|
||||
format.xml
|
||||
end
|
||||
recommender = PhenotypeRecommender.new
|
||||
similar_ids = recommender.for(params[:id])
|
||||
@similar_phenotypes = Phenotype.where(['id in (?)', similar_ids]).limit(6)
|
||||
end
|
||||
|
||||
def recommend_phenotype
|
||||
# init the recommendation-engines
|
||||
@phenotype_recommender = PhenotypeRecommender.new
|
||||
@variation_recommender = VariationRecommender.new
|
||||
|
||||
|
||||
# get up to three similar phenotypes regardless of variation
|
||||
|
||||
|
||||
@similar_ids = @phenotype_recommender.for(params[:id])
|
||||
@similar_phenotypes = []
|
||||
@item_counter = 0
|
||||
|
||||
|
||||
@similar_ids.each do |s|
|
||||
if @item_counter < 3
|
||||
@phenotype = Phenotype.find(s.item_id)
|
||||
@@ -163,7 +123,7 @@ class PhenotypesController < ApplicationController
|
||||
break
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
# get up to three similar combinations of phenotype and variation
|
||||
@user_phenotype = UserPhenotype.find_by_phenotype_id_and_user_id(params[:id],current_user.id)
|
||||
if @user_phenotype != nil
|
||||
@@ -172,11 +132,11 @@ class PhenotypesController < ApplicationController
|
||||
else
|
||||
@variation_recommend_request = ""
|
||||
end
|
||||
|
||||
|
||||
@similar_combinations = @phenotype_recommender.for(@variation_recommend_request)
|
||||
@similar_variations = []
|
||||
@combination_counter = 0
|
||||
|
||||
|
||||
@similar_combinations.each do |s|
|
||||
if @combination_counter < 3
|
||||
@phenotype = Phenotype.find_by_id(s.item_id.split("=>")[0])
|
||||
@@ -188,9 +148,9 @@ class PhenotypesController < ApplicationController
|
||||
break
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
@phenotype = Phenotype.find_by_id(params[:id])
|
||||
|
||||
|
||||
if @similar_phenotypes == [] and @similar_variations == []
|
||||
redirect_to :action => "index"
|
||||
else
|
||||
@@ -242,37 +202,37 @@ class PhenotypesController < ApplicationController
|
||||
rescue
|
||||
@result["error"] = "Sorry, this phenotype doesn't exist"
|
||||
end
|
||||
|
||||
|
||||
respond_to do |format|
|
||||
format.json { render :json => @result }
|
||||
end
|
||||
|
||||
|
||||
end
|
||||
|
||||
def json
|
||||
if params[:user_id].index(",")
|
||||
@user_ids = params[:user_id].split(",")
|
||||
@results = []
|
||||
@user_ids.each do |id|
|
||||
@new_param = {}
|
||||
@new_param[:user_id] = id
|
||||
@results = []
|
||||
@user_ids.each do |id|
|
||||
@new_param = {}
|
||||
@new_param[:user_id] = id
|
||||
@results << json_element(@new_param)
|
||||
end
|
||||
|
||||
|
||||
elsif params[:user_id].index("-")
|
||||
@results = []
|
||||
@id_array = params[:user_id].split("-")
|
||||
@user_ids = (@id_array[0].to_i..@id_array[1].to_i).to_a
|
||||
@user_ids.each do |id|
|
||||
@new_param = {}
|
||||
@new_param[:user_id] = id
|
||||
@results << json_element(@new_param)
|
||||
@new_param[:user_id] = id
|
||||
@results << json_element(@new_param)
|
||||
end
|
||||
|
||||
else
|
||||
|
||||
else
|
||||
@results = json_element(params)
|
||||
end
|
||||
|
||||
|
||||
respond_to do |format|
|
||||
format.json { render :json => @results }
|
||||
end
|
||||
@@ -283,19 +243,19 @@ class PhenotypesController < ApplicationController
|
||||
@user = User.find_by_id(params[:user_id])
|
||||
@result = {}
|
||||
@user_phenotypes = UserPhenotype.find_all_by_user_id(@user.id)
|
||||
|
||||
|
||||
@result["user"] = {}
|
||||
@result["user"]["name"] = @user.name
|
||||
@result["user"]["id"] = @user.id
|
||||
|
||||
|
||||
@phenotype_hash = {}
|
||||
|
||||
|
||||
@user_phenotypes.each do |up|
|
||||
@phenotype_hash[up.phenotype.characteristic] = {}
|
||||
@phenotype_hash[up.phenotype.characteristic]["phenotype_id"] = up.phenotype.id
|
||||
@phenotype_hash[up.phenotype.characteristic]["variation"] = up.variation
|
||||
end
|
||||
|
||||
|
||||
@result["phenotypes"] = @phenotype_hash
|
||||
rescue
|
||||
@result = {}
|
||||
|
||||
@@ -8,7 +8,10 @@ class Genotype < ActiveRecord::Base
|
||||
has_attached_file :genotype, url: '/data/:fs_filename',
|
||||
path: "#{Rails.root}/public/data/:fs_filename"
|
||||
before_post_process :is_image?
|
||||
validates_attachment_presence :genotype
|
||||
validates_attachment :genotype,
|
||||
presence: true,
|
||||
content_type: { content_type: 'text/plain' },
|
||||
size: { in: 0..100.megabytes }
|
||||
|
||||
attr_accessible :genotype, :filetype, :user_id
|
||||
after_create :parse_genotype
|
||||
|
||||
@@ -12,7 +12,6 @@ Snpr::Application.configure do
|
||||
|
||||
# Show full error reports and disable caching
|
||||
config.consider_all_requests_local = true
|
||||
config.action_view.debug_rjs = true
|
||||
config.action_controller.perform_caching = false
|
||||
|
||||
# Don't care if the mailer can't send
|
||||
|
||||
6
lib/phenotype_recommender.rb
Normal file
6
lib/phenotype_recommender.rb
Normal file
@@ -0,0 +1,6 @@
|
||||
class PhenotypeRecommender < Recommendify::Base
|
||||
max_neighbors 50
|
||||
input_matrix :users_to_phenotypes,
|
||||
:similarity_func => :jaccard,
|
||||
:weight => 5.0
|
||||
end
|
||||
6
lib/variation_recommender.rb
Normal file
6
lib/variation_recommender.rb
Normal file
@@ -0,0 +1,6 @@
|
||||
class VariationRecommender < Recommendify::Base
|
||||
max_neighbors 50
|
||||
input_matrix :users_to_variations,
|
||||
:similarity_func => :jaccard,
|
||||
:weight => 5.0
|
||||
end
|
||||
0
test/fixtures/.gitkeep
vendored
Normal file
0
test/fixtures/.gitkeep
vendored
Normal file
@@ -25,7 +25,7 @@ class GenotypesControllerTest < ActionController::TestCase
|
||||
end
|
||||
|
||||
should "get the rss feed" do
|
||||
get :feed
|
||||
get :feed, format: 'xml'
|
||||
assert_response :success
|
||||
assert_equal [@genotype], assigns(:genotypes)
|
||||
end
|
||||
@@ -41,7 +41,8 @@ class GenotypesControllerTest < ActionController::TestCase
|
||||
activate_authlogic
|
||||
@user = FactoryGirl.create(:user)
|
||||
UserSession.create(@user)
|
||||
@publishing_award = FactoryGirl.create(:achievement, award: "Published genotyping")
|
||||
@publishing_award = FactoryGirl.
|
||||
create(:achievement, award: "Published genotyping")
|
||||
end
|
||||
|
||||
should "see the upload form" do
|
||||
@@ -50,16 +51,20 @@ class GenotypesControllerTest < ActionController::TestCase
|
||||
end
|
||||
|
||||
should "be able to upload genotypes" do
|
||||
FileUtils.cp("#{Rails.root}/testdata/testdatensatz1_23andme.txt",
|
||||
"#{Rails.root}/test/fixtures")
|
||||
genotype_file = fixture_file_upload('testdatensatz1_23andme.txt')
|
||||
genotype_file.content_type = 'text/plain'
|
||||
Resque.expects(:enqueue).with(Preparsing, is_a(Fixnum))
|
||||
genotype_file_upload = ActionDispatch::Http::UploadedFile.new(
|
||||
filename: '23andme.txt', content_type: 'text/plain',
|
||||
tempfile: File.new("#{Rails.root}/test/data/23andMe_test.csv"))
|
||||
assert_difference 'UserAchievement.count' do
|
||||
put :create, commit: "Upload", genotype:
|
||||
{ genotype: genotype_file_upload, filetype: "23andme"}
|
||||
assert_difference 'Genotype.count' do
|
||||
put :create, commit: "Upload", genotype:
|
||||
{ genotype: genotype_file, filetype: "23andme"}
|
||||
end
|
||||
end
|
||||
assert_redirected_to user_path(@user)
|
||||
assert_equal @publishing_award.id, UserAchievement.last.achievement_id
|
||||
FileUtils.rm("#{Rails.root}/test/fixtures/testdatensatz1_23andme.txt")
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -39,13 +39,17 @@ class PhenotypesControllerTest < ActionController::TestCase
|
||||
end
|
||||
|
||||
should "see them" do
|
||||
similar_phenotype = FactoryGirl.create(:phenotype)
|
||||
PhenotypeRecommender.any_instance.expects(:for).
|
||||
with(@phenotype.id.to_s).returns([similar_phenotype.id])
|
||||
get :show, id: @phenotype.id
|
||||
assert_response :success
|
||||
assert_equal @phenotype, assigns(:phenotype)
|
||||
assert_equal [similar_phenotype], assigns(:similar_phenotypes)
|
||||
end
|
||||
|
||||
should "get the feed" do
|
||||
get :feed, id: @phenotype.id
|
||||
get :feed, id: @phenotype.id, format: 'xml'
|
||||
assert_response :success
|
||||
end
|
||||
|
||||
|
||||
@@ -11,6 +11,8 @@ SunspotTest.solr_startup_timeout = 30
|
||||
require 'sunspot_test/test_unit'
|
||||
require 'factory_girl'
|
||||
FactoryGirl.find_definitions
|
||||
require 'paperclip/matchers'
|
||||
|
||||
class ActiveSupport::TestCase
|
||||
extend Paperclip::Shoulda::Matchers
|
||||
end
|
||||
|
||||
15
test/unit/genotype_test.rb
Normal file
15
test/unit/genotype_test.rb
Normal file
@@ -0,0 +1,15 @@
|
||||
require_relative '../test_helper'
|
||||
|
||||
class GenotypeTest < ActiveSupport::TestCase
|
||||
context "Genotype" do
|
||||
setup do
|
||||
Genotype.any_instance.stubs(:fs_filename).returns("1.23andme.1")
|
||||
end
|
||||
|
||||
should have_attached_file(:genotype)
|
||||
should validate_attachment_presence(:genotype)
|
||||
should validate_attachment_content_type(:genotype).
|
||||
allowing('text/plain').rejecting('image/png', 'image/gif', 'text/xml')
|
||||
should validate_attachment_size(:genotype).less_than(100.megabytes)
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user