Changeset 8215 for django/branches/gis/tests
- Timestamp:
- 08/05/08 12:15:33 (4 months ago)
- Files:
-
- django/branches/gis (modified) (1 prop)
- django/branches/gis/tests/modeltests/choices/models.py (modified) (1 diff)
- django/branches/gis/tests/modeltests/custom_methods/models.py (modified) (1 diff)
- django/branches/gis/tests/modeltests/delete/models.py (modified) (6 diffs)
- django/branches/gis/tests/modeltests/generic_relations/models.py (modified) (3 diffs)
- django/branches/gis/tests/modeltests/invalid_models/models.py (modified) (2 diffs)
- django/branches/gis/tests/modeltests/m2m_through (copied) (copied from django/trunk/tests/modeltests/m2m_through)
- django/branches/gis/tests/modeltests/m2m_through/__init__.py (copied) (copied from django/trunk/tests/modeltests/m2m_through/__init__.py)
- django/branches/gis/tests/modeltests/m2m_through/models.py (copied) (copied from django/trunk/tests/modeltests/m2m_through/models.py)
- django/branches/gis/tests/modeltests/many_to_one/models.py (modified) (2 diffs)
- django/branches/gis/tests/modeltests/model_formsets/models.py (modified) (14 diffs)
- django/branches/gis/tests/modeltests/model_forms/models.py (modified) (1 diff)
- django/branches/gis/tests/modeltests/pagination/models.py (modified) (4 diffs)
- django/branches/gis/tests/modeltests/validation/models.py (modified) (4 diffs)
- django/branches/gis/tests/regressiontests/admin_registration (copied) (copied from django/trunk/tests/regressiontests/admin_registration)
- django/branches/gis/tests/regressiontests/admin_registration/__init__.py (copied) (copied from django/trunk/tests/regressiontests/admin_registration/__init__.py)
- django/branches/gis/tests/regressiontests/admin_registration/models.py (copied) (copied from django/trunk/tests/regressiontests/admin_registration/models.py)
- django/branches/gis/tests/regressiontests/admin_scripts/tests.py (modified) (49 diffs)
- django/branches/gis/tests/regressiontests/admin_views/tests.py (modified) (4 diffs)
- django/branches/gis/tests/regressiontests/auth_backends/tests.py (modified) (2 diffs)
- django/branches/gis/tests/regressiontests/cache/tests.py (modified) (7 diffs)
- django/branches/gis/tests/regressiontests/context_processors (copied) (copied from django/trunk/tests/regressiontests/context_processors)
- django/branches/gis/tests/regressiontests/context_processors/__init__.py (copied) (copied from django/trunk/tests/regressiontests/context_processors/__init__.py)
- django/branches/gis/tests/regressiontests/context_processors/models.py (copied) (copied from django/trunk/tests/regressiontests/context_processors/models.py)
- django/branches/gis/tests/regressiontests/context_processors/templates (copied) (copied from django/trunk/tests/regressiontests/context_processors/templates)
- django/branches/gis/tests/regressiontests/context_processors/templates/context_processors (copied) (copied from django/trunk/tests/regressiontests/context_processors/templates/context_processors)
- django/branches/gis/tests/regressiontests/context_processors/templates/context_processors/request_attrs.html (copied) (copied from django/trunk/tests/regressiontests/context_processors/templates/context_processors/request_attrs.html)
- django/branches/gis/tests/regressiontests/context_processors/tests.py (copied) (copied from django/trunk/tests/regressiontests/context_processors/tests.py)
- django/branches/gis/tests/regressiontests/context_processors/urls.py (copied) (copied from django/trunk/tests/regressiontests/context_processors/urls.py)
- django/branches/gis/tests/regressiontests/context_processors/views.py (copied) (copied from django/trunk/tests/regressiontests/context_processors/views.py)
- django/branches/gis/tests/regressiontests/dispatch/tests/test_dispatcher.py (modified) (6 diffs)
- django/branches/gis/tests/regressiontests/file_uploads/models.py (modified) (1 diff)
- django/branches/gis/tests/regressiontests/file_uploads/tests.py (modified) (10 diffs)
- django/branches/gis/tests/regressiontests/forms/fields.py (modified) (11 diffs)
- django/branches/gis/tests/regressiontests/forms/formsets.py (modified) (15 diffs)
- django/branches/gis/tests/regressiontests/forms/forms.py (modified) (1 diff)
- django/branches/gis/tests/regressiontests/forms/localflavor/at.py (copied) (copied from django/trunk/tests/regressiontests/forms/localflavor/at.py)
- django/branches/gis/tests/regressiontests/forms/localflavor/ro.py (copied) (copied from django/trunk/tests/regressiontests/forms/localflavor/ro.py)
- django/branches/gis/tests/regressiontests/forms/models.py (modified) (2 diffs)
- django/branches/gis/tests/regressiontests/forms/tests.py (modified) (4 diffs)
- django/branches/gis/tests/regressiontests/m2m_through_regress (copied) (copied from django/trunk/tests/regressiontests/m2m_through_regress)
- django/branches/gis/tests/regressiontests/m2m_through_regress/__init__.py (copied) (copied from django/trunk/tests/regressiontests/m2m_through_regress/__init__.py)
- django/branches/gis/tests/regressiontests/m2m_through_regress/models.py (copied) (copied from django/trunk/tests/regressiontests/m2m_through_regress/models.py)
- django/branches/gis/tests/regressiontests/mail/tests.py (modified) (2 diffs)
- django/branches/gis/tests/regressiontests/many_to_one_regress/models.py (modified) (3 diffs)
- django/branches/gis/tests/regressiontests/maxlength (deleted)
- django/branches/gis/tests/regressiontests/max_lengths/tests.py (modified) (1 diff)
- django/branches/gis/tests/regressiontests/modeladmin/models.py (modified) (1 diff)
- django/branches/gis/tests/regressiontests/model_fields/models.py (modified) (3 diffs)
- django/branches/gis/tests/regressiontests/model_fields/tests.py (modified) (2 diffs)
- django/branches/gis/tests/regressiontests/model_inheritance_regress/models.py (modified) (3 diffs)
- django/branches/gis/tests/regressiontests/model_regress/models.py (modified) (2 diffs)
- django/branches/gis/tests/regressiontests/null_fk/models.py (modified) (3 diffs)
- django/branches/gis/tests/regressiontests/one_to_one_regress/models.py (modified) (5 diffs)
- django/branches/gis/tests/regressiontests/pagination_regress (copied) (copied from django/trunk/tests/regressiontests/pagination_regress)
- django/branches/gis/tests/regressiontests/pagination_regress/__init__.py (copied) (copied from django/trunk/tests/regressiontests/pagination_regress/__init__.py)
- django/branches/gis/tests/regressiontests/pagination_regress/models.py (copied) (copied from django/trunk/tests/regressiontests/pagination_regress/models.py)
- django/branches/gis/tests/regressiontests/pagination_regress/tests.py (copied) (copied from django/trunk/tests/regressiontests/pagination_regress/tests.py)
- django/branches/gis/tests/regressiontests/queries/models.py (modified) (5 diffs)
- django/branches/gis/tests/regressiontests/requests/tests.py (modified) (1 diff)
- django/branches/gis/tests/regressiontests/reverse_single_related (copied) (copied from django/trunk/tests/regressiontests/reverse_single_related)
- django/branches/gis/tests/regressiontests/reverse_single_related/__init__.py (copied) (copied from django/trunk/tests/regressiontests/reverse_single_related/__init__.py)
- django/branches/gis/tests/regressiontests/reverse_single_related/models.py (copied) (copied from django/trunk/tests/regressiontests/reverse_single_related/models.py)
- django/branches/gis/tests/regressiontests/serializers_regress/tests.py (modified) (6 diffs)
- django/branches/gis/tests/regressiontests/templates/loaders.py (modified) (2 diffs)
- django/branches/gis/tests/regressiontests/templates/tests.py (modified) (6 diffs)
- django/branches/gis/tests/regressiontests/test_client_regress/models.py (modified) (5 diffs)
- django/branches/gis/tests/regressiontests/test_utils (copied) (copied from django/trunk/tests/regressiontests/test_utils)
- django/branches/gis/tests/regressiontests/test_utils/__init__.py (copied) (copied from django/trunk/tests/regressiontests/test_utils/__init__.py)
- django/branches/gis/tests/regressiontests/test_utils/models.py (copied) (copied from django/trunk/tests/regressiontests/test_utils/models.py)
- django/branches/gis/tests/regressiontests/test_utils/tests.py (copied) (copied from django/trunk/tests/regressiontests/test_utils/tests.py)
- django/branches/gis/tests/regressiontests/utils/datastructures.py (modified) (1 diff)
- django/branches/gis/tests/regressiontests/utils/tests.py (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
django/branches/gis
- Property svnmerge-integrated changed from /django/trunk:1-7978 to /django/trunk:1-8214
django/branches/gis/tests/modeltests/choices/models.py
r6018 r8215 37 37 >>> s.get_gender_display() 38 38 u'Female' 39 40 # If the value for the field doesn't correspond to a valid choice, 41 # the value itself is provided as a display value. 42 >>> a.gender = '' 43 >>> a.get_gender_display() 44 u'' 45 46 >>> a.gender = 'U' 47 >>> a.get_gender_display() 48 u'U' 49 39 50 """} django/branches/gis/tests/modeltests/custom_methods/models.py
r6018 r8215 32 32 FROM custom_methods_article 33 33 WHERE pub_date = %s 34 AND id != %s""", [str(self.pub_date), self.id]) 34 AND id != %s""", [connection.ops.value_to_db_date(self.pub_date), 35 self.id]) 35 36 # The asterisk in "(*row)" tells Python to expand the list into 36 37 # positional arguments to Article(). django/branches/gis/tests/modeltests/delete/models.py
r7768 r8215 43 43 44 44 __test__ = {'API_TESTS': """ 45 # First, some tests for the datastructure we use 45 ### Tests for models A,B,C,D ### 46 47 ## First, test the CollectedObjects data structure directly 46 48 47 49 >>> from django.db.models.query import CollectedObjects … … 73 75 74 76 77 ## Second, test the usage of CollectedObjects by Model.delete() 75 78 76 79 # Due to the way that transactions work in the test harness, … … 85 88 # access to internals here :-) 86 89 90 # If implementation changes, then the tests may need to be simplified: 91 # - remove the lines that set the .keyOrder and clear the related 92 # object caches 93 # - remove the second set of tests (with a2, b2 etc) 94 87 95 >>> from django.db.models.loading import cache 96 97 >>> def clear_rel_obj_caches(models): 98 ... for m in models: 99 ... if hasattr(m._meta, '_related_objects_cache'): 100 ... del m._meta._related_objects_cache 88 101 89 102 # Nice order 90 103 >>> cache.app_models['delete'].keyOrder = ['a', 'b', 'c', 'd'] 91 >>> del A._meta._related_objects_cache 92 >>> del B._meta._related_objects_cache 93 >>> del C._meta._related_objects_cache 94 >>> del D._meta._related_objects_cache 104 >>> clear_rel_obj_caches([A, B, C, D]) 95 105 96 106 >>> a1 = A() … … 111 121 # Same again with a known bad order 112 122 >>> cache.app_models['delete'].keyOrder = ['d', 'c', 'b', 'a'] 113 >>> del A._meta._related_objects_cache 114 >>> del B._meta._related_objects_cache 115 >>> del C._meta._related_objects_cache 116 >>> del D._meta._related_objects_cache 123 >>> clear_rel_obj_caches([A, B, C, D]) 117 124 118 125 >>> a2 = A() … … 131 138 >>> a2.delete() 132 139 133 # Tests for nullable related fields 140 ### Tests for models E,F - nullable related fields ### 141 142 ## First, test the CollectedObjects data structure directly 134 143 135 144 >>> g = CollectedObjects() … … 142 151 >>> g.ordered_keys() 143 152 ['key1', 'key2'] 153 154 ## Second, test the usage of CollectedObjects by Model.delete() 144 155 145 156 >>> e1 = E() django/branches/gis/tests/modeltests/generic_relations/models.py
r6920 r8215 28 28 return self.tag 29 29 30 class Comparison(models.Model): 31 """ 32 A model that tests having multiple GenericForeignKeys 33 """ 34 comparative = models.CharField(max_length=50) 35 36 content_type1 = models.ForeignKey(ContentType, related_name="comparative1_set") 37 object_id1 = models.PositiveIntegerField() 38 39 content_type2 = models.ForeignKey(ContentType, related_name="comparative2_set") 40 object_id2 = models.PositiveIntegerField() 41 42 first_obj = generic.GenericForeignKey(ct_field="content_type1", fk_field="object_id1") 43 other_obj = generic.GenericForeignKey(ct_field="content_type2", fk_field="object_id2") 44 45 def __unicode__(self): 46 return u"%s is %s than %s" % (self.first_obj, self.comparative, self.other_obj) 47 30 48 class Animal(models.Model): 31 49 common_name = models.CharField(max_length=150) … … 33 51 34 52 tags = generic.GenericRelation(TaggedItem) 53 comparisons = generic.GenericRelation(Comparison, 54 object_id_field="object_id1", 55 content_type_field="content_type1") 35 56 36 57 def __unicode__(self): … … 137 158 [<Animal: Platypus>] 138 159 160 # Simple tests for multiple GenericForeignKeys 161 # only uses one model, since the above tests should be sufficient. 162 >>> tiger, cheetah, bear = Animal(common_name="tiger"), Animal(common_name="cheetah"), Animal(common_name="bear") 163 >>> for o in [tiger, cheetah, bear]: o.save() 164 165 # Create directly 166 >>> Comparison(first_obj=cheetah, other_obj=tiger, comparative="faster").save() 167 >>> Comparison(first_obj=tiger, other_obj=cheetah, comparative="cooler").save() 168 169 # Create using GenericRelation 170 >>> tiger.comparisons.create(other_obj=bear, comparative="cooler") 171 <Comparison: tiger is cooler than bear> 172 >>> tiger.comparisons.create(other_obj=cheetah, comparative="stronger") 173 <Comparison: tiger is stronger than cheetah> 174 175 >>> cheetah.comparisons.all() 176 [<Comparison: cheetah is faster than tiger>] 177 178 # Filtering works 179 >>> tiger.comparisons.filter(comparative="cooler") 180 [<Comparison: tiger is cooler than cheetah>, <Comparison: tiger is cooler than bear>] 181 182 # Filtering and deleting works 183 >>> subjective = ["cooler"] 184 >>> tiger.comparisons.filter(comparative__in=subjective).delete() 185 >>> Comparison.objects.all() 186 [<Comparison: cheetah is faster than tiger>, <Comparison: tiger is stronger than cheetah>] 187 188 # If we delete cheetah, Comparisons with cheetah as 'first_obj' will be deleted 189 # since Animal has an explicit GenericRelation to Comparison through first_obj. 190 # Comparisons with cheetah as 'other_obj' will not be deleted. 191 >>> cheetah.delete() 192 >>> Comparison.objects.all() 193 [<Comparison: tiger is stronger than None>] 139 194 """} django/branches/gis/tests/modeltests/invalid_models/models.py
r7979 r8215 111 111 rel1 = models.ForeignKey("Rel1") 112 112 rel2 = models.ManyToManyField("Rel2") 113 114 class MissingManualM2MModel(models.Model): 115 name = models.CharField(max_length=5) 116 missing_m2m = models.ManyToManyField(Model, through="MissingM2MModel") 117 118 class Person(models.Model): 119 name = models.CharField(max_length=5) 120 121 class Group(models.Model): 122 name = models.CharField(max_length=5) 123 primary = models.ManyToManyField(Person, through="Membership", related_name="primary") 124 secondary = models.ManyToManyField(Person, through="Membership", related_name="secondary") 125 tertiary = models.ManyToManyField(Person, through="RelationshipDoubleFK", related_name="tertiary") 126 127 class GroupTwo(models.Model): 128 name = models.CharField(max_length=5) 129 primary = models.ManyToManyField(Person, through="Membership") 130 secondary = models.ManyToManyField(Group, through="MembershipMissingFK") 131 132 class Membership(models.Model): 133 person = models.ForeignKey(Person) 134 group = models.ForeignKey(Group) 135 not_default_or_null = models.CharField(max_length=5) 136 137 class MembershipMissingFK(models.Model): 138 person = models.ForeignKey(Person) 139 140 class PersonSelfRefM2M(models.Model): 141 name = models.CharField(max_length=5) 142 friends = models.ManyToManyField('self', through="Relationship") 143 too_many_friends = models.ManyToManyField('self', through="RelationshipTripleFK") 144 145 class PersonSelfRefM2MExplicit(models.Model): 146 name = models.CharField(max_length=5) 147 friends = models.ManyToManyField('self', through="ExplicitRelationship", symmetrical=True) 148 149 class Relationship(models.Model): 150 first = models.ForeignKey(PersonSelfRefM2M, related_name="rel_from_set") 151 second = models.ForeignKey(PersonSelfRefM2M, related_name="rel_to_set") 152 date_added = models.DateTimeField() 153 154 class ExplicitRelationship(models.Model): 155 first = models.ForeignKey(PersonSelfRefM2MExplicit, related_name="rel_from_set") 156 second = models.ForeignKey(PersonSelfRefM2MExplicit, related_name="rel_to_set") 157 date_added = models.DateTimeField() 158 159 class RelationshipTripleFK(models.Model): 160 first = models.ForeignKey(PersonSelfRefM2M, related_name="rel_from_set_2") 161 second = models.ForeignKey(PersonSelfRefM2M, related_name="rel_to_set_2") 162 third = models.ForeignKey(PersonSelfRefM2M, related_name="too_many_by_far") 163 date_added = models.DateTimeField() 164 165 class RelationshipDoubleFK(models.Model): 166 first = models.ForeignKey(Person, related_name="first_related_name") 167 second = models.ForeignKey(Person, related_name="second_related_name") 168 third = models.ForeignKey(Group, related_name="rel_to_set") 169 date_added = models.DateTimeField() 113 170 114 171 model_errors = """invalid_models.fielderrors: "charfield": CharFields require a "max_length" attribute. … … 196 253 invalid_models.missingrelations: 'rel2' has m2m relation with model Rel2, which has not been installed 197 254 invalid_models.missingrelations: 'rel1' has relation with model Rel1, which has not been installed 255 invalid_models.grouptwo: 'primary' has a manually-defined m2m relation through model Membership, which does not have foreign keys to Person and GroupTwo 256 invalid_models.grouptwo: 'secondary' has a manually-defined m2m relation through model MembershipMissingFK, which does not have foreign keys to Group and GroupTwo 257 invalid_models.missingmanualm2mmodel: 'missing_m2m' specifies an m2m relation through model MissingM2MModel, which has not been installed 258 invalid_models.group: The model Group has two manually-defined m2m relations through the model Membership, which is not permitted. Please consider using an extra field on your intermediary model instead. 259 invalid_models.group: Intermediary model RelationshipDoubleFK has more than one foreign key to Person, which is ambiguous and is not permitted. 260 invalid_models.personselfrefm2m: Many-to-many fields with intermediate tables cannot be symmetrical. 261 invalid_models.personselfrefm2m: Intermediary model RelationshipTripleFK has more than two foreign keys to PersonSelfRefM2M, which is ambiguous and is not permitted. 262 invalid_models.personselfrefm2mexplicit: Many-to-many fields with intermediate tables cannot be symmetrical. 198 263 """ django/branches/gis/tests/modeltests/many_to_one/models.py
r7979 r8215 47 47 # Article objects have access to their related Reporter objects. 48 48 >>> r = a.reporter 49 50 # These are strings instead of unicode strings because that's what was used in 51 # the creation of this reporter (and we haven't refreshed the data from the 52 # database, which always returns unicode strings). 49 53 >>> r.first_name, r.last_name 50 ( u'John', u'Smith')54 ('John', 'Smith') 51 55 52 56 # Create an Article via the Reporter object. … … 177 181 178 182 # You can also use a queryset instead of a literal list of instances. 179 # The queryset must be reduced to a list of values using values(), 183 # The queryset must be reduced to a list of values using values(), 180 184 # then converted into a query 181 185 >>> Article.objects.filter(reporter__in=Reporter.objects.filter(first_name='John').values('pk').query).distinct() django/branches/gis/tests/modeltests/model_formsets/models.py
r7979 r8215 1 1 from django.db import models 2 3 try: 4 sorted 5 except NameError: 6 from django.utils.itercompat import sorted 2 7 3 8 class Author(models.Model): 4 9 name = models.CharField(max_length=100) 10 11 class Meta: 12 ordering = ('name',) 5 13 6 14 def __unicode__(self): … … 18 26 authors = models.ManyToManyField(Author) 19 27 created = models.DateField(editable=False) 20 28 21 29 def __unicode__(self): 22 30 return self.name 31 32 class CustomPrimaryKey(models.Model): 33 my_pk = models.CharField(max_length=10, primary_key=True) 34 some_field = models.CharField(max_length=100) 23 35 24 36 … … 42 54 ... 'form-TOTAL_FORMS': '3', # the number of forms rendered 43 55 ... 'form-INITIAL_FORMS': '0', # the number of forms with initial data 44 ... 'form-MAX_FORMS': '0', # the max number of forms45 56 ... 'form-0-name': 'Charles Baudelaire', 46 57 ... 'form-1-name': 'Arthur Rimbaud', … … 80 91 ... 'form-TOTAL_FORMS': '3', # the number of forms rendered 81 92 ... 'form-INITIAL_FORMS': '2', # the number of forms with initial data 82 ... 'form-MAX_FORMS': '0', # the max number of forms83 93 ... 'form-0-id': '2', 84 94 ... 'form-0-name': 'Arthur Rimbaud', … … 124 134 ... 'form-TOTAL_FORMS': '4', # the number of forms rendered 125 135 ... 'form-INITIAL_FORMS': '3', # the number of forms with initial data 126 ... 'form-MAX_FORMS': '0', # the max number of forms127 136 ... 'form-0-id': '2', 128 137 ... 'form-0-name': 'Arthur Rimbaud', … … 154 163 ... 'form-TOTAL_FORMS': '4', # the number of forms rendered 155 164 ... 'form-INITIAL_FORMS': '3', # the number of forms with initial data 156 ... 'form-MAX_FORMS': '0', # the max number of forms157 165 ... 'form-0-id': '2', 158 166 ... 'form-0-name': 'Walt Whitman', … … 185 193 ... 'form-TOTAL_FORMS': '2', # the number of forms rendered 186 194 ... 'form-INITIAL_FORMS': '1', # the number of forms with initial data 187 ... 'form-MAX_FORMS': '0', # the max number of forms188 195 ... 'form-0-id': '1', 189 196 ... 'form-0-name': '2nd Tuesday of the Week Meeting', … … 202 209 >>> formset.save_m2m() 203 210 >>> instances[0].authors.all() 204 [<Author: Charles Baudelaire>, <Author: Walt Whitman>, <Author: Paul Verlaine>, <Author: John Steinbeck>]211 [<Author: Charles Baudelaire>, <Author: John Steinbeck>, <Author: Paul Verlaine>, <Author: Walt Whitman>] 205 212 206 213 # delete the author we created to allow later tests to continue working. … … 215 222 >>> AuthorFormSet = modelformset_factory(Author, max_num=2) 216 223 >>> formset = AuthorFormSet(queryset=qs) 217 >>> formset.initial218 [ {'id': 1, 'name': u'Charles Baudelaire'}, {'id': 3, 'name': u'Paul Verlaine'}]224 >>> [sorted(x.items()) for x in formset.initial] 225 [[('id', 1), ('name', u'Charles Baudelaire')], [('id', 3), ('name', u'Paul Verlaine')]] 219 226 220 227 >>> AuthorFormSet = modelformset_factory(Author, max_num=3) 221 228 >>> formset = AuthorFormSet(queryset=qs) 222 >>> formset.initial 223 [{'id': 1, 'name': u'Charles Baudelaire'}, {'id': 3, 'name': u'Paul Verlaine'}, {'id': 2, 'name': u'Walt Whitman'}] 229 >>> [sorted(x.items()) for x in formset.initial] 230 [[('id', 1), ('name', u'Charles Baudelaire')], [('id', 3), ('name', u'Paul Verlaine')], [('id', 2), ('name', u'Walt Whitman')]] 231 224 232 225 233 # Inline Formsets ############################################################ … … 243 251 ... 'book_set-TOTAL_FORMS': '3', # the number of forms rendered 244 252 ... 'book_set-INITIAL_FORMS': '0', # the number of forms with initial data 245 ... 'book_set-MAX_FORMS': '0', # the max number of forms246 253 ... 'book_set-0-title': 'Les Fleurs du Mal', 247 254 ... 'book_set-1-title': '', … … 278 285 ... 'book_set-TOTAL_FORMS': '3', # the number of forms rendered 279 286 ... 'book_set-INITIAL_FORMS': '1', # the number of forms with initial data 280 ... 'book_set-MAX_FORMS': '0', # the max number of forms281 287 ... 'book_set-0-id': '1', 282 288 ... 'book_set-0-title': 'Les Fleurs du Mal', … … 294 300 As you can see, 'Le Spleen de Paris' is now a book belonging to Charles Baudelaire. 295 301 296 >>> for book in author.book_set.order_by(' title'):302 >>> for book in author.book_set.order_by('id'): 297 303 ... print book.title 304 Les Fleurs du Mal 298 305 Le Spleen de Paris 299 Les Fleurs du Mal300 306 301 307 The save_as_new parameter lets you re-associate the data to a new instance. … … 305 311 ... 'book_set-TOTAL_FORMS': '3', # the number of forms rendered 306 312 ... 'book_set-INITIAL_FORMS': '2', # the number of forms with initial data 307 ... 'book_set-MAX_FORMS': '0', # the max number of forms308 313 ... 'book_set-0-id': '1', 309 314 ... 'book_set-0-title': 'Les Fleurs du Mal', … … 322 327 [<Book: Les Fleurs du Mal>, <Book: Le Spleen de Paris>] 323 328 329 Test using a custom prefix on an inline formset. 330 331 >>> formset = AuthorBooksFormSet(prefix="test") 332 >>> for form in formset.forms: 333 ... print form.as_p() 334 <p><label for="id_test-0-title">Title:</label> <input id="id_test-0-title" type="text" name="test-0-title" maxlength="100" /><input type="hidden" name="test-0-id" id="id_test-0-id" /></p> 335 <p><label for="id_test-1-title">Title:</label> <input id="id_test-1-title" type="text" name="test-1-title" maxlength="100" /><input type="hidden" name="test-1-id" id="id_test-1-id" /></p> 336 337 # Test a custom primary key ################################################### 338 339 We need to ensure that it is displayed 340 341 >>> CustomPrimaryKeyFormSet = modelformset_factory(CustomPrimaryKey) 342 >>> formset = CustomPrimaryKeyFormSet() 343 >>> for form in formset.forms: 344 ... print form.as_p() 345 <p><label for="id_form-0-my_pk">My pk:</label> <input id="id_form-0-my_pk" type="text" name="form-0-my_pk" maxlength="10" /></p> 346 <p><label for="id_form-0-some_field">Some field:</label> <input id="id_form-0-some_field" type="text" name="form-0-some_field" maxlength="100" /></p> 347 324 348 """} django/branches/gis/tests/modeltests/model_forms/models.py
r7979 r8215 70 70 try: 71 71 # If PIL is available, try testing PIL. 72 # Otherwise, it's equivalent to TextFile above. 73 import Image 72 # Checking for the existence of Image is enough for CPython, but 73 # for PyPy, you need to check for the underlying modules 74 # If PIL is not available, this test is equivalent to TextFile above. 75 import Image, _imaging 74 76 image = models.ImageField(upload_to=tempfile.gettempdir()) 75 77 except ImportError: django/branches/gis/tests/modeltests/pagination/models.py
r7918 r8215 5 5 of code. This is often useful for dividing search results or long lists of 6 6 objects into easily readable pages. 7 8 In Django 0.96 and earlier, a single ObjectPaginator class implemented this9 functionality. In the Django development version, the behavior is split across10 two classes -- Paginator and Page -- that are more easier to use. The legacy11 ObjectPaginator class is deprecated.12 7 """ 13 8 … … 28 23 ... a.save() 29 24 30 ################## ##################31 # New/current API (Paginator/Page)#32 ################## ##################25 ################## 26 # Paginator/Page # 27 ################## 33 28 34 29 >>> from django.core.paginator import Paginator … … 141 136 5 142 137 143 ################################ 144 # Legacy API (ObjectPaginator) # 145 ################################ 138 # Paginator can be passed other objects with a count() method. 139 >>> class CountContainer: 140 ... def count(self): 141 ... return 42 142 >>> paginator = Paginator(CountContainer(), 10) 143 >>> paginator.count 144 42 145 >>> paginator.num_pages 146 5 147 >>> paginator.page_range 148 [1, 2, 3, 4, 5] 146 149 147 # Don't print out the deprecation warnings during testing. 148 >>> from warnings import filterwarnings 149 >>> filterwarnings("ignore") 150 151 >>> from django.core.paginator import ObjectPaginator, EmptyPage 152 >>> paginator = ObjectPaginator(Article.objects.all(), 5) 153 >>> paginator.hits 154 9 155 >>> paginator.pages 156 2 157 >>> paginator.page_range 158 [1, 2] 159 160 # Get the first page. 161 >>> paginator.get_page(0) 162 [<Article: Article 1>, <Article: Article 2>, <Article: Article 3>, <Article: Article 4>, <Article: Article 5>] 163 >>> paginator.has_next_page(0) 164 True 165 >>> paginator.has_previous_page(0) 166 False 167 >>> paginator.first_on_page(0) 168 1 169 >>> paginator.last_on_page(0) 170 5 171 172 # Get the second page. 173 >>> paginator.get_page(1) 174 [<Article: Article 6>, <Article: Article 7>, <Article: Article 8>, <Article: Article 9>] 175 >>> paginator.has_next_page(1) 176 False 177 >>> paginator.has_previous_page(1) 178 True 179 >>> paginator.first_on_page(1) 180 6 181 >>> paginator.last_on_page(1) 182 9 183 184 # Invalid pages raise EmptyPage. 185 >>> paginator.get_page(-1) 186 Traceback (most recent call last): 187 ... 188 EmptyPage: ... 189 >>> paginator.get_page(2) 190 Traceback (most recent call last): 191 ... 192 EmptyPage: ... 193 194 # Empty paginators with allow_empty_first_page=True. 195 >>> paginator = ObjectPaginator(Article.objects.filter(id=0), 5) 196 >>> paginator.count 197 0 198 >>> paginator.num_pages 199 1 200 >>> paginator.page_range 201 [1] 202 203 # ObjectPaginator can be passed lists too. 204 >>> paginator = ObjectPaginator([1, 2, 3], 5) 205 >>> paginator.hits 206 3 207 >>> paginator.pages 208 1 209 >>> paginator.page_range 210 [1] 211 212 213 # ObjectPaginator can be passed other objects with a count() method. 214 >>> class Container: 150 # Paginator can be passed other objects that implement __len__. 151 >>> class LenContainer: 215 152 ... def __len__(self): 216 153 ... return 42 217 >>> paginator = ObjectPaginator(Container(), 10)218 >>> paginator. hits154 >>> paginator = Paginator(LenContainer(), 10) 155 >>> paginator.count 219 156 42 220 >>> paginator. pages157 >>> paginator.num_pages 221 158 5 222 159 >>> paginator.page_range … … 238 175 239 176 # With orphans only set to 1, we should get two pages. 240 >>> paginator = ObjectPaginator(Article.objects.all(), 10, orphans=1)177 >>> paginator = Paginator(Article.objects.all(), 10, orphans=1) 241 178 >>> paginator.num_pages 242 179 2 243 244 # LEGACY: With orphans set to 3 and 10 items per page, we should get all 12 items on a single page.245 >>> paginator = ObjectPaginator(Article.objects.all(), 10, orphans=3)246 >>> paginator.pages247 1248 249 # LEGACY: With orphans only set to 1, we should get two pages.250 >>> paginator = ObjectPaginator(Article.objects.all(), 10, orphans=1)251 >>> paginator.pages252 2253 180 """} django/branches/gis/tests/modeltests/validation/models.py
r7354 r8215 17 17 favorite_moment = models.DateTimeField() 18 18 email = models.EmailField() 19 best_time = models.TimeField() 19 20 20 21 def __unicode__(self): … … 29 30 ... 'birthdate': datetime.date(2000, 5, 3), 30 31 ... 'favorite_moment': datetime.datetime(2002, 4, 3, 13, 23), 31 ... 'email': 'john@example.com' 32 ... 'email': 'john@example.com', 33 ... 'best_time': datetime.time(16, 20), 32 34 ... } 33 35 >>> p = Person(**valid_params) … … 131 133 datetime.datetime(2002, 4, 3, 0, 0) 132 134 135 >>> p = Person(**dict(valid_params, best_time='16:20:00')) 136 >>> p.validate() 137 {} 138 >>> p.best_time 139 datetime.time(16, 20) 140 141 >>> p = Person(**dict(valid_params, best_time='16:20')) 142 >>> p.validate() 143 {} 144 >>> p.best_time 145 datetime.time(16, 20) 146 147 >>> p = Person(**dict(valid_params, best_time='bar')) 148 >>> p.validate()['best_time'] 149 [u'Enter a valid time in HH:MM[:ss[.uuuuuu]] format.'] 150 133 151 >>> p = Person(**dict(valid_params, email='john@example.com')) 134 152 >>> p.validate() … … 154 172 >>> errors['birthdate'] 155 173 [u'This field is required.'] 174 >>> errors['best_time'] 175 [u'This field is required.'] 156 176 157 177 """} django/branches/gis/tests/regressiontests/admin_scripts/tests.py
r7979 r8215 1 1 """ 2 A series of tests to establish that the command-line managment tools work as 2 A series of tests to establish that the command-line managment tools work as 3 3 advertised - especially with regards to the handling of the DJANGO_SETTINGS_MODULE 4 4 and default settings.py files. … … 7 7 import unittest 8 8 import shutil 9 import sys 10 import re 9 11 10 12 from django import conf, bin, get_version … … 13 15 class AdminScriptTestCase(unittest.TestCase): 14 16 def write_settings(self, filename, apps=None): 15 test_dir = os.path.dirname(os.path.dirname(__file__)) 17 test_dir = os.path.dirname(os.path.dirname(__file__)) 16 18 settings_file = open(os.path.join(test_dir,filename), 'w') 17 19 settings_file.write('# Settings file automatically generated by regressiontests.admin_scripts test case\n') … … 28 30 if hasattr(settings,s): 29 31 settings_file.write("%s = '%s'\n" % (s, str(getattr(settings,s)))) 30 32 31 33 if apps is None: 32 34 apps = ['django.contrib.auth', 'django.contrib.contenttypes', 'admin_scripts'] … … 34 36 if apps: 35 37 settings_file.write("INSTALLED_APPS = %s\n" % apps) 38 39 settings_file.close() 40 41 def remove_settings(self, filename): 42 test_dir = os.path.dirname(os.path.dirname(__file__)) 43 full_name = os.path.join(test_dir, filename) 44 os.remove(full_name) 36 45 37 settings_file.close() 38 39 def remove_settings(self, filename): 40 test_dir = os.path.dirname(os.path.dirname(__file__)) 41 os.remove(os.path.join(test_dir, filename)) 42 # Also try to remove the pyc file; if it exists, it could 46 # Also try to remove the compiled file; if it exists, it could 43 47 # mess up later tests that depend upon the .py file not existing 44 48 try: 45 os.remove(os.path.join(test_dir, filename + 'c')) 49 if sys.platform.startswith('java'): 50 # Jython produces module$py.class files 51 os.remove(re.sub(r'\.py$', '$py.class', full_name)) 52 else: 53 # CPython produces module.pyc files 54 os.remove(full_name + 'c') 46 55 except OSError: 47 56 pass 48 57 58 def _sys_executable(self): 59 """ 60 Returns the command line needed to run a python interpreter, including 61 the options for setting sys.path on Jython, which doesn't recognize 62 PYTHONPATH. 63 """ 64 if sys.platform.startswith('java'): 65 return "%s -J-Dpython.path=%s" % \ 66 (sys.executable, os.environ['PYTHONPATH']) 67 else: 68 return sys.executable 69 49 70 def run_test(self, script, args, settings_file=None, apps=None): 50 71 test_dir = os.path.dirname(os.path.dirname(__file__)) 51 72 project_dir = os.path.dirname(test_dir) 52 73 base_dir = os.path.dirname(project_dir) 53 54 # Build the command line 55 cmd = 'python "%s"' % script 56 cmd += ''.join([' %s' % arg for arg in args]) 57 74 58 75 # Remember the old environment 59 76 old_django_settings_module = os.environ.get('DJANGO_SETTINGS_MODULE', None) 60 77 old_python_path = os.environ.get('PYTHONPATH', None) 61 78 old_cwd = os.getcwd() 62 79 63 80 # Set the test environment 64 81 if settings_file: … … 66 83 elif 'DJANGO_SETTINGS_MODULE' in os.environ: 67 84 del os.environ['DJANGO_SETTINGS_MODULE'] 68 &nbs
