self.serialize

in www/roster/models/committer.rb [6:269]


  def self.serialize(id, env)
    response = {}

    person = ASF::Person.find(id)
    person.reload!
    return unless person.attrs['cn']

    response[:id] = id

    response[:member] = person.asf_member?
    
    m = person.createTimestamp.match(/^(\d\d\d\d)(\d\d)(\d\d)/)
    if m
      response[:createTimestamp] = m[1] + '-' + m[2] + '-' + m[3]
    else 
      response[:createTimestamp] = person.createTimestamp
    end

    name = {}

    auth = Auth.info(env)
    isSelfOrMember = (id == env.user or auth[:member])

    if person.icla
      name[:public_name] = person.public_name

      if isSelfOrMember
        name[:legal_name] = person.icla.legal_name
      end
    end

    unless person.attrs['cn'].empty?
      name[:ldap] = person.attrs['cn'].first.force_encoding('utf-8')
    end

    unless (person.attrs['givenName'] || []).empty?
      name[:given_name] = person.attrs['givenName'].first.force_encoding('utf-8')
    end

    unless person.attrs['sn'].empty?
      name[:family_name] = person.attrs['sn'].first.force_encoding('utf-8')
    end

    response[:name] = name

    response[:email_forward] = person.mail 
    response[:email_alt] = person.alt_email 
    response[:email_other] = person.all_mail - person.mail - person.alt_email 

    unless person.pgp_key_fingerprints.empty?
      response[:pgp] = person.pgp_key_fingerprints
    end

    unless person.ssh_public_keys.empty?
      response[:ssh] = person.ssh_public_keys
    end

    response[:host] = person.attrs['host'] || ['(none)']
    response[:inactive] = person.inactive?

    if person.attrs['asf-sascore']
      response[:sascore] = person.attrs['asf-sascore'].first 
    end

    if person.attrs['githubUsername']
      response[:githubUsername] = person.attrs['githubUsername'] 
    end

    response[:urls] = person.urls unless person.urls.empty?

    response[:groups] = person.services
    response[:committer] = [] 
    response[:committees] = [] 
    response[:podlings] = [] 
    pmcs = ASF::Committee.pmcs
    pmc_names = pmcs.map(&:name) 
    podlings = ASF::Podling.current.map(&:id)

    
    person.groups.map(&:name).each do |group|
      unless pmc_names.include? group
        response[:groups] << group
      end
    end

    
    person.project_owners.map(&:name).each do |project|
      if pmc_names.include? project
        response[:committees] << project
      elsif podlings.include? project
        response[:podlings] << project
      else
        
      end
    end

    
    person.projects.map(&:name).each do |project|
      if pmc_names.include? project
        
        response[:committer] << project
      elsif podlings.include? project
        response[:podlings] << project
      else
        
      end
    end

    ASF::Authorization.new('asf').each do |group, members|
      response[:groups] << group if members.include? id
    end

    ASF::Authorization.new('pit').each do |group, members|
      response[:groups] << group if members.include? id
    end

    response[:committees].sort!
    response[:groups].sort!
    response[:committer].sort!
    response[:podlings].sort!
    response[:committees].uniq!
    response[:groups].uniq!
    response[:committer].uniq!
    response[:podlings].uniq!

    member = {} 

    inMembersTxt = ASF::Member.find(id) 

    if inMembersTxt
      
      member[:status] = ASF::Member.status[id] || 'Active'
    end

    response[:forms] = {}

    if auth[:member] 

      if person.icla&.claRef and (auth[:secretary] or auth[:root]) 
        ASF::ICLAFiles.update_cache(env)
        file = ASF::ICLAFiles.match_claRef(person.icla.claRef)  
        if file
          url = ASF::SVN.svnurl('iclas')
          response[:forms][:icla] = "#{url}/#{file}"
        end
      end


      if inMembersTxt
        member[:info] = person.members_txt

        if person.icla 
          ASF::MemApps.update_cache(env)
          file = ASF::MemApps.find1st(person)
          if file
            url = ASF::SVN.svnurl('member_apps')
            response[:forms][:member] = "#{url}/#{file}"
          end
        end

        file = ASF::EmeritusFiles.find(person)
        if file
          response[:forms][:emeritus] = ASF::EmeritusFiles.svnpath!(file)
        end

        epoch, file = ASF::EmeritusRequestFiles.find(person, true)
        if file
          response[:forms][:emeritus_request] = ASF::EmeritusRequestFiles.svnpath!(file)
          
          response[:emeritus_request_age] = (((Time.now.to_i - epoch.to_i).to_f/SECS_TO_DAYS)).round(1).to_s
        elsif epoch 
          response[:forms][:emeritus_request] = ASF::EmeritusRequestFiles.svnpath!(epoch)
        end

        file = ASF::EmeritusRescindedFiles.find(person)
        if file
          response[:forms][:emeritus_rescinded] = ASF::EmeritusRescindedFiles.svnpath!(file)
        end

        file = ASF::EmeritusReinstatedFiles.find(person)
        if file
          response[:forms][:emeritus_reinstated] = ASF::EmeritusReinstatedFiles.svnpath!(file)
        end

        if auth[:secretary]
          path, _name, _timestamp, epoch = ASF::WithdrawalRequestFiles.findpath(person.id, env, true)
          if path
            response[:forms][:withdrawal_request] = path
            
            response[:withdrawal_request_age] = (((Time.now.to_i - epoch).to_f/SECS_TO_DAYS)).round(1).to_s
          end
        end
      else
        if person.member_nomination
          member[:nomination] = person.member_nomination
        end
      end

    else 
      response[:forms][:icla] = '' if person.icla&.claRef
    end

    response[:member] = member unless member.empty?

    if isSelfOrMember
      response[:moderates] = {}

      require 'whimsy/asf/mlist'
      ASF::MLIST.moderates(person.all_mail, response)
    end

    if env.user == id or auth[:root] or auth[:secretary]
      require 'whimsy/asf/mlist'
      ASF::MLIST.subscriptions(person.all_mail, response) 
      
      ASF::MLIST.digests(person.all_mail, response)
      
      response[:privateNosub] = []
    end

    
    response[:chairOf] = []
    response[:committees].each do |cttee|
      pmc = ASF::Committee.find(cttee)
      chairs = pmc.chairs.map {|x| x[:id]}
      response[:chairOf] << cttee if chairs.include?(id)
      
      if response[:subscriptions] 
        pmail = pmc.private_mail_list rescue ''
        subbed = false
        subs = response[:subscriptions]
        digs = response[:digests]
        subs += digs if digs
        subs.each do |sub|
          if sub[0] == pmail
            subbed = true
          end
        end
        response[:privateNosub] << cttee unless subbed
      end
    end

    response[:pmcs] = []
    response[:nonpmcs] = []

    pmcs.each do |pmc|
      response[:pmcs] << pmc.name if pmc.roster.include?(person.id)
      response[:chairOf] << pmc.name if pmc.chairs.map{|ch| ch[:id]}.include?(person.id)
    end
    response[:pmcs].sort!
    response[:pmcs].uniq!

    response[:nonPMCchairOf] = [] 
    nonpmcs = ASF::Committee.nonpmcs
    nonpmcs.each do |nonpmc|
      response[:nonpmcs] << nonpmc.name if nonpmc.roster.include?(person.id)
      response[:nonPMCchairOf] << nonpmc.name if nonpmc.chairs.map{|ch| ch[:id]}.include?(person.id)
    end
    response[:nonpmcs].sort!
    response[:nonpmcs].uniq!

    response
  end