# `paste.progress` – Track progress of uploads

Upload Progress Monitor

This is a WSGI middleware component which monitors the status of files being uploaded. It includes a small query application which will return a list of all files being uploaded by particular session/user.

    >>> from paste.httpserver import serve
    >>> from paste.urlmap import URLMap
    >>> from paste.auth.basic import AuthBasicHandler
    >>> from paste.debug.debugapp import SlowConsumer, SimpleApplication
    >>> # from paste.progress import *
    >>> realm = 'Test Realm'
    >>> def authfunc(username, password):
    ...     return username == password
    >>> map = URLMap({})
    >>> ups = UploadProgressMonitor(map, threshold=1024)
    >>> map['/upload'] = SlowConsumer()
    >>> map['/simple'] = SimpleApplication()
    >>> map['/report'] = UploadProgressReporter(ups)
    >>> serve(AuthBasicHandler(ups, realm, authfunc))
    serving on...

Note

This is experimental, and will change in the future.

## Module Contents

class paste.progress.UploadProgressMonitor(application, threshold=None, timeout=None)

  monitors and reports on the status of uploads in progress

  Parameters:

  > `application`

  > > This is the next application in the WSGI stack.

  > `threshold`

  > > This is the size in bytes that is needed for the upload to be included in the monitor.

  > `timeout`

  > > This is the amount of time (in seconds) that a upload remains in the monitor after it has finished.

  Methods:

  > `uploads()`

  > > This returns a list of `environ` dict objects for each upload being currently monitored, or finished but whose time has not yet expired.

  For each request `environ` that is monitored, there are several variables that are stored:

  > `paste.bytes_received`

  > > This is the total number of bytes received for the given request; it can be compared with `CONTENT_LENGTH` to build a percentage complete. This is an integer value.

  > `paste.request_started`

  > > This is the time (in seconds) when the request was started as obtained from `time.time()`. One would want to format this for presentation to the user, if necessary.

  > `paste.request_finished`

  > > This is the time (in seconds) when the request was finished, canceled, or otherwise disconnected. This is None while the given upload is still in-progress.

  TODO: turn monitor into a queue and purge queue of finished

    requests that have passed the timeout period.

class paste.progress.UploadProgressReporter(monitor)

  reports on the progress of uploads for a given user

  This reporter returns a JSON file (for use in AJAX) listing the uploads in progress for the given user. By default, this reporter uses the `REMOTE_USER` environment to compare between the current request and uploads in-progress. If they match, then a response record is formed.

  > `match()`

  > > This member function can be overriden to provide alternative matching criteria. It takes two environments, the first is the current request, the second is a current upload.

  > `report()`

  > > This member function takes an environment and builds a `dict` that will be used to create a JSON mapping for the given upload. By default, this just includes the percent complete and the request url.