def get_site_id(site):
from django.contrib.sites.models import Site
if isinstance(site, Site):
return site.id
try:
return int(site)
except (TypeError, ValueError):
pass
return settings.SITE_ID
python类Site()的实例源码
def assign_user_to_page(page, user, grant_on=ACCESS_PAGE_AND_DESCENDANTS,
can_add=False, can_change=False, can_delete=False,
can_change_advanced_settings=False, can_publish=False,
can_change_permissions=False, can_move_page=False,
can_recover_page=True, can_view=False,
grant_all=False, global_permission=False):
"""
Assigns given user to page, and gives him requested permissions.
See docs/extending_cms/api_reference.rst for more info
"""
grant_all = grant_all and not global_permission
data = {
'can_add': can_add or grant_all,
'can_change': can_change or grant_all,
'can_delete': can_delete or grant_all,
'can_change_advanced_settings': can_change_advanced_settings or grant_all,
'can_publish': can_publish or grant_all,
'can_change_permissions': can_change_permissions or grant_all,
'can_move_page': can_move_page or grant_all,
'can_view': can_view or grant_all,
}
page_permission = PagePermission(page=page, user=user,
grant_on=grant_on, **data)
page_permission.save()
if global_permission:
page_permission = GlobalPagePermission(
user=user, can_recover_page=can_recover_page, **data)
page_permission.save()
page_permission.sites.add(Site.objects.get_current())
return page_permission
def __init__(self, *args, **kwargs):
super(PageForm, self).__init__(*args, **kwargs)
self.fields['parent'].widget = HiddenInput()
self.fields['site'].widget = HiddenInput()
self.fields['template'].widget = HiddenInput()
self.fields['language'].widget = HiddenInput()
if not self.fields['site'].initial:
self.fields['site'].initial = Site.objects.get_current().pk
site_id = self.fields['site'].initial
languages = get_language_tuple(site_id)
self.fields['language'].choices = languages
if not self.fields['language'].initial:
self.fields['language'].initial = get_language()
if 'page_type' in self.fields:
try:
type_root = Page.objects.get(publisher_is_draft=True, reverse_id=PAGE_TYPES_ID, site=site_id)
except Page.DoesNotExist:
type_root = None
if type_root:
language = self.fields['language'].initial
type_ids = type_root.get_descendants().values_list('pk', flat=True)
titles = Title.objects.filter(page__in=type_ids, language=language)
choices = [('', '----')]
for title in titles:
choices.append((title.page_id, title.title))
self.fields['page_type'].choices = choices
def clean(self):
cleaned_data = self.cleaned_data
slug = cleaned_data.get('slug', '')
page = self.instance
lang = cleaned_data.get('language', None)
# No language, can not go further, but validation failed already
if not lang:
return cleaned_data
parent = cleaned_data.get('parent', None)
site = self.cleaned_data.get('site', Site.objects.get_current())
if parent and parent.site != site:
raise ValidationError("Site doesn't match the parent's page site")
if site and not is_valid_page_slug(page, parent, lang, slug, site):
self._errors['slug'] = ErrorList([_('Another page with this slug already exists')])
del cleaned_data['slug']
if self.instance and page.title_set.count():
#Check for titles attached to the page makes sense only because
#AdminFormsTests.test_clean_overwrite_url validates the form with when no page instance available
#Looks like just a theoretical corner case
title = page.get_title_obj(lang, fallback=False)
if title and not isinstance(title, EmptyTitle) and slug:
oldslug = title.slug
title.slug = slug
title.save()
try:
is_valid_url(title.path, page)
except ValidationError as exc:
title.slug = oldslug
title.save()
if 'slug' in cleaned_data:
del cleaned_data['slug']
if hasattr(exc, 'messages'):
errors = exc.messages
else:
errors = [force_text(exc.message)]
self._errors['slug'] = ErrorList(errors)
return cleaned_data
def setUp(self):
Site.objects.get_or_create(id=2, domain='example2.com', name='Site 2')
def create_article(
cls,
parent,
slug,
site=None,
title="Root",
article_kwargs={},
**kwargs):
"""Utility function:
Create a new urlpath with an article and a new revision for the article"""
if not site:
site = Site.objects.get_current()
article = Article(**article_kwargs)
article.add_revision(ArticleRevision(title=title, **kwargs),
save=True)
article.save()
newpath = cls.objects.create(
site=site,
parent=parent,
slug=slug,
article=article)
article.add_object_relation(newpath)
return newpath
######################################################
# SIGNAL HANDLERS
######################################################
# Just get this once
def site(self):
"""
It may seem like this should need the request but the plan is to make
a SiteBackend registry at some point... for now we will assume one site.
"""
from django.contrib.sites.models import Site
return Site.objects.get(pk=settings.SITE_ID)
def get_backend():
"""
Allow invocation of a Site elsewhere, fallback to a default Backend.
TODO: We probably want a Site-Backend Registry.
"""
global backends
if not backends:
backends.append(Backend())
return backends[0]
def test_requestsite_sitemap(self):
# Make sure hitting the flatpages sitemap without the sites framework
# installed doesn't raise an exception
Site._meta.installed = False
response = self.client.get('/simple/sitemap.xml')
expected_content = """<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url><loc>http://testserver/location/</loc><lastmod>%s</lastmod><changefreq>never</changefreq><priority>0.5</priority></url>
</urlset>
""" % date.today()
self.assertXMLEqual(response.content.decode('utf-8'), expected_content)
def test_sitemap_get_urls_no_site_1(self):
"""
Check we get ImproperlyConfigured if we don't pass a site object to
Sitemap.get_urls and no Site objects exist
"""
Site.objects.all().delete()
self.assertRaises(ImproperlyConfigured, Sitemap().get_urls)
def test_sitemap_get_urls_no_site_2(self):
"""
Check we get ImproperlyConfigured when we don't pass a site object to
Sitemap.get_urls if Site objects exists, but the sites framework is not
actually installed.
"""
Site._meta.installed = False
self.assertRaises(ImproperlyConfigured, Sitemap().get_urls)
def add_current_site(sender, instance, **kwargs):
"""
Add the current site to a model's sites property after a save. This is
required in post save because ManyToManyField fields require an existing
key.
TODO: Don't run this on *every* post_save.
"""
if hasattr(instance, 'sites'):
if not instance.sites.all():
instance.sites.set(Site.objects.filter(id=current_site_id()))
instance.save()
def save(self, *args, **kwargs):
if not self.date:
self.date = date.today()
if not self.site:
self.site = Site.objects.get(id=current_site_id())
super(Entry, self).save(*args, **kwargs)
def __str__(self):
return 'Site permissions for {}'.format(self.user)
def dump_data(self):
""" ?????????? ??????? main.Char ?? ?????? ??????? ??????? """
json_serializer = serializers.get_serializer('json')
json_dumper = json_serializer()
_models = [
(Author, 'authors'), (Book, 'book'), (Sequence, 'sequence'),
(SequenceBook, 'sequencebook'), (Genre, 'genre'),
(Language, 'language'), (Translator, 'translator'), (Char, 'char'),
(MenuItem, 'menuitem'), (Publisher, 'publisher'), (Site, 'site')
]
for model, name in _models:
with open('%s.json' % name, 'w') as out:
json_dumper.serialize(model.objects.all(), stream=out)
def get_view_url(self):
absolute_url = reverse('crm_view_entity', args=[self.id])
try:
return "//" + Site.objects.get_current().domain + absolute_url
except Site.objects.DoesNotExist:
return absolute_url
def get_view_url(self):
if self.entity.is_single_contact:
absolute_url = reverse('crm_view_entity', args=[self.entity.id])
else:
absolute_url = reverse('crm_view_contact', args=[self.id])
try:
return "//" + Site.objects.get_current().domain + absolute_url
except Site.objects.DoesNotExist:
return absolute_url
def mail_to(self):
"""returns a mailto link"""
unique_emails = sorted(list(set(
[
contact.get_email_address() for contact in self.contacts.all() if contact.get_email
] + [
entity.get_email_address() for entity in self.entities.all() if entity.email
]
)))
if not unique_emails:
return u""
body = u""
if self.uuid and hasattr(self, 'sale'):
try:
url = reverse('store_view_sales_document_public', args=[self.uuid])
body = ugettext(u"Here is a link to your {0}: {1}{2}").format(
self.type.name,
"http://" + Site.objects.get_current().domain,
url
)
except ObjectDoesNotExist:
pass
return u"mailto:{0}?subject={1}&body={2}".format(
u",".join(unique_emails),
self.type.mail_to_subject if (self.type and self.type.mail_to_subject) else self.subject,
body
)