File: application_controller_patch.rb

package info (click to toggle)
redmine-plugin-pretend 0.0.2%2Bgit20130821-4
  • links: PTS, VCS
  • area: main
  • in suites: stretch
  • size: 168 kB
  • ctags: 30
  • sloc: ruby: 94; makefile: 35
file content (73 lines) | stat: -rw-r--r-- 1,660 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
require_dependency 'application_controller'

module PretendPatches
  module ApplicationControllerPatch
    def self.included(base)
      base.extend(ClassMethods)
      base.send(:include, InstanceMethods)

      base.class_eval do
        unloadable # Send unloadable so it will not be unloaded in development
      end
    end

    module ClassMethods
    end

    module InstanceMethods
      def pretend_to
        render_403 unless can_pretend?

        if not_pretended?
          remember_current_user
          user = User.find(params[:id])

          logger.info "#{ User.current } is pretend as #{user}"
          set_user(user)
        end

        redirect_to :back
      end

      def unpretend
        if real_user
          logger.info "#{ session[:real_user_id] } stop pretend"
          set_user(real_user)
          reset_pretent_storage
        end
        redirect_to :back
      end

      def real_user
        @real_user ||= User.find_by_id(User.active.find(session[:real_user_id]))
      end

      private

      def set_user(user)
        User.current = user
        start_user_session(user)
      end

      def not_pretended?
        !session[:real_user_id]
      end

      def can_pretend?
        User.current.logged? && User.current.admin?
      end

      def remember_current_user
        session[:real_user_id] = User.current.id
      end

      def reset_pretent_storage
        session[:real_user_id] = nil
      end
    end
  end
end

unless ApplicationController.included_modules.include?(PretendPatches::ApplicationControllerPatch)
  ApplicationController.send(:include, PretendPatches::ApplicationControllerPatch)
end