Skip to content
Snippets Groups Projects
Commit 0f6ebcb6 authored by gitlabhq's avatar gitlabhq
Browse files

v1.0

parent 93efff94
No related branches found
No related tags found
No related merge requests found
Showing
with 734 additions and 0 deletions
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
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
#
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)
#
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)
#
require "grit"
class Project < ActiveRecord::Base
belongs_to :owner, :class_name => "User"
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 }
validates :owner,
:presence => true
validate :check_limit
before_save :format_code
after_destroy :destroy_gitosis_project
after_save :update_gitosis_project
attr_protected :private_flag, :owner_id
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 check_limit
unless owner.can_create_project?
errors[:base] << ("Your own projects limit is #{owner.projects_limit}! Please contact administrator to increase it")
end
rescue
errors[:base] << ("Cant check your ability to create project")
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)
# owner_id :integer
#
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, :projects_limit
has_many :users_projects, :dependent => :destroy
has_many :projects, :through => :users_projects
has_many :my_own_projects, :class_name => "Project", :foreign_key => :owner_id
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
def can_create_project?
projects_limit >= my_own_projects.count
end
def last_activity_project
projects.first
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
# projects_limit :integer
#
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
#
# encoding: utf-8
class AttachmentUploader < CarrierWave::Uploader::Base
# Include RMagick or ImageScience support:
# include CarrierWave::RMagick
# include CarrierWave::MiniMagick
# include CarrierWave::ImageScience
# Choose what kind of storage to use for this uploader:
storage :file
# storage :fog
# Override the directory where uploaded files will be stored.
# This is a sensible default for uploaders that are meant to be mounted:
def store_dir
"uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
end
# Provide a default URL as a default if there hasn't been a file uploaded:
# def default_url
# "/images/fallback/" + [version_name, "default.png"].compact.join('_')
# end
# Process files as they are uploaded:
# process :scale => [200, 300]
#
# def scale(width, height)
# # do something
# end
# Create different versions of your uploaded files:
# version :thumb do
# process :scale => [50, 50]
# end
# Add a white list of extensions which are allowed to be uploaded.
# For images you might use something like this:
# def extension_white_list
# %w(jpg jpeg gif png)
# end
# Override the filename of the uploaded files:
# Avoid using model.id or version_name here, see uploader/store.rb for details.
# def filename
# "something.jpg" if original_filename
# end
end
%div.top_project_menu
%span= link_to "Users", admin_users_path, :style => "width:50px;", :class => controller.controller_name == "users" ? "current" : nil
%span= link_to "Projects", admin_projects_path, :style => "width:50px;", :class => controller.controller_name == "projects" ? "current" : nil
%span= link_to "Teams", admin_team_members_path, :style => "width:50px;", :class => controller.controller_name == "team_members" ? "current" : nil
%span= link_to "Emails", admin_emails_path, :style => "width:50px;", :class => controller.controller_name == "mailer" ? "current" : nil
%p This is page with preview for all system emails that are sent to user
%p Email previews built based on existing Project/Commit/Issue base - so some preview maybe unavailable unless object appear in system
#accordion
%h3
%a New user
%div
%iframe{ :src=> admin_mailer_preview_user_new_path, :width=>"100%", :height=>"350"}
%h3
%a New issue
%div
%iframe{ :src=> admin_mailer_preview_issue_new_path, :width=>"100%", :height=>"350"}
%h3
%a Commit note
%div
%iframe{ :src=> admin_mailer_preview_note_path(:type => "Commit"), :width=>"100%", :height=>"350"}
%h3
%a Issue note
%div
%iframe{ :src=> admin_mailer_preview_note_path(:type => "Issue"), :width=>"100%", :height=>"350"}
%h3
%a Wall note
%div
%iframe{ :src=> admin_mailer_preview_note_path(:type => "Wall"), :width=>"100%", :height=>"350"}
:javascript
$(function() {
$( "#accordion" ).accordion(); });
= form_for [:admin, @admin_project] do |f|
-if @admin_project.errors.any?
#error_explanation
%h2= "#{pluralize(@admin_project.errors.count, "error")} prohibited this admin_project from being saved:"
%ul
- @admin_project.errors.full_messages.each do |msg|
%li= msg
.span-24
.span-12
.field
= f.label :name
%br
= f.text_field :name
.field
= f.label :code
%br
= f.text_field :code
.field
= f.label :path
%br
= f.text_field :path
.span-10
.field
= f.label :description
%br
= f.text_area :description
.clear
.actions
= f.submit 'Save', :class => "lbutton"
= render 'form'
= link_to 'Show', [:admin, @admin_project]
\|
= link_to 'Back', admin_projects_path
%table
%tr
%th Name
%th Code
%th Path
%th Team Members
%th Last Commit
%th
%th
%th
- @admin_projects.each do |project|
%tr
%td= project.name
%td= project.code
%td= project.path
%td= project.users_projects.count
%td= last_commit(project)
%td= link_to 'Show', [:admin, project]
%td= link_to 'Edit', edit_admin_project_path(project), :id => "edit_#{dom_id(project)}"
%td= link_to 'Destroy', [:admin, project], :confirm => 'Are you sure?', :method => :delete
%br
= paginate @admin_projects
= link_to 'New Project', new_admin_project_path
%h1 New project
= render 'form'
= link_to 'Back', admin_projects_path
%p#notice= notice
.span-8.colborder
%h2= @admin_project.name
%p
%b Name:
= @admin_project.name
%p
%b Code:
= @admin_project.code
%p
%b Path:
= @admin_project.path
%p
%b Description:
= @admin_project.description
= link_to 'Edit', edit_admin_project_path(@admin_project)
\|
= link_to 'Back', admin_projects_path
.span-14
%h2 Team
%table.round-borders
%tr
%th Name
%th Added
%th Web
%th Git
%th Admin
%th
- @admin_project.users_projects.each do |tm|
%tr
%td= link_to tm.user_name, admin_team_member_path(tm)
%td= time_ago_in_words(tm.updated_at) + " ago"
%td= check_box_tag "read", 1, @admin_project.readers.include?(tm.user), :disabled => :disabled
%td= check_box_tag "commit", 1, @admin_project.writers.include?(tm.user), :disabled => :disabled
%td.span-2= check_box_tag "admin", 1, @admin_project.admins.include?(tm.user), :disabled => :disabled
%td= link_to 'Destroy', admin_team_member_path(tm), :confirm => 'Are you sure?', :method => :delete
= link_to 'New Team Member', new_admin_team_member_path(:team_member => {:project_id => @admin_project.id})
= form_for @admin_team_member, :as => :team_member, :url => @admin_team_member.new_record? ? admin_team_members_path(@admin_team_member) : admin_team_member_path(@admin_team_member) do |f|
-if @admin_team_member.errors.any?
#error_explanation
%h2= "#{pluralize(@admin_team_member.errors.count, "error")} prohibited this admin_project from being saved:"
%ul
- @admin_team_member.errors.full_messages.each do |msg|
%li= msg
.span-10
- if @admin_team_member.new_record?
.field
= f.label :user_id
%br
= f.select :user_id, User.all.map { |user| [user.name, user.id] }
.field
= f.label :project_id
%br
= f.select :project_id, Project.all.map { |user| [user.name, user.id] }
.span-10
.span-6
%b Access:
.span-8
= f.check_box :read
Web Access (Browse Repo)
.span-8
= f.check_box :write
Git Access (User will be added to commiters list)
.span-6.append-bottom
= f.check_box :admin
Admin (Can manage project)
%hr
.actions
= f.submit 'Save'
= render 'form'
= link_to 'Show', admin_team_member_path(@admin_team_member)
\|
= link_to 'Back', admin_team_members_path
- @admin_team_members.group_by(&:project).sort.each do |project, members|
%h3= link_to project.name, [:admin, project]
%table
%tr
%th Name
%th Email
%th Read
%th Git
%th Manage
%th Added
%th
%th
%th
- members.each do |tm|
- user = tm.user
%tr
%td.span-6= tm.user_name
%td.span-6= tm.user_email
%td.span-1= check_box_tag "read", 1, project.readers.include?(user), :disabled => :disabled
%td.span-1= check_box_tag "commit", 1, project.writers.include?(user), :disabled => :disabled
%td.span-2= check_box_tag "admin", 1, project.admins.include?(user), :disabled => :disabled
%td.span-3= time_ago_in_words(tm.updated_at) + " ago"
%td= link_to 'Show', admin_team_member_path(tm)
%td= link_to 'Edit', edit_admin_team_member_path(tm), :id => "edit_#{dom_id(tm)}"
%td= link_to 'Destroy', admin_team_member_path(tm), :confirm => 'Are you sure?', :method => :delete
%br
= paginate @admin_team_members
= link_to 'New Team Member', new_admin_team_member_path
%h1 New team member
= render 'form'
= link_to 'Back', admin_team_members_path
%p#notice= notice
.span-10
%p
%b Name:
= @admin_team_member.user_name
%p
%b Project:
= @admin_team_member.project.name
%p
%b Since:
= @admin_team_member.updated_at
.span-10
.span-6
%b Access:
.span-8
= check_box_tag "read", 1, @admin_team_member.read, :disabled => :disabled
Web Access (Browse Repo)
.span-8
= check_box_tag "commit", 1, @admin_team_member.write, :disabled => :disabled
Git Access (User will be added to commiters list)
.span-6.append-bottom
= check_box_tag "admin", 1, @admin_team_member.admin, :disabled => :disabled
Admin (Can manage project)
%hr
= link_to 'Edit', edit_admin_team_member_path(@admin_project)
\|
= link_to 'Back', admin_team_members_path
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment