summaryrefslogtreecommitdiff
path: root/app/controllers/nodes_controller.rb
blob: 482d0ac9ebad68a8592fca4d334b3401753c54e2 (plain)
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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
class NodesController < ApplicationController
  
  # Private
  
  layout 'admin'
  
  before_action :login_required
  before_action :find_node, :only => [
                              :show, 
                              :edit, 
                              :update, 
                              :destroy,
                              :publish,
                              :unlock
                            ]

  def index
    @nodes = Node.root.descendants.includes(:head, :draft)
      .order('id DESC')
      .paginate(:page => params[:page], :per_page => 25)
  end

  def new
    @node = Node.new node_params
    if params.has_key?(:parent_id)
      @parent_id = params[:parent_id]
      @parent_name = Node.find(@parent_id).title
    end
  end
  
  def create
    params[:title] ||= ""
    
    @node = Node.new
    @node.parent_id = find_parent
    @node.slug = params[:title].parameterize.to_s
   
    if @node.save
      @node.draft.update_attributes(:title => params[:title])
      case params[:kind]
        when "update"
          @node.draft.tag_list.add("update")
        when "press_release"
          @node.draft.tag_list.add("update", "pressemitteilung")
      end
      @node.draft.save!
      redirect_to(edit_node_path(@node))
    else
      render :new
    end
  end
  
  def show
    node = Node.find(params[:id])
    node.wipe_draft!
    @page = node.draft || node.head
  end

  def edit
    begin
      @draft = @node.find_or_create_draft( current_user )
    rescue LockedByAnotherUser => e
      flash[:error] = e.message
      if request.referer
        redirect_to request.referer || node_path(@node)
      else
        redirect_to node_path(@node)
      end
    end
  end

  def update
    @node.update_attributes(node_params)
    @draft = @node.find_or_create_draft current_user
    @draft.tag_list = params[:tag_list]
    if @draft.update_attributes( page_params )
      flash[:notice] = "Draft has been saved: #{Time.now}"
      respond_to do |format|
        format.html { redirect_to edit_node_path(@node) }
        format.js
      end
    else
      render :action => :edit
    end
  end

  def destroy
    @node.destroy
  end
  
  def publish
    @node.publish_draft!
    flash[:notice] = "Draft has been published"
    redirect_to node_path(@node)
  end
  
  def unlock
    if @node.unlock!
      flash[:notice] = "Node unlocked"
    else
      flash[:notice] = "Already unlocked"
    end
    
    redirect_to node_path(@node)
  end
  
  private

    def node_params
      params.fetch(:node, {}).permit(:slug, :parent_id)
    end

    def page_params
      params.fetch(:page, {}).permit(:title, :abstract, :body, :template_name, :published_at, :user_id)
    end
  
    def find_node
      @node = Node.find(params[:id])
    end
    
    def find_parent
      case params[:kind]
      when "top_level"
        Node.root.id
      when "update"
        Update.find_or_create_parent.id
      when "press_release"
        Update.find_or_create_parent.id
      when "generic"
        if params[:parent_id] && Node.find(params[:parent_id])
          params[:parent_id]
        else
          nil
        end
      end
    end
end