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

« back to all changes in this revision

Viewing changes to django/contrib/sites/managers.py

  • Committer: Package Import Robot
  • Author(s): Raphaël Hertzog
  • Date: 2014-09-17 14:15:11 UTC
  • mfrom: (1.3.17) (6.2.18 experimental)
  • Revision ID: package-import@ubuntu.com-20140917141511-icneokthe9ww5sk4
Tags: 1.7-2
* Release to unstable.
* Add a migrate-south sample script to help users apply their South
  migrations. Thanks to Brian May.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# -*- coding: utf-8 -*-
 
2
from __future__ import unicode_literals
 
3
 
1
4
from django.conf import settings
 
5
from django.core import checks
2
6
from django.db import models
3
7
from django.db.models.fields import FieldDoesNotExist
4
8
 
 
9
 
5
10
class CurrentSiteManager(models.Manager):
6
11
    "Use this to limit objects to those associated with the current site."
 
12
 
7
13
    def __init__(self, field_name=None):
8
14
        super(CurrentSiteManager, self).__init__()
9
15
        self.__field_name = field_name
10
 
        self.__is_validated = False
11
 
        
12
 
    def _validate_field_name(self):
13
 
        field_names = self.model._meta.get_all_field_names()
14
 
        
15
 
        # If a custom name is provided, make sure the field exists on the model
16
 
        if self.__field_name is not None and self.__field_name not in field_names:
17
 
            raise ValueError("%s couldn't find a field named %s in %s." % \
18
 
                (self.__class__.__name__, self.__field_name, self.model._meta.object_name))
19
 
        
20
 
        # Otherwise, see if there is a field called either 'site' or 'sites'
21
 
        else:
22
 
            for potential_name in ['site', 'sites']:
23
 
                if potential_name in field_names:
24
 
                    self.__field_name = potential_name
25
 
                    self.__is_validated = True
26
 
                    break
27
 
        
28
 
        # Now do a type check on the field (FK or M2M only)
 
16
 
 
17
    def check(self, **kwargs):
 
18
        errors = super(CurrentSiteManager, self).check(**kwargs)
 
19
        errors.extend(self._check_field_name())
 
20
        return errors
 
21
 
 
22
    def _check_field_name(self):
 
23
        field_name = self._get_field_name()
29
24
        try:
30
 
            field = self.model._meta.get_field(self.__field_name)
31
 
            if not isinstance(field, (models.ForeignKey, models.ManyToManyField)):
32
 
                raise TypeError("%s must be a ForeignKey or ManyToManyField." %self.__field_name)
 
25
            field = self.model._meta.get_field(field_name)
33
26
        except FieldDoesNotExist:
34
 
            raise ValueError("%s couldn't find a field named %s in %s." % \
35
 
                    (self.__class__.__name__, self.__field_name, self.model._meta.object_name))
36
 
        self.__is_validated = True
37
 
    
 
27
            return [
 
28
                checks.Error(
 
29
                    "CurrentSiteManager could not find a field named '%s'." % field_name,
 
30
                    hint=None,
 
31
                    obj=self,
 
32
                    id='sites.E001',
 
33
                )
 
34
            ]
 
35
 
 
36
        if not isinstance(field, (models.ForeignKey, models.ManyToManyField)):
 
37
            return [
 
38
                checks.Error(
 
39
                    "CurrentSiteManager cannot use '%s.%s' as it is not a ForeignKey or ManyToManyField." % (
 
40
                        self.model._meta.object_name, field_name
 
41
                    ),
 
42
                    hint=None,
 
43
                    obj=self,
 
44
                    id='sites.E002',
 
45
                )
 
46
            ]
 
47
 
 
48
        return []
 
49
 
 
50
    def _get_field_name(self):
 
51
        """ Return self.__field_name or 'site' or 'sites'. """
 
52
 
 
53
        if not self.__field_name:
 
54
            try:
 
55
                self.model._meta.get_field('site')
 
56
            except FieldDoesNotExist:
 
57
                self.__field_name = 'sites'
 
58
            else:
 
59
                self.__field_name = 'site'
 
60
        return self.__field_name
 
61
 
38
62
    def get_queryset(self):
39
 
        if not self.__is_validated:
40
 
            self._validate_field_name()
41
 
        return super(CurrentSiteManager, self).get_queryset().filter(**{self.__field_name + '__id__exact': settings.SITE_ID})
 
63
        return super(CurrentSiteManager, self).get_queryset().filter(
 
64
            **{self._get_field_name() + '__id': settings.SITE_ID})