summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore1
-rw-r--r--python-django-tracking-model.spec361
-rw-r--r--sources1
3 files changed, 363 insertions, 0 deletions
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 <Python_Bot@openeuler.org> - 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