Skip to content
Snippets Groups Projects
Verified Commit aa176305 authored by Nik | Klampfradler's avatar Nik | Klampfradler
Browse files

Add iterator interface to record progress from an iterable

parent f2e29d79
No related branches found
No related tags found
2 merge requests!494Refactor ProgressRecorder for non-optional Celery usage and add doc strings,!491Resolve "Make Celery non-optional"
from functools import wraps
from numbers import Number
from typing import Callable, Optional
from typing import Callable, Generator, Iterable, Optional, Sequence, Union
from django.contrib import messages
......@@ -37,6 +37,8 @@ class ProgressRecorder(AbstractProgressRecorder):
recorder.add_message(messages.SUCCESS, "All data were imported successfully.")
You can also use `recorder.iterate` to simplify iterating and counting.
2. Track progress in view:
::
......@@ -67,6 +69,28 @@ class ProgressRecorder(AbstractProgressRecorder):
self._current = 0
self._total = 100
def iterate(self, data: Union[Iterable, Sequence], total: Optional[int] = None) -> Generator:
"""Iterate over a sequence or iterable, updating progress on the move.
::
@recorded_task
def do_something(long_list, recorder):
for item in recorder.iterate(long_list):
do_something_with(item)
:param data: A sequence (tuple, list, set,...) or an iterable
:param total: Total number of items, in case data does not support len()
"""
if total is None and hasattr(data, "__len__"):
total = len(data)
else:
raise TypeError("No total value passed, and data does not support len()")
for current, item in enumerate(data):
self.set_progress(current, total)
yield item
def set_progress(
self,
current: Optional[Number] = None,
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment