|
15 | 15 | from redmine.project import Project |
16 | 16 | from redmine.query import Query |
17 | 17 | from redmine.redmine import Redmine |
| 18 | +from redmine.time import Time |
18 | 19 | from redmine.tracker import Tracker |
19 | 20 | from redmine.user import User |
20 | 21 | from redmine.version import Version |
@@ -121,15 +122,28 @@ def show(redmine, issue_id, journals, pager): |
121 | 122 |
|
122 | 123 |
|
123 | 124 | @cli.command() |
124 | | -@click.option(OPTIONS["subject"]["long"], OPTIONS["subject"]["short"], default=None, required=True) |
| 125 | +@click.option( |
| 126 | + OPTIONS["subject"]["long"], OPTIONS["subject"]["short"], default=None, required=True |
| 127 | +) |
125 | 128 | @click.option( |
126 | 129 | OPTIONS["description"]["long"], OPTIONS["description"]["short"], default=None |
127 | 130 | ) |
128 | 131 | @click.option(OPTIONS["edit"]["long"], OPTIONS["edit"]["short"], default=False) |
129 | | -@click.option(OPTIONS["project"]["long"], OPTIONS["project"]["short"], default=None, required=True) |
130 | | -@click.option(OPTIONS["status"]["long"], OPTIONS["status"]["short"], default=None, required=True) |
131 | | -@click.option(OPTIONS["tracker"]["long"], OPTIONS["tracker"]["short"], default=None, required=True) |
132 | | -@click.option(OPTIONS["priority"]["long"], OPTIONS["priority"]["short"], default=None, required=True) |
| 132 | +@click.option( |
| 133 | + OPTIONS["project"]["long"], OPTIONS["project"]["short"], default=None, required=True |
| 134 | +) |
| 135 | +@click.option( |
| 136 | + OPTIONS["status"]["long"], OPTIONS["status"]["short"], default=None, required=True |
| 137 | +) |
| 138 | +@click.option( |
| 139 | + OPTIONS["tracker"]["long"], OPTIONS["tracker"]["short"], default=None, required=True |
| 140 | +) |
| 141 | +@click.option( |
| 142 | + OPTIONS["priority"]["long"], |
| 143 | + OPTIONS["priority"]["short"], |
| 144 | + default=None, |
| 145 | + required=True, |
| 146 | +) |
133 | 147 | @click.option(OPTIONS["assignee"]["long"], OPTIONS["assignee"]["short"], default=None) |
134 | 148 | @click.option(OPTIONS["start"]["long"], OPTIONS["start"]["short"], default=None) |
135 | 149 | @click.option(OPTIONS["due"]["long"], OPTIONS["due"]["short"], default=None) |
@@ -360,3 +374,35 @@ def open(redmine, issue_id): |
360 | 374 |
|
361 | 375 | url = urljoin(redmine.url, "/issues/{}".format(issue_id)) |
362 | 376 | click.launch(url) |
| 377 | + |
| 378 | + |
| 379 | +@cli.command() |
| 380 | +@click.option(OPTIONS["user"]["long"], OPTIONS["user"]["short"], default=None) |
| 381 | +@click.option(OPTIONS["project"]["long"], OPTIONS["project"]["short"], default=None) |
| 382 | +@click.option(OPTIONS["from"]["long"], default=None) |
| 383 | +@click.option(OPTIONS["to"]["long"], default=None) |
| 384 | +@click.option(OPTIONS["on"]["long"], default=None) |
| 385 | +@click.pass_obj |
| 386 | +def times(redmine, **kwargs): |
| 387 | + """ List spent times """ |
| 388 | + |
| 389 | + on = kwargs.get("on") |
| 390 | + if on is not None: |
| 391 | + kwargs.update({"from": on, "to": on}) |
| 392 | + |
| 393 | + try: |
| 394 | + entries = redmine.get( |
| 395 | + "time_entries", |
| 396 | + cache=False, |
| 397 | + **{ |
| 398 | + "user_id": kwargs.get("user"), |
| 399 | + "project_id": kwargs.get("project"), |
| 400 | + "from": kwargs.get("from"), |
| 401 | + "to": kwargs.get("to"), |
| 402 | + }, |
| 403 | + ) |
| 404 | + except HTTPError as e: |
| 405 | + return click.echo(click.style(f"Fatal: {e}", fg="red")) |
| 406 | + |
| 407 | + for entry in entries: |
| 408 | + click.echo(Time(**entry)) |
0 commit comments