PageRenderTime 51ms CodeModel.GetById 27ms RepoModel.GetById 0ms app.codeStats 0ms

/app/controllers/projects/labels_controller.rb

https://gitlab.com/tbeadle/gitlab-ce
Ruby | 164 lines | 134 code | 30 blank | 0 comment | 6 complexity | 0a59bed4861795e13d74a149ef5b4d26 MD5 | raw file
  1. class Projects::LabelsController < Projects::ApplicationController
  2. include ToggleSubscriptionAction
  3. before_action :check_issuables_available!
  4. before_action :label, only: [:edit, :update, :destroy, :promote]
  5. before_action :find_labels, only: [:index, :set_priorities, :remove_priority, :toggle_subscription]
  6. before_action :authorize_read_label!
  7. before_action :authorize_admin_labels!, only: [:new, :create, :edit, :update,
  8. :generate, :destroy, :remove_priority,
  9. :set_priorities]
  10. before_action :authorize_admin_group_labels!, only: [:promote]
  11. respond_to :js, :html
  12. def index
  13. @prioritized_labels = @available_labels.prioritized(@project)
  14. @labels = @available_labels.unprioritized(@project).page(params[:page])
  15. respond_to do |format|
  16. format.html
  17. format.json do
  18. render json: LabelSerializer.new.represent_appearance(@available_labels)
  19. end
  20. end
  21. end
  22. def new
  23. @label = @project.labels.new
  24. end
  25. def create
  26. @label = Labels::CreateService.new(label_params).execute(project: @project)
  27. if @label.valid?
  28. respond_to do |format|
  29. format.html { redirect_to project_labels_path(@project) }
  30. format.json { render json: @label }
  31. end
  32. else
  33. respond_to do |format|
  34. format.html { render :new }
  35. format.json { render json: { message: @label.errors.messages }, status: :bad_request }
  36. end
  37. end
  38. end
  39. def edit
  40. end
  41. def update
  42. @label = Labels::UpdateService.new(label_params).execute(@label)
  43. if @label.valid?
  44. redirect_to project_labels_path(@project)
  45. else
  46. render :edit
  47. end
  48. end
  49. def generate
  50. Gitlab::IssuesLabels.generate(@project)
  51. if params[:redirect] == 'issues'
  52. redirect_to project_issues_path(@project)
  53. elsif params[:redirect] == 'merge_requests'
  54. redirect_to project_merge_requests_path(@project)
  55. else
  56. redirect_to project_labels_path(@project)
  57. end
  58. end
  59. def destroy
  60. @label.destroy
  61. @labels = find_labels
  62. redirect_to project_labels_path(@project),
  63. status: 302,
  64. notice: 'Label was removed'
  65. end
  66. def remove_priority
  67. respond_to do |format|
  68. label = @available_labels.find(params[:id])
  69. if label.unprioritize!(project)
  70. format.json { render json: label }
  71. else
  72. format.json { head :unprocessable_entity }
  73. end
  74. end
  75. end
  76. def set_priorities
  77. Label.transaction do
  78. available_labels_ids = @available_labels.where(id: params[:label_ids]).pluck(:id)
  79. label_ids = params[:label_ids].select { |id| available_labels_ids.include?(id.to_i) }
  80. label_ids.each_with_index do |label_id, index|
  81. label = @available_labels.find(label_id)
  82. label.prioritize!(project, index)
  83. end
  84. end
  85. respond_to do |format|
  86. format.json { render json: { message: 'success' } }
  87. end
  88. end
  89. def promote
  90. promote_service = Labels::PromoteService.new(@project, @current_user)
  91. begin
  92. return render_404 unless promote_service.execute(@label)
  93. flash[:notice] = "#{@label.title} promoted to <a href=\"#{group_labels_path(@project.group)}\">group label</a>.".html_safe
  94. respond_to do |format|
  95. format.html do
  96. redirect_to(project_labels_path(@project), status: :see_other)
  97. end
  98. format.json do
  99. render json: { url: project_labels_path(@project) }
  100. end
  101. end
  102. rescue ActiveRecord::RecordInvalid => e
  103. Gitlab::AppLogger.error "Failed to promote label \"#{@label.title}\" to group label"
  104. Gitlab::AppLogger.error e
  105. respond_to do |format|
  106. format.html do
  107. redirect_to(project_labels_path(@project),
  108. notice: 'Failed to promote label due to internal error. Please contact administrators.')
  109. end
  110. format.js
  111. end
  112. end
  113. end
  114. protected
  115. def label_params
  116. params.require(:label).permit(:title, :description, :color)
  117. end
  118. def label
  119. @label ||= @project.labels.find(params[:id])
  120. end
  121. def subscribable_resource
  122. @available_labels.find(params[:id])
  123. end
  124. def find_labels
  125. @available_labels ||=
  126. LabelsFinder.new(current_user, project_id: @project.id, include_ancestor_groups: params[:include_ancestor_groups]).execute
  127. end
  128. def authorize_admin_labels!
  129. return render_404 unless can?(current_user, :admin_label, @project)
  130. end
  131. def authorize_admin_group_labels!
  132. return render_404 unless can?(current_user, :admin_label, @project.group)
  133. end
  134. end