From 806b49bde4e58106da224eb08709e60dd279074f Mon Sep 17 00:00:00 2001 From: CoprDistGit Date: Fri, 5 May 2023 12:50:43 +0000 Subject: automatic import of python-django-tracking-model --- .gitignore | 1 + python-django-tracking-model.spec | 361 ++++++++++++++++++++++++++++++++++++++ sources | 1 + 3 files changed, 363 insertions(+) create mode 100644 python-django-tracking-model.spec create mode 100644 sources diff --git a/.gitignore b/.gitignore index e69de29..1ff332c 100644 --- a/.gitignore +++ b/.gitignore @@ -0,0 +1 @@ +/django-tracking-model-0.1.5.tar.gz diff --git a/python-django-tracking-model.spec b/python-django-tracking-model.spec new file mode 100644 index 0000000..a4b3e1c --- /dev/null +++ b/python-django-tracking-model.spec @@ -0,0 +1,361 @@ +%global _empty_manifest_terminate_build 0 +Name: python-django-tracking-model +Version: 0.1.5 +Release: 1 +Summary: Track changes made to django model instance fields. +License: MIT +URL: https://github.com/drozdowsky/django-tracking-model/ +Source0: https://mirrors.nju.edu.cn/pypi/web/packages/dd/8d/640dded6ee736ec658b66ecbb9374d4ef4860475827ab6c747f87343c5e4/django-tracking-model-0.1.5.tar.gz +BuildArch: noarch + +Requires: python3-Django + +%description +# Django Tracking Model / DTM 🏁 +Track changes made to your model's instance fields. +Changes are cleared on save. +This package works well with [signals](https://seddonym.me/2018/05/04/django-signals/). +Mutable fields (e.g. JSONField) are not handled with deepcopy to keep it fast and simple. +Meant to be [model_utils](https://github.com/jazzband/django-model-utils)'s FieldTracker fast alternative. + +*Available on [PyPi](https://pypi.org/project/django-tracking-model/)* + +## Installation +```sh +pip install django-tracking-model +``` + +## Usage +```python +from django.db import models +from tracking_model import TrackingModelMixin + +# order matters +class Example(TrackingModelMixin, models.Model): + text = models.TextField(null=True) + myself = models.ForeignKey("self", null=True) + array = models.ArrayField(TextField()) +``` +```python +In [1]: e = Example.objects.create(id=1, text="Sample Text") +In [2]: e.tracker.changed, e.tracker.newly_created +Out[1]: ({}, True) + +In [3]: e.text = "Different Text" +In [4]: e.tracker.changed +Out[2]: {"text": "Sample Text"} + +In [5]: e.save() +In [6]: e.tracker.changed, e.tracker.newly_created +Out[3]: ({}, False) +``` +DTM will also detect changes made to ForeignKey/OneToOne fields. +```python +In [1]: Example.objects.create(myself=e) +In [2]: e.myself = None +In [3]: e.tracker.changed +Out[1]: {"myself_id": 1} +``` +Because DTM does not handle mutable fields well, you handle them with copy/deepcopy. +```python +In [1]: e = Example.objects.create(array=["I", "am", "your"]) +In [2]: copied = copy(e.array) +In [3]: copied.append("father") +In [4]: e.array = copied +In [5]: e.tracker.changed +Out[1]: {"array": ["I", "am", "your"]} + +In [6]: e.array = ["Testing", "is", "the", "future"] # in this case copy not needed +``` +DTM works best with \*\_save signals. +```python +def pre_save_example(instance, *args, **kwargs): + # .create() does not populate .changed, we use newly_created + if "text" in instance.tracker.changed or instance.tracker.newly_created: + if instance.text + instance.array = instance.text.split() + +pre_save.connect(pre_save_example, sender=Example) +``` +```python +In [1]: e = Example.objects.create(text="I am your father") +In [2]: e.refresh_from_db() # not needed +In [3]: e.array +Out[1]: ["I", "am", "your", "father"] +``` +DTM handles deferred fields well. +```python +In [1]: e = Example.objects.only("array").first() +In [2]: e.text = "I am not your father" +In [3]: e.tracker.changed +Out[4]: {"text": DeferredAttribute} +``` +You can narrow choice of tracked fields. By default everything is tracked. +```python +class Example(models.Model): + TRACKED_FIELDS = ["first"] + first = models.TextField() + second = models.TextField() +``` + +## Requirements + * Python >= 2.7, <= 3.9 + * Django >= 1.11, <= 4.0 + +## Todo +- [ ] Tests could be more readable +- [ ] Signals decorators + + + + +%package -n python3-django-tracking-model +Summary: Track changes made to django model instance fields. +Provides: python-django-tracking-model +BuildRequires: python3-devel +BuildRequires: python3-setuptools +BuildRequires: python3-pip +%description -n python3-django-tracking-model +# Django Tracking Model / DTM 🏁 +Track changes made to your model's instance fields. +Changes are cleared on save. +This package works well with [signals](https://seddonym.me/2018/05/04/django-signals/). +Mutable fields (e.g. JSONField) are not handled with deepcopy to keep it fast and simple. +Meant to be [model_utils](https://github.com/jazzband/django-model-utils)'s FieldTracker fast alternative. + +*Available on [PyPi](https://pypi.org/project/django-tracking-model/)* + +## Installation +```sh +pip install django-tracking-model +``` + +## Usage +```python +from django.db import models +from tracking_model import TrackingModelMixin + +# order matters +class Example(TrackingModelMixin, models.Model): + text = models.TextField(null=True) + myself = models.ForeignKey("self", null=True) + array = models.ArrayField(TextField()) +``` +```python +In [1]: e = Example.objects.create(id=1, text="Sample Text") +In [2]: e.tracker.changed, e.tracker.newly_created +Out[1]: ({}, True) + +In [3]: e.text = "Different Text" +In [4]: e.tracker.changed +Out[2]: {"text": "Sample Text"} + +In [5]: e.save() +In [6]: e.tracker.changed, e.tracker.newly_created +Out[3]: ({}, False) +``` +DTM will also detect changes made to ForeignKey/OneToOne fields. +```python +In [1]: Example.objects.create(myself=e) +In [2]: e.myself = None +In [3]: e.tracker.changed +Out[1]: {"myself_id": 1} +``` +Because DTM does not handle mutable fields well, you handle them with copy/deepcopy. +```python +In [1]: e = Example.objects.create(array=["I", "am", "your"]) +In [2]: copied = copy(e.array) +In [3]: copied.append("father") +In [4]: e.array = copied +In [5]: e.tracker.changed +Out[1]: {"array": ["I", "am", "your"]} + +In [6]: e.array = ["Testing", "is", "the", "future"] # in this case copy not needed +``` +DTM works best with \*\_save signals. +```python +def pre_save_example(instance, *args, **kwargs): + # .create() does not populate .changed, we use newly_created + if "text" in instance.tracker.changed or instance.tracker.newly_created: + if instance.text + instance.array = instance.text.split() + +pre_save.connect(pre_save_example, sender=Example) +``` +```python +In [1]: e = Example.objects.create(text="I am your father") +In [2]: e.refresh_from_db() # not needed +In [3]: e.array +Out[1]: ["I", "am", "your", "father"] +``` +DTM handles deferred fields well. +```python +In [1]: e = Example.objects.only("array").first() +In [2]: e.text = "I am not your father" +In [3]: e.tracker.changed +Out[4]: {"text": DeferredAttribute} +``` +You can narrow choice of tracked fields. By default everything is tracked. +```python +class Example(models.Model): + TRACKED_FIELDS = ["first"] + first = models.TextField() + second = models.TextField() +``` + +## Requirements + * Python >= 2.7, <= 3.9 + * Django >= 1.11, <= 4.0 + +## Todo +- [ ] Tests could be more readable +- [ ] Signals decorators + + + + +%package help +Summary: Development documents and examples for django-tracking-model +Provides: python3-django-tracking-model-doc +%description help +# Django Tracking Model / DTM 🏁 +Track changes made to your model's instance fields. +Changes are cleared on save. +This package works well with [signals](https://seddonym.me/2018/05/04/django-signals/). +Mutable fields (e.g. JSONField) are not handled with deepcopy to keep it fast and simple. +Meant to be [model_utils](https://github.com/jazzband/django-model-utils)'s FieldTracker fast alternative. + +*Available on [PyPi](https://pypi.org/project/django-tracking-model/)* + +## Installation +```sh +pip install django-tracking-model +``` + +## Usage +```python +from django.db import models +from tracking_model import TrackingModelMixin + +# order matters +class Example(TrackingModelMixin, models.Model): + text = models.TextField(null=True) + myself = models.ForeignKey("self", null=True) + array = models.ArrayField(TextField()) +``` +```python +In [1]: e = Example.objects.create(id=1, text="Sample Text") +In [2]: e.tracker.changed, e.tracker.newly_created +Out[1]: ({}, True) + +In [3]: e.text = "Different Text" +In [4]: e.tracker.changed +Out[2]: {"text": "Sample Text"} + +In [5]: e.save() +In [6]: e.tracker.changed, e.tracker.newly_created +Out[3]: ({}, False) +``` +DTM will also detect changes made to ForeignKey/OneToOne fields. +```python +In [1]: Example.objects.create(myself=e) +In [2]: e.myself = None +In [3]: e.tracker.changed +Out[1]: {"myself_id": 1} +``` +Because DTM does not handle mutable fields well, you handle them with copy/deepcopy. +```python +In [1]: e = Example.objects.create(array=["I", "am", "your"]) +In [2]: copied = copy(e.array) +In [3]: copied.append("father") +In [4]: e.array = copied +In [5]: e.tracker.changed +Out[1]: {"array": ["I", "am", "your"]} + +In [6]: e.array = ["Testing", "is", "the", "future"] # in this case copy not needed +``` +DTM works best with \*\_save signals. +```python +def pre_save_example(instance, *args, **kwargs): + # .create() does not populate .changed, we use newly_created + if "text" in instance.tracker.changed or instance.tracker.newly_created: + if instance.text + instance.array = instance.text.split() + +pre_save.connect(pre_save_example, sender=Example) +``` +```python +In [1]: e = Example.objects.create(text="I am your father") +In [2]: e.refresh_from_db() # not needed +In [3]: e.array +Out[1]: ["I", "am", "your", "father"] +``` +DTM handles deferred fields well. +```python +In [1]: e = Example.objects.only("array").first() +In [2]: e.text = "I am not your father" +In [3]: e.tracker.changed +Out[4]: {"text": DeferredAttribute} +``` +You can narrow choice of tracked fields. By default everything is tracked. +```python +class Example(models.Model): + TRACKED_FIELDS = ["first"] + first = models.TextField() + second = models.TextField() +``` + +## Requirements + * Python >= 2.7, <= 3.9 + * Django >= 1.11, <= 4.0 + +## Todo +- [ ] Tests could be more readable +- [ ] Signals decorators + + + + +%prep +%autosetup -n django-tracking-model-0.1.5 + +%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-tracking-model -f filelist.lst +%dir %{python3_sitelib}/* + +%files help -f doclist.lst +%{_docdir}/* + +%changelog +* Fri May 05 2023 Python_Bot - 0.1.5-1 +- Package Spec generated diff --git a/sources b/sources new file mode 100644 index 0000000..d06236d --- /dev/null +++ b/sources @@ -0,0 +1 @@ +ce444f08fc31d1184c76fea688e41f9a django-tracking-model-0.1.5.tar.gz -- cgit v1.2.3