Browse Source

Filter languages with opt out (#3175)

* Remove allowed_languages and add filtered_languages

* Use filtered_languages instead of allowed_languages
master
Matt Jankowski 7 years ago
committed by Eugen Rochko
parent
commit
8f4b7c1820
21 changed files with 30 additions and 41 deletions
  1. +1
    -1
      app/controllers/settings/preferences_controller.rb
  2. +1
    -1
      app/javascript/styles/forms.scss
  3. +1
    -1
      app/models/account.rb
  4. +3
    -3
      app/models/status.rb
  5. +2
    -2
      app/models/user.rb
  6. +1
    -1
      app/views/settings/preferences/show.html.haml
  7. +0
    -2
      config/locales/simple_form.ar.yml
  8. +1
    -1
      config/locales/simple_form.en.yml
  9. +0
    -2
      config/locales/simple_form.fa.yml
  10. +0
    -2
      config/locales/simple_form.he.yml
  11. +0
    -3
      config/locales/simple_form.ja.yml
  12. +0
    -3
      config/locales/simple_form.oc.yml
  13. +0
    -2
      config/locales/simple_form.pl.yml
  14. +0
    -2
      config/locales/simple_form.pt-BR.yml
  15. +1
    -3
      config/locales/simple_form.th.yml
  16. +0
    -2
      config/locales/simple_form.zh-CN.yml
  17. +9
    -0
      db/migrate/20170520145338_change_language_filter_to_opt_out.rb
  18. +3
    -3
      db/schema.rb
  19. +3
    -3
      spec/controllers/settings/preferences_controller_spec.rb
  20. +2
    -2
      spec/models/status_spec.rb
  21. +2
    -2
      spec/models/user_spec.rb

+ 1
- 1
app/controllers/settings/preferences_controller.rb View File

@@ -26,7 +26,7 @@ class Settings::PreferencesController < ApplicationController
def user_params def user_params
params.require(:user).permit( params.require(:user).permit(
:locale, :locale,
allowed_languages: []
filtered_languages: []
) )
end end




+ 1
- 1
app/javascript/styles/forms.scss View File

@@ -352,7 +352,7 @@ code {
} }
} }


.user_allowed_languages {
.user_filtered_languages {
li { li {
float: left; float: left;
width: 50%; width: 50%;


+ 1
- 1
app/models/account.rb View File

@@ -99,7 +99,7 @@ class Account < ApplicationRecord
prefix: true, prefix: true,
allow_nil: true allow_nil: true


delegate :allowed_languages, to: :user, prefix: false, allow_nil: true
delegate :filtered_languages, to: :user, prefix: false, allow_nil: true


def local? def local?
domain.nil? domain.nil?


+ 3
- 3
app/models/status.rb View File

@@ -142,8 +142,8 @@ class Status < ApplicationRecord
before_validation :set_conversation before_validation :set_conversation


class << self class << self
def in_allowed_languages(account)
where(language: account.allowed_languages)
def not_in_filtered_languages(account)
where.not(language: account.filtered_languages)
end end


def as_home_timeline(account) def as_home_timeline(account)
@@ -234,7 +234,7 @@ class Status < ApplicationRecord
def filter_timeline_for_account(query, account, local_only) def filter_timeline_for_account(query, account, local_only)
query = query.not_excluded_by_account(account) query = query.not_excluded_by_account(account)
query = query.not_domain_blocked_by_account(account) unless local_only query = query.not_domain_blocked_by_account(account) unless local_only
query = query.in_allowed_languages(account) if account.allowed_languages.present?
query = query.not_in_filtered_languages(account) if account.filtered_languages.present?
query.merge(account_silencing_filter(account)) query.merge(account_silencing_filter(account))
end end




+ 2
- 2
app/models/user.rb View File

@@ -30,7 +30,7 @@
# otp_required_for_login :boolean # otp_required_for_login :boolean
# last_emailed_at :datetime # last_emailed_at :datetime
# otp_backup_codes :string is an Array # otp_backup_codes :string is an Array
# allowed_languages :string default([]), not null, is an Array
# filtered_languages :string default([]), not null, is an Array
# #


class User < ApplicationRecord class User < ApplicationRecord
@@ -83,6 +83,6 @@ class User < ApplicationRecord
private private


def sanitize_languages def sanitize_languages
allowed_languages.reject!(&:blank?)
filtered_languages.reject!(&:blank?)
end end
end end

+ 1
- 1
app/views/settings/preferences/show.html.haml View File

@@ -12,7 +12,7 @@
label_method: lambda { |locale| human_locale(locale) }, label_method: lambda { |locale| human_locale(locale) },
selected: I18n.locale selected: I18n.locale


= f.input :allowed_languages,
= f.input :filtered_languages,
collection: I18n.available_locales, collection: I18n.available_locales,
wrapper: :with_label, wrapper: :with_label,
include_blank: false, include_blank: false,


+ 0
- 2
config/locales/simple_form.ar.yml View File

@@ -12,8 +12,6 @@ ar:
data: ملف CSV تم تصديره من خادوم مثيل آخر لماستدون data: ملف CSV تم تصديره من خادوم مثيل آخر لماستدون
sessions: sessions:
otp: أدخل الرمز الثنائي من هاتفك أو استخدم أحد رموز الاسترداد. otp: أدخل الرمز الثنائي من هاتفك أو استخدم أحد رموز الاسترداد.
user:
allowed_languages: سوف يتم السماح بعرض اللغات المختارة على خيوطك المتسلسلة العامة أما التي لم يتم تحديدها فسوف تصفّى.
labels: labels:
defaults: defaults:
avatar: الصورة الرمزية avatar: الصورة الرمزية


+ 1
- 1
config/locales/simple_form.en.yml View File

@@ -17,7 +17,7 @@ en:
sessions: sessions:
otp: Enter the Two-factor code from your phone or use one of your recovery codes. otp: Enter the Two-factor code from your phone or use one of your recovery codes.
user: user:
allowed_languages: These languages will be allowed in your public timelines. Languages that are not selected will be filtered out.
filtered_languages: Selected languages will be removed from your public timelines.
labels: labels:
defaults: defaults:
avatar: Avatar avatar: Avatar


+ 0
- 2
config/locales/simple_form.fa.yml View File

@@ -12,8 +12,6 @@ fa:
data: پروندهٔ CSV که از سرور ماستدون دیگری برون‌سپاری شده data: پروندهٔ CSV که از سرور ماستدون دیگری برون‌سپاری شده
sessions: sessions:
otp: کد تأیید دومرحله‌ای را از تلفن خود وارد کنید یا یکی از کدهای بازیابی را به کار ببرید. otp: کد تأیید دومرحله‌ای را از تلفن خود وارد کنید یا یکی از کدهای بازیابی را به کار ببرید.
user:
allowed_languages: این زبان‌ها در فهرست عمومی نوشته‌ها مجاز خواهند بود. زبان‌هایی که انتخاب نشده باشند به این فهرست راه پیدا نمی‌کنند.
labels: labels:
defaults: defaults:
avatar: تصویر نمایه avatar: تصویر نمایه


+ 0
- 2
config/locales/simple_form.he.yml View File

@@ -16,8 +16,6 @@ he:
data: 'קובץ CSV שיוצא משרת מסטודון אחר' data: 'קובץ CSV שיוצא משרת מסטודון אחר'
sessions: sessions:
otp: 'נא להקליד קוד אימות דו-שלבי ממכשירך או קוד אחזור גישה.' otp: 'נא להקליד קוד אימות דו-שלבי ממכשירך או קוד אחזור גישה.'
user:
allowed_languages: אלו השפות שיהיה מותרות בצירי הזמן הציבוריים שלך. שפות שלא ייבחרו יפולטרו מעיני הקוראים.
labels: labels:
defaults: defaults:
avatar: תמונת פרופיל avatar: תמונת פרופיל


+ 0
- 3
config/locales/simple_form.ja.yml View File

@@ -12,11 +12,8 @@ ja:
data: 他の Mastodon インスタンスからエクスポートしたCSVファイルを選択して下さい data: 他の Mastodon インスタンスからエクスポートしたCSVファイルを選択して下さい
sessions: sessions:
otp: 携帯電話に表示された2段階認証コードを入力するか、生成したリカバリーコードを使用してください。 otp: 携帯電話に表示された2段階認証コードを入力するか、生成したリカバリーコードを使用してください。
user:
allowed_languages: 選択した言語があなたの公開タイムラインに表示されます。選択していない言語は取り除かれます。
labels: labels:
defaults: defaults:
allowed_languages: 許可する言語
avatar: アイコン avatar: アイコン
confirm_new_password: 新しいパスワード(確認用) confirm_new_password: 新しいパスワード(確認用)
confirm_password: パスワード(確認用) confirm_password: パスワード(確認用)


+ 0
- 3
config/locales/simple_form.oc.yml View File

@@ -12,11 +12,8 @@ oc:
data: Fichièr CSV exportat d’una autra instància Mastodon data: Fichièr CSV exportat d’una autra instància Mastodon
sessions: sessions:
otp: Picatz lo còdi d’autentificacion en dos temps (Two factor code) de vòstre mobil o utilizatz un de vòstres còdis de recuperacion. otp: Picatz lo còdi d’autentificacion en dos temps (Two factor code) de vòstre mobil o utilizatz un de vòstres còdis de recuperacion.
user:
allowed_languages: Aquestas lengas seràn las que seràn autorizadas dins vòstre flux public. Las lengas pas causidas seràn rescondudas.
labels: labels:
defaults: defaults:
allowed_languages: Lengas autorizadas
avatar: Avatar avatar: Avatar
confirm_new_password: Confirmacion del nòu senhal confirm_new_password: Confirmacion del nòu senhal
confirm_password: Confirmatz lo nòu senhal confirm_password: Confirmatz lo nòu senhal


+ 0
- 2
config/locales/simple_form.pl.yml View File

@@ -12,8 +12,6 @@ pl:
data: Plik CSV wyeksportowany z innej instancji Mastodona data: Plik CSV wyeksportowany z innej instancji Mastodona
sessions: sessions:
otp: Wprowadź kod weryfikacji dwuetapowej z telefonu lub wykorzystaj jeden z kodów zapasowych. otp: Wprowadź kod weryfikacji dwuetapowej z telefonu lub wykorzystaj jeden z kodów zapasowych.
user:
allowed_languages: Te języki będą wyświetlać się na Twojej osi czasu. Wpisy w niezaznaczonych językach nie będą widoczne.
labels: labels:
defaults: defaults:
avatar: Awatar avatar: Awatar


+ 0
- 2
config/locales/simple_form.pt-BR.yml View File

@@ -12,8 +12,6 @@ pt-BR:
data: Arquivo CSV exportado de outra instancia Mastodon data: Arquivo CSV exportado de outra instancia Mastodon
sessions: sessions:
otp: Entre com o código de 2 passos do seu telefone ou use os códiogos de recuperação. otp: Entre com o código de 2 passos do seu telefone ou use os códiogos de recuperação.
user:
allowed_languages: Essas línguas vão ser permitidas na sua timeline pública. Línguas que não forem selecionadas serão filtradas.
labels: labels:
defaults: defaults:
avatar: Avatar avatar: Avatar


+ 1
- 3
config/locales/simple_form.th.yml View File

@@ -9,15 +9,13 @@ th:
other: '%{count} characters left' other: '%{count} characters left'
header: PNG, GIF or JPG. At most 2MB. Will be downscaled to 700x335px header: PNG, GIF or JPG. At most 2MB. Will be downscaled to 700x335px
locked: Requires you to manually approve followers and defaults post privacy to followers-only locked: Requires you to manually approve followers and defaults post privacy to followers-only
note:
note:
one: '1 character left' one: '1 character left'
other: '%{count} characters left' other: '%{count} characters left'
imports: imports:
data: CSV file exported from another Mastodon instance data: CSV file exported from another Mastodon instance
sessions: sessions:
otp: Enter the Two-factor code from your phone or use one of your recovery codes. otp: Enter the Two-factor code from your phone or use one of your recovery codes.
user:
allowed_languages: These languages will be allowed in your public timelines. Languages that are not selected will be filtered out.
labels: labels:
defaults: defaults:
avatar: Avatar avatar: Avatar


+ 0
- 2
config/locales/simple_form.zh-CN.yml View File

@@ -12,8 +12,6 @@ zh-CN:
data: 自其他服务站导出的 CSV 文件 data: 自其他服务站导出的 CSV 文件
sessions: sessions:
otp: 输入你手机生成的两步验证码,或者恢复代码。 otp: 输入你手机生成的两步验证码,或者恢复代码。
user:
allowed_languages: 允许下列语言的内容出现在你的公共时间线上。
labels: labels:
defaults: defaults:
avatar: 头像 avatar: 头像


+ 9
- 0
db/migrate/20170520145338_change_language_filter_to_opt_out.rb View File

@@ -0,0 +1,9 @@
class ChangeLanguageFilterToOptOut < ActiveRecord::Migration[5.0]
def change
remove_index :users, :allowed_languages
remove_column :users, :allowed_languages

add_column :users, :filtered_languages, :string, array: true, default: [], null: false
add_index :users, :filtered_languages, using: :gin
end
end

+ 3
- 3
db/schema.rb View File

@@ -10,7 +10,7 @@
# #
# It's strongly recommended that you check this file into your version control system. # It's strongly recommended that you check this file into your version control system.


ActiveRecord::Schema.define(version: 20170517205741) do
ActiveRecord::Schema.define(version: 20170520145338) do


# These are extensions that must be enabled in order to support this database # These are extensions that must be enabled in order to support this database
enable_extension "plpgsql" enable_extension "plpgsql"
@@ -350,11 +350,11 @@ ActiveRecord::Schema.define(version: 20170517205741) do
t.boolean "otp_required_for_login" t.boolean "otp_required_for_login"
t.datetime "last_emailed_at" t.datetime "last_emailed_at"
t.string "otp_backup_codes", array: true t.string "otp_backup_codes", array: true
t.string "allowed_languages", default: [], null: false, array: true
t.string "filtered_languages", default: [], null: false, array: true
t.index ["account_id"], name: "index_users_on_account_id", using: :btree t.index ["account_id"], name: "index_users_on_account_id", using: :btree
t.index ["allowed_languages"], name: "index_users_on_allowed_languages", using: :gin
t.index ["confirmation_token"], name: "index_users_on_confirmation_token", unique: true, using: :btree t.index ["confirmation_token"], name: "index_users_on_confirmation_token", unique: true, using: :btree
t.index ["email"], name: "index_users_on_email", unique: true, using: :btree t.index ["email"], name: "index_users_on_email", unique: true, using: :btree
t.index ["filtered_languages"], name: "index_users_on_filtered_languages", using: :gin
t.index ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true, using: :btree t.index ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true, using: :btree
end end




+ 3
- 3
spec/controllers/settings/preferences_controller_spec.rb View File

@@ -3,7 +3,7 @@ require 'rails_helper'
describe Settings::PreferencesController do describe Settings::PreferencesController do
render_views render_views


let(:user) { Fabricate(:user, allowed_languages: []) }
let(:user) { Fabricate(:user, filtered_languages: []) }


before do before do
sign_in user, scope: :user sign_in user, scope: :user
@@ -18,12 +18,12 @@ describe Settings::PreferencesController do


describe 'PUT #update' do describe 'PUT #update' do
it 'updates the user record' do it 'updates the user record' do
put :update, params: { user: { locale: 'en', allowed_languages: ['es', 'fr', ''] } }
put :update, params: { user: { locale: 'en', filtered_languages: ['es', 'fr', ''] } }


expect(response).to redirect_to(settings_preferences_path) expect(response).to redirect_to(settings_preferences_path)
user.reload user.reload
expect(user.locale).to eq 'en' expect(user.locale).to eq 'en'
expect(user.allowed_languages).to eq ['es', 'fr']
expect(user.filtered_languages).to eq ['es', 'fr']
end end


it 'updates user settings' do it 'updates user settings' do


+ 2
- 2
spec/models/status_spec.rb View File

@@ -512,7 +512,7 @@ RSpec.describe Status, type: :model do


context 'with language preferences' do context 'with language preferences' do
it 'excludes statuses in languages not allowed by the account user' do it 'excludes statuses in languages not allowed by the account user' do
user = Fabricate(:user, allowed_languages: [:en, :es])
user = Fabricate(:user, filtered_languages: [:fr])
@account.update(user: user) @account.update(user: user)
en_status = Fabricate(:status, language: 'en') en_status = Fabricate(:status, language: 'en')
es_status = Fabricate(:status, language: 'es') es_status = Fabricate(:status, language: 'es')
@@ -525,7 +525,7 @@ RSpec.describe Status, type: :model do
end end


it 'includes all languages when user does not have a setting' do it 'includes all languages when user does not have a setting' do
user = Fabricate(:user, allowed_languages: [])
user = Fabricate(:user, filtered_languages: [])
@account.update(user: user) @account.update(user: user)


en_status = Fabricate(:status, language: 'en') en_status = Fabricate(:status, language: 'en')


+ 2
- 2
spec/models/user_spec.rb View File

@@ -24,9 +24,9 @@ RSpec.describe User, type: :model do
end end


it 'cleans out empty string from languages' do it 'cleans out empty string from languages' do
user = Fabricate.build(:user, allowed_languages: [''])
user = Fabricate.build(:user, filtered_languages: [''])
user.valid? user.valid?
expect(user.allowed_languages).to eq []
expect(user.filtered_languages).to eq []
end end
end end




Loading…
Cancel
Save