%global _empty_manifest_terminate_build 0 Name: python-django-fsm-log Version: 3.1.0 Release: 1 Summary: Transition's persistence for django-fsm License: MIT URL: https://github.com/jazzband/django-fsm-log Source0: https://mirrors.nju.edu.cn/pypi/web/packages/bd/25/25296d04f9d4bb3717049a4f758f8b3ce5c6614ffea3b9504d1f6e79121f/django-fsm-log-3.1.0.tar.gz BuildArch: noarch Requires: python3-django Requires: python3-django-fsm Requires: python3-django-appconf Requires: python3-sphinx Requires: python3-sphinx-rtd-theme Requires: python3-myst-parser Requires: python3-pytest Requires: python3-pytest-cov Requires: python3-pytest-django Requires: python3-pytest-mock %description # Django Finite State Machine Log [![test suite](https://github.com/jazzband/django-fsm-log/actions/workflows/test_suite.yml/badge.svg)](https://github.com/jazzband/django-fsm-log/actions/workflows/test_suite.yml) [![codecov](https://codecov.io/gh/jazzband/django-fsm-log/branch/master/graph/badge.svg)](https://codecov.io/gh/jazzband/django-fsm-log) [![Jazzband](https://jazzband.co/static/img/badge.svg)](https://jazzband.co/) [![pre-commit.ci status](https://results.pre-commit.ci/badge/github/jazzband/django-fsm-log/master.svg)](https://results.pre-commit.ci/latest/github/jazzband/django-fsm-log/master) [![Documentation Status](https://readthedocs.org/projects/django-fsm-log/badge/?version=latest)](https://django-fsm-log.readthedocs.io/en/latest/?badge=latest) Provides persistence of the transitions of your fsm's models. Backed by the excellent [Django FSM](https://github.com/viewflow/django-fsm) package. Logs can be accessed before a transition occurs and before they are persisted to the database by enabling a cached backend. See [Advanced Usage](#advanced-usage) ## Changelog ## 4.0.0 (not released) ## 3.1.0 (2023-03-23) - `fsm_log_description` now accepts a default description parameter - Document `fsm_log_description` decorator - Add support for Django 4.1 - Add compatibility for python 3.11 ### 3.0.0 (2022-01-14) - Switch to github actions (from travis-ci) - Test against django 3.2 and 4.0, then python 3.9 and 3.10 - Drop support for django 1.11, 2.0, 2.1, 3.0, 3.1 - Drop support for python 3.4, 3.5, 3.6 - allow using StateLogManager in migrations [#95](https://github.com/jazzband/django-fsm-log/pull/95) ### 2.0.1 (2020-03-26) - Add support for django3.0 - Drop support for python2 ### 1.6.2 (2019-01-06) - Address Migration history breakage added in 1.6.1 ### 1.6.1 (2018-12-02) - Make StateLog.description field nullable ### 1.6.0 (2018-11-14) - Add source state on transitions - Fixed `get_state_display` with FSMIntegerField (#63) - Fixed handling of transitions if target is None (#71) - Added `fsm_log_description` decorator (#1, #67) - Dropped support for Django 1.10 (#64) ### 1.5.0 (2017-11-29) - cleanup deprecated code. - add codecov support. - switch to pytest. - add Admin integration to visualize past transitions. ### 1.4.0 (2017-11-09) - Bring compatibility with Django 2.0 and drop support of unsupported versions of Django: `1.6`, `1.7`, `1.9`. ### Compatibility - Python 2.7 and 3.4+ - Django 1.8+ - Django-FSM 2+ ## Installation First, install the package with pip. This will automatically install any dependencies you may be missing ```bash pip install django-fsm-log ``` Register django_fsm_log in your list of Django applications: ```python INSTALLED_APPS = ( ..., 'django_fsm_log', ..., ) ``` Then migrate the app to create the database table ```bash python manage.py migrate django_fsm_log ``` ## Usage The app listens for the `django_fsm.signals.post_transition` signal and creates a new record for each transition. To query the log: ```python from django_fsm_log.models import StateLog StateLog.objects.all() # ...all recorded logs... ``` ### Disabling logging for specific models By default transitions get recorded for all models. Logging can be disabled for specific models by adding their fully qualified name to `DJANGO_FSM_LOG_IGNORED_MODELS`. ```python DJANGO_FSM_LOG_IGNORED_MODELS = ('poll.models.Vote',) ``` ### `for_` Manager Method For convenience there is a custom `for_` manager method to easily filter on the generic foreign key: ```python from my_app.models import Article from django_fsm_log.models import StateLog article = Article.objects.all()[0] StateLog.objects.for_(article) # ...logs for article... ``` ### `by` Decorator We found that our transitions are commonly called by a user, so we've added a decorator to make logging this easy: ```python from django.db import models from django_fsm import FSMField, transition from django_fsm_log.decorators import fsm_log_by class Article(models.Model): state = FSMField(default='draft', protected=True) @fsm_log_by @transition(field=state, source='draft', target='submitted') def submit(self, by=None): pass ``` With this the transition gets logged when the `by` kwarg is present. ```python article = Article.objects.create() article.submit(by=some_user) # StateLog.by will be some_user ``` ### `description` Decorator Decorator that allows to set a custom description (saved on database) to a transitions. ```python from django.db import models from django_fsm import FSMField, transition from django_fsm_log.decorators import fsm_log_description class Article(models.Model): state = FSMField(default='draft', protected=True) @fsm_log_description(description='Article submitted') # description param is NOT required @transition(field=state, source='draft', target='submitted') def submit(self, description=None): pass article = Article.objects.create() article.submit() # logged with "Article submitted" description article.submit(description="Article reviewed and submitted") # logged with "Article reviewed and submitted" description ``` .. TIP:: The "description" argument passed when calling ".submit" has precedence over the default description set in the decorator The decorator also accepts a `allow_inline` boolean argument that allows to set the description inside the transition method. ```python from django.db import models from django_fsm import FSMField, transition from django_fsm_log.decorators import fsm_log_description class Article(models.Model): state = FSMField(default='draft', protected=True) @fsm_log_description(allow_inline=True) @transition(field=state, source='draft', target='submitted') def submit(self, description=None): description.set("Article submitted") article = Article.objects.create() article.submit() # logged with "Article submitted" description ``` ### Admin integration There is an InlineForm available that can be used to display the history of changes. To use it expand your own `AdminModel` by adding `StateLogInline` to its inlines: ```python from django.contrib import admin from django_fsm_log.admin import StateLogInline @admin.register(FSMModel) class FSMModelAdmin(admin.ModelAdmin): inlines = [StateLogInline] ``` ### Advanced Usage You can change the behaviour of this app by turning on caching for StateLog records. Simply add `DJANGO_FSM_LOG_STORAGE_METHOD = 'django_fsm_log.backends.CachedBackend'` to your project's settings file. It will use your project's default cache backend by default. If you wish to use a specific cache backend, you can add to your project's settings: ```python DJANGO_FSM_LOG_CACHE_BACKEND = 'some_other_cache_backend' ``` The StateLog object is now available after the `django_fsm.signals.pre_transition` signal is fired, but is deleted from the cache and persisted to the database after `django_fsm.signals.post_transition` is fired. This is useful if: - you need immediate access to StateLog details, and cannot wait until `django_fsm.signals.post_transition` has been fired - at any stage, you need to verify whether or not the StateLog has been written to the database Access to the pending StateLog record is available via the `pending_objects` manager ```python from django_fsm_log.models import StateLog article = Article.objects.get(...) pending_state_log = StateLog.pending_objects.get_for_object(article) ``` ## Contributing ### Running tests ```bash pip install tox tox ``` ### Linting with pre-commit We use ruff, black and more, all configured and check via [pre-commit](https://pre-commit.com/). Before committing, run the following: ```bash pip install pre-commit pre-commit install ``` %package -n python3-django-fsm-log Summary: Transition's persistence for django-fsm Provides: python-django-fsm-log BuildRequires: python3-devel BuildRequires: python3-setuptools BuildRequires: python3-pip %description -n python3-django-fsm-log # Django Finite State Machine Log [![test suite](https://github.com/jazzband/django-fsm-log/actions/workflows/test_suite.yml/badge.svg)](https://github.com/jazzband/django-fsm-log/actions/workflows/test_suite.yml) [![codecov](https://codecov.io/gh/jazzband/django-fsm-log/branch/master/graph/badge.svg)](https://codecov.io/gh/jazzband/django-fsm-log) [![Jazzband](https://jazzband.co/static/img/badge.svg)](https://jazzband.co/) [![pre-commit.ci status](https://results.pre-commit.ci/badge/github/jazzband/django-fsm-log/master.svg)](https://results.pre-commit.ci/latest/github/jazzband/django-fsm-log/master) [![Documentation Status](https://readthedocs.org/projects/django-fsm-log/badge/?version=latest)](https://django-fsm-log.readthedocs.io/en/latest/?badge=latest) Provides persistence of the transitions of your fsm's models. Backed by the excellent [Django FSM](https://github.com/viewflow/django-fsm) package. Logs can be accessed before a transition occurs and before they are persisted to the database by enabling a cached backend. See [Advanced Usage](#advanced-usage) ## Changelog ## 4.0.0 (not released) ## 3.1.0 (2023-03-23) - `fsm_log_description` now accepts a default description parameter - Document `fsm_log_description` decorator - Add support for Django 4.1 - Add compatibility for python 3.11 ### 3.0.0 (2022-01-14) - Switch to github actions (from travis-ci) - Test against django 3.2 and 4.0, then python 3.9 and 3.10 - Drop support for django 1.11, 2.0, 2.1, 3.0, 3.1 - Drop support for python 3.4, 3.5, 3.6 - allow using StateLogManager in migrations [#95](https://github.com/jazzband/django-fsm-log/pull/95) ### 2.0.1 (2020-03-26) - Add support for django3.0 - Drop support for python2 ### 1.6.2 (2019-01-06) - Address Migration history breakage added in 1.6.1 ### 1.6.1 (2018-12-02) - Make StateLog.description field nullable ### 1.6.0 (2018-11-14) - Add source state on transitions - Fixed `get_state_display` with FSMIntegerField (#63) - Fixed handling of transitions if target is None (#71) - Added `fsm_log_description` decorator (#1, #67) - Dropped support for Django 1.10 (#64) ### 1.5.0 (2017-11-29) - cleanup deprecated code. - add codecov support. - switch to pytest. - add Admin integration to visualize past transitions. ### 1.4.0 (2017-11-09) - Bring compatibility with Django 2.0 and drop support of unsupported versions of Django: `1.6`, `1.7`, `1.9`. ### Compatibility - Python 2.7 and 3.4+ - Django 1.8+ - Django-FSM 2+ ## Installation First, install the package with pip. This will automatically install any dependencies you may be missing ```bash pip install django-fsm-log ``` Register django_fsm_log in your list of Django applications: ```python INSTALLED_APPS = ( ..., 'django_fsm_log', ..., ) ``` Then migrate the app to create the database table ```bash python manage.py migrate django_fsm_log ``` ## Usage The app listens for the `django_fsm.signals.post_transition` signal and creates a new record for each transition. To query the log: ```python from django_fsm_log.models import StateLog StateLog.objects.all() # ...all recorded logs... ``` ### Disabling logging for specific models By default transitions get recorded for all models. Logging can be disabled for specific models by adding their fully qualified name to `DJANGO_FSM_LOG_IGNORED_MODELS`. ```python DJANGO_FSM_LOG_IGNORED_MODELS = ('poll.models.Vote',) ``` ### `for_` Manager Method For convenience there is a custom `for_` manager method to easily filter on the generic foreign key: ```python from my_app.models import Article from django_fsm_log.models import StateLog article = Article.objects.all()[0] StateLog.objects.for_(article) # ...logs for article... ``` ### `by` Decorator We found that our transitions are commonly called by a user, so we've added a decorator to make logging this easy: ```python from django.db import models from django_fsm import FSMField, transition from django_fsm_log.decorators import fsm_log_by class Article(models.Model): state = FSMField(default='draft', protected=True) @fsm_log_by @transition(field=state, source='draft', target='submitted') def submit(self, by=None): pass ``` With this the transition gets logged when the `by` kwarg is present. ```python article = Article.objects.create() article.submit(by=some_user) # StateLog.by will be some_user ``` ### `description` Decorator Decorator that allows to set a custom description (saved on database) to a transitions. ```python from django.db import models from django_fsm import FSMField, transition from django_fsm_log.decorators import fsm_log_description class Article(models.Model): state = FSMField(default='draft', protected=True) @fsm_log_description(description='Article submitted') # description param is NOT required @transition(field=state, source='draft', target='submitted') def submit(self, description=None): pass article = Article.objects.create() article.submit() # logged with "Article submitted" description article.submit(description="Article reviewed and submitted") # logged with "Article reviewed and submitted" description ``` .. TIP:: The "description" argument passed when calling ".submit" has precedence over the default description set in the decorator The decorator also accepts a `allow_inline` boolean argument that allows to set the description inside the transition method. ```python from django.db import models from django_fsm import FSMField, transition from django_fsm_log.decorators import fsm_log_description class Article(models.Model): state = FSMField(default='draft', protected=True) @fsm_log_description(allow_inline=True) @transition(field=state, source='draft', target='submitted') def submit(self, description=None): description.set("Article submitted") article = Article.objects.create() article.submit() # logged with "Article submitted" description ``` ### Admin integration There is an InlineForm available that can be used to display the history of changes. To use it expand your own `AdminModel` by adding `StateLogInline` to its inlines: ```python from django.contrib import admin from django_fsm_log.admin import StateLogInline @admin.register(FSMModel) class FSMModelAdmin(admin.ModelAdmin): inlines = [StateLogInline] ``` ### Advanced Usage You can change the behaviour of this app by turning on caching for StateLog records. Simply add `DJANGO_FSM_LOG_STORAGE_METHOD = 'django_fsm_log.backends.CachedBackend'` to your project's settings file. It will use your project's default cache backend by default. If you wish to use a specific cache backend, you can add to your project's settings: ```python DJANGO_FSM_LOG_CACHE_BACKEND = 'some_other_cache_backend' ``` The StateLog object is now available after the `django_fsm.signals.pre_transition` signal is fired, but is deleted from the cache and persisted to the database after `django_fsm.signals.post_transition` is fired. This is useful if: - you need immediate access to StateLog details, and cannot wait until `django_fsm.signals.post_transition` has been fired - at any stage, you need to verify whether or not the StateLog has been written to the database Access to the pending StateLog record is available via the `pending_objects` manager ```python from django_fsm_log.models import StateLog article = Article.objects.get(...) pending_state_log = StateLog.pending_objects.get_for_object(article) ``` ## Contributing ### Running tests ```bash pip install tox tox ``` ### Linting with pre-commit We use ruff, black and more, all configured and check via [pre-commit](https://pre-commit.com/). Before committing, run the following: ```bash pip install pre-commit pre-commit install ``` %package help Summary: Development documents and examples for django-fsm-log Provides: python3-django-fsm-log-doc %description help # Django Finite State Machine Log [![test suite](https://github.com/jazzband/django-fsm-log/actions/workflows/test_suite.yml/badge.svg)](https://github.com/jazzband/django-fsm-log/actions/workflows/test_suite.yml) [![codecov](https://codecov.io/gh/jazzband/django-fsm-log/branch/master/graph/badge.svg)](https://codecov.io/gh/jazzband/django-fsm-log) [![Jazzband](https://jazzband.co/static/img/badge.svg)](https://jazzband.co/) [![pre-commit.ci status](https://results.pre-commit.ci/badge/github/jazzband/django-fsm-log/master.svg)](https://results.pre-commit.ci/latest/github/jazzband/django-fsm-log/master) [![Documentation Status](https://readthedocs.org/projects/django-fsm-log/badge/?version=latest)](https://django-fsm-log.readthedocs.io/en/latest/?badge=latest) Provides persistence of the transitions of your fsm's models. Backed by the excellent [Django FSM](https://github.com/viewflow/django-fsm) package. Logs can be accessed before a transition occurs and before they are persisted to the database by enabling a cached backend. See [Advanced Usage](#advanced-usage) ## Changelog ## 4.0.0 (not released) ## 3.1.0 (2023-03-23) - `fsm_log_description` now accepts a default description parameter - Document `fsm_log_description` decorator - Add support for Django 4.1 - Add compatibility for python 3.11 ### 3.0.0 (2022-01-14) - Switch to github actions (from travis-ci) - Test against django 3.2 and 4.0, then python 3.9 and 3.10 - Drop support for django 1.11, 2.0, 2.1, 3.0, 3.1 - Drop support for python 3.4, 3.5, 3.6 - allow using StateLogManager in migrations [#95](https://github.com/jazzband/django-fsm-log/pull/95) ### 2.0.1 (2020-03-26) - Add support for django3.0 - Drop support for python2 ### 1.6.2 (2019-01-06) - Address Migration history breakage added in 1.6.1 ### 1.6.1 (2018-12-02) - Make StateLog.description field nullable ### 1.6.0 (2018-11-14) - Add source state on transitions - Fixed `get_state_display` with FSMIntegerField (#63) - Fixed handling of transitions if target is None (#71) - Added `fsm_log_description` decorator (#1, #67) - Dropped support for Django 1.10 (#64) ### 1.5.0 (2017-11-29) - cleanup deprecated code. - add codecov support. - switch to pytest. - add Admin integration to visualize past transitions. ### 1.4.0 (2017-11-09) - Bring compatibility with Django 2.0 and drop support of unsupported versions of Django: `1.6`, `1.7`, `1.9`. ### Compatibility - Python 2.7 and 3.4+ - Django 1.8+ - Django-FSM 2+ ## Installation First, install the package with pip. This will automatically install any dependencies you may be missing ```bash pip install django-fsm-log ``` Register django_fsm_log in your list of Django applications: ```python INSTALLED_APPS = ( ..., 'django_fsm_log', ..., ) ``` Then migrate the app to create the database table ```bash python manage.py migrate django_fsm_log ``` ## Usage The app listens for the `django_fsm.signals.post_transition` signal and creates a new record for each transition. To query the log: ```python from django_fsm_log.models import StateLog StateLog.objects.all() # ...all recorded logs... ``` ### Disabling logging for specific models By default transitions get recorded for all models. Logging can be disabled for specific models by adding their fully qualified name to `DJANGO_FSM_LOG_IGNORED_MODELS`. ```python DJANGO_FSM_LOG_IGNORED_MODELS = ('poll.models.Vote',) ``` ### `for_` Manager Method For convenience there is a custom `for_` manager method to easily filter on the generic foreign key: ```python from my_app.models import Article from django_fsm_log.models import StateLog article = Article.objects.all()[0] StateLog.objects.for_(article) # ...logs for article... ``` ### `by` Decorator We found that our transitions are commonly called by a user, so we've added a decorator to make logging this easy: ```python from django.db import models from django_fsm import FSMField, transition from django_fsm_log.decorators import fsm_log_by class Article(models.Model): state = FSMField(default='draft', protected=True) @fsm_log_by @transition(field=state, source='draft', target='submitted') def submit(self, by=None): pass ``` With this the transition gets logged when the `by` kwarg is present. ```python article = Article.objects.create() article.submit(by=some_user) # StateLog.by will be some_user ``` ### `description` Decorator Decorator that allows to set a custom description (saved on database) to a transitions. ```python from django.db import models from django_fsm import FSMField, transition from django_fsm_log.decorators import fsm_log_description class Article(models.Model): state = FSMField(default='draft', protected=True) @fsm_log_description(description='Article submitted') # description param is NOT required @transition(field=state, source='draft', target='submitted') def submit(self, description=None): pass article = Article.objects.create() article.submit() # logged with "Article submitted" description article.submit(description="Article reviewed and submitted") # logged with "Article reviewed and submitted" description ``` .. TIP:: The "description" argument passed when calling ".submit" has precedence over the default description set in the decorator The decorator also accepts a `allow_inline` boolean argument that allows to set the description inside the transition method. ```python from django.db import models from django_fsm import FSMField, transition from django_fsm_log.decorators import fsm_log_description class Article(models.Model): state = FSMField(default='draft', protected=True) @fsm_log_description(allow_inline=True) @transition(field=state, source='draft', target='submitted') def submit(self, description=None): description.set("Article submitted") article = Article.objects.create() article.submit() # logged with "Article submitted" description ``` ### Admin integration There is an InlineForm available that can be used to display the history of changes. To use it expand your own `AdminModel` by adding `StateLogInline` to its inlines: ```python from django.contrib import admin from django_fsm_log.admin import StateLogInline @admin.register(FSMModel) class FSMModelAdmin(admin.ModelAdmin): inlines = [StateLogInline] ``` ### Advanced Usage You can change the behaviour of this app by turning on caching for StateLog records. Simply add `DJANGO_FSM_LOG_STORAGE_METHOD = 'django_fsm_log.backends.CachedBackend'` to your project's settings file. It will use your project's default cache backend by default. If you wish to use a specific cache backend, you can add to your project's settings: ```python DJANGO_FSM_LOG_CACHE_BACKEND = 'some_other_cache_backend' ``` The StateLog object is now available after the `django_fsm.signals.pre_transition` signal is fired, but is deleted from the cache and persisted to the database after `django_fsm.signals.post_transition` is fired. This is useful if: - you need immediate access to StateLog details, and cannot wait until `django_fsm.signals.post_transition` has been fired - at any stage, you need to verify whether or not the StateLog has been written to the database Access to the pending StateLog record is available via the `pending_objects` manager ```python from django_fsm_log.models import StateLog article = Article.objects.get(...) pending_state_log = StateLog.pending_objects.get_for_object(article) ``` ## Contributing ### Running tests ```bash pip install tox tox ``` ### Linting with pre-commit We use ruff, black and more, all configured and check via [pre-commit](https://pre-commit.com/). Before committing, run the following: ```bash pip install pre-commit pre-commit install ``` %prep %autosetup -n django-fsm-log-3.1.0 %build %py3_build %install %py3_install install -d -m755 %{buildroot}/%{_pkgdocdir} if [ -d doc ]; then cp -arf doc %{buildroot}/%{_pkgdocdir}; fi if [ -d docs ]; then cp -arf docs %{buildroot}/%{_pkgdocdir}; fi if [ -d example ]; then cp -arf example %{buildroot}/%{_pkgdocdir}; fi if [ -d examples ]; then cp -arf examples %{buildroot}/%{_pkgdocdir}; fi pushd %{buildroot} if [ -d usr/lib ]; then find usr/lib -type f -printf "/%h/%f\n" >> filelist.lst fi if [ -d usr/lib64 ]; then find usr/lib64 -type f -printf "/%h/%f\n" >> filelist.lst fi if [ -d usr/bin ]; then find usr/bin -type f -printf "/%h/%f\n" >> filelist.lst fi if [ -d usr/sbin ]; then find usr/sbin -type f -printf "/%h/%f\n" >> filelist.lst fi touch doclist.lst if [ -d usr/share/man ]; then find usr/share/man -type f -printf "/%h/%f.gz\n" >> doclist.lst fi popd mv %{buildroot}/filelist.lst . mv %{buildroot}/doclist.lst . %files -n python3-django-fsm-log -f filelist.lst %dir %{python3_sitelib}/* %files help -f doclist.lst %{_docdir}/* %changelog * Tue Apr 11 2023 Python_Bot - 3.1.0-1 - Package Spec generated