2012-09-04 06:04:36 +02:00
|
|
|
module Account
|
|
|
|
# Returns a string for use as a Gitolite user identifier
|
|
|
|
#
|
|
|
|
# Note that Gitolite 2.x requires the following pattern for users:
|
|
|
|
#
|
|
|
|
# ^@?[0-9a-zA-Z][0-9a-zA-Z._\@+-]*$
|
2012-06-07 14:44:57 +02:00
|
|
|
def identifier
|
2012-09-04 06:04:36 +02:00
|
|
|
# Replace non-word chars with underscores, then make sure it starts with
|
|
|
|
# valid chars
|
|
|
|
email.gsub(/\W/, '_').gsub(/\A([\W\_])+/, '')
|
2012-06-07 14:44:57 +02:00
|
|
|
end
|
|
|
|
|
|
|
|
def is_admin?
|
|
|
|
admin
|
|
|
|
end
|
|
|
|
|
|
|
|
def require_ssh_key?
|
|
|
|
keys.count == 0
|
|
|
|
end
|
|
|
|
|
|
|
|
def can_create_project?
|
|
|
|
projects_limit > my_own_projects.count
|
|
|
|
end
|
|
|
|
|
2012-10-09 08:46:20 +02:00
|
|
|
def can_create_group?
|
|
|
|
is_admin?
|
|
|
|
end
|
|
|
|
|
2012-11-25 10:57:01 +01:00
|
|
|
def abilities
|
|
|
|
@abilities ||= begin
|
|
|
|
abilities = Six.new
|
|
|
|
abilities << Ability
|
|
|
|
abilities
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def can? action, subject
|
|
|
|
abilities.allowed?(self, action, subject)
|
|
|
|
end
|
|
|
|
|
2012-06-07 14:44:57 +02:00
|
|
|
def last_activity_project
|
|
|
|
projects.first
|
|
|
|
end
|
|
|
|
|
|
|
|
def first_name
|
|
|
|
name.split.first unless name.blank?
|
|
|
|
end
|
|
|
|
|
|
|
|
def cared_merge_requests
|
2012-08-11 00:07:50 +02:00
|
|
|
MergeRequest.where("author_id = :id or assignee_id = :id", id: self.id).opened
|
2012-06-07 14:44:57 +02:00
|
|
|
end
|
|
|
|
|
|
|
|
def project_ids
|
|
|
|
projects.map(&:id)
|
|
|
|
end
|
|
|
|
|
|
|
|
# Remove user from all projects and
|
|
|
|
# set blocked attribute to true
|
|
|
|
def block
|
2012-10-09 02:10:04 +02:00
|
|
|
users_projects.find_each do |membership|
|
2012-06-07 14:44:57 +02:00
|
|
|
return false unless membership.destroy
|
|
|
|
end
|
|
|
|
|
|
|
|
self.blocked = true
|
|
|
|
save
|
|
|
|
end
|
|
|
|
|
|
|
|
def projects_limit_percent
|
|
|
|
return 100 if projects_limit.zero?
|
|
|
|
(my_own_projects.count.to_f / projects_limit) * 100
|
|
|
|
end
|
2012-06-12 16:43:16 +02:00
|
|
|
|
|
|
|
def recent_push project_id = nil
|
2012-06-21 17:41:22 +02:00
|
|
|
# Get push events not earlier than 2 hours ago
|
|
|
|
events = recent_events.code_push.where("created_at > ?", Time.now - 2.hours)
|
2012-08-11 00:07:50 +02:00
|
|
|
events = events.where(project_id: project_id) if project_id
|
2012-06-12 16:43:16 +02:00
|
|
|
|
|
|
|
# Take only latest one
|
|
|
|
events = events.recent.limit(1).first
|
|
|
|
end
|
2012-07-20 07:39:34 +02:00
|
|
|
|
2012-11-16 19:31:17 +01:00
|
|
|
def projects_sorted_by_activity
|
|
|
|
projects.order("(SELECT max(events.created_at) FROM events WHERE events.project_id = projects.id) DESC")
|
2012-07-20 07:39:34 +02:00
|
|
|
end
|
2012-11-25 10:57:01 +01:00
|
|
|
|
|
|
|
def namespaces
|
|
|
|
namespaces = []
|
|
|
|
|
|
|
|
# Add user account namespace
|
|
|
|
namespaces << self.namespace if self.namespace
|
|
|
|
|
|
|
|
# Add groups you can manage
|
|
|
|
namespaces += if admin
|
|
|
|
Group.all
|
|
|
|
else
|
|
|
|
groups.all
|
|
|
|
end
|
|
|
|
namespaces
|
|
|
|
end
|
|
|
|
|
|
|
|
def several_namespaces?
|
|
|
|
namespaces.size > 1
|
|
|
|
end
|
|
|
|
|
|
|
|
def namespace_id
|
|
|
|
namespace.try :id
|
|
|
|
end
|
2012-06-07 14:44:57 +02:00
|
|
|
end
|