def update_photo():
    latest_id = Legislator.select(Legislator.id).group_by(
        Legislator.name).order_by(Legislator.term.desc())
    query = Legislator.select(Legislator.name, Legislator.term,
                              Legislator.picUrl).where(
                                  Legislator.id.in_(latest_id))

    for legislator in query:
        Candidate.update(picUrl=legislator.picUrl).where(
            Candidate.name == legislator.name,
            Candidate.lastTerm == legislator.term).execute()
def update_last_term():
    query = Legislator.select(
        Legislator.name,
        fn.max(Legislator.term).alias("last_term")).group_by(Legislator.name)
    for legislator in query:
        Candidate.update(lastTerm=legislator.last_term).where(
            Candidate.name == legislator.name).execute()
def tag_history_candidate():
    query = Legislator.select(Legislator.name)
    names = [re.match(r"[\u4e00-\u9fff|.]{2,}", row.name)[0] for row in query]
    print(f"history legislators: {names}")
    query = Candidate.update(historyLegislator=True).where(
        Candidate.name.in_(names))
    query.execute()
def tag_current_candidate():
    query = Legislator.select(Legislator.name).where(
        Legislator.term == "09", Legislator.leaveFlag == "否")
    names = [re.match(r"[\u4e00-\u9fff|.]{2,}", row.name)[0] for row in query]
    print(f"current legislators: {names}")
    query = Candidate.update(currentLegislator=True).where(
        Candidate.name.in_(names))
    query.execute()
def update_sitting_rate():
    def is_participatable_meeting(meeting_date: str, onboard_date: str,
                                  leave_date: str) -> bool:
        if leave_date:
            return leave_date >= meeting_date >= onboard_date
        else:
            return meeting_date >= onboard_date

    legislators = Legislator.select(
        Legislator.name, Legislator.onboardDate,
        Legislator.leaveDate).where(Legislator.term == "09")
    valid_meeting_unit = ["全院委員會", "議事處會務科", "院會"]
    valid_meetings = Sitting.select().where(
        Sitting.meetingUnit.in_(valid_meeting_unit),
        Sitting.attendLegislator.is_null(False), Sitting.term == "09")
    total_valid_meeting = len(valid_meeting_unit)
    print("total_valid_meeting: ", total_valid_meeting)

    for legislator in legislators:
        name = legislator.name
        participatable_meetings = [
            meeting for meeting in valid_meetings if is_participatable_meeting(
                roc_to_common_era(meeting.meetingDateDesc[:9]),
                legislator.onboardDate, legislator.leaveDate)
        ]

        participat_meetings = [
            meeting for meeting in participatable_meetings
            if name in meeting.attendLegislator
        ]
        print(
            name,
            len(participat_meetings),
            len(participatable_meetings),
            len(participat_meetings) / len(participatable_meetings),
        )
        Legislator.update(sittingNum=len(participat_meetings),
                          maxSittingNum=len(participatable_meetings)).where(
                              Legislator.name == name,
                              Legislator.term == "09").execute()