Changeset 3669
- Timestamp:
- 08/28/06 08:06:03 (2 years ago)
- Files:
-
- django/branches/per-object-permissions/django/conf/global_settings.py (modified) (1 diff)
- django/branches/per-object-permissions/django/contrib/admin/media/css/global.css (modified) (1 diff)
- django/branches/per-object-permissions/django/contrib/admin/templates/admin_doc/model_detail.html (modified) (1 diff)
- django/branches/per-object-permissions/django/contrib/admin/templatetags/admin_modify.py (modified) (1 diff)
- django/branches/per-object-permissions/django/contrib/admin/views/main.py (modified) (1 diff)
- django/branches/per-object-permissions/django/contrib/auth/management.py (modified) (2 diffs)
- django/branches/per-object-permissions/django/contrib/contenttypes/management.py (modified) (2 diffs)
- django/branches/per-object-permissions/django/contrib/flatpages/views.py (modified) (2 diffs)
- django/branches/per-object-permissions/django/contrib/sites/management.py (modified) (1 diff)
- django/branches/per-object-permissions/django/core/management.py (modified) (9 diffs)
- django/branches/per-object-permissions/django/core/validators.py (modified) (1 diff)
- django/branches/per-object-permissions/django/test (copied) (copied from django/trunk/django/test)
- django/branches/per-object-permissions/django/test/client.py (copied) (copied from django/trunk/django/test/client.py)
- django/branches/per-object-permissions/django/test/doctest.py (copied) (copied from django/trunk/django/test/doctest.py)
- django/branches/per-object-permissions/django/test/__init__.py (copied) (copied from django/trunk/django/test/__init__.py)
- django/branches/per-object-permissions/django/test/simple.py (copied) (copied from django/trunk/django/test/simple.py)
- django/branches/per-object-permissions/django/test/testcases.py (copied) (copied from django/trunk/django/test/testcases.py)
- django/branches/per-object-permissions/django/test/utils.py (copied) (copied from django/trunk/django/test/utils.py)
- django/branches/per-object-permissions/django/views/generic/date_based.py (modified) (3 diffs)
- django/branches/per-object-permissions/docs/faq.txt (modified) (3 diffs)
- django/branches/per-object-permissions/docs/model-api.txt (modified) (2 diffs)
- django/branches/per-object-permissions/docs/overview.txt (modified) (1 diff)
- django/branches/per-object-permissions/docs/settings.txt (modified) (3 diffs)
- django/branches/per-object-permissions/docs/templates.txt (modified) (5 diffs)
- django/branches/per-object-permissions/tests/doctest.py (deleted)
- django/branches/per-object-permissions/tests/modeltests/basic/models.py (modified) (5 diffs)
- django/branches/per-object-permissions/tests/modeltests/choices/models.py (modified) (2 diffs)
- django/branches/per-object-permissions/tests/modeltests/custom_columns/models.py (modified) (2 diffs)
- django/branches/per-object-permissions/tests/modeltests/custom_managers/models.py (modified) (2 diffs)
- django/branches/per-object-permissions/tests/modeltests/custom_methods/models.py (modified) (2 diffs)
- django/branches/per-object-permissions/tests/modeltests/custom_pk/models.py (modified) (2 diffs)
- django/branches/per-object-permissions/tests/modeltests/empty/models.py (modified) (2 diffs)
- django/branches/per-object-permissions/tests/modeltests/field_defaults/models.py (modified) (2 diffs)
- django/branches/per-object-permissions/tests/modeltests/generic_relations/models.py (modified) (2 diffs)
- django/branches/per-object-permissions/tests/modeltests/get_latest/models.py (modified) (2 diffs)
- django/branches/per-object-permissions/tests/modeltests/get_or_create/models.py (modified) (2 diffs)
- django/branches/per-object-permissions/tests/modeltests/invalid_models/models.py (modified) (1 diff)
- django/branches/per-object-permissions/tests/modeltests/lookup/models.py (modified) (2 diffs)
- django/branches/per-object-permissions/tests/modeltests/m2m_and_m2o/models.py (modified) (2 diffs)
- django/branches/per-object-permissions/tests/modeltests/m2m_intermediary/models.py (modified) (2 diffs)
- django/branches/per-object-permissions/tests/modeltests/m2m_multiple/models.py (modified) (2 diffs)
- django/branches/per-object-permissions/tests/modeltests/m2m_recursive/models.py (modified) (2 diffs)
- django/branches/per-object-permissions/tests/modeltests/m2o_recursive2/models.py (modified) (2 diffs)
- django/branches/per-object-permissions/tests/modeltests/m2o_recursive/models.py (modified) (2 diffs)
- django/branches/per-object-permissions/tests/modeltests/manipulators/models.py (modified) (2 diffs)
- django/branches/per-object-permissions/tests/modeltests/many_to_many/models.py (modified) (2 diffs)
- django/branches/per-object-permissions/tests/modeltests/many_to_one/models.py (modified) (2 diffs)
- django/branches/per-object-permissions/tests/modeltests/many_to_one_null/models.py (modified) (2 diffs)
- django/branches/per-object-permissions/tests/modeltests/model_inheritance/models.py (modified) (2 diffs)
- django/branches/per-object-permissions/tests/modeltests/mutually_referential/models.py (modified) (2 diffs)
- django/branches/per-object-permissions/tests/modeltests/one_to_one/models.py (modified) (2 diffs)
- django/branches/per-object-permissions/tests/modeltests/ordering/models.py (modified) (2 diffs)
- django/branches/per-object-permissions/tests/modeltests/or_lookups/models.py (modified) (2 diffs)
- django/branches/per-object-permissions/tests/modeltests/pagination/models.py (modified) (2 diffs)
- django/branches/per-object-permissions/tests/modeltests/properties/models.py (modified) (2 diffs)
- django/branches/per-object-permissions/tests/modeltests/reserved_names/models.py (modified) (2 diffs)
- django/branches/per-object-permissions/tests/modeltests/reverse_lookup/models.py (modified) (2 diffs)
- django/branches/per-object-permissions/tests/modeltests/save_delete_hooks/models.py (modified) (2 diffs)
- django/branches/per-object-permissions/tests/modeltests/serializers/models.py (modified) (2 diffs)
- django/branches/per-object-permissions/tests/modeltests/str/models.py (modified) (2 diffs)
- django/branches/per-object-permissions/tests/modeltests/transactions/models.py (modified) (2 diffs)
- django/branches/per-object-permissions/tests/modeltests/validation/models.py (modified) (2 diffs)
- django/branches/per-object-permissions/tests/othertests (deleted)
- django/branches/per-object-permissions/tests/regressiontests/cache (copied) (copied from django/trunk/tests/regressiontests/cache)
- django/branches/per-object-permissions/tests/regressiontests/cache/__init__.py (copied) (copied from django/trunk/tests/regressiontests/cache/__init__.py)
- django/branches/per-object-permissions/tests/regressiontests/cache/models.py (copied) (copied from django/trunk/tests/regressiontests/cache/models.py)
- django/branches/per-object-permissions/tests/regressiontests/cache/tests.py (copied) (copied from django/trunk/tests/regressiontests/cache/tests.py)
- django/branches/per-object-permissions/tests/regressiontests/dateformat (copied) (copied from django/trunk/tests/regressiontests/dateformat)
- django/branches/per-object-permissions/tests/regressiontests/dateformat/__init__.py (copied) (copied from django/trunk/tests/regressiontests/dateformat/__init__.py)
- django/branches/per-object-permissions/tests/regressiontests/dateformat/models.py (copied) (copied from django/trunk/tests/regressiontests/dateformat/models.py)
- django/branches/per-object-permissions/tests/regressiontests/dateformat/tests.py (copied) (copied from django/trunk/tests/regressiontests/dateformat/tests.py)
- django/branches/per-object-permissions/tests/regressiontests/db_typecasts (copied) (copied from django/trunk/tests/regressiontests/db_typecasts)
- django/branches/per-object-permissions/tests/regressiontests/db_typecasts/__init__.py (copied) (copied from django/trunk/tests/regressiontests/db_typecasts/__init__.py)
- django/branches/per-object-permissions/tests/regressiontests/db_typecasts/models.py (copied) (copied from django/trunk/tests/regressiontests/db_typecasts/models.py)
- django/branches/per-object-permissions/tests/regressiontests/db_typecasts/tests.py (copied) (copied from django/trunk/tests/regressiontests/db_typecasts/tests.py)
- django/branches/per-object-permissions/tests/regressiontests/defaultfilters (copied) (copied from django/trunk/tests/regressiontests/defaultfilters)
- django/branches/per-object-permissions/tests/regressiontests/defaultfilters/__init__.py (copied) (copied from django/trunk/tests/regressiontests/defaultfilters/__init__.py)
- django/branches/per-object-permissions/tests/regressiontests/defaultfilters/models.py (copied) (copied from django/trunk/tests/regressiontests/defaultfilters/models.py)
- django/branches/per-object-permissions/tests/regressiontests/defaultfilters/tests.py (copied) (copied from django/trunk/tests/regressiontests/defaultfilters/tests.py)
- django/branches/per-object-permissions/tests/regressiontests/httpwrappers (copied) (copied from django/trunk/tests/regressiontests/httpwrappers)
- django/branches/per-object-permissions/tests/regressiontests/httpwrappers/__init__.py (copied) (copied from django/trunk/tests/regressiontests/httpwrappers/__init__.py)
- django/branches/per-object-permissions/tests/regressiontests/httpwrappers/models.py (copied) (copied from django/trunk/tests/regressiontests/httpwrappers/models.py)
- django/branches/per-object-permissions/tests/regressiontests/httpwrappers/tests.py (copied) (copied from django/trunk/tests/regressiontests/httpwrappers/tests.py)
- django/branches/per-object-permissions/tests/regressiontests/initial_sql_regress/models.py (modified) (1 diff)
- django/branches/per-object-permissions/tests/regressiontests/many_to_one_regress/models.py (modified) (1 diff)
- django/branches/per-object-permissions/tests/regressiontests/markup (copied) (copied from django/trunk/tests/regressiontests/markup)
- django/branches/per-object-permissions/tests/regressiontests/markup/__init__.py (copied) (copied from django/trunk/tests/regressiontests/markup/__init__.py)
- django/branches/per-object-permissions/tests/regressiontests/markup/models.py (copied) (copied from django/trunk/tests/regressiontests/markup/models.py)
- django/branches/per-object-permissions/tests/regressiontests/markup/tests.py (copied) (copied from django/trunk/tests/regressiontests/markup/tests.py)
- django/branches/per-object-permissions/tests/regressiontests/one_to_one_regress/models.py (modified) (2 diffs)
- django/branches/per-object-permissions/tests/regressiontests/string_lookup/models.py (modified) (2 diffs)
- django/branches/per-object-permissions/tests/regressiontests/templates (copied) (copied from django/trunk/tests/regressiontests/templates)
- django/branches/per-object-permissions/tests/regressiontests/templates/__init__.py (copied) (copied from django/trunk/tests/regressiontests/templates/__init__.py)
- django/branches/per-object-permissions/tests/regressiontests/templates/models.py (copied) (copied from django/trunk/tests/regressiontests/templates/models.py)
- django/branches/per-object-permissions/tests/regressiontests/templates/tests.py (copied) (copied from django/trunk/tests/regressiontests/templates/tests.py)
- django/branches/per-object-permissions/tests/regressiontests/urlpatterns_reverse (copied) (copied from django/trunk/tests/regressiontests/urlpatterns_reverse)
- django/branches/per-object-permissions/tests/regressiontests/urlpatterns_reverse/__init__.py (copied) (copied from django/trunk/tests/regressiontests/urlpatterns_reverse/__init__.py)
- django/branches/per-object-permissions/tests/regressiontests/urlpatterns_reverse/models.py (copied) (copied from django/trunk/tests/regressiontests/urlpatterns_reverse/models.py)
- django/branches/per-object-permissions/tests/regressiontests/urlpatterns_reverse/tests.py (copied) (copied from django/trunk/tests/regressiontests/urlpatterns_reverse/tests.py)
- django/branches/per-object-permissions/tests/runtests.py (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
django/branches/per-object-permissions/django/conf/global_settings.py
r3583 r3669 297 297 298 298 AUTHENTICATION_BACKENDS = ('django.contrib.auth.backends.ModelBackend',) 299 300 ########### 301 # TESTING # 302 ########### 303 304 TEST_RUNNER='django.test.simple.run_tests' django/branches/per-object-permissions/django/contrib/admin/media/css/global.css
r3615 r3669 1 body { margin:0; padding:0; font-size:12px; font-family:"Lucida Grande"," Bitstream Vera Sans",Verdana,Arial,sans-serif; color:#333; background:#fff; }1 body { margin:0; padding:0; font-size:12px; font-family:"Lucida Grande","DejaVu Sans","Bitstream Vera Sans",Verdana,Arial,sans-serif; color:#333; background:#fff; } 2 2 3 3 /* LINKS */ django/branches/per-object-permissions/django/contrib/admin/templates/admin_doc/model_detail.html
r3464 r3669 36 36 <td>{{ field.name }}</td> 37 37 <td>{{ field.data_type }}</td> 38 <td>{% if field.verbose %}{{ field.verbose |escape }}{% endif %}{% if field.help_text %} - {{ field.help_text|escape}}{% endif %}</td>38 <td>{% if field.verbose %}{{ field.verbose }}{% endif %}{% if field.help_text %} - {{ field.help_text }}{% endif %}</td> 39 39 </tr> 40 40 {% endfor %} django/branches/per-object-permissions/django/contrib/admin/templatetags/admin_modify.py
r3629 r3669 196 196 if f.rel and isinstance(f.rel, models.ManyToManyRel) and f.rel.filter_interface: 197 197 return '<script type="text/javascript">addEvent(window, "load", function(e) {' \ 198 ' SelectFilter.init("id_%s", "%s", %s, "%s"); });</script>\n' % (198 ' SelectFilter.init("id_%s", %r, %s, "%s"); });</script>\n' % ( 199 199 f.name, f.verbose_name, f.rel.filter_interface-1, settings.ADMIN_MEDIA_PREFIX) 200 200 else: django/branches/per-object-permissions/django/contrib/admin/views/main.py
r3630 r3669 424 424 return # Avoid recursing too deep. 425 425 opts_seen = [] 426 for related in opts. related_objects():426 for related in opts.get_all_related_objects(): 427 427 if related.opts in opts_seen: 428 428 continue django/branches/per-object-permissions/django/contrib/auth/management.py
r3172 r3669 17 17 return perms + list(opts.permissions) 18 18 19 def create_permissions(app, created_models ):19 def create_permissions(app, created_models, verbosity): 20 20 from django.contrib.contenttypes.models import ContentType 21 21 from django.contrib.auth.models import Permission … … 28 28 p, created = Permission.objects.get_or_create(codename=codename, content_type__pk=ctype.id, 29 29 defaults={'name': name, 'content_type': ctype}) 30 if created :30 if created and verbosity >= 2: 31 31 print "Adding permission '%s'" % p 32 32 33 def create_superuser(app, created_models ):33 def create_superuser(app, created_models, verbosity, **kwargs): 34 34 from django.contrib.auth.models import User 35 35 from django.contrib.auth.create_superuser import createsuperuser as do_create 36 if User in created_models :36 if User in created_models and kwargs.get('interactive', True): 37 37 msg = "\nYou just installed Django's auth system, which means you don't have " \ 38 38 "any superusers defined.\nWould you like to create one now? (yes/no): " django/branches/per-object-permissions/django/contrib/contenttypes/management.py
r3148 r3669 6 6 from django.db.models import get_models, signals 7 7 8 def create_contenttypes(app, created_models ):8 def create_contenttypes(app, created_models, verbosity): 9 9 from django.contrib.contenttypes.models import ContentType 10 10 app_models = get_models(app) … … 20 20 app_label=opts.app_label, model=opts.object_name.lower()) 21 21 ct.save() 22 print "Adding content type '%s | %s'" % (ct.app_label, ct.model) 22 if verbosity >= 2: 23 print "Adding content type '%s | %s'" % (ct.app_label, ct.model) 23 24 24 25 dispatcher.connect(create_contenttypes, signal=signals.post_syncdb) django/branches/per-object-permissions/django/contrib/flatpages/views.py
r3464 r3669 4 4 from django.http import HttpResponse 5 5 from django.conf import settings 6 from django.core.xheaders import populate_xheaders 6 7 7 8 DEFAULT_TEMPLATE = 'flatpages/default.html' … … 33 34 'flatpage': f, 34 35 }) 35 return HttpResponse(t.render(c)) 36 response = HttpResponse(t.render(c)) 37 populate_xheaders(request, response, FlatPage, f.id) 38 return response django/branches/per-object-permissions/django/contrib/sites/management.py
r2809 r3669 8 8 from django.contrib.sites import models as site_app 9 9 10 def create_default_site(app, created_models ):10 def create_default_site(app, created_models, verbosity): 11 11 if Site in created_models: 12 print "Creating example.com Site object" 12 if verbosity >= 2: 13 print "Creating example.com Site object" 13 14 s = Site(domain="example.com", name="example.com") 14 15 s.save() django/branches/per-object-permissions/django/core/management.py
r3583 r3669 424 424 get_sql_all.args = APP_ARGS 425 425 426 def syncdb( ):426 def syncdb(verbosity=2, interactive=True): 427 427 "Creates the database tables for all apps in INSTALLED_APPS whose tables haven't already been created." 428 428 from django.db import connection, transaction, models, get_creation_module … … 472 472 pending_references[refto] = refs 473 473 sql.extend(_get_sql_for_pending_references(model, pending_references)) 474 print "Creating table %s" % model._meta.db_table 474 if verbosity >= 2: 475 print "Creating table %s" % model._meta.db_table 475 476 for statement in sql: 476 477 cursor.execute(statement) … … 481 482 sql = _get_many_to_many_sql_for_model(model) 482 483 if sql: 483 print "Creating many-to-many tables for %s model" % model.__name__ 484 if verbosity >= 2: 485 print "Creating many-to-many tables for %s model" % model.__name__ 484 486 for statement in sql: 485 487 cursor.execute(statement) … … 491 493 for app in models.get_apps(): 492 494 dispatcher.send(signal=signals.post_syncdb, sender=app, 493 app=app, created_models=created_models) 495 app=app, created_models=created_models, 496 verbosity=verbosity, interactive=interactive) 494 497 495 498 # Install initial data for the app (but only if this is a model we've … … 1155 1158 runfcgi.args = '[various KEY=val options, use `runfcgi help` for help]' 1156 1159 1160 def test(verbosity, app_labels): 1161 "Runs the test suite for the specified applications" 1162 from django.conf import settings 1163 from django.db.models import get_app, get_apps 1164 1165 if len(app_labels) == 0: 1166 app_list = get_apps() 1167 else: 1168 app_list = [get_app(app_label) for app_label in app_labels] 1169 1170 test_path = settings.TEST_RUNNER.split('.') 1171 # Allow for Python 2.5 relative paths 1172 if len(test_path) > 1: 1173 test_module_name = '.'.join(test_path[:-1]) 1174 else: 1175 test_module_name = '.' 1176 test_module = __import__(test_module_name, [],[],test_path[-1]) 1177 test_runner = getattr(test_module, test_path[-1]) 1178 1179 test_runner(app_list, verbosity) 1180 test.help_doc = 'Runs the test suite for the specified applications, or the entire site if no apps are specified' 1181 test.args = '[--verbosity] ' + APP_ARGS 1182 1157 1183 # Utilities for command-line script 1158 1184 … … 1179 1205 'syncdb': syncdb, 1180 1206 'validate': validate, 1207 'test':test, 1181 1208 } 1182 1209 … … 1229 1256 parser.add_option('--plain', action='store_true', dest='plain', 1230 1257 help='Tells Django to use plain Python, not IPython, for "shell" command.') 1258 parser.add_option('--noinput', action='store_false', dest='interactive', default=True, 1259 help='Tells Django to NOT prompt the user for input of any kind.') 1231 1260 parser.add_option('--noreload', action='store_false', dest='use_reloader', default=True, 1232 1261 help='Tells Django to NOT use the auto-reloader when running the development server.') 1262 parser.add_option('--verbosity', action='store', dest='verbosity', default='2', 1263 type='choice', choices=['0', '1', '2'], 1264 help='Verbosity level; 0=minimal output, 1=normal output, 2=all output') 1265 1233 1266 options, args = parser.parse_args(argv[1:]) 1234 1267 … … 1257 1290 if action == 'shell': 1258 1291 action_mapping[action](options.plain is True) 1259 elif action in (' syncdb', 'validate', 'diffsettings', 'dbshell'):1292 elif action in ('validate', 'diffsettings', 'dbshell'): 1260 1293 action_mapping[action]() 1294 elif action == 'syncdb': 1295 action_mapping[action](int(options.verbosity), options.interactive) 1261 1296 elif action == 'inspectdb': 1262 1297 try: … … 1269 1304 try: 1270 1305 action_mapping[action](args[1]) 1306 except IndexError: 1307 parser.print_usage_and_exit() 1308 elif action == 'test': 1309 try: 1310 action_mapping[action](int(options.verbosity), args[1:]) 1271 1311 except IndexError: 1272 1312 parser.print_usage_and_exit() django/branches/per-object-permissions/django/core/validators.py
r3305 r3669 69 69 def isSlug(field_data, all_data): 70 70 if not slug_re.search(field_data): 71 raise ValidationError, "This value must contain only letters, numbers, underscores or hyphens."71 raise ValidationError, gettext("This value must contain only letters, numbers, underscores or hyphens.") 72 72 73 73 def isLowerCase(field_data, all_data): django/branches/per-object-permissions/django/views/generic/date_based.py
r3464 r3669 2 2 from django.core.exceptions import ObjectDoesNotExist 3 3 from django.core.xheaders import populate_xheaders 4 from django.db.models.fields import DateTimeField 4 5 from django.http import Http404, HttpResponse 5 6 import datetime, time … … 236 237 now = datetime.datetime.now() 237 238 238 lookup_kwargs = { 239 '%s__range' % date_field: (datetime.datetime.combine(date, datetime.time.min), datetime.datetime.combine(date, datetime.time.max)), 240 } 239 if isinstance(model._meta.get_field(date_field), DateTimeField): 240 lookup_kwargs = {'%s__range' % date_field: (datetime.datetime.combine(date, datetime.time.min), datetime.datetime.combine(date, datetime.time.max))} 241 else: 242 lookup_kwargs = {date_field: date} 241 243 242 244 # Only bother to check current date if the date isn't in the past and future objects aren't requested. … … 305 307 now = datetime.datetime.now() 306 308 307 lookup_kwargs = { 308 '%s__range' % date_field: (datetime.datetime.combine(date, datetime.time.min), datetime.datetime.combine(date, datetime.time.max)), 309 } 309 if isinstance(model._meta.get_field(date_field), DateTimeField): 310 lookup_kwargs = {'%s__range' % date_field: (datetime.datetime.combine(date, datetime.time.min), datetime.datetime.combine(date, datetime.time.max))} 311 else: 312 lookup_kwargs = {date_field: date} 310 313 311 314 # Only bother to check current date if the date isn't in the past and future objects aren't requested. django/branches/per-object-permissions/docs/faq.txt
r3630 r3669 17 17 perfectionists when it comes to following best practices of Web development. 18 18 19 Thus, Django was designed not only to allow fast Web development, but 20 *best-practice* Web development. 21 22 Django would not be possible without a whole host of open-source projects -- 23 `Apache`_, `Python`_, and `PostgreSQL`_ to name a few -- and we're thrilled to 24 be able to give something back to the open-source community. 19 In fall 2003, the World Online developers (Adrian Holovaty and Simon Willison) 20 ditched PHP and began using Python to develop its Web sites. As they built 21 intensive, richly interactive sites such as Lawrence.com, they began to extract 22 a generic Web development framework that let them build Web applications more 23 and more quickly. They tweaked this framework constantly, adding improvements 24 over two years. 25 26 In summer 2005, World Online decided to open-source the resulting software, 27 Django. Django would not be possible without a whole host of open-source 28 projects -- `Apache`_, `Python`_, and `PostgreSQL`_ to name a few -- and we're 29 thrilled to be able to give something back to the open-source community. 25 30 26 31 .. _Apache: http://httpd.apache.org/ … … 43 48 ----------------- 44 49 45 Yes. World Online has been using Django for more than t wo years. Sites built on46 Django have weathered traffic spikes of over one million hits an hour and a50 Yes. World Online has been using Django for more than three years. Sites built 51 on Django have weathered traffic spikes of over one million hits an hour and a 47 52 number of Slashdottings. Yes, it's quite stable. 48 53 … … 631 636 ================= 632 637 638 How can I get started contributing code to Django? 639 -------------------------------------------------- 640 641 Thanks for asking! We've written an entire document devoted to this question. 642 It's titled `Contributing to Django`_. 643 644 .. _Contributing do Django: http://www.djangoproject.com/documentation/contributing/ 645 633 646 I submitted a bug fix in the ticket system several weeks ago. Why are you ignoring my patch? 634 647 -------------------------------------------------------------------------------------------- django/branches/per-object-permissions/docs/model-api.txt
r3630 r3669 1223 1223 1224 1224 * ``ManyToManyField`` fields aren't supported, because that would entail 1225 executing a separate SQL statement for each row in the table. 1226 1227 * If the field is a ``BooleanField``, Django will display a pretty "on" or 1228 "off" icon instead of ``True`` or ``False``. 1225 executing a separate SQL statement for each row in the table. If you 1226 want to do this nonetheless, give your model a custom method, and add 1227 that method's name to ``list_display``. (See below for more on custom 1228 methods in ``list_display``.) 1229 1230 * If the field is a ``BooleanField`` or ``NullBooleanField``, Django will 1231 display a pretty "on" or "off" icon instead of ``True`` or ``False``. 1229 1232 1230 1233 * If the string given is a method of the model, Django will call it and … … 1262 1265 return '<span style="color: #%s;">%s %s</span>' % (self.color_code, self.first_name, self.last_name) 1263 1266 colored_name.allow_tags = True 1267 1268 * The ``__str__()`` method is just as valid in ``list_display`` as any 1269 other model method, so it's perfectly OK to do this:: 1270 1271 list_display = ('__str__', 'some_other_field') 1272 1273 * For any element of ``list_display`` that is not a field on the model, the 1274 change list page will not allow ordering by that column. This is because 1275 ordering is done at the database level, and Django has no way of knowing 1276 how to order the result of a custom method at the SQL level. 1264 1277 1265 1278 ``list_display_links`` django/branches/per-object-permissions/docs/overview.txt
r2871 r3669 160 160 code. 161 161 162 Here's what a URLconf might look like for the above``Reporter``/``Article``162 Here's what a URLconf might look like for the ``Reporter``/``Article`` 163 163 example above:: 164 164 django/branches/per-object-permissions/docs/settings.txt
r3583 r3669 474 474 475 475 LANGUAGES = ( 476 ('ar', _('Arabic')), 476 477 ('bn', _('Bengali')), 477 478 ('cs', _('Czech')), … … 479 480 ('da', _('Danish')), 480 481 ('de', _('German')), 482 ('el', _('Greek')), 481 483 ('en', _('English')), 482 484 ('es', _('Spanish')), 485 ('es_AR', _('Argentinean Spanish')), 483 486 ('fr', _('French')), 484 487 ('gl', _('Galician')), 488 ('hu', _('Hungarian')), 489 ('he', _('Hebrew')), 485 490 ('is', _('Icelandic')), 486 491 ('it', _('Italian')), 492 ('ja', _('Japanese')), 493 ('nl', _('Dutch')), 487 494 ('no', _('Norwegian')), 488 495 ('pt-br', _('Brazilian')), … … 490 497 ('ru', _('Russian')), 491 498 ('sk', _('Slovak')), 499 ('sl', _('Slovenian')), 492 500 ('sr', _('Serbian')), 493 501 ('sv', _('Swedish')), 502 ('ta', _('Tamil')), 503 ('uk', _('Ukrainian')), 494 504 ('zh-cn', _('Simplified Chinese')), 505 ('zh-tw', _('Traditional Chinese')), 495 506 ) 496 507 django/branches/per-object-permissions/docs/templates.txt
r3583 r3669 142 142 </div> 143 143 </body> 144 </html> 144 145 145 146 This template, which we'll call ``base.html``, defines a simple HTML skeleton … … 197 198 </div> 198 199 </body> 200 </html> 199 201 200 202 Note that since the child template didn't define the ``sidebar`` block, the … … 364 366 Signal that this template extends a parent template. 365 367 366 This tag can be used in two ways: 368 This tag can be used in two ways: 367 369 368 370 * ``{% extends "base.html" %}`` (with quotes) uses the literal value … … 962 964 ~~~~~~~~~ 963 965 964 Returns a plural suffix if the value is not 1. By default, this suffix is ``'s'``. 966 Returns a plural suffix if the value is not 1. By default, this suffix is ``'s'``. 965 967 966 968 Example:: … … 968 970 You have {{ num_messages }} message{{ num_messages|pluralize }}. 969 971 970 For words that require a suffix other than ``'s'``, you can provide an alternate 972 For words that require a suffix other than ``'s'``, you can provide an alternate 971 973 suffix as a parameter to the filter. 972 974 django/branches/per-object-permissions/tests/modeltests/basic/models.py
r3217 r3669 14 14 return self.headline 15 15 16 API_TESTS = """ 17 16 __test__ = {'API_TESTS': """ 18 17 # No articles are in the system yet. 19 18 >>> Article.objects.all() … … 315 314 [<Article: Article 6>, <Article: Default headline>, <Article: Article 7>, <Article: Updated article 8>] 316 315 317 """ 316 """} 318 317 319 318 from django.conf import settings … … 322 321 323 322 if building_docs or settings.DATABASE_ENGINE == 'postgresql': 324 API_TESTS+= """323 __test__['API_TESTS'] += """ 325 324 # In PostgreSQL, microsecond-level precision is available. 326 325 >>> a9 = Article(headline='Article 9', pub_date=datetime(2005, 7, 31, 12, 30, 45, 180)) … … 331 330 332 331 if building_docs or settings.DATABASE_ENGINE == 'mysql': 333 API_TESTS+= """332 __test__['API_TESTS'] += """ 334 333 # In MySQL, microsecond-level precision isn't available. You'll lose 335 334 # microsecond-level precision once the data is saved. … … 340 339 """ 341 340 342 API_TESTS+= """341 __test__['API_TESTS'] += """ 343 342 344 343 # You can manually specify the primary key when creating a new object. django/branches/per-object-permissions/tests/modeltests/choices/models.py
r3075 r3669 24 24 return self.name 25 25 26 API_TESTS ="""26 __test__ = {'API_TESTS':""" 27 27 >>> a = Person(name='Adrian', gender='M') 28 28 >>> a.save() … … 37 37 >>> s.get_gender_display() 38 38 'Female' 39 """ 39 """} django/branches/per-object-permissions/tests/modeltests/custom_columns/models.py
r3075 r3669 16 16 return '%s %s' % (self.first_name, self.last_name) 17 17 18 API_TESTS ="""18 __test__ = {'API_TESTS':""" 19 19 # Create a Person. 20 20 >>> p = Person(first_name='John', last_name='Smith') … … 51 51 ... 52 52 AttributeError: 'Person' object has no attribute 'last' 53 """ 53 """} django/branches/per-object-permissions/tests/modeltests/custom_managers/models.py
r3075 r3669 59 59 return self.name 60 60 61 API_TESTS ="""61 __test__ = {'API_TESTS':""" 62 62 >>> p1 = Person(first_name='Bugs', last_name='Bunny', fun=True) 63 63 >>> p1.save() … … 105 105 >>> Car._default_manager.order_by('name') 106 106 [<Car: Corvette>, <Car: Neon>] 107 """ 107 """} django/branches/per-object-permissions/tests/modeltests/custom_methods/models.py
r3075 r3669 37 37 return [self.__class__(*row) for row
