|
- # Redmine - project management software
- # Copyright (C) 2006-2013 Jean-Philippe Lang
- #
- # This program is free software; you can redistribute it and/or
- # modify it under the terms of the GNU General Public License
- # as published by the Free Software Foundation; either version 2
- # of the License, or (at your option) any later version.
- #
- # This program is distributed in the hope that it will be useful,
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- # GNU General Public License for more details.
- #+
- # You should have received a copy of the GNU General Public License
- # along with this program; if not, write to the Free Software
- # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-
- class MyController < ApplicationController
- layout "users_base"
- # edit
- before_filter :auth_login1, :only => [:account]
- #
- before_filter :require_login, except: [:change_mail_notification]
-
- helper :issues
- helper :users
- helper :custom_fields
- helper :user_score
-
- BLOCKS = { 'issuesassignedtome' => :label_assigned_to_me_issues,
- 'issuesreportedbyme' => :label_reported_issues,
- 'issueswatched' => :label_watched_issues,
- 'news' => :label_news_latest,
- 'calendar' => :label_calendar,
- 'documents' => :label_document_plural,
- 'timelog' => :label_spent_time
- }.merge(Redmine::Views::MyPage::Block.additional_blocks).freeze
-
- DEFAULT_LAYOUT = { 'left' => ['issuesassignedtome'],
- 'right' => ['issuesreportedbyme']
- }.freeze
-
- def index
-
- page
- render :action => 'page'
- end
-
- # Show user's page
- def page
- @user = User.current
- @Issues= Issue.visible.open.
- where(:assigned_to_id => ([User.current.id] + User.current.group_ids))
- @limit = 10
- @feedback_count = @Issues.count
- @feedback_pages = Paginator.new @feedback_count, @limit, params['page']
- @offset ||= @feedback_pages.offset
- @curse_attachments = @Issues[@offset, @limit]
-
- @blocks = @user.pref[:my_page_layout] || DEFAULT_LAYOUT
- end
-
- def page2
- @limit = 10
- @user = User.current
- @Issues= Issue.visible.open.
- where(:assigned_to_id => ([User.current.id] + User.current.group_ids))
- @feedback_count = @Issues.count
- @feedback_pages = Paginator.new @feedback_count, @limit, params['page']
- @offset ||= @feedback_pages.offset
- @curse_attachments = @Issues[@offset, @limit]
- @state = false
- @blocks = @user.pref[:my_page_layout] || DEFAULT_LAYOUT
- respond_to do |format|
- format.js
- end
- end
-
- def change_mail_notification
- token = params[:token]
- user = try_to_autologin1
- if user
- user.mail_notification = params[:mail_notification]
- user.save
- flash[:notice] = l(:notice_mail_notification_updated)
- redirect_to my_account_url
- else
- redirect_to signin_url
- end
- end
-
- def clear_user_avatar_temp
- @user = User.current
- diskfile = disk_filename('User', @user.id)
- diskfile1 = diskfile + 'temp'
- File.delete(diskfile1) if File.exist?(diskfile1)
- end
- def save_user_avatar
- @user = User.current
- diskfile = disk_filename('User', @user.id)
- diskfile1 = diskfile + 'temp'
- begin
- FileUtils.mv diskfile1, diskfile, force: true if File.exist? diskfile1
- ensure
- File.delete(diskfile1) if File.exist?(diskfile1)
- end
- end
-
- # Edit user's account
- def account
- @user = User.current
-
- lg=@user.login
- @pref = @user.pref
- diskfile = disk_filename('User', @user.id)
- diskfile1 = diskfile + 'temp'
- begin
- if request.post?
- # 修改邮箱的时候同步修改到gitlab
- if @user.mail != params[:user][:mail]
- g = Gitlab.client
- begin
- g.edit_user(@user.gid, :email => params[:user][:mail])
- rescue
- logger.error "sync user's email of gitlab failed!"
- end
- end
-
- @user.safe_attributes = params[:user]
- @user.lastname = params[:lastname]
- @user.firstname = ""
- @user.pref.attributes = params[:pref]
- @user.pref[:no_self_notified] = (params[:no_self_notified] == '1')
- #@user.login = params[:login]
- unless @user.user_extensions.nil?
- if @user.user_extensions.identity == 2
- # @user.firstname = params[:enterprise_name]
- end
- end
-
- @se = @user.extensions
- # if params[:occupation].to_i.to_s == params[:occupation]
- # @se.school_id = params[:occupation]
- # else
- # @se.occupation = params[:occupation]
- # end
- @se.school_id = params[:occupation]
-
- @se.gender = params[:sex]
- @se.location = params[:province] if params[:province]
- @se.location_city = params[:city] if params[:city]
- @se.identity = params[:identity].to_i if params[:identity]
- @se.technical_title = params[:technical_title] if params[:technical_title]
- @se.student_id = params[:no] if params[:no]
- # @se.brief_introduction = params[:brief_introduction]
- @se.description = params[:description]
-
- if @user.save && @se.save
- # 头像保存
- FileUtils.mv diskfile1, diskfile, force: true if File.exist? diskfile1
- @user.pref.save
- @user.notified_project_ids = (@user.mail_notification == 'selected' ? params[:notified_project_ids] : [])
- set_language_if_valid @user.language
- flash[:notice] = l(:notice_account_updated)
- redirect_to user_url(@user)
- return
- else
- @user.login = lg
- end
- end
- ensure
- File.delete(diskfile1) if File.exist?(diskfile1)
- end
-
- render :layout=>'new_base_user'
- end
-
- # Destroys user's account
- def destroy
- @user = User.current
- unless @user.own_account_deletable?
- redirect_to my_account_url
- return
- end
-
- if request.post? && params[:confirm]
- @user.destroy
- if @user.destroyed?
- logout_user
- flash.now[:notice] = l(:notice_account_deleted)
- end
- redirect_to signin_path
- end
- end
-
- # Manage user's password
- def password
- begin
- @act='password'
- @user = User.current
- unless @user.change_password_allowed?
- flash.now[:error] = l(:notice_can_t_change_password)
- redirect_to my_account_url
- return
- end
- if request.post?
- us = UsersService.new
- @user = us.change_password params.merge(:current_user_id => @user.id)
- if @user.errors.full_messages.count <= 0
- flash.now[:notice] = l(:notice_account_password_updated)
- # 修改完密码,让其重新登录,并更新Token
- Token.delete_user_all_tokens(@user)
- logout_user
- redirect_to signin_url(back_url: my_account_path)
- return
- else
- #flash.now[:error] = l(:notice_account_wrong_password)
- end
- end
- rescue Exception => e
- if e.message == 'wrong password'
- # flash.now[:error] = l(:notice_account_wrong_password)
- else
- # flash.now[:error] = e.message
- end
- flash.now[:error] = l(:notice_account_old_wrong_password)
- end
- render :template => 'my/account',:layout=>'new_base_user'
- end
-
- # Create a new feeds key
- def reset_rss_key
- if request.post?
- if User.current.rss_token
- User.current.rss_token.destroy
- User.current.reload
- end
- User.current.rss_key
- flash[:notice] = l(:notice_feeds_access_key_reseted)
- end
- redirect_to my_account_url
- end
-
- # Create a new API key
- def reset_api_key
- if request.post?
- if User.current.api_token
- User.current.api_token.destroy
- User.current.reload
- end
- User.current.api_key
- flash[:notice] = l(:notice_api_access_key_reseted)
- end
- redirect_to my_account_url
- end
-
- # User's page layout configuration
- def page_layout
- @user = User.current
- @blocks = @user.pref[:my_page_layout] || DEFAULT_LAYOUT.dup
- @block_options = []
- BLOCKS.each do |k, v|
- unless %w(top left right).detect {|f| (@blocks[f] ||= []).include?(k)}
- @block_options << [l("my.blocks.#{v}", :default => [v, v.to_s.humanize]), k.dasherize]
- end
- end
- end
-
- # Add a block to user's page
- # The block is added on top of the page
- # params[:block] : id of the block to add
- def add_block
- block = params[:block].to_s.underscore
- if block.present? && BLOCKS.key?(block)
- @user = User.current
- layout = @user.pref[:my_page_layout] || {}
- # remove if already present in a group
- %w(top left right).each {|f| (layout[f] ||= []).delete block }
- # add it on top
- layout['top'].unshift block
- @user.pref[:my_page_layout] = layout
- @user.pref.save
- end
- redirect_to my_page_layout_url
- end
-
- # Remove a block to user's page
- # params[:block] : id of the block to remove
- def remove_block
- block = params[:block].to_s.underscore
- @user = User.current
- # remove block in all groups
- layout = @user.pref[:my_page_layout] || {}
- %w(top left right).each {|f| (layout[f] ||= []).delete block }
- @user.pref[:my_page_layout] = layout
- @user.pref.save
- redirect_to my_page_layout_url
- end
-
- # Change blocks order on user's page
- # params[:group] : group to order (top, left or right)
- # params[:list-(top|left|right)] : array of block ids of the group
- def order_blocks
- group = params[:group]
- @user = User.current
- if group.is_a?(String)
- group_items = (params["blocks"] || []).collect(&:underscore)
- group_items.each {|s| s.sub!(/^block_/, '')}
- if group_items and group_items.is_a? Array
- layout = @user.pref[:my_page_layout] || {}
- # remove group blocks if they are presents in other groups
- %w(top left right).each {|f|
- layout[f] = (layout[f] || []) - group_items
- }
- layout[group] = group_items
- @user.pref[:my_page_layout] = layout
- @user.pref.save
- end
- end
- render :nothing => true
- end
- end
|