diff options
Diffstat (limited to 'app/models')
-rw-r--r-- | app/models/.gitkeep | 0 | ||||
-rw-r--r-- | app/models/ability.rb | 34 | ||||
-rw-r--r-- | app/models/issue.rb | 39 | ||||
-rw-r--r-- | app/models/key.rb | 58 | ||||
-rw-r--r-- | app/models/note.rb | 41 | ||||
-rw-r--r-- | app/models/project.rb | 149 | ||||
-rw-r--r-- | app/models/user.rb | 52 | ||||
-rw-r--r-- | app/models/users_project.rb | 35 |
8 files changed, 408 insertions, 0 deletions
diff --git a/app/models/.gitkeep b/app/models/.gitkeep new file mode 100644 index 00000000000..e69de29bb2d --- /dev/null +++ b/app/models/.gitkeep diff --git a/app/models/ability.rb b/app/models/ability.rb new file mode 100644 index 00000000000..0a2c45f1289 --- /dev/null +++ b/app/models/ability.rb @@ -0,0 +1,34 @@ +class Ability + def self.allowed(object, subject) + case subject.class.name + when "Project" then project_abilities(object, subject) + else [] + end + end + + def self.project_abilities(user, project) + rules = [] + + rules << [ + :read_project, + :read_issue, + :read_team_member, + :read_note + ] if project.readers.include?(user) + + rules << [ + :write_project, + :write_issue, + :write_note + ] if project.writers.include?(user) + + rules << [ + :admin_project, + :admin_issue, + :admin_team_member, + :admin_note + ] if project.admins.include?(user) + + rules.flatten + end +end diff --git a/app/models/issue.rb b/app/models/issue.rb new file mode 100644 index 00000000000..0399607efe6 --- /dev/null +++ b/app/models/issue.rb @@ -0,0 +1,39 @@ +class Issue < ActiveRecord::Base + belongs_to :project + belongs_to :author, :class_name => "User" + belongs_to :assignee, :class_name => "User" + has_many :notes, :as => :noteable + + attr_protected :author, :author_id, :project, :project_id + + validates_presence_of :project_id + validates_presence_of :assignee_id + validates_presence_of :author_id + + validates :title, + :presence => true, + :length => { :within => 0..255 } + + validates :content, + :presence => true, + :length => { :within => 0..2000 } + + scope :opened, where(:closed => false) + scope :closed, where(:closed => true) + scope :assigned, lambda { |u| where(:assignee_id => u.id)} +end +# == Schema Information +# +# Table name: issues +# +# id :integer not null, primary key +# title :string(255) +# content :text +# assignee_id :integer +# author_id :integer +# project_id :integer +# created_at :datetime +# updated_at :datetime +# closed :boolean default(FALSE), not null +# + diff --git a/app/models/key.rb b/app/models/key.rb new file mode 100644 index 00000000000..9fa8958772d --- /dev/null +++ b/app/models/key.rb @@ -0,0 +1,58 @@ +class Key < ActiveRecord::Base + belongs_to :user + + validates :title, + :presence => true, + :length => { :within => 0..255 } + + validates :key, + :presence => true, + :uniqueness => true, + :length => { :within => 0..555 } + + before_save :set_identifier + after_save :update_gitosis + after_destroy :gitosis_delete_key + + def set_identifier + self.identifier = "#{user.identifier}_#{Time.now.to_i}" + end + + def update_gitosis + Gitosis.new.configure do |c| + c.update_keys(identifier, key) + + projects.each do |project| + c.update_project(project.path, project.gitosis_writers) + end + end + end + + def gitosis_delete_key + Gitosis.new.configure do |c| + c.delete_key(identifier) + + projects.each do |project| + c.update_project(project.path, project.gitosis_writers) + end + end + end + + #projects that has this key + def projects + user.projects + end +end +# == Schema Information +# +# Table name: keys +# +# id :integer not null, primary key +# user_id :integer not null +# created_at :datetime +# updated_at :datetime +# key :text +# title :string(255) +# identifier :string(255) +# + diff --git a/app/models/note.rb b/app/models/note.rb new file mode 100644 index 00000000000..f89fb9f8995 --- /dev/null +++ b/app/models/note.rb @@ -0,0 +1,41 @@ +require 'carrierwave/orm/activerecord' +require 'file_size_validator' + +class Note < ActiveRecord::Base + belongs_to :project + belongs_to :noteable, :polymorphic => true + belongs_to :author, + :class_name => "User" + + attr_protected :author, :author_id + + validates_presence_of :project + + validates :note, + :presence => true, + :length => { :within => 0..255 } + + validates :attachment, + :file_size => { + :maximum => 10.megabytes.to_i + } + + scope :common, where(:noteable_id => nil) + + mount_uploader :attachment, AttachmentUploader +end +# == Schema Information +# +# Table name: notes +# +# id :integer not null, primary key +# note :string(255) +# noteable_id :string(255) +# noteable_type :string(255) +# author_id :integer +# created_at :datetime +# updated_at :datetime +# project_id :integer +# attachment :string(255) +# + diff --git a/app/models/project.rb b/app/models/project.rb new file mode 100644 index 00000000000..4d9461a1152 --- /dev/null +++ b/app/models/project.rb @@ -0,0 +1,149 @@ +require "grit" + +class Project < ActiveRecord::Base + has_many :issues, :dependent => :destroy + has_many :users_projects, :dependent => :destroy + has_many :users, :through => :users_projects + has_many :notes, :dependent => :destroy + + validates :name, + :uniqueness => true, + :presence => true, + :length => { :within => 0..255 } + + validates :path, + :uniqueness => true, + :presence => true, + :length => { :within => 0..255 } + + validates :description, + :length => { :within => 0..2000 } + + validates :code, + :presence => true, + :uniqueness => true, + :length => { :within => 3..12 } + + before_save :format_code + after_destroy :destroy_gitosis_project + after_save :update_gitosis_project + + attr_protected :private_flag + + scope :public_only, where(:private_flag => false) + + def to_param + code + end + + def common_notes + notes.where(:noteable_type => ["", nil]) + end + + def format_code + read_attribute(:code).downcase.strip.gsub(' ', '') + end + + + def update_gitosis_project + Gitosis.new.configure do |c| + c.update_project(path, gitosis_writers) + end + end + + def destroy_gitosis_project + Gitosis.new.configure do |c| + c.destroy_project(self) + end + end + + def add_access(user, *access) + opts = { :user => user } + access.each { |name| opts.merge!(name => true) } + users_projects.create(opts) + end + + def reset_access(user) + users_projects.where(:project_id => self.id, :user_id => user.id).destroy if self.id + end + + def writers + @writers ||= users_projects.includes(:user).where(:write => true).map(&:user) + end + + def gitosis_writers + keys = Key.joins({:user => :users_projects}).where("users_projects.project_id = ? AND users_projects.write = ?", id, true) + keys.map(&:identifier) + end + + def readers + @readers ||= users_projects.includes(:user).where(:read => true).map(&:user) + end + + def admins + @admins ||=users_projects.includes(:user).where(:admin => true).map(&:user) + end + + def public? + !private_flag + end + + def private? + private_flag + end + + def url_to_repo + "#{GITOSIS["git_user"]}@#{GITOSIS["host"]}:#{path}.git" + end + + def path_to_repo + GITOSIS["base_path"] + path + ".git" + end + + def repo + @repo ||= Grit::Repo.new(path_to_repo) + end + + def tags + repo.tags.map(&:name).sort.reverse + end + + def repo_exists? + repo rescue false + end + + def commit(commit_id = nil) + if commit_id + repo.commits(commit_id).first + else + repo.commits.first + end + end + + def tree(fcommit, path = nil) + fcommit = commit if fcommit == :head + tree = fcommit.tree + path ? (tree / path) : tree + end + + def valid_repo? + repo + rescue + errors.add(:path, "Invalid repository path") + false + end +end +# == Schema Information +# +# Table name: projects +# +# id :integer not null, primary key +# name :string(255) +# path :string(255) +# description :text +# created_at :datetime +# updated_at :datetime +# private_flag :boolean default(TRUE), not null +# code :string(255) +# + diff --git a/app/models/user.rb b/app/models/user.rb new file mode 100644 index 00000000000..fdb4414576f --- /dev/null +++ b/app/models/user.rb @@ -0,0 +1,52 @@ +class User < ActiveRecord::Base + # Include default devise modules. Others available are: + # :token_authenticatable, :encryptable, :confirmable, :lockable, :timeoutable and :omniauthable + devise :database_authenticatable, + :recoverable, :rememberable, :trackable, :validatable + + # Setup accessible (or protected) attributes for your model + attr_accessible :email, :password, :password_confirmation, :remember_me, :name + + has_many :users_projects, :dependent => :destroy + has_many :projects, :through => :users_projects + has_many :keys, :dependent => :destroy + has_many :issues, + :foreign_key => :author_id, + :dependent => :destroy + + has_many :assigned_issues, + :class_name => "Issue", + :foreign_key => :assignee_id, + :dependent => :destroy + + scope :not_in_project, lambda { |project| where("id not in (:ids)", :ids => project.users.map(&:id) ) } + + def identifier + email.gsub "@", "_" + end + + def is_admin? + admin + end +end +# == Schema Information +# +# Table name: users +# +# id :integer not null, primary key +# email :string(255) default(""), not null +# encrypted_password :string(128) default(""), not null +# reset_password_token :string(255) +# reset_password_sent_at :datetime +# remember_created_at :datetime +# sign_in_count :integer default(0) +# current_sign_in_at :datetime +# last_sign_in_at :datetime +# current_sign_in_ip :string(255) +# last_sign_in_ip :string(255) +# created_at :datetime +# updated_at :datetime +# name :string(255) +# admin :boolean default(FALSE), not null +# + diff --git a/app/models/users_project.rb b/app/models/users_project.rb new file mode 100644 index 00000000000..bdc10633a3e --- /dev/null +++ b/app/models/users_project.rb @@ -0,0 +1,35 @@ +class UsersProject < ActiveRecord::Base + belongs_to :user + belongs_to :project + + attr_protected :project_id, :project + + after_commit :update_gitosis_project + + validates_uniqueness_of :user_id, :scope => [:project_id] + validates_presence_of :user_id + validates_presence_of :project_id + + delegate :name, :email, :to => :user, :prefix => true + + def update_gitosis_project + Gitosis.new.configure do |c| + c.update_project(project.path, project.gitosis_writers) + end + end + +end +# == Schema Information +# +# Table name: users_projects +# +# id :integer not null, primary key +# user_id :integer not null +# project_id :integer not null +# read :boolean default(FALSE) +# write :boolean default(FALSE) +# admin :boolean default(FALSE) +# created_at :datetime +# updated_at :datetime +# + |