Changeset 4456
- Timestamp:
- 02/02/07 11:35:55 (2 years ago)
- Files:
-
- django/branches/boulder-oracle-sprint/django/contrib/admin/templates/admin/auth/user/change_password.html (modified) (1 diff)
- django/branches/boulder-oracle-sprint/django/contrib/admin/templatetags/admin_list.py (modified) (3 diffs)
- django/branches/boulder-oracle-sprint/django/contrib/contenttypes/models.py (modified) (2 diffs)
- django/branches/boulder-oracle-sprint/django/contrib/sessions/middleware.py (modified) (2 diffs)
- django/branches/boulder-oracle-sprint/django/core/cache/backends/dummy.py (modified) (2 diffs)
- django/branches/boulder-oracle-sprint/django/core/management.py (modified) (2 diffs)
- django/branches/boulder-oracle-sprint/django/core/serializers/python.py (modified) (1 diff)
- django/branches/boulder-oracle-sprint/django/db/backends/ado_mssql/creation.py (modified) (1 diff)
- django/branches/boulder-oracle-sprint/django/db/backends/mysql/creation.py (modified) (1 diff)
- django/branches/boulder-oracle-sprint/django/db/backends/postgresql/creation.py (modified) (1 diff)
- django/branches/boulder-oracle-sprint/django/db/backends/sqlite3/creation.py (modified) (1 diff)
- django/branches/boulder-oracle-sprint/django/db/models/fields/__init__.py (modified) (10 diffs)
- django/branches/boulder-oracle-sprint/django/db/models/fields/related.py (modified) (8 diffs)
- django/branches/boulder-oracle-sprint/django/db/models/manager.py (modified) (3 diffs)
- django/branches/boulder-oracle-sprint/django/db/models/query.py (modified) (11 diffs)
- django/branches/boulder-oracle-sprint/django/newforms/fields.py (modified) (21 diffs)
- django/branches/boulder-oracle-sprint/django/newforms/forms.py (modified) (13 diffs)
- django/branches/boulder-oracle-sprint/django/newforms/models.py (modified) (3 diffs)
- django/branches/boulder-oracle-sprint/django/newforms/util.py (modified) (1 diff)
- django/branches/boulder-oracle-sprint/django/newforms/widgets.py (modified) (9 diffs)
- django/branches/boulder-oracle-sprint/django/oldforms/__init__.py (modified) (2 diffs)
- django/branches/boulder-oracle-sprint/django/utils/datastructures.py (modified) (2 diffs)
- django/branches/boulder-oracle-sprint/django/utils/simplejson/decoder.py (modified) (3 diffs)
- django/branches/boulder-oracle-sprint/django/utils/simplejson/encoder.py (modified) (10 diffs)
- django/branches/boulder-oracle-sprint/django/utils/simplejson/__init__.py (modified) (8 diffs)
- django/branches/boulder-oracle-sprint/django/utils/simplejson/jsonfilter.py (copied) (copied from django/trunk/django/utils/simplejson/jsonfilter.py)
- django/branches/boulder-oracle-sprint/django/utils/simplejson/LICENSE.txt (modified) (1 diff)
- django/branches/boulder-oracle-sprint/django/utils/simplejson/scanner.py (modified) (1 diff)
- django/branches/boulder-oracle-sprint/docs/add_ons.txt (modified) (8 diffs)
- django/branches/boulder-oracle-sprint/docs/apache_auth.txt (modified) (1 diff)
- django/branches/boulder-oracle-sprint/docs/api_stability.txt (modified) (1 diff)
- django/branches/boulder-oracle-sprint/docs/authentication.txt (modified) (8 diffs)
- django/branches/boulder-oracle-sprint/docs/cache.txt (modified) (1 diff)
- django/branches/boulder-oracle-sprint/docs/contributing.txt (modified) (5 diffs)
- django/branches/boulder-oracle-sprint/docs/db-api.txt (modified) (1 diff)
- django/branches/boulder-oracle-sprint/docs/design_philosophies.txt (modified) (1 diff)
- django/branches/boulder-oracle-sprint/docs/django-admin.txt (modified) (5 diffs)
- django/branches/boulder-oracle-sprint/docs/email.txt (modified) (2 diffs)
- django/branches/boulder-oracle-sprint/docs/faq.txt (modified) (10 diffs)
- django/branches/boulder-oracle-sprint/docs/fastcgi.txt (modified) (1 diff)
- django/branches/boulder-oracle-sprint/docs/flatpages.txt (modified) (3 diffs)
- django/branches/boulder-oracle-sprint/docs/forms.txt (modified) (2 diffs)
- django/branches/boulder-oracle-sprint/docs/generic_views.txt (modified) (14 diffs)
- django/branches/boulder-oracle-sprint/docs/i18n.txt (modified) (7 diffs)
- django/branches/boulder-oracle-sprint/docs/install.txt (modified) (3 diffs)
- django/branches/boulder-oracle-sprint/docs/legacy_databases.txt (modified) (3 diffs)
- django/branches/boulder-oracle-sprint/docs/middleware.txt (modified) (5 diffs)
- django/branches/boulder-oracle-sprint/docs/model-api.txt (modified) (3 diffs)
- django/branches/boulder-oracle-sprint/docs/modpython.txt (modified) (1 diff)
- django/branches/boulder-oracle-sprint/docs/newforms.txt (modified) (11 diffs)
- django/branches/boulder-oracle-sprint/docs/outputting_csv.txt (modified) (2 diffs)
- django/branches/boulder-oracle-sprint/docs/outputting_pdf.txt (modified) (1 diff)
- django/branches/boulder-oracle-sprint/docs/overview.txt (modified) (1 diff)
- django/branches/boulder-oracle-sprint/docs/redirects.txt (modified) (3 diffs)
- django/branches/boulder-oracle-sprint/docs/request_response.txt (modified) (2 diffs)
- django/branches/boulder-oracle-sprint/docs/sessions.txt (modified) (2 diffs)
- django/branches/boulder-oracle-sprint/docs/settings.txt (modified) (14 diffs)
- django/branches/boulder-oracle-sprint/docs/sitemaps.txt (modified) (6 diffs)
- django/branches/boulder-oracle-sprint/docs/sites.txt (modified) (2 diffs)
- django/branches/boulder-oracle-sprint/docs/static_files.txt (modified) (3 diffs)
- django/branches/boulder-oracle-sprint/docs/syndication_feeds.txt (modified) (5 diffs)
- django/branches/boulder-oracle-sprint/docs/templates_python.txt (modified) (6 diffs)
- django/branches/boulder-oracle-sprint/docs/templates.txt (modified) (2 diffs)
- django/branches/boulder-oracle-sprint/docs/testing.txt (modified) (4 diffs)
- django/branches/boulder-oracle-sprint/docs/tutorial01.txt (modified) (4 diffs)
- django/branches/boulder-oracle-sprint/docs/tutorial02.txt (modified) (4 diffs)
- django/branches/boulder-oracle-sprint/docs/tutorial03.txt (modified) (5 diffs)
- django/branches/boulder-oracle-sprint/docs/tutorial04.txt (modified) (3 diffs)
- django/branches/boulder-oracle-sprint/docs/url_dispatch.txt (modified) (4 diffs)
- django/branches/boulder-oracle-sprint/tests/modeltests/custom_columns/models.py (modified) (2 diffs)
- django/branches/boulder-oracle-sprint/tests/modeltests/generic_relations/models.py (modified) (2 diffs)
- django/branches/boulder-oracle-sprint/tests/modeltests/lookup/models.py (modified) (1 diff)
- django/branches/boulder-oracle-sprint/tests/modeltests/many_to_many/models.py (modified) (1 diff)
- django/branches/boulder-oracle-sprint/tests/modeltests/model_forms/models.py (modified) (12 diffs)
- django/branches/boulder-oracle-sprint/tests/modeltests/or_lookups/models.py (modified) (1 diff)
- django/branches/boulder-oracle-sprint/tests/modeltests/serializers/models.py (modified) (2 diffs)
- django/branches/boulder-oracle-sprint/tests/modeltests/test_client/views.py (modified) (2 diffs)
- django/branches/boulder-oracle-sprint/tests/regressiontests/forms/tests.py (modified) (23 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
django/branches/boulder-oracle-sprint/django/contrib/admin/templates/admin/auth/user/change_password.html
r4279 r4456 26 26 {% endif %} 27 27 28 <p>{% blocktrans with original.username|escape as username %}Enter a new username andpassword for the user <strong>{{ username }}</strong>.{% endblocktrans %}</p>28 <p>{% blocktrans with original.username|escape as username %}Enter a new password for the user <strong>{{ username }}</strong>.{% endblocktrans %}</p> 29 29 30 30 <fieldset class="module aligned"> django/branches/boulder-oracle-sprint/django/contrib/admin/templatetags/admin_list.py
r4279 r4456 101 101 "url": cl.get_query_string({ORDER_VAR: i, ORDER_TYPE_VAR: new_order_type}), 102 102 "class_attrib": (th_classes and ' class="%s"' % ' '.join(th_classes) or '')} 103 104 def _boolean_icon(field_val): 105 BOOLEAN_MAPPING = {True: 'yes', False: 'no', None: 'unknown'} 106 return '<img src="%simg/admin/icon-%s.gif" alt="%s" />' % (settings.ADMIN_MEDIA_PREFIX, BOOLEAN_MAPPING[field_val], field_val) 103 107 104 108 def items_for_result(cl, result): … … 115 119 attr = getattr(result, field_name) 116 120 allow_tags = getattr(attr, 'allow_tags', False) 121 boolean = getattr(attr, 'boolean', False) 117 122 if callable(attr): 118 123 attr = attr() 119 result_repr = str(attr) 124 if boolean: 125 allow_tags = True 126 result_repr = _boolean_icon(attr) 127 else: 128 result_repr = str(attr) 120 129 except (AttributeError, ObjectDoesNotExist): 121 130 result_repr = EMPTY_CHANGELIST_VALUE … … 148 157 # Booleans are special: We use images. 149 158 elif isinstance(f, models.BooleanField) or isinstance(f, models.NullBooleanField): 150 BOOLEAN_MAPPING = {True: 'yes', False: 'no', None: 'unknown'} 151 result_repr = '<img src="%simg/admin/icon-%s.gif" alt="%s" />' % (settings.ADMIN_MEDIA_PREFIX, BOOLEAN_MAPPING[field_val], field_val) 159 result_repr = _boolean_icon(field_val) 152 160 # FloatFields are special: Zero-pad the decimals. 153 161 elif isinstance(f, models.FloatField): django/branches/boulder-oracle-sprint/django/contrib/contenttypes/models.py
r4279 r4456 2 2 from django.utils.translation import gettext_lazy as _ 3 3 4 CONTENT_TYPE_CACHE = {} 4 5 class ContentTypeManager(models.Manager): 5 6 def get_for_model(self, model): … … 9 10 """ 10 11 opts = model._meta 11 # The str() is needed around opts.verbose_name because it's a 12 # django.utils.functional.__proxy__ object. 13 ct, created = self.model._default_manager.get_or_create(app_label=opts.app_label, 14 model=opts.object_name.lower(), defaults={'name': str(opts.verbose_name)}) 12 key = (opts.app_label, opts.object_name.lower()) 13 try: 14 ct = CONTENT_TYPE_CACHE[key] 15 except KeyError: 16 # The str() is needed around opts.verbose_name because it's a 17 # django.utils.functional.__proxy__ object. 18 ct, created = self.model._default_manager.get_or_create(app_label=key[0], 19 model=key[1], defaults={'name': str(opts.verbose_name)}) 20 CONTENT_TYPE_CACHE[key] = ct 15 21 return ct 16 22 django/branches/boulder-oracle-sprint/django/contrib/sessions/middleware.py
r4279 r4456 1 1 from django.conf import settings 2 2 from django.contrib.sessions.models import Session 3 from django.core.exceptions import SuspiciousOperation 3 4 from django.utils.cache import patch_vary_headers 4 5 import datetime … … 56 57 expire_date__gt=datetime.datetime.now()) 57 58 self._session_cache = s.get_decoded() 58 except Session.DoesNotExist:59 except (Session.DoesNotExist, SuspiciousOperation): 59 60 self._session_cache = {} 60 61 # Set the session_key to None to force creation of a new django/branches/boulder-oracle-sprint/django/core/cache/backends/dummy.py
r4279 r4456 7 7 pass 8 8 9 def get(self, *args, **kwargs):10 pass9 def get(self, key, default=None): 10 return default 11 11 12 12 def set(self, *args, **kwargs): … … 17 17 18 18 def get_many(self, *args, **kwargs): 19 pass19 return {} 20 20 21 21 def has_key(self, *args, **kwargs): django/branches/boulder-oracle-sprint/django/core/management.py
r4279 r4456 26 26 PROJECT_TEMPLATE_DIR = os.path.join(django.__path__[0], 'conf', '%s_template') 27 27 28 INVALID_PROJECT_NAMES = ('django', ' test')28 INVALID_PROJECT_NAMES = ('django', 'site', 'test') 29 29 30 30 # Set up the terminal color scheme. … … 736 736 from random import choice 737 737 if project_name in INVALID_PROJECT_NAMES: 738 sys.stderr.write(style.ERROR("Error: %r isn't a valid project name. Please try another.\n" % project_name))738 sys.stderr.write(style.ERROR("Error: '%r' conflicts with the name of an existing Python module and cannot be used as a project name. Please try another name.\n" % project_name)) 739 739 sys.exit(1) 740 740 _start_helper('project', project_name, directory) django/branches/boulder-oracle-sprint/django/core/serializers/python.py
r4279 r4456 58 58 # Look up the model and starting build a dict of data for it. 59 59 Model = _get_model(d["model"]) 60 data = {Model._meta.pk. name : d["pk"]}60 data = {Model._meta.pk.attname : d["pk"]} 61 61 m2m_data = {} 62 62 django/branches/boulder-oracle-sprint/django/db/backends/ado_mssql/creation.py
r4279 r4456 22 22 'TextField': 'text', 23 23 'TimeField': 'time', 24 'URLField': 'varchar(200)',25 24 'USStateField': 'varchar(2)', 26 25 } django/branches/boulder-oracle-sprint/django/db/backends/mysql/creation.py
r4279 r4456 26 26 'TextField': 'longtext', 27 27 'TimeField': 'time', 28 'URLField': 'varchar(200)',29 28 'USStateField': 'varchar(2)', 30 29 } django/branches/boulder-oracle-sprint/django/db/backends/postgresql/creation.py
r4279 r4456 26 26 'TextField': 'text', 27 27 'TimeField': 'time', 28 'URLField': 'varchar(200)',29 28 'USStateField': 'varchar(2)', 30 29 } django/branches/boulder-oracle-sprint/django/db/backends/sqlite3/creation.py
r4279 r4456 25 25 'TextField': 'text', 26 26 'TimeField': 'time', 27 'URLField': 'varchar(200)',28 27 'USStateField': 'varchar(2)', 29 28 } django/branches/boulder-oracle-sprint/django/db/models/fields/__init__.py
r4279 r4456 338 338 choices = property(_get_choices) 339 339 340 def formfield(self, initial=None):340 def formfield(self, **kwargs): 341 341 "Returns a django.newforms.Field instance for this database Field." 342 from django.newforms import CharField343 # TODO: This is just a temporary default during development.344 return forms.CharField( required=not self.blank, label=capfirst(self.verbose_name), initial=initial)342 defaults = {'required': not self.blank, 'label': capfirst(self.verbose_name), 'help_text': self.help_text} 343 defaults.update(kwargs) 344 return forms.CharField(**defaults) 345 345 346 346 def value_from_object(self, obj): … … 384 384 cls._meta.has_auto_field = True 385 385 386 def formfield(self, initial=None):386 def formfield(self, **kwargs): 387 387 return None 388 388 … … 401 401 return [oldforms.CheckboxField] 402 402 403 def formfield(self, initial=None): 404 return forms.BooleanField(required=not self.blank, label=capfirst(self.verbose_name), initial=initial) 403 def formfield(self, **kwargs): 404 defaults = {'required': not self.blank, 'label': capfirst(self.verbose_name), 'help_text': self.help_text} 405 defaults.update(kwargs) 406 return forms.BooleanField(**defaults) 405 407 406 408 class CharField(Field): … … 418 420 return str(value) 419 421 420 def formfield(self, initial=None): 421 return forms.CharField(max_length=self.maxlength, required=not self.blank, label=capfirst(self.verbose_name), initial=initial) 422 def formfield(self, **kwargs): 423 defaults = {'max_length': self.maxlength, 'required': not self.blank, 'label': capfirst(self.verbose_name), 'help_text': self.help_text} 424 defaults.update(kwargs) 425 return forms.CharField(**defaults) 422 426 423 427 # TODO: Maybe move this into contrib, because it's specialized. … … 498 502 return {self.attname: (val is not None and val.strftime("%Y-%m-%d") or '')} 499 503 500 def formfield(self, initial=None): 501 return forms.DateField(required=not self.blank, label=capfirst(self.verbose_name), initial=initial) 504 def formfield(self, **kwargs): 505 defaults = {'required': not self.blank, 'label': capfirst(self.verbose_name), 'help_text': self.help_text} 506 defaults.update(kwargs) 507 return forms.DateField(**defaults) 502 508 503 509 class DateTimeField(DateField): … … 570 576 time_field: (val is not None and val.strftime("%H:%M:%S") or '')} 571 577 572 def formfield(self, initial=None): 573 return forms.DateTimeField(required=not self.blank, label=capfirst(self.verbose_name), initial=initial) 578 def formfield(self, **kwargs): 579 defaults = {'required': not self.blank, 'label': capfirst(self.verbose_name), 'help_text': self.help_text} 580 defaults.update(kwargs) 581 return forms.DateTimeField(**defaults) 574 582 575 583 class EmailField(CharField): … … 587 595 validators.isValidEmail(field_data, all_data) 588 596 589 def formfield(self, initial=None): 590 return forms.EmailField(required=not self.blank, label=capfirst(self.verbose_name), initial=initial) 597 def formfield(self, **kwargs): 598 defaults = {'required': not self.blank, 'label': capfirst(self.verbose_name), 'help_text': self.help_text} 599 defaults.update(kwargs) 600 return forms.EmailField(**defaults) 591 601 592 602 class FileField(Field): … … 722 732 return [oldforms.IntegerField] 723 733 724 def formfield(self, initial=None): 725 return forms.IntegerField(required=not self.blank, label=capfirst(self.verbose_name), initial=initial) 734 def formfield(self, **kwargs): 735 defaults = {'required': not self.blank, 'label': capfirst(self.verbose_name), 'help_text': self.help_text} 736 defaults.update(kwargs) 737 return forms.IntegerField(**defaults) 726 738 727 739 class IPAddressField(Field): … … 778 790 def get_manipulator_field_objs(self): 779 791 return [oldforms.LargeTextField] 792 793 def formfield(self, **kwargs): 794 defaults = {'required': not self.blank, 'widget': forms.Textarea, 'label': capfirst(self.verbose_name), 'help_text': self.help_text} 795 defaults.update(kwargs) 796 return forms.CharField(**defaults) 780 797 781 798 class TimeField(Field): … … 825 842 return {self.attname: (val is not None and val.strftime("%H:%M:%S") or '')} 826 843 827 def formfield(self, initial=None): 828 return forms.TimeField(required=not self.blank, label=capfirst(self.verbose_name), initial=initial) 829 830 class URLField(Field): 844 def formfield(self, **kwargs): 845 defaults = {'required': not self.blank, 'label': capfirst(self.verbose_name), 'help_text': self.help_text} 846 defaults.update(kwargs) 847 return forms.TimeField(**defaults) 848 849 class URLField(CharField): 831 850 def __init__(self, verbose_name=None, name=None, verify_exists=True, **kwargs): 851 kwargs['maxlength'] = kwargs.get('maxlength', 200) 832 852 if verify_exists: 833 853 kwargs.setdefault('validator_list', []).append(validators.isExistingURL) 834 854 self.verify_exists = verify_exists 835 Field.__init__(self, verbose_name, name, **kwargs)855 CharField.__init__(self, verbose_name, name, **kwargs) 836 856 837 857 def get_manipulator_field_objs(self): 838 858 return [oldforms.URLField] 839 859 840 def formfield(self, initial=None): 841 return forms.URLField(required=not self.blank, verify_exists=self.verify_exists, label=capfirst(self.verbose_name), initial=initial) 860 def get_internal_type(self): 861 return "CharField" 862 863 def formfield(self, **kwargs): 864 defaults = {'required': not self.blank, 'verify_exists': self.verify_exists, 'label': capfirst(self.verbose_name), 'help_text': self.help_text} 865 defaults.update(kwargs) 866 return forms.URLField(**defaults) 842 867 843 868 class USStateField(Field): django/branches/boulder-oracle-sprint/django/db/models/fields/related.py
r4279 r4456 317 317 # source_col_name: the PK colname in join_table for the source object 318 318 # target_col_name: the PK colname in join_table for the target object 319 # *objs - objects to add 319 # *objs - objects to add. Either object instances, or primary keys of object instances. 320 320 from django.db import connection 321 321 … … 323 323 if objs: 324 324 # Check that all the objects are of the right type 325 new_ids = set() 325 326 for obj in objs: 326 if not isinstance(obj, self.model): 327 raise ValueError, "objects to add() must be %s instances" % self.model._meta.object_name 327 if isinstance(obj, self.model): 328 new_ids.add(obj._get_pk_val()) 329 else: 330 new_ids.add(obj) 328 331 # Add the newly created or already existing objects to the join table. 329 332 # First find out which items are already added, to avoid adding them twice 330 new_ids = set([obj._get_pk_val() for obj in objs])331 333 cursor = connection.cursor() 332 334 cursor.execute("SELECT %s FROM %s WHERE %s = %%s AND %s IN (%s)" % \ … … 355 357 if objs: 356 358 # Check that all the objects are of the right type 359 old_ids = set() 357 360 for obj in objs: 358 if not isinstance(obj, self.model): 359 raise ValueError, "objects to remove() must be %s instances" % self.model._meta.object_name 361 if isinstance(obj, self.model): 362 old_ids.add(obj._get_pk_val()) 363 else: 364 old_ids.add(obj) 360 365 # Remove the specified objects from the join table 361 old_ids = set([obj._get_pk_val() for obj in objs])362 366 cursor = connection.cursor() 363 367 cursor.execute("DELETE FROM %s WHERE %s = %%s AND %s IN (%s)" % \ … … 549 553 setattr(cls, related.get_accessor_name(), ForeignRelatedObjectsDescriptor(related)) 550 554 551 def formfield(self, initial=None): 552 return forms.ChoiceField(choices=self.get_choices_default(), required=not self.blank, label=capfirst(self.verbose_name), initial=initial) 555 def formfield(self, **kwargs): 556 defaults = {'choices': self.get_choices_default(), 'required': not self.blank, 'label': capfirst(self.verbose_name), 'help_text': self.help_text} 557 defaults.update(kwargs) 558 return forms.ChoiceField(**defaults) 553 559 554 560 class OneToOneField(RelatedField, IntegerField): … … 613 619 cls._meta.one_to_one_field = self 614 620 615 def formfield(self, initial=None): 616 return forms.ChoiceField(choices=self.get_choices_default(), required=not self.blank, label=capfirst(self.verbose_name), initial=initial) 621 def formfield(self, **kwargs): 622 defaults = {'choices': self.get_choices_default(), 'required': not self.blank, 'label': capfirst(self.verbose_name), 'help_text': self.help_text} 623 defaults.update(kwargs) 624 return forms.ChoiceField(**kwargs) 617 625 618 626 class ManyToManyField(RelatedField, Field): … … 626 634 raw_id_admin=kwargs.pop('raw_id_admin', False), 627 635 symmetrical=kwargs.pop('symmetrical', True)) 636 self.db_table = kwargs.pop('db_table', None) 628 637 if kwargs["rel"].raw_id_admin: 629 638 kwargs.setdefault("validator_list", []).append(self.isValidIDList) … … 648 657 def _get_m2m_db_table(self, opts): 649 658 "Function that can be curried to provide the m2m table name for this relation" 650 from django.db import backend651 from django.db.backends.util import truncate_name652 name = '%s_%s' % (opts.db_table, self.name)653 return truncate_name(name, backend.get_max_name_length())659 if self.db_table: 660 return self.db_table 661 else: 662 return '%s_%s' % (opts.db_table, self.name) 654 663 655 664 def _get_m2m_column_name(self, related): … … 729 738 return getattr(obj, self.attname).all() 730 739 731 def formfield(self, initial=None):740 def formfield(self, **kwargs): 732 741 # If initial is passed in, it's a list of related objects, but the 733 742 # MultipleChoiceField takes a list of IDs. 734 if initial is not None: 735 initial = [i._get_pk_val() for i in initial] 736 return forms.MultipleChoiceField(choices=self.get_choices_default(), required=not self.blank, label=capfirst(self.verbose_name), initial=initial) 743 if kwargs.get('initial') is not None: 744 kwargs['initial'] = [i._get_pk_val() for i in kwargs['initial']] 745 defaults = {'choices': self.get_choices_default(), 'required': not self.blank, 'label': capfirst(self.verbose_name), 'help_text': self.help_text} 746 defaults.update(kwargs) 747 return forms.MultipleChoiceField(**defaults) 737 748 738 749 class ManyToOneRel(object): django/branches/boulder-oracle-sprint/django/db/models/manager.py
r4279 r4456 1 from django.db.models.query import QuerySet 1 from django.db.models.query import QuerySet, EmptyQuerySet 2 2 from django.dispatch import dispatcher 3 3 from django.db.models import signals … … 42 42 # PROXIES TO QUERYSET # 43 43 ####################### 44 45 def get_empty_query_set(self): 46 return EmptyQuerySet(self.model) 44 47 45 48 def get_query_set(self): … … 48 51 """ 49 52 return QuerySet(self.model) 53 54 def none(self): 55 return self.get_empty_query_set() 50 56 51 57 def all(self): django/branches/boulder-oracle-sprint/django/db/models/query.py
r4279 r4456 1 1 from django.db import backend, connection, get_query_module, transaction 2 2 from django.db.models.fields import DateField, FieldDoesNotExist 3 from django.db.models.fields.generic import GenericRelation 3 4 from django.db.models import signals 4 5 from django.dispatch import dispatcher … … 25 26 # Larger values are slightly faster at the expense of more storage space. 26 27 GET_ITERATOR_CHUNK_SIZE = 100 28 29 class EmptyResultSet(Exception): 30 pass 27 31 28 32 #################### … … 170 174 cursor = connection.cursor() 171 175 172 select, sql, params, full_query = self._get_sql_clause() 176 try: 177 select, sql, params, full_query = self._get_sql_clause() 178 except EmptyResultSet: 179 raise StopIteration 180 173 181 cursor.execute("SELECT " + (self._distinct and "DISTINCT " or "") + ",".join(select) + sql, params) 174 182 … … 195 203 counter._limit = None 196 204 counter._select_related = False 197 select, sql, params, full_query = counter._get_sql_clause() 205 206 try: 207 select, sql, params, full_query = counter._get_sql_clause() 208 except EmptyResultSet: 209 return 0 210 198 211 cursor = connection.cursor() 199 212 if self._distinct: … … 533 546 534 547 cursor = connection.cursor() 535 select, sql, params, full_query = self._get_sql_clause() 548 549 try: 550 select, sql, params, full_query = self._get_sql_clause() 551 except EmptyResultSet: 552 raise StopIteration 553 536 554 select = ['%s.%s' % (backend.quote_name(self.model._meta.db_table), backend.quote_name(c)) for c in columns] 537 555 cursor.execute("SELECT " + (self._distinct and "DISTINCT " or "") + ",".join(select) + sql, params) … … 555 573 self._where.append('%s.%s IS NOT NULL' % \ 556 574 (backend.quote_name(self.model._meta.db_table), backend.quote_name(self._field.column))) 557 select, sql, params, full_query = self._get_sql_clause() 575 try: 576 select, sql, params, full_query = self._get_sql_clause() 577 except EmptyResultSet: 578 raise StopIteration 579 558 580 table_name = backend.quote_name(self.model._meta.db_table) 559 581 field_name = backend.quote_name(self._field.column) 560 date_trunc_sql = backend.get_date_trunc_sql(self._kind, 561 '%s.%s' % (table_name, field_name)) 582 562 583 if backend.allows_group_by_ordinal: 563 584 group_by = '1' 564 585 else: 565 group_by = date_trunc_sql 566 fmt = 'SELECT %s %s GROUP BY %s ORDER BY 1 %s' 567 stmt = fmt % (date_trunc_sql, sql, group_by, self._order) 586 group_by = backend.get_date_trunc_sql(self._kind, 587 '%s.%s' % (table_name, field_name)) 588 589 sql = 'SELECT %s %s GROUP BY %s ORDER BY 1 %s' % \ 590 (backend.get_date_trunc_sql(self._kind, '%s.%s' % (backend.quote_name(self.model._meta.db_table), 591 backend.quote_name(self._field.column))), sql, group_by, self._order) 568 592 cursor = connection.cursor() 569 cursor.execute(s tmt, params)593 cursor.execute(sql, params) 570 594 if backend.needs_datetime_string_cast: 571 595 return [typecast_timestamp(str(row[0])) for row in cursor.fetchall()] … … 580 604 return c 581 605 606 class EmptyQuerySet(QuerySet): 607 def __init__(self, model=None): 608 super(EmptyQuerySet, self).__init__(model) 609 self._result_cache = [] 610 611 def iterator(self): 612 raise StopIteration 613 614 def count(self): 615 return 0 616 617 def delete(self): 618 pass 619 620 def _clone(self, klass=None, **kwargs): 621 c = super(EmptyQuerySet, self)._clone(klass, **kwargs) 622 c._result_cache = [] 623 return c 624 582 625 class QOperator(object): 583 626 "Base class for QAnd and QOr" … … 588 631 joins, where, params = SortedDict(), [], [] 589 632 for val in self.args: 590 joins2, where2, params2 = val.get_sql(opts) 591 joins.update(joins2) 592 where.extend(where2) 593 params.extend(params2) 633 try: 634 joins2, where2, params2 = val.get_sql(opts) 635 joins.update(joins2) 636 where.extend(where2) 637 params.extend(params2) 638 except EmptyResultSet: 639 if not isinstance(self, QOr): 640 raise EmptyResultSet 594 641 if where: 595 642 return joins, ['(%s)' % self.operator.join(where)], params … … 645 692 646 693 def get_sql(self, opts): 647 joins, where, params = self.q.get_sql(opts) 648 where2 = ['(NOT (%s))' % " AND ".join(where)] 694 try: 695 joins, where, params = self.q.get_sql(opts) 696 where2 = ['(NOT (%s))' % " AND ".join(where)] 697 except EmptyResultSet: 698 return SortedDict(), [], [] 649 699 return joins, where2, params 650 700 … … 663 713 pass 664 714 if lookup_type == 'in': 665 return '%s%s IN (%s)' % (table_prefix, field_name, ','.join(['%s' for v in value])) 715 in_string = ','.join(['%s' for id in value]) 716 if in_string: 717 return '%s%s IN (%s)' % (table_prefix, field_name, in_string) 718 else: 719 raise EmptyResultSet 666 720 elif lookup_type == 'range': 667 721 return '%s%s BETWEEN %%s AND %%s' % (table_prefix, field_name) … … 949 1003 pk_list = [pk for pk,instance in seen_objs[cls]] 950 1004 for related in cls._meta.get_all_related_many_to_many_objects(): 1005 if not isinstance(related.field, GenericRelation): 1006 for offset in range(0, len(pk_list), GET_ITERATOR_CHUNK_SIZE): 1007 cursor.execute("DELETE FROM %s WHERE %s IN (%s)" % \ 1008 (qn(related.field.m2m_db_table()), 1009 qn(related.field.m2m_reverse_name()), 1010 ','.join(['%s' for pk in pk_list[offset:offset+GET_ITERATOR_CHUNK_SIZE]])), 1011 pk_list[offset:offset+GET_ITERATOR_CHUNK_SIZE]) 1012 for f in cls._meta.many_to_many: 1013 if isinstance(f, GenericRelation): 1014 from django.contrib.contenttypes.models import ContentType 1015 query_extra = 'AND %s=%%s' % f.rel.to._meta.get_field(f.content_type_field_name).column 1016 args_extra = [ContentType.objects.get_for_model(cls).id] 1017 else: 1018 query_extra = '' 1019 args_extra = [] 951 1020 for offset in range(0, len(pk_list), GET_ITERATOR_CHUNK_SIZE): 952 cursor.execute("DELETE FROM %s WHERE %s IN (%s)" % \ 953 (qn(related.field.m2m_db_table()), 954 qn(related.field.m2m_reverse_name()), 955 ','.join(['%s' for pk in pk_list[offset:offset+GET_ITERATOR_CHUNK_SIZE]])), 956 pk_list[offset:offset+GET_ITERATOR_CHUNK_SIZE]) 957 for f in cls._meta.many_to_many: 958 for offset in range(0, len(pk_list), GET_ITERATOR_CHUNK_SIZE): 959 cursor.execute("DELETE FROM %s WHERE %s IN (%s)" % \ 1021 cursor.execute(("DELETE FROM %s WHERE %s IN (%s)" % \ 960 1022 (qn(f.m2m_db_table()), qn(f.m2m_column_name()), 961 ','.join(['%s' for pk in pk_list[offset:offset+GET_ITERATOR_CHUNK_SIZE]])) ,962 pk_list[offset:offset+GET_ITERATOR_CHUNK_SIZE] )1023 ','.join(['%s' for pk in pk_list[offset:offset+GET_ITERATOR_CHUNK_SIZE]]))) + query_extra, 1024 pk_list[offset:offset+GET_ITERATOR_CHUNK_SIZE] + args_extra) 963 1025 for field in cls._meta.fields: 964 1026 if field.rel and field.null and field.rel.to in seen_objs: django/branches/boulder-oracle-sprint/django/newforms/fields.py
