mirror of
https://github.com/spiral-project/ihatemoney.git
synced 2025-05-05 04:31:49 +02:00
Added command to allow user to see the number of projects, with a few options. Added tests as well.
This commit is contained in:
parent
4bef5ad922
commit
edd453c285
2 changed files with 121 additions and 0 deletions
|
@ -4,6 +4,7 @@ import getpass
|
|||
import os
|
||||
import random
|
||||
import sys
|
||||
import datetime
|
||||
|
||||
import click
|
||||
from flask.cli import FlaskGroup
|
||||
|
@ -94,5 +95,97 @@ def delete_project(project_name):
|
|||
db.session.commit()
|
||||
|
||||
|
||||
@cli.command()
|
||||
@click.option(
|
||||
"-l", "--bills_low", type=int, required=False, help="The minimum number of bills"
|
||||
)
|
||||
@click.option(
|
||||
"-h", "--bills_high", type=int, required=False, help="Maximum number of bills"
|
||||
)
|
||||
@click.option(
|
||||
"-d",
|
||||
"--num_days",
|
||||
required=False,
|
||||
type=int,
|
||||
help="Max number of days you want the oldest result to be",
|
||||
)
|
||||
@click.option(
|
||||
"-e",
|
||||
"--emails",
|
||||
is_flag=True,
|
||||
default=False,
|
||||
help="Returns emails rather than project names",
|
||||
)
|
||||
@click.option(
|
||||
"-n",
|
||||
"--names",
|
||||
is_flag=True,
|
||||
default=False,
|
||||
help="Returns list of names of projects",
|
||||
)
|
||||
def get_all_projects(
|
||||
bills_low=None, bills_high=None, num_days=None, emails=None, names=None
|
||||
):
|
||||
"""Displays the number of projects. Options exist to specify for \
|
||||
projects within the bounds of the specified number of bills (inclusive) and/or less than x days old. """
|
||||
if bills_low and bills_high:
|
||||
|
||||
# Make sure low < high
|
||||
if bills_high < bills_low:
|
||||
temp = bills_high
|
||||
bills_high = bills_low
|
||||
bills_low = temp
|
||||
|
||||
if num_days:
|
||||
projects = [
|
||||
pr
|
||||
for pr in Project.query.all()
|
||||
if pr.get_bills().count() >= bills_low
|
||||
and pr.get_bills().count() <= bills_high
|
||||
and pr.get_bills()[0].date
|
||||
> datetime.date.today() - datetime.timedelta(days=num_days)
|
||||
]
|
||||
else:
|
||||
projects = [
|
||||
pr
|
||||
for pr in Project.query.all()
|
||||
if pr.get_bills().count() >= bills_low
|
||||
and pr.get_bills().count() <= bills_high
|
||||
]
|
||||
click.echo(len(projects))
|
||||
if emails:
|
||||
list_emails = ", ".join(set([pr.contact_email for pr in projects]))
|
||||
click.echo(list_emails)
|
||||
if names:
|
||||
proj_names = [pr.name for pr in projects]
|
||||
click.echo(proj_names)
|
||||
|
||||
elif (bills_low and bills_high == None) or (bills_low == None and bills_high):
|
||||
click.secho(
|
||||
f"Invalid number of bounds specified. Please include both a \
|
||||
low and high bound by using (-l or --low) and (-h or --high)",
|
||||
fg="red",
|
||||
)
|
||||
|
||||
else:
|
||||
if num_days:
|
||||
projects = [
|
||||
pr
|
||||
for pr in Project.query.all()
|
||||
if pr.get_bills()[0].date
|
||||
> datetime.date.today() - datetime.timedelta(days=num_days)
|
||||
]
|
||||
else:
|
||||
projects = Project.query.all()
|
||||
|
||||
click.echo(len(projects))
|
||||
if emails:
|
||||
list_emails = ", ".join(set([pr.contact_email for pr in projects]))
|
||||
click.echo(list_emails)
|
||||
if names:
|
||||
proj_names = [pr.name for pr in projects]
|
||||
click.echo(proj_names)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
cli()
|
||||
|
|
|
@ -106,6 +106,34 @@ class CommandTestCase(BaseTestCase):
|
|||
|
||||
self.assertEqual(len(models.Project.query.all()), 0)
|
||||
|
||||
def test_get_all_projects_basic(self):
|
||||
self.create_project("proj1")
|
||||
self.create_project("proj2")
|
||||
self.create_project("proj3")
|
||||
self.create_project("proj4")
|
||||
|
||||
runner = self.app.test_cli_runner()
|
||||
result = runner.invoke(get_all_projects)
|
||||
self.assertEqual(result, 4)
|
||||
|
||||
def test_get_proj_emails(self):
|
||||
self.create_project("test")
|
||||
runner = self.app.test_cli_runner()
|
||||
result = runner.invoke(get_all_projects(emails = True))
|
||||
self.assertEqual(result, "1 \n demo@notmyidea.org")
|
||||
|
||||
def test_get_proj_names(self):
|
||||
self.create_project("test")
|
||||
runner = self.app.test_cli_runner()
|
||||
result = runner.invoke(get_all_projects(days = 0))
|
||||
self.assertEqual(result, 1)
|
||||
|
||||
def test_get_proj_days(self):
|
||||
self.create_project("test")
|
||||
runner = self.app.test_cli_runner()
|
||||
result = runner.invoke(get_all_projects(low = 1, high =1))
|
||||
self.assertEqual(result, 1)
|
||||
|
||||
|
||||
class ModelsTestCase(IhatemoneyTestCase):
|
||||
def test_weighted_bills(self):
|
||||
|
|
Loading…
Reference in a new issue