def generate_rotation()

in rotation.py [0:0]


def generate_rotation(leaders, rotations):
    leader_candidates = leaders.copy()
    sheriff_candidates = MEMBERS.copy()

    # remove recent leaders from pool
    for w, r in list(sorted(rotations.items()))[(len(leaders) // 2) * -1 :]:
        if r.leader in leader_candidates:
            logger.debug(f"Removing {r.leader} from leader pool because they led on {w}")
            leader_candidates.remove(r.leader)

    # remove recent sheriffs from pools
    for w, r in list(sorted(rotations.items()))[-4:]:
        if r.leader in sheriff_candidates:
            logger.debug(f"Removing {r.leader} from sheriff pool because they sheriffed on {w}")
            sheriff_candidates.remove(r.leader)
        for sheriff in r.sheriffs:
            if sheriff in leader_candidates:
                logger.debug(f"Removing {sheriff} from leader pool because they sheriffed on {w}")
                leader_candidates.remove(sheriff)
            if sheriff in sheriff_candidates:
                logger.debug(f"Removing {sheriff} from sheriff pool because they sheriffed on {w}")
                sheriff_candidates.remove(sheriff)

    # pick a leader
    leader = random.choice(leader_candidates)
    logger.debug(f"Picked {leader} as leader")

    # remove leader from pool
    sheriff_candidates.remove(leader)
    logger.debug(f"Removed {leader} from sheriff pool because they have been picked as the leader")

    # pick sheriffs from pool
    sheriffs = []
    for _ in range(2):
        geos = {s.geo for s in [leader] + sheriffs}
        if len(geos) > 1:
            # remove sheriffs outside of selected geos from pool
            for sheriff in [c for c in sheriff_candidates if c.geo not in geos]:
                logger.debug(f"Removing {sheriff} from pool as they are in {sheriff.geo} and leader/sheriffs are in {geos}")
                sheriff_candidates.remove(sheriff)
        if len(sheriff_candidates) > 0:
            random.shuffle(sheriff_candidates)
            sheriff = sheriff_candidates.pop()
            sheriffs.append(sheriff)
            logger.debug(f"Picked {sheriff} as sheriff")
    return Rotation(leader, sheriffs)