~ubuntu-branches/debian/sid/python-django/sid

« back to all changes in this revision

Viewing changes to django/db/models/related.py

  • Committer: Package Import Robot
  • Author(s): Luke Faraone
  • Date: 2013-11-07 15:33:49 UTC
  • mfrom: (1.3.12)
  • Revision ID: package-import@ubuntu.com-20131107153349-e31sc149l2szs3jb
Tags: 1.6-1
* New upstream version. Closes: #557474, #724637.
* python-django now also suggests the installation of ipython,
  bpython, python-django-doc, and libgdal1.
  Closes: #636511, #686333, #704203
* Set package maintainer to Debian Python Modules Team.
* Bump standards version to 3.9.5, no changes needed.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
from collections import namedtuple
 
2
 
1
3
from django.utils.encoding import smart_text
2
4
from django.db.models.fields import BLANK_CHOICE_DASH
3
5
 
4
 
class BoundRelatedObject(object):
5
 
    def __init__(self, related_object, field_mapping, original):
6
 
        self.relation = related_object
7
 
        self.field_mappings = field_mapping[related_object.name]
8
 
 
9
 
    def template_name(self):
10
 
        raise NotImplementedError
11
 
 
12
 
    def __repr__(self):
13
 
        return repr(self.__dict__)
 
6
# PathInfo is used when converting lookups (fk__somecol). The contents
 
7
# describe the relation in Model terms (model Options and Fields for both
 
8
# sides of the relation. The join_field is the field backing the relation.
 
9
PathInfo = namedtuple('PathInfo',
 
10
                      'from_opts to_opts target_fields join_field '
 
11
                      'm2m direct')
14
12
 
15
13
class RelatedObject(object):
16
14
    def __init__(self, parent_model, model, field):
18
16
        self.model = model
19
17
        self.opts = model._meta
20
18
        self.field = field
21
 
        self.name = '%s:%s' % (self.opts.app_label, self.opts.module_name)
22
 
        self.var_name = self.opts.object_name.lower()
 
19
        self.name = '%s:%s' % (self.opts.app_label, self.opts.model_name)
 
20
        self.var_name = self.opts.model_name
23
21
 
24
22
    def get_choices(self, include_blank=True, blank_choice=BLANK_CHOICE_DASH,
25
23
                    limit_to_currently_related=False):
29
27
        Analogue of django.db.models.fields.Field.get_choices, provided
30
28
        initially for utilisation by RelatedFieldListFilter.
31
29
        """
32
 
        first_choice = include_blank and blank_choice or []
 
30
        first_choice = blank_choice if include_blank else []
33
31
        queryset = self.model._default_manager.all()
34
32
        if limit_to_currently_related:
35
33
            queryset = queryset.complex_filter(
36
 
                {'%s__isnull' % self.parent_model._meta.module_name: False})
 
34
                {'%s__isnull' % self.parent_model._meta.model_name: False})
37
35
        lst = [(x._get_pk_val(), smart_text(x)) for x in queryset]
38
36
        return first_choice + lst
39
37
 
49
47
    def __repr__(self):
50
48
        return "<RelatedObject: %s related to %s>" % (self.name, self.field.name)
51
49
 
52
 
    def bind(self, field_mapping, original, bound_related_object_class=BoundRelatedObject):
53
 
        return bound_related_object_class(self, field_mapping, original)
54
 
 
55
50
    def get_accessor_name(self):
56
51
        # This method encapsulates the logic that decides what name to give an
57
52
        # accessor descriptor that retrieves related many-to-one or
61
56
            # If this is a symmetrical m2m relation on self, there is no reverse accessor.
62
57
            if getattr(self.field.rel, 'symmetrical', False) and self.model == self.parent_model:
63
58
                return None
64
 
            return self.field.rel.related_name or (self.opts.object_name.lower() + '_set')
 
59
            return self.field.rel.related_name or (self.opts.model_name + '_set')
65
60
        else:
66
 
            return self.field.rel.related_name or (self.opts.object_name.lower())
 
61
            return self.field.rel.related_name or (self.opts.model_name)
67
62
 
68
63
    def get_cache_name(self):
69
64
        return "_%s_cache" % self.get_accessor_name()
 
65
 
 
66
    def get_path_info(self):
 
67
        return self.field.get_reverse_path_info()