FEATURE: Add timezone to core user_options (#8380)

* Add timezone to user_options table

* Also migrate existing timezone values from UserCustomField,
  which is where the discourse-calendar plugin is storing them

* Allow user to change their core timezone from Profile

* Auto guess & set timezone on login & invite accept & signup

* Serialize user_options.timezone for group members. this is so discourse-group-timezones can access the core user timezone, as it is being removed in discourse-calendar.

* Annotate user_option with timezone

* Validate timezone values
This commit is contained in:
Martin Brennan
2019-11-25 10:49:27 +10:00
committed by GitHub
parent 43ddf60cdf
commit afb5533581
24 changed files with 215 additions and 13 deletions

View File

@@ -269,7 +269,7 @@ class GroupsController < ApplicationController
end
end
users = users.select('users.*, group_users.created_at as added_at')
users = users.joins(:user_option).select('users.*, user_options.timezone, group_users.created_at as added_at')
members = users
.order('NOT group_users.owner')

View File

@@ -40,7 +40,7 @@ class InvitesController < ApplicationController
def perform_accept_invitation
params.require(:id)
params.permit(:username, :name, :password, user_custom_fields: {})
params.permit(:username, :name, :password, :timezone, user_custom_fields: {})
invite = Invite.find_by(invite_key: params[:id])
if invite.present?
@@ -48,6 +48,7 @@ class InvitesController < ApplicationController
user = invite.redeem(username: params[:username], name: params[:name], password: params[:password], user_custom_fields: params[:user_custom_fields], ip_address: request.remote_ip)
if user.present?
log_on_user(user) if user.active?
user.update_timezone_if_missing(params[:timezone])
post_process_invite(user)
end

View File

@@ -540,6 +540,7 @@ class SessionController < ApplicationController
def login(user)
session.delete(ACTIVATE_USER_KEY)
user.update_timezone_if_missing(params[:timezone])
log_on_user(user)
if payload = cookies.delete(:sso_payload)

View File

@@ -128,7 +128,7 @@ class UsersController < ApplicationController
end
end
json_result(user, serializer: UserSerializer, additional_errors: [:user_profile]) do |u|
json_result(user, serializer: UserSerializer, additional_errors: [:user_profile, :user_option]) do |u|
updater = UserUpdater.new(current_user, user)
updater.update(attributes.permit!)
end
@@ -387,7 +387,7 @@ class UsersController < ApplicationController
params[:locale] ||= I18n.locale unless current_user
new_user_params = user_params
new_user_params = user_params.except(:timezone)
user = User.unstage(new_user_params)
user = User.new(new_user_params) if user.nil?
@@ -435,6 +435,7 @@ class UsersController < ApplicationController
if user.save
authentication.finish
activation.finish
user.update_timezone_if_missing(params[:timezone])
secure_session[HONEYPOT_KEY] = nil
secure_session[CHALLENGE_KEY] = nil