Django

Code

Ticket #3591: app_labels.6.diff

File app_labels.6.diff, 32.1 kB (added by Vinay Sajip <vinay_sajip@yahoo.co.uk>, 1 year ago)

An updated patch to cater for recent changes in trunk.

  • django/test/client.py

    old new  
    22import sys 
    33from cStringIO import StringIO 
    44from urlparse import urlparse 
    5 from django.conf import settings 
     5from django.conf import settings, get_installed_app_paths 
    66from django.contrib.auth import authenticate, login 
    77from django.contrib.sessions.models import Session 
    88from django.contrib.sessions.middleware import SessionWrapper 
     
    128128 
    129129    def _session(self): 
    130130        "Obtain the current session variables" 
    131         if 'django.contrib.sessions' in settings.INSTALLED_APPS
     131        if 'django.contrib.sessions' in get_installed_app_paths()
    132132            cookie = self.cookies.get(settings.SESSION_COOKIE_NAME, None) 
    133133            if cookie: 
    134134                return SessionWrapper(cookie.value) 
  • django/conf/__init__.py

    old new  
    9797        # of all those apps. 
    9898        new_installed_apps = [] 
    9999        for app in self.INSTALLED_APPS: 
    100             if app.endswith('.*'): 
     100            if not isinstance(app, basestring) or not app.endswith('.*'): 
     101                new_installed_apps.append(app) 
     102            else: 
    101103                appdir = os.path.dirname(__import__(app[:-2], {}, {}, ['']).__file__) 
    102104                for d in os.listdir(appdir): 
    103105                    if d.isalpha() and os.path.isdir(os.path.join(appdir, d)): 
    104106                        new_installed_apps.append('%s.%s' % (app[:-2], d)) 
    105             else: 
    106                 new_installed_apps.append(app) 
    107107        self.INSTALLED_APPS = new_installed_apps 
    108108 
    109109        if hasattr(time, 'tzset'): 
     
    147147    return gettext(*args) 
    148148 
    149149__builtins__['_'] = first_time_gettext 
     150 
     151class app(object): 
     152    """Configuration directive for specifying an app.""" 
     153    def __init__(self, path, app_label=None, verbose_name=None): 
     154        self.path = path 
     155        # if name isn't specified, get the last part of the Python dotted path 
     156        self.label = app_label or path.split('.')[-1] 
     157        self.verbose_name = verbose_name or self.label 
     158        self.app_module = None    # will be filled in by loading.py 
     159        self.models_module = None # will be filled in by loading.py 
     160 
     161    def __repr__(self): 
     162        return "<app: %s>" % self.path 
     163 
     164def get_installed_app_paths(): 
     165    "Return the paths of all entries in settings.INSTALLED_APPS." 
     166    rv = [] 
     167    for a in settings.INSTALLED_APPS: 
     168        if isinstance(a, basestring): 
     169            rv.append(a) 
     170        else: 
     171            rv.append(a.path) 
     172    return rv 
  • django/db/models/base.py

    old new  
    88from django.db.models.options import Options, AdminOptions 
    99from django.db import connection, backend, transaction 
    1010from django.db.models import signals 
    11 from django.db.models.loading import register_models, get_model 
     11from django.db.models.loading import register_models, get_model, get_app_label 
    1212from django.dispatch import dispatcher 
    1313from django.utils.datastructures import SortedDict 
    1414from django.utils.functional import curry 
     
    4242                new_class._meta.parents.append(base) 
    4343                new_class._meta.parents.extend(base._meta.parents) 
    4444 
    45  
    4645        if getattr(new_class._meta, 'app_label', None) is None: 
    47             # Figure out the app_label by looking one level up. 
    48             # For 'django.contrib.sites.models', this would be 'sites'. 
    49             model_module = sys.modules[new_class.__module__] 
    50             new_class._meta.app_label = model_module.__name__.split('.')[-2] 
     46            # Figure out the app_label. 
     47            new_class._meta.app_label = get_app_label(new_class) 
    5148 
    5249        # Bail out early if we have already created this class. 
    5350        m = get_model(new_class._meta.app_label, name, False) 
  • django/db/models/options.py

    old new  
    1 from django.conf import settings 
     1from django.conf import settings, get_installed_app_paths 
    22from django.db.models.related import RelatedObject 
    33from django.db.models.fields.related import ManyToManyRel 
    44from django.db.models.fields import AutoField, FieldDoesNotExist 
     
    3636 
    3737    def contribute_to_class(self, cls, name): 
    3838        cls._meta = self 
    39         self.installed = re.sub('\.models$', '', cls.__module__) in settings.INSTALLED_APPS 
     39        self.installed = re.sub('\.models$', '', cls.__module__) in get_installed_app_paths() 
    4040        # First, construct the default values for these options. 
    4141        self.object_name = cls.__name__ 
    4242        self.module_name = self.object_name.lower() 
  • django/db/models/loading.py

    old new  
    11"Utilities for loading models and the modules that contain them." 
    22 
    3 from django.conf import settings 
     3from django.conf import settings, app 
    44from django.core.exceptions import ImproperlyConfigured 
    55import sys 
    66import os 
    77 
    88__all__ = ('get_apps', 'get_app', 'get_models', 'get_model', 'register_models') 
    99 
    10 _app_list = []   # Cache of installed apps. 
     10_app_list = []   # Cache of installed app instances. 
    1111                 # Entry is not placed in app_list cache until entire app is loaded. 
    1212_app_models = {} # Dictionary of models against app label 
    1313                 # Each value is a dictionary of model name: model class 
     
    1515_app_errors = {} # Dictionary of errors that were experienced when loading the INSTALLED_APPS 
    1616                 # Key is the app_name of the model, value is the exception that was raised 
    1717                 # during model loading. 
    18 _loaded = False  # Has the contents of settings.INSTALLED_APPS been loaded? 
    19                  # i.e., has get_apps() been called? 
     18_app_map = {}    # Map of app instances keyed by app_label. 
     19_mod_map = {}    # Map of app instances keyed by app module names. 
     20 
     21_old_apps = None # what INSTALLED_APPS was when get_apps() was last called 
    2022 
    2123def get_apps(): 
    22     "Returns a list of all installed modules that contain models." 
     24    "Returns a list of all loaded applications." 
    2325    global _app_list 
    24     global _loaded 
    25     if not _loaded: 
    26         _loaded = True 
    27         for app_name in settings.INSTALLED_APPS: 
     26    global _app_map 
     27    global _mod_map 
     28    global _old_apps 
     29 
     30    changed = (_old_apps != settings.INSTALLED_APPS) 
     31    if changed: 
     32        if changed: 
     33            _app_list = [] 
     34            _app_map = {} 
     35            _mod_map = {} 
     36        _old_apps = settings.INSTALLED_APPS[:] #Note: making a copy 
     37        # We first loop through, setting up the app instances and 
     38        # the relevant maps so that we can find the instances by app_label 
     39        # or app module name. These need to be ready because we need to be 
     40        # able to get the app_label e.g. for applying to model classes. 
     41        # If a model class is loaded indirectly without being in an 
     42        # installed app, the app_label used will be what it is now - the 
     43        # last part of the app module name. 
     44        # Note that _app_map and _mod_map will contain entries even 
     45        # when an app cannot be loaded by load_app. 
     46        for app_entry in settings.INSTALLED_APPS: 
     47            if isinstance(app_entry, basestring): 
     48                the_app = app(app_entry) 
     49            else: 
     50                the_app = app_entry 
     51            _app_map[the_app.label] = the_app 
     52            _mod_map[the_app.path] = the_app 
     53 
     54        for app_entry in settings.INSTALLED_APPS: 
     55            if isinstance(app_entry, basestring): 
     56                the_app = _mod_map[app_entry] 
     57            else: 
     58                the_app = app_entry 
     59            app_name = the_app.path 
    2860            try: 
    2961                load_app(app_name) 
     62                _app_list.append(the_app) 
    3063            except Exception, e: 
    3164                # Problem importing the app 
    3265                _app_errors[app_name] = e 
    3366    return _app_list 
    3467 
     68def get_app_label(model_class): 
     69    "Returns the app label to be used for a model class." 
     70    global _mod_map 
     71    key = model_class.__module__ 
     72    i = key.rfind('.') 
     73    assert i > 0, "Model class must be defined in a package sub-module" 
     74    key = key[:i] 
     75    if key in _mod_map: 
     76        rv = _mod_map[key].label 
     77    else: 
     78        i = key.rfind('.') 
     79        if i < 0: 
     80            rv = key 
     81        else: 
     82            rv = key[i + 1:] 
     83    return rv 
     84 
     85def find_app(app_path): 
     86    "Find an app instance, given the application path." 
     87    get_apps() 
     88    return _mod_map[app_path] # _mod_map.get(app_path, None) 
     89 
    3590def get_app(app_label, emptyOK=False): 
    36     "Returns the module containing the models for the given app_label. If the app has no models in it and 'emptyOK' is True, returns None." 
     91    "Returns the app instance for the given app_label. If the app has no models in it and 'emptyOK' is True, returns None." 
    3792    get_apps() # Run get_apps() to populate the _app_list cache. Slightly hackish. 
    38     for app_name in settings.INSTALLED_APPS: 
    39         if app_label == app_name.split('.')[-1]: 
    40             mod = load_app(app_name) 
    41             if mod is None: 
    42                 if emptyOK: 
    43                     return None 
     93    if app_label not in _app_map: 
     94        rv = None 
    4495            else: 
    45                 return mod 
     96        rv = _app_map[app_label] 
     97    if emptyOK or rv is not None: 
     98        return rv 
    4699    raise ImproperlyConfigured, "App with label %s could not be found" % app_label 
    47100 
    48101def load_app(app_name): 
    49     "Loads the app with the provided fully qualified name, and returns the model module." 
     102    "Loads the app with the provided fully qualified name, and returns the models module." 
    50103    global _app_list 
     104    global _app_map 
     105    global _mod_map 
    51106    mod = __import__(app_name, {}, {}, ['models']) 
     107    if app_name in _mod_map: 
     108        the_app = _mod_map[app_name] 
     109    else: 
     110        # An app can be loaded by load_app even before get_apps is 
     111        # called. In this case, we just make a new app and add it to the maps. 
     112        the_app = app(app_name) 
     113        _app_map[the_app.label] = the_app 
     114        _mod_map[app_name] = the_app 
     115        _app_list.append(the_app) 
     116    the_app.app_module = mod 
    52117    if not hasattr(mod, 'models'): 
    53         return None 
    54     if mod.models not in _app_list: 
    55         _app_list.append(mod.models) 
    56     return mod.models 
     118        rv = None 
     119    else: 
     120        rv = mod.models 
     121    the_app.models_module = rv 
     122    return rv 
    57123 
    58124def get_app_errors(): 
    59125    "Returns the map of known problems with the INSTALLED_APPS" 
     
    61127    get_apps() # Run get_apps() to populate the _app_list cache. Slightly hackish. 
    62128    return _app_errors 
    63129 
    64 def get_models(app_mod=None): 
     130def get_models(the_app=None): 
    65131    """ 
    66     Given a module containing models, returns a list of the models. Otherwise 
    67     returns a list of all installed models. 
     132    Given an app instance, returns a list of its models. Otherwise 
     133    returns a list of all loaded models. 
    68134    """ 
    69     app_list = get_apps() # Run get_apps() to populate the _app_list cache. Slightly hackish. 
    70     if app_mod
    71         return _app_models.get(app_mod.__name__.split('.')[-2], {}).values() 
     135    get_apps() # Run get_apps() to populate the _app_list cache. Slightly hackish. 
     136    if the_app
     137        return _app_models.get(the_app.label, {}).values() 
    72138    else: 
    73139        model_list = [] 
    74         for app_mod in app_list: 
    75             model_list.extend(get_models(app_mod)) 
     140        for the_app in _app_list: 
     141            model_list.extend(get_models(the_app)) 
    76142        return model_list 
    77143 
    78144def get_model(app_label, model_name, seed_cache=True): 
  • django/db/models/__init__.py

    old new  
    22from django.core.exceptions import ObjectDoesNotExist, ImproperlyConfigured 
    33from django.core import validators 
    44from django.db import backend, connection 
    5 from django.db.models.loading import get_apps, get_app, get_models, get_model, register_models 
     5from django.db.models.loading import get_apps, get_app, get_models, get_model, register_models, find_app 
    66from django.db.models.query import Q 
    77from django.db.models.manager import Manager 
    88from django.db.models.base import Model, AdminOptions 
  • django/core/management.py

    old new  
    66import os, re, shutil, sys, textwrap 
    77from optparse import OptionParser 
    88from django.utils import termcolors 
     9import logging 
     10 
     11logger = logging.getLogger("django.core.management") 
    912 
    1013# For Python 2.3 
    1114if not hasattr(__builtins__, 'set'): 
     
    368371    from django.conf import settings 
    369372 
    370373    opts = model._meta 
    371     app_dir = os.path.normpath(os.path.join(os.path.dirname(models.get_app(model._meta.app_label).__file__), 'sql')) 
     374    app_dir = os.path.normpath(os.path.join(os.path.dirname(models.get_app(model._meta.app_label).models_module.__file__), 'sql')) 
    372375    output = [] 
    373376 
    374377    # Some backends can't execute more than one SQL statement at a time, 
     
    396399    output = [] 
    397400 
    398401    app_models = get_models(app) 
    399     app_dir = os.path.normpath(os.path.join(os.path.dirname(app.__file__), 'sql')) 
     402    app_dir = os.path.normpath(os.path.join(os.path.dirname(app.models_module.__file__), 'sql')) 
    400403 
    401404    for model in app_models: 
    402405        output.extend(get_custom_sql_for_model(model)) 
     
    456459    from django.dispatch import dispatcher 
    457460    # Emit the post_sync signal for every application. 
    458461    for app in models.get_apps(): 
    459         app_name = app.__name__.split('.')[-2] 
     462        app_name = app.label 
    460463        if verbosity >= 2: 
    461464            print "Running post-sync handlers for application", app_name 
    462465        dispatcher.send(signal=models.signals.post_syncdb, sender=app, 
     
    466469def syncdb(verbosity=1, interactive=True): 
    467470    "Creates the database tables for all apps in INSTALLED_APPS whose tables haven't already been created." 
    468471    from django.db import connection, transaction, models, get_creation_module 
    469     from django.conf import settings 
     472    from django.conf import settings, get_installed_app_paths 
    470473 
    471474    disable_termcolors() 
    472475 
     
    475478 
    476479    # Import the 'management' module within each installed app, to register 
    477480    # dispatcher events. 
    478     for app_name in settings.INSTALLED_APPS
     481    for app_name in get_installed_app_paths()
    479482        try: 
    480483            __import__(app_name + '.management', {}, {}, ['']) 
    481484        except ImportError: 
     
    496499 
    497500    # Create the tables for each model 
    498501    for app in models.get_apps(): 
    499         app_name = app.__name__.split('.')[-2] 
     502        app_name = app.label 
    500503        model_list = models.get_models(app) 
    501504        for model in model_list: 
    502505            # Create the model's database table, if it doesn't already exist. 
     
    519522    # Create the m2m tables. This must be done after all tables have been created 
    520523    # to ensure that all referred tables will exist. 
    521524    for app in models.get_apps(): 
    522         app_name = app.__name__.split('.')[-2] 
     525        app_name = app.label 
    523526        model_list = models.get_models(app) 
    524527        for model in model_list: 
    525528            if model in created_models: 
     
    539542    # Install custom SQL for the app (but only if this 
    540543    # is a model we've just created) 
    541544    for app in models.get_apps(): 
    542         app_name = app.__name__.split('.')[-2] 
     545        app_name = app.label 
    543546        for model in models.get_models(app): 
    544547            if model in created_models: 
    545548                custom_sql = get_custom_sql_for_model(model) 
     
    556559                    else: 
    557560                        transaction.commit_unless_managed() 
    558561 
    559     # Install SQL indicies for all newly created models 
     562    # Install SQL indices for all newly created models 
    560563    for app in models.get_apps(): 
    561         app_name = app.__name__.split('.')[-2] 
     564        app_name = app.label 
    562565        for model in models.get_models(app): 
    563566            if model in created_models: 
    564567                index_sql = get_sql_indexes_for_model(model) 
     
    635638    "Executes the equivalent of 'get_sql_reset' in the current database." 
    636639    from django.db import connection, transaction 
    637640    from django.conf import settings 
    638     app_name = app.__name__.split('.')[-2] 
     641    app_name = app.label 
    639642 
    640643    disable_termcolors() 
    641644 
     
    676679 
    677680def flush(verbosity=1, interactive=True): 
    678681    "Returns all tables in the database to the same state they were in immediately after syncdb." 
    679     from django.conf import settings 
     682    from django.conf import settings, get_installed_app_paths 
    680683    from django.db import connection, transaction, models 
    681684    from django.dispatch import dispatcher 
    682685 
     
    687690 
    688691    # Import the 'management' module within each installed app, to register 
    689692    # dispatcher events. 
    690     for app_name in settings.INSTALLED_APPS
     693    for app_name in get_installed_app_paths()
    691694        try: 
    692695            __import__(app_name + '.management', {}, {}, ['']) 
    693696        except ImportError: 
     
    12931296    from django.db.models import get_app, get_apps 
    12941297 
    12951298    if len(app_labels) == 0: 
    1296         app_list = get_apps() 
     1299        app_list = [app.models_module for app in get_apps()] 
    12971300    else: 
    1298         app_list = [get_app(app_label) for app_label in app_labels] 
     1301        app_list = [get_app(app_label).models_module for app_label in app_labels] 
    12991302 
    13001303    test_path = settings.TEST_RUNNER.split('.') 
    13011304    # Allow for Python 2.5 relative paths 
     
    13401343    transaction.enter_transaction_management() 
    13411344    transaction.managed(True) 
    13421345 
    1343     app_fixtures = [os.path.join(os.path.dirname(app.__file__),'fixtures') for app in get_apps()] 
     1346    app_fixtures = [] 
     1347    for app in get_apps(): 
     1348        # Some apps (e.g. databrowse) have no models 
     1349        if app.models_module: 
     1350            app_fixtures.append(os.path.join(os.path.dirname( 
     1351                                app.models_module.__file__),'fixtures')) 
    13441352    for fixture_label in fixture_labels: 
    13451353        parts = fixture_label.split('.') 
    13461354        if len(parts) == 1: 
     
    13921400                                obj.save() 
    13931401                            label_found = True 
    13941402                        except Exception, e: 
     1403                            logger.exception("Problem installing fixture '%s': %s\n" % 
     1404                                     (full_path, str(e))) 
    13951405                            fixture.close() 
    13961406                            sys.stderr.write( 
    13971407                                style.ERROR("Problem installing fixture '%s': %s\n" % 
     
    16231633        from django.db import models 
    16241634        validate(silent_success=True) 
    16251635        try: 
    1626             mod_list = [models.get_app(app_label) for app_label in args[1:]] 
     1636            app_list = [models.get_app(app_label) for app_label in args[1:]] 
    16271637        except ImportError, e: 
    16281638            sys.stderr.write(style.ERROR("Error: %s. Are you sure your INSTALLED_APPS setting is correct?\n" % e)) 
    16291639            sys.exit(1) 
    1630         if not mod_list: 
     1640        if not app_list: 
    16311641            parser.print_usage_and_exit() 
    16321642        if action not in NO_SQL_TRANSACTION: 
    16331643            print style.SQL_KEYWORD("BEGIN;") 
    1634         for mod in mod_list: 
     1644        for app in app_list: 
    16351645            if action == 'reset': 
    1636                 output = action_mapping[action](mod, options.interactive) 
     1646                output = action_mapping[action](app, options.interactive) 
    16371647            else: 
    1638                 output = action_mapping[action](mod
     1648                output = action_mapping[action](app
    16391649            if output: 
    16401650                print '\n'.join(output) 
    16411651        if action not in NO_SQL_TRANSACTION: 
  • django/templatetags/__init__.py

    old new  
    1 from django.conf import settings 
     1from django.conf import settings, get_installed_app_paths 
    22 
    3 for a in settings.INSTALLED_APPS
     3for a in get_installed_app_paths()
    44    try: 
    55        __path__.extend(__import__(a + '.templatetags', {}, {}, ['']).__path__) 
    66    except ImportError: 
  • django/views/i18n.py

    old new  
    11from django import http 
    22from django.utils.translation import check_for_language, activate, to_locale, get_language 
    33from django.utils.text import javascript_quote 
    4 from django.conf import settings 
     4from django.conf import settings, get_installed_app_paths 
    55import os 
    66import gettext as gettext_module 
    77 
     
    104104        packages = ['django.conf'] 
    105105    if type(packages) in (str, unicode): 
    106106        packages = packages.split('+') 
    107     packages = [p for p in packages if p == 'django.conf' or p in settings.INSTALLED_APPS
     107    packages = [p for p in packages if p == 'django.conf' or p in get_installed_app_paths()
    108108    default_locale = to_locale(settings.LANGUAGE_CODE) 
    109109    locale = to_locale(get_language()) 
    110110    t = {} 
  • django/contrib/sites/management.py

    old new  
    33""" 
    44 
    55from django.dispatch import dispatcher 
    6 from django.db.models import signals 
     6from django.db.models import signals, find_app 
    77from django.contrib.sites.models import Site 
    8 from django.contrib.sites import models as site_app 
    98 
    109def create_default_site(app, created_models, verbosity): 
    1110    if Site in created_models: 
     
    1413        s = Site(domain="example.com", name="example.com") 
    1514        s.save() 
    1615 
    17 dispatcher.connect(create_default_site, sender=site_app, signal=signals.post_syncdb) 
     16dispatcher.connect(create_default_site, sender=find_app('django.contrib.sites'), signal=signals.post_syncdb) 
  • django/contrib/admin/templatetags/adminapplist.py

    old new  
    1818            app_models = get_models(app) 
    1919            if not app_models: 
    2020                continue 
    21             app_label = app_models[0]._meta.app_label 
     21            app_label = app.label 
    2222 
    2323            has_module_perms = user.has_module_perms(app_label) 
    2424 
     
    4949                    model_list = [x for key, x in decorated] 
    5050 
    5151                    app_list.append({ 
    52                         'name': app_label.title(), 
     52                        'name': _(app.verbose_name).title(), 
    5353                        'has_module_perms': has_module_perms, 
    5454                        'models': model_list, 
    5555                    }) 
  • django/contrib/admin/views/doc.py

    old new  
    159159 
    160160    # Get the model class. 
    161161    try: 
    162         app_mod = models.get_app(app_label) 
     162        app = models.get_app(app_label) 
    163163    except ImproperlyConfigured: 
    164164        raise Http404, _("App %r not found") % app_label 
    165165    model = None 
    166     for m in models.get_models(app_mod): 
     166    for m in models.get_models(app): 
    167167        if m._meta.object_name.lower() == model_name: 
    168168            model = m 
    169169            break 
  • django/contrib/auth/management.py

    old new  
    33""" 
    44 
    55from django.dispatch import dispatcher 
    6 from django.db.models import get_models, signals 
    7 from django.contrib.auth import models as auth_app 
     6from django.db.models import get_models, signals, find_app 
    87 
    98def _get_permission_codename(action, opts): 
    109    return '%s_%s' % (action, opts.object_name.lower()) 
     
    4645            break 
    4746 
    4847dispatcher.connect(create_permissions, signal=signals.post_syncdb) 
    49 dispatcher.connect(create_superuser, sender=auth_app, signal=signals.post_syncdb) 
     48dispatcher.connect(create_superuser, sender=find_app('django.contrib.auth'), signal=signals.post_syncdb) 
  • django/utils/translation/trans_real.py

    old new  
    107107    if t is not None: 
    108108        return t 
    109109 
    110     from django.conf import settings 
     110    from django.conf import settings, get_installed_app_paths 
    111111 
    112112    # set up the right translation class 
    113113    klass = DjangoTranslation 
     
    160160        if projectpath and os.path.isdir(projectpath): 
    161161            res = _merge(projectpath) 
    162162 
    163         for appname in settings.INSTALLED_APPS
     163        for appname in get_installed_app_paths()
    164164            p = appname.rfind('.') 
    165165            if p >= 0: 
    166166                app = getattr(__import__(appname[:p], {}, {}, [appname[p+1:]]), appname[p+1:]) 
  • django/bin/make-messages.py

    old new  
    129129                print "errors happened while running msguniq" 
    130130                print errors 
    131131                sys.exit(8) 
     132            # Try importing the local settings. This will work if you're 
     133            # in the project directory 
     134            sys.path.insert(0, '.') 
     135            try: 
     136                import settings 
     137                apps = settings.INSTALLED_APPS 
     138            except (ImportError, AttributeError): 
     139                apps = [] 
     140            del sys.path[0] 
     141            # Now look for all applications which have a verbose name 
     142            # which is different from the default. If different, add 
     143            # an internationalization string. 
     144            for app in apps: 
     145                if (not isinstance(app, basestring)) and (app.verbose_name != app.path.split('.')[-1]): 
     146                    s = '\nmsgid "%s"\nmsgstr ""\n' % app.verbose_name 
     147                    msgs += s 
    132148            open(potfile, 'w').write(msgs) 
    133149            if os.path.exists(pofile): 
    134150                (stdin, stdout, stderr) = os.popen3('msgmerge -q "%s" "%s"' % (pofile, potfile), 'b') 
  • django/template/loaders/app_directories.py

    old new  
    11# Wrapper for loading templates from "template" directories in installed app packages. 
    22 
    3 from django.conf import settings 
     3from django.conf import settings, get_installed_app_paths 
    44from django.core.exceptions import ImproperlyConfigured 
    55from django.template import TemplateDoesNotExist 
    66import os 
    77 
    88# At compile time, cache the directories to search. 
    99app_template_dirs = [] 
    10 for app in settings.INSTALLED_APPS
     10for app in get_installed_app_paths()
    1111    i = app.rfind('.') 
    1212    if i == -1: 
    1313        m, a = app, None 
  • django/template/loaders/eggs.py

    old new  
    66    resource_string = None 
    77 
    88from django.template import TemplateDoesNotExist 
    9 from django.conf import settings 
     9from django.conf import settings, get_installed_app_paths 
    1010 
    1111def load_template_source(template_name, template_dirs=None): 
    1212    """ 
     
    1616    """ 
    1717    if resource_string is not None: 
    1818        pkg_name = 'templates/' + template_name 
    19         for app in settings.INSTALLED_APPS
     19        for app in get_installed_app_paths()
    2020            try: 
    2121                return (resource_string(app, pkg_name), 'egg:%s:%s ' % (app, pkg_name)) 
    2222            except: 
  • tests/runtests.py

    old new  
    22 
    33import os, sys, traceback 
    44import unittest 
     5from django.conf import app, get_installed_app_paths 
    56 
    67import django.contrib as contrib 
    78CONTRIB_DIR_NAME = 'django.contrib' 
     
    1718 
    1819ALWAYS_INSTALLED_APPS = [ 
    1920    'django.contrib.contenttypes', 
    20     'django.contrib.auth', 
     21    #We need to use the same app label, otherwise fixtures will break... 
     22    app('django.contrib.auth', 'auth', 'Authentication'), 
    2123    'django.contrib.sites', 
    2224    'django.contrib.flatpages', 
    2325    'django.contrib.redirects', 
     
    5254 
    5355    def runTest(self): 
    5456        from django.core import management 
    55         from django.db.models.loading import load_app 
     57        from django.db.models.loading import load_app, find_app 
    5658        from cStringIO import StringIO 
    5759 
    5860        try: 
    5961            module = load_app(self.model_label) 
    6062        except Exception, e: 
    61             self.fail('Unable to load invalid model module'
     63            self.fail('Unable to load invalid application %s: %s' % (self.model_label, e)
    6264 
    6365        s = StringIO() 
    64         count = management.get_validation_errors(s, module
     66        count = management.get_validation_errors(s, find_app(self.model_label)
    6567        s.seek(0) 
    6668        error_log = s.read() 
    6769        actual = error_log.split('\n') 
     
    114116                    print "Importing model %s" % model_name 
    115117                mod = load_app(model_label) 
    116118                if mod: 
    117                     if model_label not in settings.INSTALLED_APPS
     119                    if model_label not in get_installed_app_paths()
    118120                        settings.INSTALLED_APPS.append(model_label) 
    119121                    test_models.append(mod) 
    120122        except Exception, e: 
  • docs/settings.txt

    old new  
    469469 
    470470Default: ``()`` (Empty tuple) 
    471471 
    472 A tuple of strings designating all applications that are enabled in this Django 
    473 installation. Each string should be a full Python path to a Python package that 
    474 contains a Django application, as created by `django-admin.py startapp`_. 
     472A tuple of entries designating all applications that are enabled in this Django 
     473installation. Each entry should be one of the following: 
     474 
     475    * A string which is a full Python path to a Python package that contains a 
     476      Django application, as created by `django-admin.py startapp`_. 
     477    * A string which is a full Python path to a Python package which contains 
     478      multiple applications, with an appended ``.*``. This entry is replaced 
     479      by entries for the contained applications. For example, a wildcard 
     480      entry of the form ``django.contrib.*`` would be replaced by 
     481      multiple entries for ``django.contrib.admin``, ``django.contrib.auth`` 
     482      etc. 
     483    * An ``app`` configuration directive (to use it, you need to add 
     484      ``from django.conf import app`` to your ``settings`` file). This takes 
     485      the form ``app(path, label=None, verbose_name=None)``. The ``path`` 
     486      argument must specify the full Python path to a Python package that 
     487      contains a Django application. The ``label`` argument, if specified, 
     488      provides a unique application label (used to disambiguate different 
     489      third-party applications with conflicting default label values). If this 
     490      value is not specified, the last portion of the application path is used 
     491      as the default label. The ``verbose_name`` argument, if specified, is 
     492      used to provide a descriptive name for the application in the admin 
     493      screens. If this value is not specified, the last portion of the 
     494      application path is used as the default value. 
    475495 
    476496.. _django-admin.py startapp: ../django-admin/#startapp-appname 
    477497