File: app/controllers/my_controller.rb

Overview
Module Structure
Class Hierarchy
Code

Overview

Module Structure

  module: <Toplevel Module>
  class: MyController#18
inherits from
  ApplicationController   
has properties
constant: BLOCKS #25
constant: DEFAULT_LAYOUT #34
method: index #38
method: page #44
method: account #50
method: password #69
method: reset_rss_key #90
method: reset_api_key #103
method: page_layout #116
method: add_block #126
method: remove_block #142
method: order_blocks #156

Class Hierarchy

Code

   1  # Redmine - project management software
   2  # Copyright (C) 2006-2011  Jean-Philippe Lang
   3  #
   4  # This program is free software; you can redistribute it and/or
   5  # modify it under the terms of the GNU General Public License
   6  # as published by the Free Software Foundation; either version 2
   7  # of the License, or (at your option) any later version.
   8  #
   9  # This program is distributed in the hope that it will be useful,
  10  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  11  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12  # GNU General Public License for more details.
  13  #
  14  # You should have received a copy of the GNU General Public License
  15  # along with this program; if not, write to the Free Software
  16  # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
  17 
  18  class MyController < ApplicationController
  19    before_filter :require_login
  20 
  21    helper :issues
  22    helper :users
  23    helper :custom_fields
  24 
  25    BLOCKS = { 'issuesassignedtome' => :label_assigned_to_me_issues,
  26               'issuesreportedbyme' => :label_reported_issues,
  27               'issueswatched' => :label_watched_issues,
  28               'news' => :label_news_latest,
  29               'calendar' => :label_calendar,
  30               'documents' => :label_document_plural,
  31               'timelog' => :label_spent_time
  32             }.merge(Redmine::Views::MyPage::Block.additional_blocks).freeze
  33 
  34    DEFAULT_LAYOUT = {  'left' => ['issuesassignedtome'],
  35                        'right' => ['issuesreportedbyme']
  36                     }.freeze
  37 
  38    def index
  39      page
  40      render :action => 'page'
  41    end
  42 
  43    # Show user's page
  44    def page
  45      @user = User.current
  46      @blocks = @user.pref[:my_page_layout] || DEFAULT_LAYOUT
  47    end
  48 
  49    # Edit user's account
  50    def account
  51      @user = User.current
  52      @pref = @user.pref
  53      if request.post?
  54        @user.safe_attributes = params[:user]
  55        @user.pref.attributes = params[:pref]
  56        @user.pref[:no_self_notified] = (params[:no_self_notified] == '1')
  57        if @user.save
  58          @user.pref.save
  59          @user.notified_project_ids = (@user.mail_notification == 'selected' ? params[:notified_project_ids] : [])
  60          set_language_if_valid @user.language
  61          flash[:notice] = l(:notice_account_updated)
  62          redirect_to :action => 'account'
  63          return
  64        end
  65      end
  66    end
  67 
  68    # Manage user's password
  69    def password
  70      @user = User.current
  71      unless @user.change_password_allowed?
  72        flash[:error] = l(:notice_can_t_change_password)
  73        redirect_to :action => 'account'
  74        return
  75      end
  76      if request.post?
  77        if @user.check_password?(params[:password])
  78          @user.password, @user.password_confirmation = params[:new_password], params[:new_password_confirmation]
  79          if @user.save
  80            flash[:notice] = l(:notice_account_password_updated)
  81            redirect_to :action => 'account'
  82          end
  83        else
  84          flash[:error] = l(:notice_account_wrong_password)
  85        end
  86      end
  87    end
  88 
  89    # Create a new feeds key
  90    def reset_rss_key
  91      if request.post?
  92        if User.current.rss_token
  93          User.current.rss_token.destroy
  94          User.current.reload
  95        end
  96        User.current.rss_key
  97        flash[:notice] = l(:notice_feeds_access_key_reseted)
  98      end
  99      redirect_to :action => 'account'
 100    end
 101 
 102    # Create a new API key
 103    def reset_api_key
 104      if request.post?
 105        if User.current.api_token
 106          User.current.api_token.destroy
 107          User.current.reload
 108        end
 109        User.current.api_key
 110        flash[:notice] = l(:notice_api_access_key_reseted)
 111      end
 112      redirect_to :action => 'account'
 113    end
 114 
 115    # User's page layout configuration
 116    def page_layout
 117      @user = User.current
 118      @blocks = @user.pref[:my_page_layout] || DEFAULT_LAYOUT.dup
 119      @block_options = []
 120      BLOCKS.each {|k, v| @block_options << [l("my.blocks.#{v}", :default => [v, v.to_s.humanize]), k.dasherize]}
 121    end
 122 
 123    # Add a block to user's page
 124    # The block is added on top of the page
 125    # params[:block] : id of the block to add
 126    def add_block
 127      block = params[:block].to_s.underscore
 128      (render :nothing => true; return) unless block && (BLOCKS.keys.include? block)
 129      @user = User.current
 130      layout = @user.pref[:my_page_layout] || {}
 131      # remove if already present in a group
 132      %w(top left right).each {|f| (layout[f] ||= []).delete block }
 133      # add it on top
 134      layout['top'].unshift block
 135      @user.pref[:my_page_layout] = layout
 136      @user.pref.save
 137      render :partial => "block", :locals => {:user => @user, :block_name => block}
 138    end
 139 
 140    # Remove a block to user's page
 141    # params[:block] : id of the block to remove
 142    def remove_block
 143      block = params[:block].to_s.underscore
 144      @user = User.current
 145      # remove block in all groups
 146      layout = @user.pref[:my_page_layout] || {}
 147      %w(top left right).each {|f| (layout[f] ||= []).delete block }
 148      @user.pref[:my_page_layout] = layout
 149      @user.pref.save
 150      render :nothing => true
 151    end
 152 
 153    # Change blocks order on user's page
 154    # params[:group] : group to order (top, left or right)
 155    # params[:list-(top|left|right)] : array of block ids of the group
 156    def order_blocks
 157      group = params[:group]
 158      @user = User.current
 159      if group.is_a?(String)
 160        group_items = (params["list-#{group}"] || []).collect(&:underscore)
 161        if group_items and group_items.is_a? Array
 162          layout = @user.pref[:my_page_layout] || {}
 163          # remove group blocks if they are presents in other groups
 164          %w(top left right).each {|f|
 165            layout[f] = (layout[f] || []) - group_items
 166          }
 167          layout[group] = group_items
 168          @user.pref[:my_page_layout] = layout
 169          @user.pref.save
 170        end
 171      end
 172      render :nothing => true
 173    end
 174  end