# == Schema Information # # Table name: users # # id :integer not null, primary key # login :string(255) default(""), not null # hashed_password :string(40) default(""), not null # firstname :string(30) default(""), not null # lastname :string(255) default(""), not null # mail :string(60) # admin :boolean default("0"), not null # status :integer default("1"), not null # last_login_on :datetime # language :string(5) default("") # auth_source_id :integer # created_on :datetime # updated_on :datetime # type :string(255) # identity_url :string(255) # mail_notification :string(255) default(""), not null # salt :string(64) # gid :integer # visits :integer default("0") # excellent_teacher :integer default("0") # excellent_student :integer default("0") # phone :string(255) # authentication :boolean default("0") # grade :integer default("0") # experience :integer default("0") # nickname :string(255) # show_realname :boolean default("1") # professional_certification :boolean default("0") # ID_number :string(255) # certification :integer default("0") # homepage_teacher :boolean default("0") # homepage_engineer :boolean default("0") # is_test :integer default("0") # ecoder_user_id :integer default("0") # business :boolean default("0") # profile_completed :boolean default("0") # laboratory_id :integer # platform :string(255) default("0") # gitea_token :string(255) # gitea_uid :integer # is_shixun_marker :boolean default("0") # is_sync_pwd :boolean default("1") # watchers_count :integer default("0") # devops_step :integer default("0") # sign_cla :boolean default("0") # enabling_cla :boolean default("0") # id_card_verify :boolean default("0") # website_permission :boolean default("0") # # Indexes # # index_users_on_ecoder_user_id (ecoder_user_id) # index_users_on_homepage_engineer (homepage_engineer) # index_users_on_homepage_teacher (homepage_teacher) # index_users_on_laboratory_id (laboratory_id) # index_users_on_login (login) UNIQUE # index_users_on_mail (mail) # index_users_on_type (type) # class Organization < Owner alias_attribute :name, :login NAME_REGEX = /^[a-zA-Z0-9]+([-_.][a-zA-Z0-9]+)*$/ #只含有数字、字母、下划线不能以下划线开头和结尾 default_scope { where(type: "Organization") } has_one :organization_extension, dependent: :destroy has_one :cla, dependent: :destroy has_many :teams, dependent: :destroy has_many :organization_users, dependent: :destroy has_many :team_users, dependent: :destroy has_many :pinned_projects, class_name: 'PinnedProject', foreign_key: :user_id, dependent: :destroy has_many :is_pinned_projects, through: :pinned_projects, source: :project, validate: false validates :login, presence: true validates_uniqueness_of :login, :if => Proc.new { |user| user.login_changed? && user.login.present? }, case_sensitive: false validates :login, format: { with: NAME_REGEX, multiline: true, message: "只能以数字或字母开头,仅支持横杠、下划线、点三种符号,不允许符号连续排列,长度4-50个字符" } delegate :description, :website, :location, :repo_admin_change_team_access, :recommend, :visibility, :max_repo_creation, :num_projects, :num_users, :num_teams, :news_banner_id, :news_content, :memo, :news_title, :news_url, to: :organization_extension, allow_nil: true scope :with_visibility, ->(visibility) { joins(:organization_extension).where(organization_extensions: {visibility: visibility}) if visibility.present? } # after_save :reset_cache_data def gitea_token team_users.joins(:team).where(teams: {authorize: "owner"}).take&.user&.gitea_token end # def reset_cache_data # Cache::V2::OwnerCommonService.new(self.id).reset # end def self.build(name, nickname, gitea_token=nil) self.create!(login: name, nickname: nickname, gitea_token: gitea_token) end def can_create_project?(user_id) team_users.joins(:team).where(user_id: user_id, teams: {can_create_org_project: true}).present? end def is_member?(user_id) organization_users.where(user_id: user_id).present? end def is_sign?(user_id) return false if cla.nil? cla.user_clas.where(user_id: user_id, state: 1).present? end def cla_sign_email(user_id) cla.user_clas.find_by(user_id: user_id)&.email end def is_owner?(user_id) team_users.joins(:team).where(user_id: user_id, teams: {authorize: %w(owner)}).present? end def is_admin?(user_id) team_users.joins(:team).where(user_id: user_id, teams: {authorize: %w(admin owner)}).present? end def is_write?(user_id) team_users.joins(:team).where(user_id: user_id, teams: {authorize: %w(write admin owner)}).present? end def is_read?(user_id) team_users.joins(:team).where(user_id: user_id, teams: {authorize: %w(read write admin owner)}).present? end def is_only_admin?(user_id) team_users.joins(:team).where(user_id: user_id, teams: {authorize: %w(admin)}).present? roles = has_roles(user_id) roles.size > 1 ? false : roles.include?("admin") end def is_only_write?(user_id) # team_users.joins(:team).where(user_id: user_id, teams: {authorize: %w(write)}).present? roles = has_roles(user_id) roles.size > 1 ? false : roles.include?("write") end def is_only_read?(user_id) # team_users.joins(:team).where(user_id: user_id, teams: {authorize: %w(read)}).present? roles = has_roles(user_id) roles.size > 1 ? false : roles.include?("read") end def has_roles(user_id) teams.joins(:team_users).where("team_users.user_id=?", user_id).pluck("teams.authorize").uniq end # 是不是所有者团队的最后一个成员 def is_owner_team_last_one?(user_id) owner_team_users = team_users.joins(:team).where(teams: {authorize: %w(owner)}) owner_team_users.pluck(:user_id).include?(user_id) && owner_team_users.size == 1 end # 为包含组织所有项目的团队创建项目访问权限 def build_permit_team_projects!(project_id) teams.where(includes_all_project: true).each do |team| TeamProject.build(id, team.id, project_id) end end def projects_count Project.where( user_id: self.id).count end def teams_count teams.count end def organization_users_count organization_users.count end def real_name name = lastname + firstname name = name.blank? ? (nickname.blank? ? login : nickname) : name name.gsub(/\s+/, '').strip #6.11 -hs end def show_real_name name = lastname + firstname if name.blank? nickname.blank? ? login : nickname else name end end def open_cla! update_attribute(:enabling_cla, true) end def close_cla! update_attribute(:enabling_cla, false) end def open_cla? enabling_cla == true end def num_users organization_user_ids = self.organization_users.pluck(:user_id).uniq project_member_user_ids = self.projects.joins(:members).pluck("members.user_id").uniq ids = organization_user_ids + project_member_user_ids ids.uniq.size end end