summaryrefslogtreecommitdiff
path: root/python-django-fsm-log.spec
diff options
context:
space:
mode:
authorCoprDistGit <infra@openeuler.org>2023-04-11 09:31:29 +0000
committerCoprDistGit <infra@openeuler.org>2023-04-11 09:31:29 +0000
commit5e988d3f701faf4e1198f026fa5da42247fa91dd (patch)
treeb233810100c82cd84975be4f8be5be342e08c777 /python-django-fsm-log.spec
parent1c5113aea7ab6429a96b82c2ebd39205298a5df3 (diff)
automatic import of python-django-fsm-log
Diffstat (limited to 'python-django-fsm-log.spec')
-rw-r--r--python-django-fsm-log.spec895
1 files changed, 895 insertions, 0 deletions
diff --git a/python-django-fsm-log.spec b/python-django-fsm-log.spec
new file mode 100644
index 0000000..6cf51af
--- /dev/null
+++ b/python-django-fsm-log.spec
@@ -0,0 +1,895 @@
+%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 <Python_Bot@openeuler.org> - 3.1.0-1
+- Package Spec generated