django-curation is a django module that provides a model used for curating other model objects and proxying their attributes.
Note
Version(s) < 2.0 requires Django >= 1.11, < 2.0.
Version(s) >= 2.0 require Python 3, Django >= 2.0.
from django.db import models
from curation.models import CuratedItem, CuratedGroup, CuratedItemManager
from curation.fields import CuratedForeignKey
from blog.models import Post
class CuratedPostGroup(CuratedGroup):
pass
class CuratedPost(CuratedItem):
formfield_overrides = {
'custom_title': 'title',
}
objects = CuratedItemManager()
group = models.ForeignKey(CuratedPostGroup, on_delete=models.CASCADE)
post = curation.fields.CuratedForeignKey(Post)
custom_title = models.CharField(max_length=255, null=True, blank=True,
db_column='title')
Setup:
python3 -m venv venv . venv/bin/activate pip install tox
Run all tests:
tox
Run code coverage and render HTML report:
tox -e cov open htmlcov/index.html
Setup:
python3 -m venv venv . venv/bin/activate pip install pytest pytest-cov pytest-django "Django<2.1" pip install -e .
Run tests:
python -m pytest
Run code coverage and render HTML report:
python -m pytest --cov-report html --cov-report term --cov=curation
Abstract class representing an item in a curated group.
In order for a model that extends this class to proxy successfully,
it must define a CuratedForeignKey
field:
class CuratedPost(CuratedItem): post = curation.fields.CuratedForeignKey(Post)
A dict that maps field names in the proxy model (the to=... model in the
CuratedForeignKey
) to field names in the current model which can override
them (provided their value is not None or an empty string).
This takes the form:
field_overrides = { 'title': 'custom_title', 'status': 'custom_status', }
Where custom_title
and custom_status
are fields in the model extending
CuratedItem
, and title
and status
are fields in the proxy model.
Custom primary key to prevent conflicts with the proxy model's primary key.
A manager that defines queryset helpers for CuratedItem.
Filter the current queryset to rows with curated groups having slug "slug".
Overrides ModelBase
to check whether a curation.fields.CuratedForeignKey
is defined on the model. If not, throw a TypeError
.
A ForeignKey that gets a list of the __dict__
keys and field names of the
related model on load. It saves this list to the _proxy_attrs
attribute of
its parent model's _meta
attribute.
A django built-in that adds attributes to the model class in which it is defined.
This method sets the _curated_proxy_field_name
on the _meta
attribute of the
CuratedForeignKey
's parent model to the field's name (e.g. "post" in the example at the very
beginning of this README).
A django built-in that adds attributes to the class a RelatedField
points to.
In this case we're adding _proxy_attrs
to the _meta attribute of the ForeignKey
's parent
model, not the related model. The reason we're not using contribute_to_class
is that we need the
related class to be instantiated to obtain its field names, and the related class may not be loaded
yet when contribute_to_class
is called (for instance, if it is lazy loaded, when the
ForeignKey
field is defined using a string for the model).