A fork of Gitea (see branch `mj`) adding Majority Judgment Polls 𐄷 over Issues and Merge Requests. https://git.mieuxvoter.fr
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

78 lines
2.6 KiB

// Copyright 2020 The Gitea Authors. All rights reserved.
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file.
package models
import (
"code.gitea.io/gitea/modules/timeutil"
"strconv"
)
// ____ _ _ _ _ ____ _ _
// / ___|__ _ _ __ __| (_) __| | __ _| |_ ___| _ \ ___ ___ _ _| | |_
// | | / _` | '_ \ / _` | |/ _` |/ _` | __/ _ \ |_) / _ \/ __| | | | | __|
// | |__| (_| | | | | (_| | | (_| | (_| | || __/ _ < __/\__ \ |_| | | |_
// \____\__,_|_| |_|\__,_|_|\__,_|\__,_|\__\___|_| \_\___||___/\__,_|_|\__|
//
type PollCandidateResult struct {
Poll *Poll
CandidateID int64 // Issue Index (or internal candidate index, later on)
Position uint64 // Two Candidates may share the same Position (perfect equality)
MedianGrade uint8
Score string
Tally *PollCandidateTally
MeritProfile *PollCandidateMeritProfile
CreatedUnix timeutil.TimeStamp
}
func (result *PollCandidateResult) GetColorWord() (_ string) {
return result.Poll.GetGradeColorWord(result.MedianGrade)
}
func (result *PollCandidateResult) GetCandidateName() (_ string) { // FIXME
isssue, err := GetIssueByID(result.CandidateID)
if nil != err {
return "Candidate #" + strconv.FormatInt(result.CandidateID, 10)
}
return isssue.Title
}
// ____ _ _ _ _ ____ _ _
// / ___|__ _ _ __ __| (_) __| | __ _| |_ ___| _ \ ___ ___ _ _| | |_ ___
// | | / _` | '_ \ / _` | |/ _` |/ _` | __/ _ \ |_) / _ \/ __| | | | | __/ __|
// | |__| (_| | | | | (_| | | (_| | (_| | || __/ _ < __/\__ \ |_| | | |_\__ \
// \____\__,_|_| |_|\__,_|_|\__,_|\__,_|\__\___|_| \_\___||___/\__,_|_|\__|___/
//
// PollCandidateResults implements sort.Interface based on the Score field.
type PollCandidateResults []*PollCandidateResult
func (a PollCandidateResults) Len() int { return len(a) }
func (a PollCandidateResults) Less(i, j int) bool { return a[i].Score < a[j].Score }
func (a PollCandidateResults) Swap(i, j int) { a[i], a[j] = a[j], a[i] }
// ____ _ _
// | _ \ ___ ___ _ _| | |_
// | |_) / _ \/ __| | | | | __|
// | _ < __/\__ \ |_| | | |_
// |_| \_\___||___/\__,_|_|\__|
//
type PollResult struct {
Poll *Poll
Tally *PollTally
Candidates PollCandidateResults
CreatedUnix timeutil.TimeStamp
}
func (result *PollResult) GetCandidate(candidateID int64) (_ *PollCandidateResult) {
// A `for` loop is pretty inefficient, index this somehow?
for _, candidate := range result.Candidates {
if candidate.CandidateID == candidateID {
return candidate
}
}
return nil
}