labels_controller.rb 4.61 KB
Newer Older
1
class Projects::LabelsController < Projects::ApplicationController
2 3
  include ToggleSubscriptionAction

4
  before_action :module_enabled
5
  before_action :label, only: [:edit, :update, :destroy, :promote]
6
  before_action :find_labels, only: [:index, :set_priorities, :remove_priority, :toggle_subscription]
7
  before_action :authorize_read_label!
8 9 10
  before_action :authorize_admin_labels!, only: [:new, :create, :edit, :update,
                                                 :generate, :destroy, :remove_priority,
                                                 :set_priorities]
11
  before_action :authorize_admin_group!, only: [:promote]
randx's avatar
randx committed
12 13 14 15

  respond_to :js, :html

  def index
16 17
    @prioritized_labels = @available_labels.prioritized(@project)
    @labels = @available_labels.unprioritized(@project).page(params[:page])
18 19 20 21

    respond_to do |format|
      format.html
      format.json do
22
        render json: @available_labels.as_json(only: [:id, :title, :color])
23 24
      end
    end
randx's avatar
randx committed
25 26
  end

27 28 29 30 31 32 33 34
  def new
    @label = @project.labels.new
  end

  def create
    @label = @project.labels.create(label_params)

    if @label.valid?
35 36 37 38
      respond_to do |format|
        format.html { redirect_to namespace_project_labels_path(@project.namespace, @project) }
        format.json { render json: @label }
      end
39
    else
40
      respond_to do |format|
41
        format.html { render :new }
42 43
        format.json { render json: { message: @label.errors.messages }, status: 400 }
      end
44 45 46 47 48 49 50 51
    end
  end

  def edit
  end

  def update
    if @label.update_attributes(label_params)
Vinnie Okada's avatar
Vinnie Okada committed
52
      redirect_to namespace_project_labels_path(@project.namespace, @project)
53
    else
54
      render :edit
55 56 57
    end
  end

58
  def generate
59
    Gitlab::IssuesLabels.generate(@project)
60

61
    if params[:redirect] == 'issues'
Vinnie Okada's avatar
Vinnie Okada committed
62
      redirect_to namespace_project_issues_path(@project.namespace, @project)
63
    elsif params[:redirect] == 'merge_requests'
Vinnie Okada's avatar
Vinnie Okada committed
64 65
      redirect_to namespace_project_merge_requests_path(@project.namespace,
                                                        @project)
66
    else
Vinnie Okada's avatar
Vinnie Okada committed
67
      redirect_to namespace_project_labels_path(@project.namespace, @project)
68
    end
69 70
  end

Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
71 72
  def destroy
    @label.destroy
73
    @labels = find_labels
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
74

75
    redirect_to(namespace_project_labels_path(@project.namespace, @project), notice: 'Label was removed')
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
76 77
  end

78
  def remove_priority
79
    respond_to do |format|
80
      label = @available_labels.find(params[:id])
81

82
      if label.unprioritize!(project)
83 84
        format.json { render json: label }
      else
85
        format.json { head :unprocessable_entity }
86 87 88 89
      end
    end
  end

Alfredo Sumaran's avatar
Alfredo Sumaran committed
90
  def set_priorities
91
    Label.transaction do
92 93
      available_labels_ids = @available_labels.where(id: params[:label_ids]).pluck(:id)
      label_ids = params[:label_ids].select { |id| available_labels_ids.include?(id.to_i) }
94

95 96 97
      label_ids.each_with_index do |label_id, index|
        label = @available_labels.find(label_id)
        label.prioritize!(project, index)
98 99 100
      end
    end

101
    respond_to do |format|
102
      format.json { render json: { message: 'success' } }
103 104 105
    end
  end

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
  def promote
    promote_service = Labels::PromoteService.new(@project, @current_user)

    begin
      return render_404 unless promote_service.execute(@label)
      respond_to do |format|
        format.html do
          redirect_to(namespace_project_labels_path(@project.namespace, @project),
                      notice: 'Label was promoted to a Group Label')
        end
        format.js
      end
    rescue ActiveRecord::RecordInvalid => e
      Gitlab::AppLogger.error "Failed to promote label \"#{@label.title}\" to group label"
      Gitlab::AppLogger.error e

      respond_to do |format|
        format.html do
          redirect_to(namespace_project_labels_path(@project.namespace, @project),
                      notice: 'Failed to promote label due to internal error. Please contact administrators.')
        end
        format.js
      end
    end
  end

randx's avatar
randx committed
132 133 134
  protected

  def module_enabled
135
    unless @project.feature_available?(:issues, current_user) || @project.feature_available?(:merge_requests, current_user)
136 137
      return render_404
    end
randx's avatar
randx committed
138
  end
139 140

  def label_params
Alfredo Sumaran's avatar
Alfredo Sumaran committed
141
    params.require(:label).permit(:title, :description, :color)
142 143 144
  end

  def label
145
    @label ||= @project.labels.find(params[:id])
146
  end
147 148 149 150

  def subscribable_resource
    @available_labels.find(params[:id])
  end
151

152
  def find_labels
153
    @available_labels ||= LabelsFinder.new(current_user, project_id: @project.id).execute
154 155
  end

156 157 158
  def authorize_admin_labels!
    return render_404 unless can?(current_user, :admin_label, @project)
  end
159 160 161 162

  def authorize_admin_group!
    return render_404 unless can?(current_user, :admin_group, @project.group)
  end
randx's avatar
randx committed
163
end