2 # This file is part of SMR.
4 # SMR is free software: you can redistribute it and/or modify it under the
5 # terms of the GNU General Public License as published by the Free Software
6 # Foundation, either version 3 of the License, or (at your option) any later
9 # SMR is distributed in the hope that it will be useful, but WITHOUT ANY
10 # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
11 # A PARTICULAR PURPOSE. See the GNU General Public License for more details.
13 # You should have received a copy of the GNU General Public License along with
14 # SMR. If not, see <http://www.gnu.org/licenses/>.
18 # provides fundamental means to use SMR
19 class ApplicationController < ActionController::Base
20 before_filter :force_login
21 helper_method :current_user
22 helper_method :smr_menu_addsubitem
25 # extend parent constructor with @smr_menu_items, see
26 # smr_menu_addsubitem()
29 # I don not understand where these symbols come from? However,
30 # when smr_menu() builds the menu it happens that +:root+
31 # refers to +root_path+ and +:cashflow+ refers to +cashflow_path+
33 # If one specifies a symbol for the actual method name, like
34 # +:root_path+ that will become translated into +:root_path_path+
35 # and trigger an error 'unknown method'.
40 'cashflow'=>:cashflow_index,
41 'watchlist'=>:watchlist_index,
42 'quote records'=>:quoterecords,
45 'documents'=>:documents,
53 # redirect to login unless we have a authenticated current_user
55 unless current_user or params[:controller].eql?'sessions'
56 redirect_to :controller=>'sessions', :action=>'new'
61 # find current_user by :auth_token cookie
63 @current_user ||= User.find_by_password_auth_token!(cookies[:auth_token]) if cookies[:auth_token]
69 # set session parameters that are of global use
70 # - these can be modified through POST from anywhere
72 # you may POST these params:
74 # - smr_browse_date = {"day"=>"23","month"=>"5","year"=>"2010"}
76 def set_session_params
78 if params[:smr_browse_date] then
79 d=params[:smr_browse_date]
80 session[:smr_browse_date] = Time.new(d['year'],d['month'],d['day']).end_of_day.to_i
83 if params[:smr_step_date] then
84 case params[:smr_step_date]
85 when 'day_back' then session[:smr_browse_date] -= 1.days
86 when 'day_forward' then session[:smr_browse_date] += 1.days
94 # return date the user is currently browsing, as Time
96 session[:smr_browse_date] = Time.now.end_of_day.to_i if session[:smr_browse_date].nil?
97 Time.at(session[:smr_browse_date])
101 # extends @smr_menu_items by adding sub elements to a top level
102 # entry. Note that you can only extend exising entries but not
103 # add your own top level entry.
104 def smr_menu_addsubitem(name, subitems)
105 raise 'subitems must be a Hash' if not subitems.is_a?(Hash)
106 raise 'name must exist in @smr_menu_items' if not @smr_menu_items[name]
108 toplink=@smr_menu_items[name]
109 @smr_menu_items[name] = subitems
110 @smr_menu_items[name]['_toplink'] = toplink
114 # Collection of securities (of Stock) to display or select from.
116 # The list is ordered by Stock.name while open positions are prefered
117 # and put in front, see AssetsController.
118 def smr_securities_list
119 securities = Stock.all.order(:name).to_a
121 # put securities held in open positions in front of the list
122 if not smr_stocks_in_open_positions_list.empty? then
124 securities.delete_if do |s|
125 if smr_stocks_in_open_positions_list.include?(s.id) then
130 open.sort_by!{|s| s.name}
131 securities = open + securities
137 # Collection of Portfolio objects of current user to display or select
140 # By default, only those having open positions in it will be shown. Use the
141 # options to change that behaviour.
142 def smr_portfolios_list(options={:show_all=>false})
143 if options[:show_all] then
144 Portfolio.where(:id_user=>current_user.id).order(:order).to_a
146 Portfolio.with_open_positions(current_user.id).order(:order).to_a
151 # Collection of Stock.id numbers held in open positions by the current
154 # This is cached in the session. Either some code fills the cache by giving
155 # :fill_initially or this method takes care of filling it (expensive).
157 # :fill_initially should be a collection of Smr::AssetsPosition.
158 def smr_stocks_in_open_positions_list(fill_initially=false)
159 if fill_initially then
160 session[:smr_stocks_in_open_positions_cache] = fill_initially.collect{ |p| p.stock.id }.uniq
163 if not session[:smr_stocks_in_open_positions_cache].is_a?(Array) then
164 assets = Smr::Asset.new(current_user.id, smr_browse_date)
165 session[:smr_stocks_in_open_positions_cache] = assets.open_positions.collect{ |p| p.stock.id }.uniq
167 session[:smr_stocks_in_open_positions_cache]
171 # Returns sanitized page number as set by +params[:page]+.
173 JustPaginate.page_value(params[:page])
177 # Paginate a collection if things.
178 def smr_paginate(current_page, collection, items_per_page=20)
179 JustPaginate.paginate(current_page, items_per_page, collection.count) do |range|
180 collection.slice(range)