Skip to content

Commit

Permalink
Merge pull request #19 from quiqueporta/master
Browse files Browse the repository at this point in the history
generic_objects can be filtered by model instance type
  • Loading branch information
coleifer committed Oct 30, 2014
2 parents 80c94ca + 0d5ccd1 commit 697f437
Show file tree
Hide file tree
Showing 4 changed files with 37 additions and 15 deletions.
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
*.pyc
.ropeproject/*
26 changes: 13 additions & 13 deletions genericm2m/genericm2m_tests/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,42 +8,42 @@
class RelatedBeverage(models.Model):
food = models.ForeignKey('Food')
beverage = models.ForeignKey('Beverage')

class Meta:
ordering = ('-id',)


class Food(models.Model):
name = models.CharField(max_length=255)

related = RelatedObjectsDescriptor()
related_beverages = RelatedObjectsDescriptor(RelatedBeverage, 'food', 'beverage')

def __unicode__(self):
return self.name


class Beverage(models.Model):
name = models.CharField(max_length=255)

related = RelatedObjectsDescriptor()

def __unicode__(self):
return self.name


class Person(models.Model):
name = models.CharField(max_length=255)

related = RelatedObjectsDescriptor()

def __unicode__(self):
return self.name


class Boring(models.Model):
name = models.CharField(max_length=255)

def __unicode__(self):
return self.name

Expand All @@ -52,21 +52,21 @@ class AnotherRelatedObject(models.Model):
parent_type = models.ForeignKey(ContentType, related_name="child_%(class)s")
parent_id = models.IntegerField(db_index=True)
parent = GenericForeignKey(ct_field="parent_type", fk_field="parent_id")

object_type = models.ForeignKey(ContentType, related_name="related_%(class)s")
object_id = models.IntegerField(db_index=True)
object = GenericForeignKey(ct_field="object_type", fk_field="object_id")

alias = models.CharField(max_length=255, blank=True)
description = models.TextField(blank=True)

creation_date = models.DateTimeField(auto_now_add=True)

class Meta:
ordering = ('id',)


class Note(models.Model):
content = models.TextField()

related = RelatedObjectsDescriptor(AnotherRelatedObject)
18 changes: 18 additions & 0 deletions genericm2m/genericm2m_tests/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -414,3 +414,21 @@ def test_custom_model_using_gfks(self):
])

self.assertEqual(related_c.generic_objects(), [])

def test_generic_objects_filtered(self):
"""
Get generic objects filtered by Model.
"""
self.pizza.related.connect(self.beer)
self.pizza.related.connect(self.soda)
self.pizza.related.connect(self.mario)

# Get all generic related content
related = self.pizza.related.all()
objects = related.generic_objects()
self.assertEqual(objects, [self.mario, self.soda, self.beer])

# Get Person generic related content only.
related = self.pizza.related.all()
objects = related.generic_objects(Person)
self.assertEqual(objects, [self.mario])
6 changes: 4 additions & 2 deletions genericm2m/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ def get_gfk(self):

return self._gfk_field

def generic_objects(self):
def generic_objects(self, model=None):
clone = self._clone()

ctypes_and_fks = {}
Expand All @@ -52,7 +52,9 @@ def generic_objects(self):

obj_list = []
for obj in clone:
obj_list.append(gfk_objects[getattr(obj, ctype_field)][getattr(obj, fk_field)])
obj = gfk_objects[getattr(obj, ctype_field)][getattr(obj, fk_field)]
if not model or (model and isinstance(obj, model)):
obj_list.append(obj)

return obj_list

Expand Down

0 comments on commit 697f437

Please sign in to comment.