self.serialize

in www/roster/models/ppmc.rb [3:185]


  def self.serialize(id, env)

    ppmc = ASF::Podling.find(id)
    return unless ppmc 

    committers = ppmc.members
    owners = ppmc.owners

    
    unknownSubs = []
    asfMembers = []
    
    nonASFmails = {}

    
    
    
    moderators, modtime = ASF::MLIST.list_moderators(ppmc.mail_list)
    subscribers = nil 
    subtime = nil
    pSubs = [] 
    unMatchedSubs = [] 
    currentUser = ASF::Person.find(env.user)

    
    
    
    
    
    
    

    analysePrivateSubs = currentUser.asf_member? 
    unless analysePrivateSubs 
      
      user_mail = currentUser.all_mail || []
      pMods = moderators[ppmc.private_mail_list] || []
      analysePrivateSubs = !(pMods & user_mail).empty?
    end

    isOwner = false 
    unless analysePrivateSubs
      isOwner = owners.include? currentUser
    end


    
    if analysePrivateSubs or isOwner
      pSubs = ASF::MLIST.private_subscribers(ppmc.mail_list)[0]||[]
      subscribers, subtime = ASF::MLIST.list_subs(ppmc.mail_list, true) 
      if analysePrivateSubs
        unMatchedSubs=Set.new(pSubs) if analysePrivateSubs 
        moderators.each { |_, mods| mods.each {|m| nonASFmails[m]='' unless m.end_with? '@apache.org'} }
      end
      pSubs.map!(&:downcase) 
      lists = ASF::MLIST.domain_lists(ppmc.mail_list, true)
    else
      lists = ASF::MLIST.domain_lists(ppmc.mail_list, false)
    end

    pmc = ASF::Committee.find('incubator')
    ipmc = pmc.owners
    incubator_committers = pmc.committers

    
    roster = committers.map {|person|
      [person.id, {
        
        name: person.public_name,
        member: person.asf_member?,
        icommit: incubator_committers.include?(person),
        role: 'Committer',
        githubUsername: (person.attrs['githubUsername'] || []).join(', ')
      }]
    }.to_h

    
    owners.each do |person|
      roster[person.id] = {
        name: person.public_name,
        member: person.asf_member?,
        icommit: incubator_committers.include?(person),
        role: 'PPMC Member',
        githubUsername: (person.attrs['githubUsername'] || []).join(', ')
      }
      if analysePrivateSubs or isOwner
        allMail = person.all_mail.map{|m| ASF::Mail.to_canonical(m.downcase)}
        roster[person.id]['notSubbed'] = true if (allMail & pSubs.map{|m| ASF::Mail.to_canonical(m)}).empty?
      end
      if analysePrivateSubs
        unMatchedSubs.delete_if {|k| allMail.include? ASF::Mail.to_canonical(k.downcase)}
      end
    end

    
    ppmc.mentors.each do |mentor|
      person = ASF::Person.find(mentor)
      roster[person.id] = {
        name: person.public_name,
        member: person.asf_member?,
        ipmc: ipmc.include?(person),
        icommit: incubator_committers.include?(person),
        role: 'Mentor',
        githubUsername: (person.attrs['githubUsername'] || []).join(', ')
      }
      if analysePrivateSubs or isOwner
        allMail = person.all_mail.map{|m| ASF::Mail.to_canonical(m.downcase)}
        roster[person.id]['notSubbed'] = true if (allMail & pSubs.map{|m| ASF::Mail.to_canonical(m)}).empty?
      end
      if analysePrivateSubs or isOwner
        unMatchedSubs.delete_if {|k| allMail.include? ASF::Mail.to_canonical(k.downcase)}
      end
    end

    statusInfo = ppmc.podlingStatus || {news: []}

    if unMatchedSubs.length > 0 or nonASFmails.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
      }
    end

    
    unless isOwner or analysePrivateSubs
      moderators = modtime = nil
    end

    ret = {
      id: id,
      display_name: ppmc.display_name,
      description: ppmc.description,
      mail_list: ppmc.mail_list, 
      schedule: ppmc.reporting,
      monthly: ppmc.monthly,
      established: ppmc.startdate.to_s,
      enddate: ppmc.enddate.to_s,
      status: ppmc.status,
      mentors: ppmc.mentors,
      hasLDAP: ppmc.hasLDAP?,
      owners: owners.map(&:id),
      committers: committers.map(&:id),
      roster: roster,
      mail: lists.sort.to_h,
      moderators: moderators,
      modtime: modtime,
      subscribers: subscribers,
      subtime: subtime,
      nonASFmails: nonASFmails,
      duration: ppmc.duration,
      podlingStatus: statusInfo,
      namesearch: ppmc.namesearch,
      analysePrivateSubs: analysePrivateSubs,
      unknownSubs: unknownSubs,
      asfMembers: asfMembers,
    }
    
    ret[:isOwner] = isOwner if isOwner
    return ret

  end