|
- # 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
- if params[:course]
- @course = Course.find params[:course]
- diskfile = disk_filename('Course', @course.id)
- elsif params[:contest]
- @contest = Contest.find params[:contest]
- diskfile = disk_filename('Contest', @contest.id)
- elsif params[:project]
- @project = Project.find params[:project]
- diskfile = disk_filename('Project', @project.id)
- elsif params[:organization]
- @organization = Organization.find params[:organization]
- diskfile = disk_filename('Organization', @organization.id)
- else
- @user = User.current
- diskfile = disk_filename('User', @user.id)
- end
- diskfile1 = diskfile + 'temp'
- File.delete(diskfile1) if File.exist?(diskfile1)
- end
-
- def save_user_avatar
- if params[:source_id] && params[:source_type]
- case params[:source_type]
- when 'User'
- @user = User.current
- diskfile = disk_filename('User', @user.id)
- when 'Course'
- @course = Course.find params[:source_id]
- diskfile = disk_filename('Course', @course.id)
- when 'Contest'
- @contest = Contest.find params[:source_id]
- diskfile = disk_filename('Contest', @contest.id)
- when 'Project'
- @project = Project.find params[:source_id]
- diskfile = disk_filename('Project', @project.id)
- when 'Organization'
- @organization = Organization.find params[:source_id]
- diskfile = disk_filename('Organization', @organization.id)
- end
- end
- 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
- # 更新消息状态
- if params[:flag]
- applied_message = AppliedMessage.where(:id => params[:applied_message_id]).first
- applied_message.update_attribute(:viewed, true)
- end
-
- # 基本资料不完善 @force为false, 完善 @force为true
- @force = false
- if params[:tip]
- @force = true
- end
-
- @user = User.current
-
- lg = @user.login
- @pref = @user.pref
- diskfile = disk_filename('User', @user.id)
- diskfile1 = diskfile + 'temp'
- begin
- if request.post?
- changed_login = (@user.login != params[:login])
- changed_mail = (@user.mail != params[:user][:mail])
- @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].strip
- unless @user.user_extensions.nil?
- # 如果用户是从业者,将单位名称保存至学校id字段
- if @user.user_extensions.identity == 3
- # @user.firstname = params[:enterprise_name]
- @user.user_extensions.school_id = params[:occupation]
- 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
- # 修改邮箱的时候同步修改到gitlab
- if changed_mail || changed_login
- g = Gitlab.client
- s = Trustie::Gitlab::Sync.new
- begin
- gid = @user.gid
- if gid.nil?
- gid = s.sync_user(@user).id
- end
- g.edit_user(gid, :email => params[:user][:mail], :username => @user.login)
- rescue Exception => e
- puts e
- end
- end
-
- # 头像保存
- 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
|