projects_controller.rb 4.8 KB
Newer Older
1
class ProjectsController < ApplicationController
2
  skip_before_filter :authenticate_user!, only: [:show]
3 4
  before_filter :project, except: [:new, :create]
  before_filter :repository, except: [:new, :create]
G
gitlabhq 已提交
5 6

  # Authorize
7
  before_filter :authorize_read_project!, except: [:index, :new, :create]
8
  before_filter :authorize_admin_project!, only: [:edit, :update, :destroy, :transfer, :archive, :unarchive, :retry_import]
9
  before_filter :require_non_empty_project, only: [:blob, :tree, :graph]
G
gitlabhq 已提交
10

11
  layout 'navless', only: [:new, :create, :fork]
12
  before_filter :set_title, only: [:new, :create]
C
Cyril 已提交
13

G
gitlabhq 已提交
14 15 16 17 18
  def new
    @project = Project.new
  end

  def edit
19
    render 'edit', layout: "project_settings"
G
gitlabhq 已提交
20 21 22
  end

  def create
23
    @project = ::Projects::CreateService.new(current_user, params[:project]).execute
24
    flash[:notice] = 'Project was successfully created.' if @project.saved?
G
gitlabhq 已提交
25 26 27 28 29

    respond_to do |format|
      format.js
    end
  end
G
gitlabhq 已提交
30

G
gitlabhq 已提交
31
  def update
32
    status = ::Projects::UpdateService.new(@project, current_user, params).execute
33

G
gitlabhq 已提交
34
    respond_to do |format|
35
      if status
36
        flash[:notice] = 'Project was successfully updated.'
D
Dmitriy Zaporozhets 已提交
37
        format.html { redirect_to edit_project_path(@project), notice: 'Project was successfully updated.' }
N
Nihad Abbasov 已提交
38
        format.js
G
gitlabhq 已提交
39
      else
40
        format.html { render "edit", layout: "project_settings" }
N
Nihad Abbasov 已提交
41
        format.js
G
gitlabhq 已提交
42
      end
G
gitlabhq 已提交
43
    end
44
  end
45

46
  def transfer
47
    ::Projects::TransferService.new(project, current_user, params).execute
G
gitlabhq 已提交
48 49 50
  end

  def show
51 52 53 54 55
    if @project.import_in_progress?
      redirect_to import_project_path(@project)
      return
    end

56
    return authenticate_user! unless @project.public? || current_user
57

58
    limit = (params[:limit] || 20).to_i
59 60 61
    @events = @project.events.recent
    @events = event_filter.apply_filter(@events)
    @events = @events.limit(limit).offset(params[:offset] || 0)
D
Dmitriy Zaporozhets 已提交
62 63

    respond_to do |format|
N
Nihad Abbasov 已提交
64
      format.html do
65
        if @project.empty_repo?
66
          render "projects/empty", layout: user_layout
67
        else
68
          @last_push = current_user.recent_push(@project.id) if current_user
69
          render :show, layout: user_layout
70
        end
D
Dmitriy Zaporozhets 已提交
71
      end
72
      format.json { pager_json("events/_events", @events.count) }
D
Dmitriy Zaporozhets 已提交
73
    end
74 75
  end

76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97
  def import
    if project.import_finished?
      redirect_to @project
      return
    end
  end

  def retry_import
    unless @project.import_failed?
      redirect_to import_project_path(@project)
    end

    @project.import_url = params[:project][:import_url]

    if @project.save
      @project.reload
      @project.import_retry
    end

    redirect_to import_project_path(@project)
  end

G
gitlabhq 已提交
98
  def destroy
99 100
    return access_denied! unless can?(current_user, :remove_project, project)

D
Dmitriy Zaporozhets 已提交
101
    project.team.truncate
G
gitlabhq 已提交
102 103 104
    project.destroy

    respond_to do |format|
R
randx 已提交
105
      format.html { redirect_to root_path }
G
gitlabhq 已提交
106 107
    end
  end
108 109

  def fork
110
    @forked_project = ::Projects::ForkService.new(project, current_user).execute
111 112 113

    respond_to do |format|
      format.html do
114 115
        if @forked_project.saved? && @forked_project.forked?
          redirect_to(@forked_project, notice: 'Project was successfully forked.')
116
        else
117
          @title = 'Fork project'
118
          render "fork"
119 120 121 122 123
        end
      end
      format.js
    end
  end
124 125

  def autocomplete_sources
M
Marin Jankovski 已提交
126 127 128 129 130 131 132
    note_type = params['type']
    note_id = params['type_id']
    participating = if note_type && note_id
      participants_in(note_type, note_id)
    else
      []
    end
M
Marin Jankovski 已提交
133
    team_members = sorted(@project.team.members)
M
Marin Jankovski 已提交
134
    participants = team_members + participating
135
    @suggestions = {
136
      emojis: Emoji.names.map { |e| { name: e, path: view_context.image_url("emoji/#{e}.png") } },
137
      issues: @project.issues.select([:iid, :title, :description]),
138
      mergerequests: @project.merge_requests.select([:iid, :title, :description]),
M
Marin Jankovski 已提交
139
      members: participants
140 141 142 143 144 145
    }

    respond_to do |format|
      format.json { render :json => @suggestions }
    end
  end
146

147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164
  def archive
    return access_denied! unless can?(current_user, :archive_project, project)
    project.archive!

    respond_to do |format|
      format.html { redirect_to @project }
    end
  end

  def unarchive
    return access_denied! unless can?(current_user, :archive_project, project)
    project.unarchive!

    respond_to do |format|
      format.html { redirect_to @project }
    end
  end

165 166 167 168 169
  private

  def set_title
    @title = 'New Project'
  end
170 171 172 173

  def user_layout
    current_user ? "projects" : "public_projects"
  end
M
Marin Jankovski 已提交
174 175

  def participants_in(type, id)
M
Marin Jankovski 已提交
176
    users = case type
M
Marin Jankovski 已提交
177
    when "Issue", "MergeRequest"
M
Marin Jankovski 已提交
178 179 180 181
      type.constantize.find_by_iid(id).participants
    when "Commit"
      author_ids = Note.for_commit_id(id).pluck(:author_id).uniq
      User.where(id: author_ids)
M
Marin Jankovski 已提交
182 183 184
    else
      []
    end
M
Marin Jankovski 已提交
185 186 187 188 189
    sorted(users)
  end

  def sorted(users)
    users.uniq.sort_by(&:username).map { |user| { username: user.username, name: user.name } }
M
Marin Jankovski 已提交
190
  end
G
gitlabhq 已提交
191
end