🚸 Add CLI
This commit is contained in:
parent
f32a78aba3
commit
9b745cabc7
1 changed files with 84 additions and 0 deletions
84
voting/cli/voting.py
Normal file
84
voting/cli/voting.py
Normal file
|
@ -0,0 +1,84 @@
|
||||||
|
import typer
|
||||||
|
|
||||||
|
from arrow import get as arrow_get
|
||||||
|
from voting import Quorum, QuorumKind, Result, Voting
|
||||||
|
from voting.storage import Storage
|
||||||
|
|
||||||
|
app = typer.Typer()
|
||||||
|
|
||||||
|
|
||||||
|
@app.command()
|
||||||
|
def new(title: str,
|
||||||
|
quorum: str = typer.Option(
|
||||||
|
"N",
|
||||||
|
"--quorum",
|
||||||
|
"-Q",
|
||||||
|
help="Quorum string in the format `Q[:V]`, for exampel `N`, `A:42` or P:42",
|
||||||
|
),
|
||||||
|
days: int = typer.Option(
|
||||||
|
7,
|
||||||
|
"--days",
|
||||||
|
"-D",
|
||||||
|
help="Number of days the voting will be open."
|
||||||
|
),
|
||||||
|
voters: str = typer.Option(..., "--voters", "-V"),
|
||||||
|
):
|
||||||
|
"""Create a new voting."""
|
||||||
|
|
||||||
|
if ':' not in quorum:
|
||||||
|
quorum = f"{quorum}:"
|
||||||
|
_q, _v = quorum.split(':')
|
||||||
|
|
||||||
|
q = Quorum()
|
||||||
|
if _q.upper() == 'A':
|
||||||
|
q = Quorum(QuorumKind.ABSOLUTE, _v)
|
||||||
|
elif _q.upper() == 'P':
|
||||||
|
q = Quorum(QuorumKind.PERCENT, _v)
|
||||||
|
|
||||||
|
voting = Voting(
|
||||||
|
title=title,
|
||||||
|
quorum=q,
|
||||||
|
voters=voters.split(','),
|
||||||
|
days=days,
|
||||||
|
)
|
||||||
|
|
||||||
|
with Storage() as s:
|
||||||
|
s.push(voting)
|
||||||
|
|
||||||
|
|
||||||
|
@app.command()
|
||||||
|
def rm(title: str):
|
||||||
|
"""Delete a voting."""
|
||||||
|
with Storage() as store:
|
||||||
|
store.pop(title)
|
||||||
|
|
||||||
|
|
||||||
|
@app.command()
|
||||||
|
def ls(verbose: bool = typer.Option(False, "--verbose", "-v", help="Verbose output"),
|
||||||
|
only_active: bool = typer.Option(False, "--active", '-A', help="Only list active votings"),
|
||||||
|
):
|
||||||
|
"""List all votings."""
|
||||||
|
with Storage() as store:
|
||||||
|
for v in store.votings:
|
||||||
|
if only_active:
|
||||||
|
if Result(v).outcome != 'LAUFEND':
|
||||||
|
continue
|
||||||
|
if verbose:
|
||||||
|
res = Result(v).result()
|
||||||
|
print(f"{v.title} ({arrow_get(v.start).format('YYYY-MM-DD HH:mm:ss')}) {res['state']} {res['votes']}")
|
||||||
|
else:
|
||||||
|
print(v)
|
||||||
|
|
||||||
|
|
||||||
|
@app.command()
|
||||||
|
def show(title: str,
|
||||||
|
voters: bool = typer.Option(False, "--voters", "-v", help="Display the votes.")
|
||||||
|
):
|
||||||
|
"""Display the results of a voting."""
|
||||||
|
store = Storage()
|
||||||
|
voting = store.pop(title)
|
||||||
|
if voters:
|
||||||
|
for vote in voting.votes:
|
||||||
|
print(f"{vote} => {voting.votes[vote].name}")
|
||||||
|
else:
|
||||||
|
print(Result(voting))
|
Loading…
Reference in a new issue