mirror of
				https://github.com/django/django.git
				synced 2025-10-31 09:41:08 +00:00 
			
		
		
		
	This is the result of Christopher Medrela's 2013 Summer of Code project. Thanks also to Preston Holmes, Tim Graham, Anssi Kääriäinen, Florian Apolloner, and Alex Gaynor for review notes along the way. Also: Fixes #8579, fixes #3055, fixes #19844.
		
			
				
	
	
		
			67 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			67 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| # -*- coding: utf-8 -*-
 | |
| from __future__ import unicode_literals
 | |
| 
 | |
| from django.conf import settings
 | |
| from django.core import checks
 | |
| from django.db import models
 | |
| from django.db.models.fields import FieldDoesNotExist
 | |
| 
 | |
| 
 | |
| class CurrentSiteManager(models.Manager):
 | |
|     "Use this to limit objects to those associated with the current site."
 | |
| 
 | |
|     def __init__(self, field_name=None):
 | |
|         super(CurrentSiteManager, self).__init__()
 | |
|         self.__field_name = field_name
 | |
| 
 | |
|     def check(self, **kwargs):
 | |
|         errors = super(CurrentSiteManager, self).check(**kwargs)
 | |
|         errors.extend(self._check_field_name())
 | |
|         return errors
 | |
| 
 | |
|     def _check_field_name(self):
 | |
|         field_name = self._get_field_name()
 | |
|         try:
 | |
|             field = self.model._meta.get_field(field_name)
 | |
|         except FieldDoesNotExist:
 | |
|             return [
 | |
|                 checks.Error(
 | |
|                     "CurrentSiteManager could not find a field named '%s'." % field_name,
 | |
|                     hint=('Ensure that you did not misspell the field name. '
 | |
|                          'Does the field exist?'),
 | |
|                     obj=self,
 | |
|                     id='sites.E001',
 | |
|                 )
 | |
|             ]
 | |
| 
 | |
|         if not isinstance(field, (models.ForeignKey, models.ManyToManyField)):
 | |
|             return [
 | |
|                 checks.Error(
 | |
|                     "CurrentSiteManager requires that '%s.%s' must be a "
 | |
|                     "ForeignKey or ManyToManyField." % (
 | |
|                         self.model._meta.object_name, field_name
 | |
|                     ),
 | |
|                     hint=None,
 | |
|                     obj=self,
 | |
|                     id='sites.E002',
 | |
|                 )
 | |
|             ]
 | |
| 
 | |
|         return []
 | |
| 
 | |
|     def _get_field_name(self):
 | |
|         """ Return self.__field_name or 'site' or 'sites'. """
 | |
| 
 | |
|         if not self.__field_name:
 | |
|             try:
 | |
|                 self.model._meta.get_field('site')
 | |
|             except FieldDoesNotExist:
 | |
|                 self.__field_name = 'sites'
 | |
|             else:
 | |
|                 self.__field_name = 'site'
 | |
|         return self.__field_name
 | |
| 
 | |
|     def get_queryset(self):
 | |
|         return super(CurrentSiteManager, self).get_queryset().filter(
 | |
|             **{self._get_field_name() + '__id': settings.SITE_ID})
 |