{"id": 8786, "created": "2008-09-02 00:12:20", "changetime": "2011-09-28 16:12:17", "last_pulled_from_trac": "2022-03-06 03:43:09.984065", "stage": "Unreviewed", "status": "closed", "component": "Documentation", "type": null, "severity": null, "version": "dev", "resolution": "fixed", "summary": "PhoneNumberField still listed in model docs", "description": "[8819] moved USStateField to localflavor docs, but not PhoneNumberField.", "owner": "nobody", "reporter": "mattmcc", "keywords": null, "easy": 0, "has_patch": 0, "needs_better_patch": 0, "needs_tests": 0, "needs_docs": 0, "ui_ux": 0} {"id": 8787, "created": "2008-09-02 00:58:46", "changetime": "2011-09-28 16:12:17", "last_pulled_from_trac": "2022-03-06 03:43:10.149129", "stage": "Accepted", "status": "closed", "component": "contrib.admin", "type": null, "severity": null, "version": "dev", "resolution": "fixed", "summary": "Tests are currently failing on django trunk", "description": "It's the admin_widget tests.", "owner": "nobody", "reporter": "Alex", "keywords": "1.0-blocker", "easy": 0, "has_patch": 1, "needs_better_patch": 0, "needs_tests": 0, "needs_docs": 0, "ui_ux": 0} {"id": 8788, "created": "2008-09-02 03:55:18", "changetime": "2011-09-28 16:12:17", "last_pulled_from_trac": "2022-03-06 03:43:10.312116", "stage": "Ready for checkin", "status": "closed", "component": "Documentation", "type": null, "severity": null, "version": "dev", "resolution": "fixed", "summary": "correction for some typos in #8805", "description": "{{{\r\nIndex: django/forms/models.py\r\n===================================================================\r\n--- django/forms/models.py (revision 8831)\r\n+++ django/forms/models.py (working copy)\r\n@@ -244,7 +244,7 @@\r\n if self.instance.pk is not None:\r\n qs = qs.exclude(pk=self.instance.pk)\r\n\r\n- # This cute trick with extra/values is the most efficiant way to\r\n+ # This cute trick with extra/values is the most efficient way to\r\n # tell if a particular query returns any results.\r\n if qs.extra(select={'a': 1}).values('a').order_by():\r\n model_name = capfirst(self.instance._meta.verbose_name)\r\nIndex: docs/topics/forms/modelforms.txt\r\n===================================================================\r\n--- docs/topics/forms/modelforms.txt (revision 8831)\r\n+++ docs/topics/forms/modelforms.txt (working copy)\r\n@@ -337,10 +337,10 @@\r\n Overriding the clean() method\r\n -----------------------------\r\n\r\n-You can overide the ``clean()`` method on a model form to provide additional\r\n+You can override the ``clean()`` method on a model form to provide additional\r\n validation in the same way you can on a normal form. However, by default the\r\n ``clean()`` method validates the uniqueness of fields that are marked as unique\r\n-on the model, and those marked as unque_together, if you would like to overide\r\n+on the model, and those marked as unique_together, if you would like to override\r\n the ``clean()`` method and maintain the default validation you must call the\r\n parent class's ``clean()`` method.\r\n}}}\r\n", "owner": "nobody", "reporter": "Matthew Flanagan ", "keywords": null, "easy": 0, "has_patch": 1, "needs_better_patch": 0, "needs_tests": 0, "needs_docs": 0, "ui_ux": 0} {"id": 8789, "created": "2008-09-02 06:56:24", "changetime": "2008-11-04 10:12:42", "last_pulled_from_trac": "2022-03-06 03:43:10.471253", "stage": "Unreviewed", "status": "closed", "component": "contrib.admin", "type": null, "severity": null, "version": "dev", "resolution": "fixed", "summary": ".submit-row class doesnt have clearfix on password change page", "description": "\"Change password\" form in admin (when you go to change users passwords) has only 1 submit button and it's floated right so it's container (which has class .submit-row) doesn't wrap around it properly.\r\nIt's probably missing .clearfix class or something like overflow:auto.\r\n\r\nBug appears in latest Firefox and Opera (and probably most of other browsers, but i haven't had time to test it).", "owner": "nobody", "reporter": "rebus", "keywords": "css", "easy": 0, "has_patch": 0, "needs_better_patch": 0, "needs_tests": 0, "needs_docs": 0, "ui_ux": 0} {"id": 8790, "created": "2008-09-02 08:36:49", "changetime": "2011-09-28 16:12:17", "last_pulled_from_trac": "2022-03-06 03:43:10.642351", "stage": "Unreviewed", "status": "closed", "component": "Database layer (models, ORM)", "type": null, "severity": null, "version": "dev", "resolution": "fixed", "summary": "Q objects problem with disjunction", "description": "Thank you for fixing my bug in #8439, but I'm still having issues with these complex queries. Below is the exact system I'm trying to implement, although I've simplified it as much as I could for this report.\r\n\r\nBasically, there are \"users\" and \"groups\" (which contain users), and \"resources\" that they have privileges to access with respect to particular \"abilities\". Here are my models:\r\n\r\n{{{\r\nfrom django.db import models\r\n\r\nclass XResource(models.Model):\r\n pass\r\n\r\nclass XUser(models.Model):\r\n pass\r\n\r\nclass XGroup(models.Model):\r\n pass\r\n\r\nclass XMembership(models.Model):\r\n user = models.ForeignKey(XUser)\r\n group = models.ForeignKey(XGroup)\r\n\r\nclass XRole(models.Model):\r\n pass\r\n\r\nclass XAbility(models.Model):\r\n role = models.ForeignKey(XRole)\r\n name = models.CharField(max_length=100)\r\n allowed = models.BooleanField()\r\n\r\nclass XUserPriv(models.Model):\r\n user = models.ForeignKey(XUser)\r\n resource = models.ForeignKey(XResource)\r\n role = models.ForeignKey(XRole)\r\n\r\nclass XGroupPriv(models.Model):\r\n group = models.ForeignKey(XGroup)\r\n resource = models.ForeignKey(XResource)\r\n role = models.ForeignKey(XRole)\r\n}}}\r\n\r\nSo I create a user, who is in a group, and the group has privileges to use the \"display\" ability on a resource.\r\n\r\n{{{\r\n user = XUser.objects.create()\r\n group = XGroup.objects.create()\r\nmembership = XMembership.objects.create(user=user, group=group)\r\n resource = XResource.objects.create()\r\n role = XRole.objects.create()\r\n ability = XAbility.objects.create(role=role, name=\"display\", allowed=True)\r\ngroup_priv = XGroupPriv.objects.create(group=group, resource=resource, role=role)\r\n}}}\r\n\r\nI do the following query (I want to get a list of all resources that the user is directly allowed to display, along with those that the user is allowed to display via his group, given that he is not explicitly denied the privilege himself), and I get no results (but I should get back [resource]):\r\n\r\n{{{\r\ndirect_yes_q = Q(xuserpriv__user=user,\r\n xuserpriv__role__xability__name=\"display\",\r\n xuserpriv__role__xability__allowed=True)\r\ndirect_no_q = Q(xuserpriv__user=user,\r\n xuserpriv__role__xability__name=\"display\",\r\n xuserpriv__role__xability__allowed=False)\r\ngroup_yes_q = Q(xgrouppriv__group__xmembership__user=user,\r\n xgrouppriv__role__xability__name=\"display\",\r\n xgrouppriv__role__xability__allowed=True)\r\n\r\nviewable_q = direct_yes_q | (~direct_no_q & group_yes_q)\r\nprint XResource.objects.filter(viewable_q).all()\r\n}}}\r\n\r\nThe SQL generated here is (I removed table prefixes and x's and some quotes to make it easier to read):\r\n{{{\r\nSELECT resource.id FROM resource\r\nLEFT OUTER JOIN userpriv ON (resource.id = userpriv.resource_id)\r\nLEFT OUTER JOIN role ON (userpriv.role_id = role.id)\r\n INNER JOIN ability ON (role.id = ability.role_id)\r\nLEFT OUTER JOIN grouppriv ON (resource.id = grouppriv.resource_id)\r\nLEFT OUTER JOIN role T7 ON (grouppriv.role_id = T7.id)\r\nLEFT OUTER JOIN group ON (grouppriv.group_id = group.id)\r\nLEFT OUTER JOIN membership ON (group.id = membership.group_id) WHERE ((ability.name = E'display' AND ability.allowed = true AND userpriv.user_id = 1 ) OR (NOT (resource.id IN (SELECT userpriv.resource_id FROM resource\r\n INNER JOIN userpriv ON (resource.id = userpriv.resource_id)\r\n INNER JOIN role ON (userpriv.role_id = role.id)\r\n INNER JOIN ability ON (role.id = ability.role_id) WHERE ability.name = E'display' ) AND resource.id IN (SELECT userpriv.resource_id FROM resource\r\n INNER JOIN userpriv ON (resource.id = userpriv.resource_id)\r\n INNER JOIN role ON (userpriv.role_id = role.id)\r\n INNER JOIN ability ON (role.id = ability.role_id) WHERE ability.allowed = false ) AND resource.id IN (SELECT userpriv.resource_id FROM resource\r\n INNER JOIN userpriv ON (resource.id = userpriv.resource_id) WHERE userpriv.user_id = 1 )) AND ability.allowed = true AND membership.user_id = 1 AND ability.name = E'display' ))\r\n}}}\r\n\r\nNow, when I do a simpler version of the query without one of the disjuncts, I actually get results back:\r\n\r\n{{{\r\nviewable_q = ~direct_no_q & group_yes_q\r\nprint XResource.objects.filter(viewable_q).all()\r\n}}}\r\n\r\nAnd it generates the following SQL:\r\n\r\n{{{\r\nSELECT resource.id FROM resource\r\nINNER JOIN grouppriv ON (resource.id = grouppriv.resource_id)\r\nINNER JOIN role ON (grouppriv.role_id = role.id)\r\nINNER JOIN ability ON (role.id = ability.role_id)\r\nINNER JOIN group ON (grouppriv.group_id = group.id)\r\nINNER JOIN membership ON (group.id = membership.group_id) WHERE (NOT (resource.id IN (SELECT userpriv.resource_id FROM resource\r\nINNER JOIN userpriv ON (resource.id = userpriv.resource_id)\r\nINNER JOIN role ON (userpriv.role_id = role.id)\r\nINNER JOIN ability ON (role.id = ability.role_id) WHERE ability.name = E'display' ) AND resource.id IN (SELECT userpriv.resource_id FROM resource\r\nINNER JOIN userpriv ON (resource.id = userpriv.resource_id)\r\nINNER JOIN role ON (userpriv.role_id = role.id)\r\nINNER JOIN ability ON (role.id = ability.role_id) WHERE ability.allowed = false ) AND resource.id IN (SELECT userpriv.resource_id FROM resource\r\nINNER JOIN userpriv ON (resource.id = userpriv.resource_id) WHERE userpriv.user_id = 1 )) AND ability.allowed = true AND membership.user_id = 1 AND ability.name = E'display' )\r\n}}}\r\n\r\nI know it's not a problem with my example, because in the second query, the Q returns a non-empty array, but when I add a disjunct (which can only add more results), the Q returns an empty array.\r\n\r\nMike\r\n", "owner": "mtredinnick", "reporter": "mikemintz", "keywords": "1.0-blocker", "easy": 0, "has_patch": 0, "needs_better_patch": 0, "needs_tests": 0, "needs_docs": 0, "ui_ux": 0} {"id": 8791, "created": "2008-09-02 08:48:24", "changetime": "2008-09-02 10:19:07", "last_pulled_from_trac": "2022-03-06 03:43:10.786973", "stage": "Unreviewed", "status": "closed", "component": "Translations", "type": null, "severity": null, "version": "dev", "resolution": "fixed", "summary": "Turkish translation updates", "description": "Here's another (and hopefully last) update for Turkish tanslations. Many additions and corrections.", "owner": "nobody", "reporter": "amiroff", "keywords": "turkish tr", "easy": 0, "has_patch": 1, "needs_better_patch": 0, "needs_tests": 0, "needs_docs": 0, "ui_ux": 0} {"id": 8792, "created": "2008-09-02 09:56:47", "changetime": "2009-03-01 12:13:57", "last_pulled_from_trac": "2022-03-06 03:43:10.945404", "stage": "Unreviewed", "status": "closed", "component": "Testing framework", "type": null, "severity": null, "version": "dev", "resolution": "wontfix", "summary": "Django's unit test system wipes out \"custom sql\" data before performing tests", "description": "Django's unit test system issues \"flush\" command (resulting in a truncate for all tables) just before performing tests. This causes problems when having custom sql scripts (/sql/.sql) because all this data is wiped out by the truncate and might be required for the tests.\r\n\r\nDjango's test execution path:\r\n - tables creation\r\n - custom sql execution (potential data insertion)\r\n - flush (truncate all tables)\r\n - perform tests (without potential custom sql data!)\r\n\r\n\r\nI think it might be good to execute custom sql after the truncate has occurred ...", "owner": "nobody", "reporter": "deltoide", "keywords": null, "easy": 0, "has_patch": 0, "needs_better_patch": 0, "needs_tests": 0, "needs_docs": 0, "ui_ux": 0} {"id": 8793, "created": "2008-09-02 11:10:42", "changetime": "2011-09-28 16:12:17", "last_pulled_from_trac": "2022-03-06 03:43:11.108225", "stage": "Unreviewed", "status": "closed", "component": "File uploads/storage", "type": null, "severity": null, "version": "dev", "resolution": "duplicate", "summary": "using the file.url can not download the uploaded file", "description": "when I digg into the source code,I found that in line 47 of django.db.models.fields.files,the call to self.storage.path(self.name) returns a os.path.normpath processed file path, it changes the file's full path to all lower case, but the url is not following this change, so this error happens!\r\n\r\nsorry, I can not submit a good patch for it,but I think it will resolved by you gurus.\r\n\r\nthank you ", "owner": "nobody", "reporter": "etng", "keywords": "normcase path", "easy": 0, "has_patch": 0, "needs_better_patch": 0, "needs_tests": 0, "needs_docs": 0, "ui_ux": 0} {"id": 8794, "created": "2008-09-02 11:54:58", "changetime": "2011-10-09 13:42:11", "last_pulled_from_trac": "2022-03-06 03:43:11.277140", "stage": "Accepted", "status": "closed", "component": "contrib.comments", "type": null, "severity": null, "version": "dev", "resolution": "fixed", "summary": "Profanity filter suffers from the Scunthorpe problem", "description": "The implementation of the profanity filter suffers from the [http://en.wikipedia.org/wiki/Scunthorpe_Problem Scunthorpe Problem]; ie. that it considers the town of Scunthorpe, amongst other innocuous words, to be profane.\r\n\r\nProfanity filtering is A Hard Problem, and na\u00efve solutions like this one cause frustrating problems to end-users.\r\n\r\nChecking the current profanities list for false positives in a couple of word lists I had to hand also yields:\r\n\r\n{{{\r\ngobbledegook\r\nsnigger\r\nBrushite\r\nCushite\r\nNiggerhead\r\nPeshito\r\nPeshitto\r\nShittah\r\nShittah tree\r\nShittim\r\nShittim wood\r\nShittle\r\nShittlecock\r\nShittleness\r\n}}}\r\n\r\nObviously proper names are not in my dictionary, but they cause frequent and often more annoying problems.\r\n\r\nI suggest to disable the filter by default so that scope of the problem is limited, and at the very least the filter must be restricted to {{{re.match(r'\\b' + word + '\\b')}}}. Users who need stricter profanity filters should have the responsibility for doing so, and potentially annoying their users themselves. Django should not be doing it for them.", "owner": "nobody", "reporter": "Daniel Pope ", "keywords": null, "easy": 0, "has_patch": 0, "needs_better_patch": 0, "needs_tests": 0, "needs_docs": 0, "ui_ux": 0} {"id": 8795, "created": "2008-09-02 12:00:55", "changetime": "2011-09-28 16:12:17", "last_pulled_from_trac": "2022-03-06 03:43:11.436606", "stage": "Accepted", "status": "closed", "component": "Forms", "type": null, "severity": null, "version": "dev", "resolution": "fixed", "summary": "unique_together validation fails on model forms that exclude unique fields", "description": "i found this bug\r\n\r\nwhen you have model like this:\r\n\r\n{{{\r\n#!python\r\nclass FunkcjeProdukt(models.Model):\r\n funkcja = models.ForeignKey(FunkcjeRodzina)\r\n produkt = models.ForeignKey(Produkty)\r\n wartosc = models.CharField(max_length=255)\r\n class Meta:\r\n unique_together = (\"produkt\", \"funkcja\")\r\n}}}\r\n\r\nand form from model:\r\n{{{\r\n#!python\r\nclass FunkcjeProduktForm(ModelForm):\r\n wartosc = forms.CharField(widget=forms.TextInput(attrs={'size':'40','class':'formularz'}))\r\n class Meta:\r\n model = FunkcjeProdukt\r\n exclude=('produkt','funkcja')\r\n}}}\r\nend if you want only edit \"wartosc\" from existing instance:\r\n\r\n{{{\r\n#!python\r\nform_fp = FunkcjeProduktForm(data=request.POST,instance=finst)\r\nif form_fp.is_valid():\r\n form_fp.save()\r\n}}}\r\n\r\nerror is throw:\r\n\r\n{{{\r\n#!python\r\nKeyError at /cms/r_produkt/8/'produkt'\r\nRequest Method: POST\r\nRequest URL: http://posiflex.com.pl/cms/r_produkt/8/\r\nException Type: KeyError\r\nException Value: 'produkt'\r\nException Location: /home/posiflex/django/forms/models.py in validate_unique, line 238\r\n}}}\r\n\r\nbecause:\r\nin validate_unique() from django/forms/models.py\r\nline unique_checks = list(self.instance._meta.unique_together[:])\r\nadd 'produkt' and 'funkcja' even when this fields in on exclude list\r\n\r\n\r\n\r\n", "owner": "jacob", "reporter": "anihrat@gmail.com", "keywords": null, "easy": 0, "has_patch": 0, "needs_better_patch": 0, "needs_tests": 0, "needs_docs": 0, "ui_ux": 0} {"id": 8796, "created": "2008-09-02 14:22:12", "changetime": "2011-09-28 16:12:17", "last_pulled_from_trac": "2022-03-06 03:43:11.579563", "stage": "Unreviewed", "status": "closed", "component": "Translations", "type": null, "severity": null, "version": "dev", "resolution": "fixed", "summary": "Last update of Brazilian Portuguese (pt_BR) localization for Django 1.0 final", "description": "Some translations improved and added new translations.\r\n\r\nPlease, if possible, apply this patch latest as possible, because is probably that we are going to have new changes later today.\r\n\r\nThanks! :-)", "owner": "nobody", "reporter": "Guilherme M. Gondim ", "keywords": "pt_BR", "easy": 0, "has_patch": 1, "needs_better_patch": 0, "needs_tests": 0, "needs_docs": 0, "ui_ux": 0} {"id": 8797, "created": "2008-09-02 14:56:07", "changetime": "2011-11-22 07:43:42", "last_pulled_from_trac": "2022-03-06 03:43:11.729761", "stage": "Design decision needed", "status": "closed", "component": "contrib.auth", "type": "Bug", "severity": "Normal", "version": "dev", "resolution": "worksforme", "summary": "django password reset tests assume hardcoded urls", "description": "in `django/contrib/auth/tests/views.py` there are lines like e.g.:\r\n{{{\r\nresponse = self.client.post('/password_reset/', {'email': 'not_a_real_email@email.com'})\r\n}}}\r\n\r\nWhen one associates the password views with different urls in urls.py these tests will fail because of the hardcoded `'/password_reset/'`.\r\n", "owner": "SmileyChris", "reporter": "teh", "keywords": null, "easy": 0, "has_patch": 0, "needs_better_patch": 0, "needs_tests": 0, "needs_docs": 0, "ui_ux": 0} {"id": 8798, "created": "2008-09-02 15:44:42", "changetime": "2012-10-15 21:16:47", "last_pulled_from_trac": "2022-03-06 03:43:11.884053", "stage": "Accepted", "status": "closed", "component": "contrib.localflavor", "type": "New feature", "severity": "Normal", "version": "dev", "resolution": "invalid", "summary": "Add DEPhoneNumberField to German localflavor module", "description": "This ticket tries to add a {{{DEPhoneNumberField}}} class to the German localflavor module.\r\n\r\nThere are several valid standards in Germany: DIN 5008, E.123 and an informal format which have national and international notations.\r\n\r\nMore information: http://de.wikipedia.org/wiki/Rufnummer#Schreibweisen\r\n", "owner": "jezdez", "reporter": "jezdez", "keywords": "locale, localflavor, german, phone, number, localflavorsplit", "easy": 0, "has_patch": 1, "needs_better_patch": 0, "needs_tests": 0, "needs_docs": 0, "ui_ux": 1} {"id": 8799, "created": "2008-09-02 15:45:19", "changetime": "2008-09-02 16:59:57", "last_pulled_from_trac": "2022-03-06 03:43:12.046010", "stage": "Unreviewed", "status": "closed", "component": "Database layer (models, ORM)", "type": null, "severity": null, "version": null, "resolution": "invalid", "summary": ".save() and .objects.create() does not set the primary key when the model has an explicit primary key field", "description": "Here is what I observed on django1.0-beta2 and 0.96 releases with MySQL or Sqlite3.[[BR]]\r\nI have the following table:[[BR]]\r\nSqlite:\r\n\r\n{{{\r\nCREATE TABLE \"Person\" (\r\n \"id\" integer NOT NULL PRIMARY KEY,\r\n \"name\" text NOT NULL\r\n)\r\nMySQL:\r\nCREATE TABLE `Person` (\r\n `id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY,\r\n `name` longtext NOT NULL\r\n)\r\n\r\n}}}\r\n\r\n\r\nIn the models.py I have \r\n\r\n{{{\r\nclass Person(models.Model):\r\n id = models.IntegerField(primary_key=True)\r\n name = models.TextField()\r\n class Meta:\r\n db_table = u'Person'\r\n\r\n}}}\r\n\r\n\r\nWhen I issue:\r\n{{{\r\np = Person.objects.create(name='Bob')\r\np.id\r\n}}}\r\nI get nothing. The record however is persisted.\r\nSame happens with\r\n{{{\r\np = Person('name'=Bob)\r\np.save()\r\np.id\r\n}}}\r\n\r\nIf however the model is missing the id field and django auto generates it:\r\n{{{\r\nclass Person(models.Model):\r\n name = models.TextField()\r\n class Meta:\r\n db_table = u'Person'\r\n}}}\r\nThan everything is OK. The id is set correctly.", "owner": "nobody", "reporter": "vmihaylov@gmail.com", "keywords": null, "easy": 0, "has_patch": 0, "needs_better_patch": 0, "needs_tests": 0, "needs_docs": 0, "ui_ux": 0} {"id": 8800, "created": "2008-09-02 15:59:36", "changetime": "2008-12-08 02:35:31", "last_pulled_from_trac": "2022-03-06 03:43:12.198834", "stage": "Unreviewed", "status": "closed", "component": "*.djangoproject.com", "type": null, "severity": null, "version": "dev", "resolution": "fixed", "summary": "New docs search producing invalid HTML", "description": "Very minor, but I noticed that my patch from #8723 that was committed in [8844] contains errors which causes the new docs site to produce invalid HTML.\r\n\r\nThe script tag in `search_form.html` has an unescaped ampersand (this was actually copied and pasted from Google's example code).\r\n\r\nAlso, it looks like the `lang` variable is never populated.\r\n\r\nThe attached (untested) patch should hopefully fix both of these.", "owner": "jacob", "reporter": "frasern", "keywords": null, "easy": 0, "has_patch": 1, "needs_better_patch": 0, "needs_tests": 0, "needs_docs": 0, "ui_ux": 0} {"id": 8801, "created": "2008-09-02 17:08:36", "changetime": "2008-09-04 00:01:01", "last_pulled_from_trac": "2022-03-06 03:43:12.360908", "stage": "Unreviewed", "status": "closed", "component": "Documentation", "type": null, "severity": null, "version": "0.96", "resolution": "wontfix", "summary": ".96 docs say svn", "description": "http://www.djangoproject.com/documentation/release_notes_0.96/#backwards-incompatible-changes \r\n\r\nsays \"This document is for Django's SVN release\" \r\n\r\nwhich is incorrect. ", "owner": "nobody", "reporter": "CarlFK", "keywords": null, "easy": 0, "has_patch": 0, "needs_better_patch": 0, "needs_tests": 0, "needs_docs": 0, "ui_ux": 0} {"id": 8802, "created": "2008-09-02 17:16:22", "changetime": "2011-09-28 16:12:17", "last_pulled_from_trac": "2022-03-06 03:43:12.490927", "stage": "Accepted", "status": "closed", "component": "Documentation", "type": null, "severity": null, "version": "dev", "resolution": "fixed", "summary": "Document database-dependent behavior of BooleanField.", "description": "As noted in http://code.djangoproject.com/ticket/7190, BooleanField can be either an int or a bool depending on the database used.\r\n\r\nThis bit of non-deterministic behavior should be documented very clearly.\r\n\r\n-Dave", "owner": "jacob", "reporter": "stengleind", "keywords": null, "easy": 0, "has_patch": 1, "needs_better_patch": 0, "needs_tests": 0, "needs_docs": 0, "ui_ux": 0} {"id": 8803, "created": "2008-09-02 17:36:53", "changetime": "2008-10-05 05:18:25", "last_pulled_from_trac": "2022-03-06 03:43:12.638756", "stage": "Unreviewed", "status": "closed", "component": "contrib.comments", "type": null, "severity": null, "version": "dev", "resolution": "fixed", "summary": "Possibility to use username if full name is missing in the comments framework", "description": "The ticket summary mentions it all. After a discussion with Jacob on IRC, it was decided to have this though having the full name is always recommended.", "owner": "nobody", "reporter": "thejaswi_puthraya", "keywords": "fullname, username, comments", "easy": 0, "has_patch": 1, "needs_better_patch": 0, "needs_tests": 0, "needs_docs": 0, "ui_ux": 0} {"id": 8804, "created": "2008-09-02 17:38:57", "changetime": "2011-09-28 16:12:17", "last_pulled_from_trac": "2022-03-06 03:43:12.787520", "stage": "Accepted", "status": "closed", "component": "Documentation", "type": null, "severity": null, "version": "dev", "resolution": "fixed", "summary": "Documentation example gives wrong result", "description": "{{{\r\n(r'^sitemap-(?P
.+).xml$', 'django.contrib.sitemaps.views.sitemap', {'sitemaps': sitemaps})\r\n}}}\r\n\r\nThis won't work. and results in sitemap-mysectionnamexxml instead of sitemap-mysectionname.xml\r\n\r\nThis will work:\r\n{{{\r\n(r'^sitemap-(?P
.+)\\.xml$', 'django.contrib.sitemaps.views.sitemap', {'sitemaps': sitemaps})\r\n}}}", "owner": "nobody", "reporter": "toke", "keywords": null, "easy": 0, "has_patch": 1, "needs_better_patch": 0, "needs_tests": 0, "needs_docs": 0, "ui_ux": 0} {"id": 8805, "created": "2008-09-02 18:22:57", "changetime": "2011-09-28 16:12:17", "last_pulled_from_trac": "2022-03-06 03:43:12.939766", "stage": "Unreviewed", "status": "closed", "component": "contrib.admin", "type": null, "severity": null, "version": "dev", "resolution": "fixed", "summary": "TypeError: sequence expected, int found", "description": "{{{\r\nclass Brand(models.Model):\r\n...\r\n geo = models.ForeignKey(Geo,\r\n related_name='brand_set',\r\n blank=True,\r\n null=True,\r\n limit_choices_to={'level__exact' : 0},\r\n )\r\n...\r\n}}}\r\nCaught an exception while rendering: sequence expected, int found\r\n\r\nOriginal Traceback (most recent call last):\r\n File \"/opt/elec-devel/python/django/template/debug.py\", line 71, in render_node\r\n result = node.render(context)\r\n File \"/opt/elec-devel/python/django/template/debug.py\", line 87, in render\r\n output = force_unicode(self.filter_expression.resolve(context))\r\n File \"/opt/elec-devel/python/django/utils/encoding.py\", line 49, in force_unicode\r\n s = unicode(s)\r\n File \"/opt/elec-devel/python/django/forms/forms.py\", line 326, in __unicode__\r\n return self.as_widget()\r\n File \"/opt/elec-devel/python/django/forms/forms.py\", line 358, in as_widget\r\n return widget.render(name, data, attrs=attrs)\r\n File \"/opt/elec-devel/python/django/contrib/admin/widgets.py\", line 109, in render\r\n params = self.url_parameters()\r\n File \"/opt/elec-devel/python/django/contrib/admin/widgets.py\", line 134, in url_parameters\r\n params = self.base_url_parameters()\r\n File \"/opt/elec-devel/python/django/contrib/admin/widgets.py\", line 129, in base_url_parameters\r\n params.update(dict([(k, ','.join(v)) for k, v in self.rel.limit_choices_to.items()]))\r\nTypeError: sequence expected, int found", "owner": "nobody", "reporter": "anonymous", "keywords": null, "easy": 0, "has_patch": 0, "needs_better_patch": 0, "needs_tests": 0, "needs_docs": 0, "ui_ux": 0} {"id": 8806, "created": "2008-09-02 18:38:01", "changetime": "2009-02-25 19:51:44", "last_pulled_from_trac": "2022-03-06 03:43:13.075868", "stage": "Unreviewed", "status": "closed", "component": "contrib.admin", "type": null, "severity": null, "version": "dev", "resolution": "duplicate", "summary": "ModelAdmin should allow not default manager", "description": "My use case is this:\r\n\r\nI have a model with two Managers - one named objects (the default), and another one. I want the admin to use the non-default one (in my case I can't even give it the default one since it doesn't return instances of the model, but of another model it inherits from). So my solution (It doesn't even merit a patch - its just 3 lines changed in django/contrib/admin/options.py):\r\n\r\n# my code\r\nfrom django.contrib import admin\r\n\r\nclass MyAdmin(admin.ModelAdmin):\r\n model = MyModel\r\n manager = MyModel.othermanager\r\n\r\n\r\n# unified diff against django/contrib/admin/options.py svn 8851\r\n--- a/django/contrib/admin/options.py\r\n+++ b/django/contrib/admin/options.py\r\n@@ -166,6 +166,8 @@ class ModelAdmin(BaseModelAdmin):\r\n ordering = None\r\n inlines = []\r\n \r\n+ manager = None\r\n+\r\n # Custom templates (designed to be over-ridden in subclasses)\r\n change_form_template = None\r\n change_list_template = None\r\n@@ -239,7 +241,10 @@ class ModelAdmin(BaseModelAdmin):\r\n Returns a QuerySet of all model instances that can be edited by the\r\n admin site. This is used by changelist_view.\r\n \"\"\"\r\n- qs = self.model._default_manager.get_query_set()\r\n+ if self.manager is None:\r\n+ qs = self.model._default_manager.get_query_set()\r\n+ else:\r\n+ qs = self.manager.get_query_set()\r\n # TODO: this should be handled by some parameter to the ChangeList.\r\n ordering = self.ordering or () # otherwise we might try to *None, which is bad ;)\r\n if ordering:\r\n", "owner": "nobody", "reporter": "alon", "keywords": "ModelAdmin,Manager", "easy": 0, "has_patch": 1, "needs_better_patch": 0, "needs_tests": 0, "needs_docs": 0, "ui_ux": 0} {"id": 8807, "created": "2008-09-02 18:54:10", "changetime": "2011-09-28 16:12:17", "last_pulled_from_trac": "2022-03-06 03:43:13.233283", "stage": "Unreviewed", "status": "closed", "component": "Forms", "type": null, "severity": null, "version": "dev", "resolution": "duplicate", "summary": "django.forms.utils.ValidationError should be a subclass of django.core.exceptions.ValidationError", "description": "Seems that this should be true as they are kinda the same thing, but in a different context (i.e. sometimes hard to figure out which ValidationError is thrown in a try except)", "owner": "nobody", "reporter": "magneto", "keywords": null, "easy": 0, "has_patch": 1, "needs_better_patch": 0, "needs_tests": 0, "needs_docs": 0, "ui_ux": 0} {"id": 8808, "created": "2008-09-02 19:04:04", "changetime": "2011-06-01 15:37:55", "last_pulled_from_trac": "2022-03-06 03:43:13.384797", "stage": "Design decision needed", "status": "closed", "component": "contrib.formtools", "type": "New feature", "severity": "Normal", "version": "dev", "resolution": "fixed", "summary": "Form Wizard keeps state on subsequent requests and provides no way to cut short inside parse_params", "description": "Since this issue is subtle I'll describe my concrete usecase first and than describe the issue and possible solutions to this.\r\n\r\n'''Usecase:'''\r\n\r\nI have a form that contains a ChoiceField which depends on the currently logged in user and some request parameters. Since I need a special behaviour I subclassed the FormWizard and did overwrite the methods {{{parse_params}}}, {{{done}}}, {{{process_step}}}, {{{get_form}}} and {{{get_template}}}. Inside {{{parse_params}}} I set some attributes of self. For some reason I assumed that returning anything but None would cause the Wizard to abort. However the return value is ignored and the wizard code continues by calling {{{get_form}}} and {{{process_step}}}. Since {{{get_form}}} is the only way of putting the stuff which was set earlier in {{{parse_params}}} I have a hook that calls some helper methods on the form to set up the options of the ChoiceField depending on the stuff set by {{{parse_params}}} earlier. Since the only way of injecting custom data there is {{{self}}} one has no chance of telling wether the value comes from the current request or something earlier which might just have failed. Thus no AttributeError is raised as the attribute is set. The data just does not come from the current request.\r\n\r\nEven worse: In my case - since I was assuming that returning from {{{parse_params}}} with an {{{HttpResponse}}} would stop the wizard and return the HttpResponse immediately - caused invalid requests to be rendered with the state from a previous requests. A horrid leak of sensible data, as the wizard is part of a checkout process and the {{{ChoiceField}}} is used to pick an address. I'm just glad our QA noticed that glitch before putting this stuff live. It would not be hard to exploit and I don't like the idea of leaking sensible data.\r\n\r\n'''Solutions:'''\r\n\r\n 1. By overwriting the {{{__call__}}} method one can inject any attribute into self and return any HttpResponse object if something is wrong. I consider this rather ugly as the FormWizard explicitly states {{{parse_params}}} for getting stuff from the request object, but provides no way of breaking out of the wizard and returning a HttpResponse. I would like to see a way to return a HttpResponse object from within {{{parse_params}}} for shortcutting requests to a Wizard. (see attached patch)\r\n\r\n 2. The Wizard could be made immutable, but provide a custom 'state' attribute for transfering data between {{{parse_params}}}, {{{process_step}}}, etc. Anyhow this still would not enable the user of the FormWizard to shortcut a request with a HttpRequest. I would consider it a good idea not to be able to reuse a state from a previous request by accident. Another idea would be to discourage the users to store such state information as attribute, but rather enhance the form wizard to implement {{{__getitem___}}}, {{{__setitem__}}}, etc. so that it can be used to transfer state between the hook methods. Thus instead of doing \"{{{self.my_state = args[0]}}}\" one would do \"{{{self['my_state'] = args[0]}}}\".\r\n\r\n 3. In my case I solved this issue by wrapping the wizard inside a custom request method which creates a new instance of the Form wizard on every request. Maybe it would be a good idea to make it possible to have a class inside the url config rather than an instance. e.g. the url handler code could just check if the contained code is a class/type which needs to be instanciated first. This would make it possible to get a fresh instance of the object on every request.\r\n\r\n'''Bottom line:'''\r\n\r\nThe FormWizard documentation needs to state that the Wizard object will be reused. Thus one must be aware that subsequent requests might get the same wizard instance. Thus any logic depending on a state set to {{{self}}} should be considered unsafe. I can imagine quite a lot of people using the FormWizard wrong without even knowing it.\r\n\r\nI posted this as a 1.0 issue as I think this one should be figured out or at least documented properly. It gave me a hard time and caused a critical software bug that was hard to spot. It surely was my mistake to assume that {{{parse_params}}} would be able to cut short the request, but the way the FormWizard uses {{{self}}} to transfer state from one method to another rounded it up to some rather unpleasing issue.\r\n\r\nI attached a simple patch which enhances {{{parse_params}}} so that it is capable of cutting short a request. The solutions (2.) is a bit more complex and needs some tweaking of the source and changing of the documentation so I did not provide a patch. Solution (3.) is just a quick fix that I don't consider very pretty, but use it for now.", "owner": "nobody", "reporter": "Michael P. Jung", "keywords": "FormWizard, state, parse_params, shortcut, HttpResponse", "easy": 0, "has_patch": 1, "needs_better_patch": 0, "needs_tests": 0, "needs_docs": 0, "ui_ux": 0} {"id": 8809, "created": "2008-09-02 19:58:37", "changetime": "2015-01-30 17:09:54", "last_pulled_from_trac": "2022-03-06 03:43:13.545045", "stage": "Accepted", "status": "closed", "component": "Core (URLs)", "type": "New feature", "severity": "Normal", "version": "dev", "resolution": "wontfix", "summary": "Better error message when can't import url callback", "description": "in django.core.urlresolvers _get_callback it would be helpful to display not just the module name that couldn't be imported, but the entire urls.py line that was the problem. Without more information it's incredibly hard to track down WHICH urls.py file has the problem and which line in that file is problematic.\r\n\r\n", "owner": "nobody", "reporter": "TP", "keywords": "error message", "easy": 0, "has_patch": 1, "needs_better_patch": 1, "needs_tests": 0, "needs_docs": 0, "ui_ux": 0} {"id": 8810, "created": "2008-09-02 20:30:23", "changetime": "2011-09-28 16:12:17", "last_pulled_from_trac": "2022-03-06 03:43:13.707296", "stage": "Unreviewed", "status": "closed", "component": "Documentation", "type": null, "severity": null, "version": null, "resolution": "fixed", "summary": "Link from docs.djangoproject.com to Django Software foundation doesn't work", "description": null, "owner": "nobody", "reporter": "anonymous", "keywords": null, "easy": 0, "has_patch": 0, "needs_better_patch": 0, "needs_tests": 0, "needs_docs": 0, "ui_ux": 0} {"id": 8811, "created": "2008-09-02 20:41:02", "changetime": "2011-09-28 16:12:17", "last_pulled_from_trac": "2022-03-06 03:43:13.872029", "stage": "Unreviewed", "status": "closed", "component": "Documentation", "type": null, "severity": null, "version": "dev", "resolution": "fixed", "summary": "urls.py example of tutorial part 2 has Django template-style vars", "description": "`\"mysite\"` should appear instead of `{{ project_name }}`", "owner": "nobody", "reporter": "ramiro", "keywords": null, "easy": 0, "has_patch": 1, "needs_better_patch": 0, "needs_tests": 0, "needs_docs": 0, "ui_ux": 0} {"id": 8812, "created": "2008-09-02 20:44:39", "changetime": "2011-09-28 16:12:17", "last_pulled_from_trac": "2022-03-06 03:43:14.019887", "stage": "Accepted", "status": "closed", "component": "contrib.admin", "type": null, "severity": null, "version": "dev", "resolution": "fixed", "summary": "Delete link should be right-aligned when admin interface is RTL", "description": "The class of the P tag that contains the 'deletelink' should be float-right rather than float-left for it to be displayed correctly.\r\nCurrently it is:\r\n{{{

delete

}}}\r\nand should be\r\n{{{

delete

}}}\r\n", "owner": "nobody", "reporter": "okhayat", "keywords": null, "easy": 0, "has_patch": 1, "needs_better_patch": 0, "needs_tests": 0, "needs_docs": 0, "ui_ux": 0} {"id": 8813, "created": "2008-09-02 20:48:20", "changetime": "2011-09-28 16:12:21", "last_pulled_from_trac": "2022-03-06 03:43:14.196738", "stage": "Accepted", "status": "closed", "component": "Forms", "type": null, "severity": null, "version": "dev", "resolution": "fixed", "summary": "BaseInlineFormSet unable to save existing objects", "description": "The Error:\r\n{{{\r\nEnvironment:\r\n\r\nRequest Method: POST\r\nRequest URL: http://localhost:8000/caktus-books/ledger/exchange/215/edit/invoice/\r\nDjango Version: 1.0-beta_2-SVN-8874\r\nPython Version: 2.5.2\r\nInstalled Applications:\r\n['django.contrib.auth',\r\n 'django.contrib.contenttypes',\r\n 'django.contrib.sessions',\r\n 'django.contrib.sites',\r\n 'django.contrib.admin',\r\n 'django.contrib.humanize',\r\n 'django.contrib.markup',\r\n 'crm',\r\n 'ledger']\r\nInstalled Middleware:\r\n('django.middleware.common.CommonMiddleware',\r\n 'django.contrib.sessions.middleware.SessionMiddleware',\r\n 'django.contrib.auth.middleware.AuthenticationMiddleware',\r\n 'django.middleware.doc.XViewMiddleware')\r\n\r\n\r\nTraceback:\r\nFile \"/home/tobias/caktus/eclipse-workspace/caktus_books/django/core/handlers/base.py\" in get_response\r\n 86. response = callback(request, *callback_args, **callback_kwargs)\r\nFile \"/home/tobias/caktus/eclipse-workspace/caktus_books/django/contrib/auth/decorators.py\" in __call__\r\n 67. return self.view_func(request, *args, **kwargs)\r\nFile \"/home/tobias/caktus/eclipse-workspace/caktus_books/django/db/transaction.py\" in _commit_on_success\r\n 238. res = func(*args, **kw)\r\nFile \"/home/tobias/caktus/eclipse-workspace/caktus_books/ledger/views.py\" in create_edit_exchange\r\n 88. \t\t\ttransactions = transaction_formset.save(commit=False)\r\nFile \"/home/tobias/caktus/eclipse-workspace/caktus_books/django/forms/models.py\" in save\r\n 372. return self.save_existing_objects(commit) + self.save_new_objects(commit)\r\nFile \"/home/tobias/caktus/eclipse-workspace/caktus_books/django/forms/models.py\" in save_existing_objects\r\n 386. obj = existing_objects[form.cleaned_data[self._pk_field.name]]\r\n\r\nException Type: KeyError at /caktus-books/ledger/exchange/215/edit/invoice/\r\nException Value: None\r\n}}}\r\n\r\nFrom the debugger I found that:\r\n{{{\r\nself._pk_field.name = 'id'\r\nself._pk_field.name in form.cleaned_data is True\r\nform.cleaned_data[self._pk_field.name] is None\r\n}}}\r\n\r\nThe Formset:\r\n{{{\r\nclass BaseTransactionFormSet(BaseInlineFormSet):\r\n\t@requires_kwarg('exchange_type')\r\n\tdef __init__(self, *args, **kwargs):\r\n\t\tself.exchange_type = kwargs.pop('exchange_type')\r\n\t\tsuper(BaseTransactionFormSet, self).__init__(*args, **kwargs)\r\n\t\r\n\tdef add_fields(self, form, index):\r\n\t\tsuper(BaseTransactionFormSet, self).add_fields(form, index)\r\n\t\tform.fields.pop('project')\r\n\t\t\r\n\t\tform.fields['memo'].widget = forms.TextInput(attrs={'size':'35'})\r\n\t\tform.fields['quantity'].widget = forms.TextInput(attrs={'size':'5'})\r\n\t\tform.fields['amount'].widget = forms.TextInput(attrs={'size':'8'})\r\n\t\t\r\n\t\tet = self.exchange_type\r\n\t\tif et.credit:\r\n\t\t\tif et.slug == 'invoice':\r\n\t\t\t\tqs = ledger.Account.objects.filter(Q(type=et.credit.type) | Q(type='expense'))\r\n\t\t\telse:\r\n\t\t\t\tqs = ledger.Account.objects.filter(type=et.credit.type)\r\n\t\t\t\t\r\n\t\t\tform.fields['credit'].queryset = qs.order_by('number')\r\n\t\telse:\r\n\t\t\tform.fields.pop('credit')\r\n\t\t\r\n\t\tif et.debit:\r\n\t\t\tform.fields['debit'].queryset = ledger.Account.objects.filter(type=et.debit.type).order_by('number')\r\n\t\telse:\r\n\t\t\tform.fields.pop('debit')\r\n\t\t\r\nTransactionFormSet = inlineformset_factory(ledger.Exchange, ledger.Transaction, formset=BaseTransactionFormSet)\r\n}}}\r\n\r\nThe View:\r\n{{{\r\n@login_required\r\n@transaction.commit_on_success\r\ndef create_edit_exchange(request, exchange_type_slug, exchange_id=None):\r\n\texchange_type = get_object_or_404(ledger.ExchangeType, slug=exchange_type_slug)\r\n\texchange = None\r\n\t\r\n\tif exchange_id:\r\n\t\texchange = get_object_or_404(ledger.Exchange, pk=exchange_id, type=exchange_type)\r\n\t\r\n\tif request.POST:\r\n\t\texchange_form = ExchangeForm(\r\n\t\t\trequest.POST,\r\n\t\t\tinstance=exchange, \r\n\t\t\texchange_type=exchange_type,\r\n\t\t)\r\n\t\ttransaction_formset = TransactionFormSet(\r\n\t\t\trequest.POST,\r\n\t\t\tinstance=exchange, \r\n\t\t\texchange_type=exchange_type,\r\n\t\t)\r\n\t\t\r\n\t\tif exchange_form.is_valid() and transaction_formset.is_valid():\r\n\t\t\texchange = exchange_form.save()\r\n\t\t\t\r\n\t\t\ttransactions = transaction_formset.save(commit=False)\r\n\t\t\tfor transaction in transactions:\r\n\t\t\t\tif exchange_type.credit:\r\n\t\t\t\t\ttransaction.credit = exchange_form.cleaned_data['credit']\r\n\t\t\t\tif exchange_type.debit:\r\n\t\t\t\t\ttransaction.debit = exchange_form.cleaned_data['debit']\r\n\t\t\t\ttransaction.project = exchange_form.cleaned_data['project']\r\n\t\t\t\ttransaction.save()\r\n\t\t\t\r\n\t\t\trequest.user.message_set.create(message='%s successfully saved.' % exchange_type)\r\n\t\t\treturn HttpResponseRedirect(reverse('list_exchanges', kwargs={'exchange_type_slug': exchange.type.slug}))\r\n\telse:\r\n\t\texchange_form = ExchangeForm(\r\n\t\t\tinstance=exchange, \r\n\t\t\texchange_type=exchange_type,\r\n\t\t)\r\n\t\ttransaction_formset = TransactionFormSet(\r\n\t\t\tinstance=exchange, \r\n\t\t\texchange_type=exchange_type,\r\n\t\t)\r\n\r\n\tcontext = {\r\n\t\t'exchange': exchange,\r\n\t\t'exchange_type': exchange_type,\r\n\t\t'exchange_form': exchange_form,\r\n\t\t'transaction_formset': transaction_formset,\r\n\t}\r\n\t\r\n\treturn render_to_response('books/ledger/exchange/create.html', context, context_instance=RequestContext(request))\r\n}}}", "owner": "jkocherhans", "reporter": "tobias", "keywords": null, "easy": 0, "has_patch": 0, "needs_better_patch": 0, "needs_tests": 0, "needs_docs": 0, "ui_ux": 0} {"id": 8814, "created": "2008-09-02 21:11:25", "changetime": "2008-09-02 21:17:51", "last_pulled_from_trac": "2022-03-06 03:43:14.352682", "stage": "Unreviewed", "status": "closed", "component": "Documentation", "type": null, "severity": null, "version": "0.96", "resolution": "invalid", "summary": "Link for 0.96 Admin module Broken", "description": "The page located at http://www.djangoproject.com/documentation/0.96/admin/ is missing. When reading the documentation for the admin module and you click on the 0.96 version link and there is no page at that location.", "owner": "nobody", "reporter": "Caelin", "keywords": null, "easy": 0, "has_patch": 0, "needs_better_patch": 0, "needs_tests": 0, "needs_docs": 0, "ui_ux": 0} {"id": 8815, "created": "2008-09-02 21:18:55", "changetime": "2011-09-28 16:12:17", "last_pulled_from_trac": "2022-03-06 03:43:14.520226", "stage": "Unreviewed", "status": "closed", "component": "Translations", "type": null, "severity": null, "version": "dev", "resolution": "fixed", "summary": "Final Arabic translation update and QA", "description": "Final QA and changed after testing the translation.", "owner": "nobody", "reporter": "okhayat", "keywords": "arabic", "easy": 0, "has_patch": 1, "needs_better_patch": 0, "needs_tests": 0, "needs_docs": 0, "ui_ux": 0} {"id": 8816, "created": "2008-09-02 22:46:16", "changetime": "2008-09-02 23:21:31", "last_pulled_from_trac": "2022-03-06 03:43:14.663898", "stage": "Unreviewed", "status": "closed", "component": "*.djangoproject.com", "type": null, "severity": null, "version": "dev", "resolution": "fixed", "summary": "Links to security fixes (might be) incorrect", "description": "One of the links to the security fixes at http://www.djangoproject.com/weblog/2008/sep/02/security/ doesn't match the description:\r\n\r\n * Django 0.96.3: http://www.djangoproject.com/download/0.91.3/tarball/ --> 0.91.3\r\n * Django 0.95.4: http://www.djangoproject.com/download/0.95.4/tarball/ --> 0.95.4\r\n * Django 0.91.3: http://www.djangoproject.com/download/0.96.3/tarball/ --> 0.96.2\r\n\r\nIs this what was intended? Both the link (0.96.3) and the result (0.96.3) look off, and why is 0.96.3 pointing to 0.91.3?\r\n\r\nAlso, the main download page (http://www.djangoproject.com/download/) is pointing to 0.96.2:\r\n\r\n First, download Django-0.96.3.tar.gz. Then:\r\n\r\nwhich links to Django-0.96.2.tar.gz\r\n\r\n", "owner": "nobody", "reporter": "jjackson", "keywords": null, "easy": 0, "has_patch": 0, "needs_better_patch": 0, "needs_tests": 0, "needs_docs": 0, "ui_ux": 0} {"id": 8817, "created": "2008-09-02 22:48:31", "changetime": "2011-09-28 16:12:21", "last_pulled_from_trac": "2022-03-06 03:43:14.814460", "stage": "Ready for checkin", "status": "closed", "component": "File uploads/storage", "type": null, "severity": null, "version": "dev", "resolution": "fixed", "summary": "Accessing ImageField's dimensions doesn't close file", "description": "If you access an ImageField's width or height property, the corresponding image file doesn't seem to be closed after retrieving its dimensions: After retrieving a lot of image dimensions (of different images), Django produces strange errors (\"cannot open template file ...\" etc.) which seem to result from too many files being open by the process. Manually calling the close() method of the ImageFieldFile object (after accessing the width and height properties) resolves these errors, so it seems it isn't not called automatically...", "owner": "mitsuhiko", "reporter": "tripediac", "keywords": null, "easy": 0, "has_patch": 1, "needs_better_patch": 0, "needs_tests": 0, "needs_docs": 0, "ui_ux": 0}