Skip to content

Commit

Permalink
Merge pull request #23 from treyhunner/related-name
Browse files Browse the repository at this point in the history
Use related_name for reverse relations (when present)
  • Loading branch information
treyhunner committed Sep 27, 2021
2 parents f27a7f5 + 24f9f57 commit ee3209e
Show file tree
Hide file tree
Showing 10 changed files with 171 additions and 4 deletions.
12 changes: 12 additions & 0 deletions CHANGES.rst
@@ -1,6 +1,18 @@
Changes
=======

Unreleased
----------

- Use related_name (if present) when linking to reverse relations

1.2.2 (2021-09-15)
------------------

- Add support for Django 3.1 and 3.2
- Drop support for Python 3.5
- Drop support for Django 1.11

1.2.0 (2020-12-15)
------------------

Expand Down
11 changes: 11 additions & 0 deletions CONTRIBUTING.rst
Expand Up @@ -16,6 +16,17 @@ When creating a pull request, try to:
.. _CHANGES: CHANGES.rst
.. _README: README.rst


Adding migrations
-----------------

When you add new models or make changes to models, you'll need to make migrations before the tests will run.

To make migrations you can run::

python runtests.py makemigrations


Testing
-------

Expand Down
2 changes: 1 addition & 1 deletion relatives/__init__.py
@@ -1 +1 @@
__version__ = '1.2.2'
__version__ = '1.2.2.post0'
6 changes: 5 additions & 1 deletion relatives/templatetags/relatives.py
Expand Up @@ -79,8 +79,12 @@ def related_objects(obj):
))
except NoReverseMatch:
continue
if getattr(related, 'related_name', None):
plural_name = related.related_name.replace("_", " ")
else:
plural_name = to_model._meta.verbose_name_plural
object_list.append({
'plural_name': to_model._meta.verbose_name_plural,
'plural_name': plural_name,
'url': smart_text('%s?%s=%s' % (url, related.field.name, obj.pk)),
})
return object_list
2 changes: 2 additions & 0 deletions relatives/tests/admin.py
Expand Up @@ -46,3 +46,5 @@ class ImageAdmin(admin.ModelAdmin):
admin.site.register(models.Actor)
admin.site.register(models.Book)
admin.site.register(models.Journal)
admin.site.register(models.Eater)
admin.site.register(models.Meal)
73 changes: 73 additions & 0 deletions relatives/tests/migrations/0003_auto_20210927_1618.py
@@ -0,0 +1,73 @@
# Generated by Django 3.2.7 on 2021-09-27 16:18

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('tests', '0002_shape'),
]

operations = [
migrations.AlterField(
model_name='actor',
name='id',
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
),
migrations.AlterField(
model_name='book',
name='id',
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
),
migrations.AlterField(
model_name='image',
name='id',
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
),
migrations.AlterField(
model_name='journal',
name='id',
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
),
migrations.AlterField(
model_name='movie',
name='id',
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
),
migrations.AlterField(
model_name='notinadmin',
name='id',
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
),
migrations.AlterField(
model_name='pet',
name='id',
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
),
migrations.AlterField(
model_name='pirate',
name='id',
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
),
migrations.AlterField(
model_name='sailor',
name='id',
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
),
migrations.AlterField(
model_name='shape',
name='id',
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
),
migrations.AlterField(
model_name='ship',
name='id',
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
),
migrations.AlterField(
model_name='something',
name='id',
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
),
]
30 changes: 30 additions & 0 deletions relatives/tests/migrations/0004_eater_meal.py
@@ -0,0 +1,30 @@
# Generated by Django 3.2.7 on 2021-09-27 16:19

from django.db import migrations, models
import django.db.models.deletion


class Migration(migrations.Migration):

dependencies = [
('tests', '0003_auto_20210927_1618'),
]

operations = [
migrations.CreateModel(
name='Eater',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=10)),
],
),
migrations.CreateModel(
name='Meal',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=10)),
('prepared', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='meals_prepared', to='tests.eater')),
('reviewed', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='meals_reviewed', to='tests.eater')),
],
),
]
24 changes: 24 additions & 0 deletions relatives/tests/models.py
Expand Up @@ -108,3 +108,27 @@ class Journal(models.Model):

name = models.CharField(max_length=10)
images = GenericRelation(Image)


class Eater(models.Model):

"""Eaters have an admin URL and Meal links to them in two ways."""

name = models.CharField(max_length=10)


class Meal(models.Model):

"""Meals link to Eaters twice."""

name = models.CharField(max_length=10)
prepared = models.ForeignKey(
Eater,
related_name="meals_prepared",
on_delete=models.CASCADE,
)
reviewed = models.ForeignKey(
Eater,
related_name="meals_reviewed",
on_delete=models.CASCADE,
)
3 changes: 2 additions & 1 deletion relatives/tests/templates/related_objects_fk_test.html
@@ -1,5 +1,6 @@
{% load relatives %}
{% load relatives %}{% spaceless %}
{% related_objects obj as related_objects %}
{% for related in related_objects %}
<a href="{{ related.url }}">{{ related.plural_name|capfirst }}</a>
{% endfor %}
{% endspaceless %}
12 changes: 11 additions & 1 deletion relatives/tests/tests.py
Expand Up @@ -8,7 +8,7 @@

from relatives.utils import object_link, object_edit_link
from .models import (Pirate, Pet, Ship, Sailor, Movie, Actor, NotInAdmin,
Shape, Something, Book, Image, Journal)
Shape, Something, Book, Image, Journal, Eater)


class ObjectEditLinkTest(TestCase):
Expand Down Expand Up @@ -148,6 +148,16 @@ def test_foreign_keys(self):
self.assertEqual(body.strip(),
'<a href="/adm/tests/sailor/?ship=1">Sailors</a>')

def test_two_foreign_keys(self):
eater = Eater.objects.create(id=1, name="Cheryl")
body = render_to_string('related_objects_fk_test.html', {'obj': eater})
self.assertEqual(
body.strip(),
'<a href="/adm/tests/meal/?prepared=1">Meals prepared</a>'
'<a href="/adm/tests/meal/?reviewed=1">Meals reviewed</a>',
)


def test_no_admin_url(self):
thing = Something.objects.create()
NotInAdmin.objects.create(id=1, fk=thing)
Expand Down

0 comments on commit ee3209e

Please sign in to comment.