Ticket #16055: django_generic_text_id_test.diff

File django_generic_text_id_test.diff, 10.4 KB (added by victor.van.den.elzen@…, 13 years ago)

patch for tests

  • tests/modeltests/generic_relations/tests.py

     
    33from django.contrib.contenttypes.models import ContentType
    44from django.test import TestCase
    55
    6 from models import (TaggedItem, ValuableTaggedItem, Comparison, Animal,
    7     Vegetable, Mineral)
     6from models import (TaggedItem, ValuableTaggedItem, TaggedItemTextID,
     7    Comparison, Animal, Vegetable, Mineral)
    88
    99
    1010class GenericRelationsTests(TestCase):
    1111    def test_generic_relations(self):
     12        self.base_generic_relations(TaggedItem, 'tags')
     13
     14    def test_generic_relations_string_id(self):
     15        self.base_generic_relations(TaggedItemTextID, 'stringtags')
     16
     17    def base_generic_relations(self, tag_model, reverse_name):
    1218        # Create the world in 7 lines of code...
    1319        lion = Animal.objects.create(common_name="Lion", latin_name="Panthera leo")
    1420        platypus = Animal.objects.create(
     
    1824        bacon = Vegetable.objects.create(name="Bacon", is_yucky=False)
    1925        quartz = Mineral.objects.create(name="Quartz", hardness=7)
    2026
     27        # Helper function
     28        def tags(obj): return getattr(obj, reverse_name)
     29
    2130        # Objects with declared GenericRelations can be tagged directly -- the
    2231        # API mimics the many-to-many API.
    23         bacon.tags.create(tag="fatty")
    24         bacon.tags.create(tag="salty")
    25         lion.tags.create(tag="yellow")
    26         lion.tags.create(tag="hairy")
    27         platypus.tags.create(tag="fatty")
    28         self.assertQuerysetEqual(lion.tags.all(), [
    29             "<TaggedItem: hairy>",
    30             "<TaggedItem: yellow>"
    31         ])
    32         self.assertQuerysetEqual(bacon.tags.all(), [
    33             "<TaggedItem: fatty>",
    34             "<TaggedItem: salty>"
    35         ])
     32        tags(bacon).create(tag="fatty")
     33        tags(bacon).create(tag="salty")
     34        tags(lion).create(tag="yellow")
     35        tags(lion).create(tag="hairy")
     36        tags(platypus).create(tag="fatty")
     37        self.assertQuerysetEqual(tags(lion).all(), ["hairy", "yellow"], unicode)
     38        self.assertQuerysetEqual(tags(bacon).all(), ["fatty", "salty"], unicode)
    3639
    3740        # You can easily access the content object like a foreign key.
    38         t = TaggedItem.objects.get(tag="salty")
     41        t = tag_model.objects.get(tag="salty")
    3942        self.assertEqual(t.content_object, bacon)
    4043
    4144        # Recall that the Mineral class doesn't have an explicit GenericRelation
    4245        # defined. That's OK, because you can create TaggedItems explicitly.
    43         tag1 = TaggedItem.objects.create(content_object=quartz, tag="shiny")
    44         tag2 = TaggedItem.objects.create(content_object=quartz, tag="clearish")
     46        tag1 = tag_model.objects.create(content_object=quartz, tag="shiny")
     47        tag2 = tag_model.objects.create(content_object=quartz, tag="clearish")
    4548
    4649        # However, excluding GenericRelations means your lookups have to be a
    4750        # bit more explicit.
    4851        ctype = ContentType.objects.get_for_model(quartz)
    49         q = TaggedItem.objects.filter(
     52        q = tag_model.objects.filter(
    5053            content_type__pk=ctype.id, object_id=quartz.id
    5154        )
    52         self.assertQuerysetEqual(q, [
    53             "<TaggedItem: clearish>",
    54             "<TaggedItem: shiny>"
    55         ])
     55        self.assertQuerysetEqual(q, ["clearish", "shiny"], unicode)
    5656
    5757        # You can set a generic foreign key in the way you'd expect.
    5858        tag1.content_object = platypus
    5959        tag1.save()
    60         self.assertQuerysetEqual(platypus.tags.all(), [
    61             "<TaggedItem: fatty>",
    62             "<TaggedItem: shiny>"
    63         ])
    64         q = TaggedItem.objects.filter(
     60        self.assertQuerysetEqual(tags(platypus).all(), ["fatty", "shiny"], unicode)
     61        q = tag_model.objects.filter(
    6562            content_type__pk=ctype.id, object_id=quartz.id
    6663        )
    67         self.assertQuerysetEqual(q, ["<TaggedItem: clearish>"])
     64        self.assertQuerysetEqual(q, ["clearish"], unicode)
    6865
    6966        # Queries across generic relations respect the content types. Even
    7067        # though there are two TaggedItems with a tag of "fatty", this query
     
    7370            "<Animal: Lion>",
    7471            "<Animal: Platypus>"
    7572        ])
    76         self.assertQuerysetEqual(Animal.objects.filter(tags__tag='fatty'), [
     73
     74        print Animal.objects.filter(**{reverse_name + '__tag': 'fatty'}).query
     75        self.assertQuerysetEqual(Animal.objects.filter(**{reverse_name + '__tag': 'fatty'}), [
    7776            "<Animal: Platypus>"
    7877        ])
    79         self.assertQuerysetEqual(Animal.objects.exclude(tags__tag='fatty'), [
     78        print Animal.objects.exclude(**{reverse_name + '__tag': 'fatty'}).query
     79        self.assertQuerysetEqual(Animal.objects.exclude(**{reverse_name + '__tag': 'fatty'}), [
    8080            "<Animal: Lion>"
    8181        ])
    8282
     
    8484        # objects are deleted when the source object is deleted.
    8585        # Original list of tags:
    8686        comp_func = lambda obj: (
    87             obj.tag, obj.content_type.model_class(), obj.object_id
     87            obj.tag, obj.content_type.model_class(), unicode(obj.object_id)
    8888        )
    8989
    90         self.assertQuerysetEqual(TaggedItem.objects.all(), [
    91                 (u'clearish', Mineral, quartz.pk),
    92                 (u'fatty', Animal, platypus.pk),
    93                 (u'fatty', Vegetable, bacon.pk),
    94                 (u'hairy', Animal, lion.pk),
    95                 (u'salty', Vegetable, bacon.pk),
    96                 (u'shiny', Animal, platypus.pk),
    97                 (u'yellow', Animal, lion.pk)
     90        self.assertQuerysetEqual(tag_model.objects.all(), [
     91                (u'clearish', Mineral, unicode(quartz.pk)),
     92                (u'fatty', Animal, unicode(platypus.pk)),
     93                (u'fatty', Vegetable, unicode(bacon.pk)),
     94                (u'hairy', Animal, unicode(lion.pk)),
     95                (u'salty', Vegetable, unicode(bacon.pk)),
     96                (u'shiny', Animal, unicode(platypus.pk)),
     97                (u'yellow', Animal, unicode(lion.pk))
    9898            ],
    9999            comp_func
    100100        )
    101101        lion.delete()
    102         self.assertQuerysetEqual(TaggedItem.objects.all(), [
    103                 (u'clearish', Mineral, quartz.pk),
    104                 (u'fatty', Animal, platypus.pk),
    105                 (u'fatty', Vegetable, bacon.pk),
    106                 (u'salty', Vegetable, bacon.pk),
    107                 (u'shiny', Animal, platypus.pk)
     102        self.assertQuerysetEqual(tag_model.objects.all(), [
     103                (u'clearish', Mineral, unicode(quartz.pk)),
     104                (u'fatty', Animal, unicode(platypus.pk)),
     105                (u'fatty', Vegetable, unicode(bacon.pk)),
     106                (u'salty', Vegetable, unicode(bacon.pk)),
     107                (u'shiny', Animal, unicode(platypus.pk))
    108108            ],
    109109            comp_func
    110110        )
     
    113113        # remain after deletion of the source object.
    114114        quartz_pk = quartz.pk
    115115        quartz.delete()
    116         self.assertQuerysetEqual(TaggedItem.objects.all(), [
    117                 (u'clearish', Mineral, quartz_pk),
    118                 (u'fatty', Animal, platypus.pk),
    119                 (u'fatty', Vegetable, bacon.pk),
    120                 (u'salty', Vegetable, bacon.pk),
    121                 (u'shiny', Animal, platypus.pk)
     116        self.assertQuerysetEqual(tag_model.objects.all(), [
     117                (u'clearish', Mineral, unicode(quartz_pk)),
     118                (u'fatty', Animal, unicode(platypus.pk)),
     119                (u'fatty', Vegetable, unicode(bacon.pk)),
     120                (u'salty', Vegetable, unicode(bacon.pk)),
     121                (u'shiny', Animal, unicode(platypus.pk))
    122122            ],
    123123            comp_func
    124124        )
    125125        # If you delete a tag, the objects using the tag are unaffected
    126126        # (other than losing a tag)
    127         tag = TaggedItem.objects.order_by("id")[0]
     127        tag = tag_model.objects.order_by("id")[0]
    128128        tag.delete()
    129         self.assertQuerysetEqual(bacon.tags.all(), ["<TaggedItem: salty>"])
    130         self.assertQuerysetEqual(TaggedItem.objects.all(), [
    131                 (u'clearish', Mineral, quartz_pk),
    132                 (u'fatty', Animal, platypus.pk),
    133                 (u'salty', Vegetable, bacon.pk),
    134                 (u'shiny', Animal, platypus.pk)
     129        self.assertQuerysetEqual(tags(bacon).all(), ["salty"], unicode)
     130        self.assertQuerysetEqual(tag_model.objects.all(), [
     131                (u'clearish', Mineral, unicode(quartz_pk)),
     132                (u'fatty', Animal, unicode(platypus.pk)),
     133                (u'salty', Vegetable, unicode(bacon.pk)),
     134                (u'shiny', Animal, unicode(platypus.pk))
    135135            ],
    136136            comp_func
    137137        )
    138         TaggedItem.objects.filter(tag='fatty').delete()
     138        tag_model.objects.filter(tag='fatty').delete()
    139139        ctype = ContentType.objects.get_for_model(lion)
    140         self.assertQuerysetEqual(Animal.objects.filter(tags__content_type=ctype), [
     140        self.assertQuerysetEqual(Animal.objects.filter(**{reverse_name + '__content_type': ctype}), [
    141141            "<Animal: Platypus>"
    142142        ])
    143143
  • tests/modeltests/generic_relations/models.py

     
    3131class ValuableTaggedItem(TaggedItem):
    3232    value = models.PositiveIntegerField()
    3333
     34class TaggedItemTextID(models.Model):
     35    tag = models.SlugField()
     36    content_type = models.ForeignKey(ContentType)
     37    object_id = models.TextField()
     38
     39    content_object = generic.GenericForeignKey()
     40
     41    class Meta:
     42        ordering = ["tag", "content_type__name"]
     43
     44    def __unicode__(self):
     45        return self.tag
     46
    3447class Comparison(models.Model):
    3548    """
    3649    A model that tests having multiple GenericForeignKeys
     
    5467    latin_name = models.CharField(max_length=150)
    5568
    5669    tags = generic.GenericRelation(TaggedItem)
     70    stringtags = generic.GenericRelation(TaggedItemTextID)
    5771    comparisons = generic.GenericRelation(Comparison,
    5872                                          object_id_field="object_id1",
    5973                                          content_type_field="content_type1")
     
    6680    is_yucky = models.BooleanField(default=True)
    6781
    6882    tags = generic.GenericRelation(TaggedItem)
     83    stringtags = generic.GenericRelation(TaggedItemTextID)
    6984
    7085    def __unicode__(self):
    7186        return self.name
Back to Top