self.serialize

in www/roster/models/nonpmc.rb [1:181]


  def self.serialize(id, env)

    cttee = ASF::Committee.find(id)
    return unless cttee.nonpmc?
    hasLDAP = !ASF::Project[cttee.name].nil? 
    members = cttee.owners
    committers = cttee.committers
    
    mail_list = cttee.mail_list.sub(/@apache\.org/,'')
    mail_list = 'legal' if mail_list =~ /^legal-/ && cttee.name != 'dataprivacy'
    mail_list = 'fundraising' if mail_list =~ /^fundraising-/

    ASF::Committee.load_committee_info
    
    ASF::Person.preload(['cn', 'mail', 'asf-altEmail', 'githubUsername'], (members + committers).uniq)

    image = ASF::SiteImage.find(id)

    moderators = nil
    modtime = nil
    subscribers = nil 
    subtime = nil
    pSubs = [] 
    unMatchedSubs = [] 
    unMatchedSecSubs = [] 
    currentUser = ASF::Person.find(env.user)
    
    analysePrivateSubs = false 
    if cttee.roster.include? env.user or currentUser.asf_member?
      require 'whimsy/asf/mlist'
      moderators, modtime = ASF::MLIST.list_moderators(mail_list)
      subscribers, subtime = ASF::MLIST.list_subs(mail_list) 
      if mail_list == 'press' 
        %w{markpub announce}.each do |alt_list|
          mods, _ = ASF::MLIST.list_moderators(alt_list)
          moderators.merge! mods
          subs, _ = ASF::MLIST.list_subs(alt_list)
          subscribers.merge! subs
        end
      end
      
      analysePrivateSubs = currentUser.asf_member?
      unless analysePrivateSubs 
        user_mail = currentUser.all_mail || []
        pMods = moderators["private@#{mail_list}.apache.org"] || []
        analysePrivateSubs = !(pMods & user_mail).empty?
      end
      if analysePrivateSubs
        pSubs = ASF::MLIST.private_subscribers(mail_list)[0]||[]
        unMatchedSubs=Set.new(pSubs) 
        pSubs.map!(&:downcase) 
        sSubs = ASF::MLIST.security_subscribers(mail_list)[0]||[]
        unMatchedSecSubs = Set.new(sSubs) 
      end
      lists = ASF::MLIST.domain_lists(mail_list, true)
    else
      lists = ASF::MLIST.domain_lists(mail_list, false)
    end

    roster = ASF.dup(cttee.roster)
    
    if roster.empty?
      cttee.chairs.each do |ch|
        roster[ch[:id]] = {name: ch[:name], date: 'unknown'} 
      end
    end
    cttee_members = roster.keys 

    
    roster.each {|_, info| info[:role] = 'Committee member'}

    members.each do |person|
      roster[person.id] ||= {
        name: person.public_name,
        role: 'Committee member'
      }
      if analysePrivateSubs
        allMail = person.all_mail.map(&:downcase)
        roster[person.id]['notSubbed'] = true if (allMail & pSubs).empty?
        unMatchedSubs.delete_if {|k| allMail.include? k.downcase}
        unMatchedSecSubs.delete_if {|k| allMail.include? k.downcase}
      end
      roster[person.id]['ldap'] = true
    end

    committers.each do |person|
      roster[person.id] ||= {
        name: person.public_name,
        role: 'Committer'
      }
    end

    roster.each do |k, v|
      person = ASF::Person.find(k)
      v[:member] = person.asf_member?
      v['githubUsername'] = (person.attrs['githubUsername'] || []).join(', ')
    end

    if cttee.chair and roster[cttee.chair.id]
      roster[cttee.chair.id]['role'] = 'Committee chair'
    end

    
    unknownSubs = [] 
    asfMembers = []
    unknownSecSubs = [] 
    
    nonASFmails = {}
    moderators&.each { |_, mods| mods.each {|m| nonASFmails[m] = '' unless m.end_with? '@apache.org'} }
    if unMatchedSubs.length > 0 or nonASFmails.length > 0 or unMatchedSecSubs.length > 0
      load_emails 
      unMatchedSubs.each { |addr|
        who = nil
        @people.each do |person|
          if person[:mail].any? {|mail| mail.downcase == addr.downcase}
            who = person
          end
        end
        if who
          if who[:member]
            asfMembers << { addr: addr, person: who }
          else
            unknownSubs << { addr: addr, person: who }
          end
        else
          unknownSubs << { addr: addr, person: nil }
        end
      }
      nonASFmails.each {|k, v|
        @people.each do |person|
          if person[:mail].any? {|mail| ASF::Mail.to_canonical(mail.downcase) == ASF::Mail.to_canonical(k.downcase)}
            nonASFmails[k] = person[:id]
          end
        end
      }
      unMatchedSecSubs.each { |addr|
        who = nil
        @people.each do |person|
          if person[:mail].any? {|mail| mail.downcase == addr.downcase}
            who = person
          end
        end
        if who
          unless who[:member]
            unknownSecSubs << { addr: addr, person: who }
          end
        else
          unknownSecSubs << { addr: addr, person: nil }
        end
      }
    end

    return {
      id: id,
      chair: cttee.chair&.id,
      display_name: cttee.display_name,
      description: cttee.description,
      schedule: cttee.schedule,
      report: cttee.report,
      site: cttee.site,
      established: cttee.established,
      hasLDAP: hasLDAP,
      ldap: members.map(&:id),
      members: cttee_members,
      committers: committers.map(&:id),
      roster: roster,
      mail: lists.sort.to_h,
      moderators: moderators,
      modtime: modtime,
      subscribers: subscribers,
      subtime: subtime,
      nonASFmails: nonASFmails,
      image: image,
      analysePrivateSubs: analysePrivateSubs,
      unknownSubs: unknownSubs,
      asfMembers: asfMembers,
      unknownSecSubs: unknownSecSubs,
    }

  end