summaryrefslogtreecommitdiff
path: root/app/models/users_project.rb
blob: 3d76a4df037f49e0ff9313784f708b70252a2198 (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
# == Schema Information
#
# Table name: users_projects
#
#  id             :integer          not null, primary key
#  user_id        :integer          not null
#  project_id     :integer          not null
#  created_at     :datetime         not null
#  updated_at     :datetime         not null
#  project_access :integer          default(0), not null
#

class UsersProject < ActiveRecord::Base
  include GitHost

  GUEST     = 10
  REPORTER  = 20
  DEVELOPER = 30
  MASTER    = 40

  attr_accessible :user, :user_id, :project_access

  belongs_to :user
  belongs_to :project

  after_save :update_repository
  after_destroy :update_repository

  validates :user, presence: true
  validates :user_id, uniqueness: { :scope => [:project_id], message: "already exists in project" }
  validates :project_access, inclusion: { in: [GUEST, REPORTER, DEVELOPER, MASTER] }, presence: true
  validates :project, presence: true

  delegate :name, :email, to: :user, prefix: true

  class << self
    def import_team(source_project, target_project)
      UsersProject.without_repository_callback do
        UsersProject.transaction do
          team = source_project.users_projects.all

          team.each do |tm|
            # Skip if user already present in team
            next if target_project.users.include?(tm.user)

            new_tm = tm.dup
            new_tm.id = nil
            new_tm.project_id = target_project.id
            new_tm.save
          end
        end
      end

      target_project.update_repository
      true
    rescue
      false
    end

    def without_repository_callback
      UsersProject.skip_callback(:destroy, :after, :update_repository)
      yield
      UsersProject.set_callback(:destroy, :after, :update_repository)
    end

    def bulk_delete(project, user_ids)
      UsersProject.transaction do
        UsersProject.where(:user_id => user_ids, :project_id => project.id).each do |users_project|
          users_project.destroy
        end
      end
    end

    def bulk_update(project, user_ids, project_access)
      UsersProject.transaction do
        UsersProject.where(:user_id => user_ids, :project_id => project.id).each do |users_project|
          users_project.project_access = project_access
          users_project.save
        end
      end
    end

    def bulk_import(project, user_ids, project_access)
      UsersProject.transaction do
        user_ids.each do |user_id|
          users_project = UsersProject.new(
            project_access: project_access,
            user_id: user_id
          )
          users_project.project = project
          users_project.save
        end
      end
    end

    def user_bulk_import(user, project_ids, project_access)
      UsersProject.transaction do
        project_ids.each do |project_id|
          users_project = UsersProject.new(
            project_access: project_access,
          )
          users_project.project_id = project_id
          users_project.user_id = user.id
          users_project.save
        end
      end
    end

    def access_roles
      {
        "Guest"     => GUEST,
        "Reporter"  => REPORTER,
        "Developer" => DEVELOPER,
        "Master"    => MASTER
      }
    end
  end

  def role_access
    project_access
  end

  def update_repository
    git_host.update_repository(project)
  end

  def project_access_human
    Project.access_options.key(self.project_access)
  end

  def repo_access_human
    self.class.access_roles.invert[self.project_access]
  end
end