def update_cms_page(self, title=None, content='', parent_title=None, draft=False): if not title: title = 'Untitled' from mezzanine.pages.models import Page, RichTextPage page = get_cms_page_from_title(title) in_menus = [2,3] # create the page from mezzanine.core.models import CONTENT_STATUS_PUBLISHED, CONTENT_STATUS_DRAFT if not page: parent_page = get_cms_page_from_title(parent_title) page = RichTextPage(title=title, content_model='richtextpage', parent=parent_page, content=content, status=CONTENT_STATUS_PUBLISHED) page.save() page.status = CONTENT_STATUS_DRAFT if draft else CONTENT_STATUS_PUBLISHED page.in_menus = in_menus else: # Can't find an easy way to edit page.richtextpage.content, so let's write directly to the DB! from django.db import connection cursor = connection.cursor() cursor.execute('''update pages_richtextpage set content = %s where page_ptr_id = %s''', [content, page.id]) page.save() return page
def test_draft_page(self): # body should have classes "richtextpage draft" page = RichTextPage(title="my draft page", status=CONTENT_STATUS_DRAFT) page.save() request = self.factory.get(page.get_absolute_url()) request.user = AnonymousUser() response = render(request, 'pages/richtextpage.html', {'page': page}) self.assertContains(response, '<body class="richtextpage draft">')
def test_copy_default_minimal(self): """Copy all CMS models from the default site (minimal example).""" # This will be created with the default site # TODO: .create fails somehow related to django-concurrency page = RichTextPage(title='Learn', content='<h1>Title</h1>') page.save() site = Site.objects.create(name='zh-cn', domain='example.com') utils.build_site_content(site) self.assertCopied(page, site)
def test_copy_multiple_models(self): """CMS Pages, RichTextPage, Links should all be copied.""" # TODO: .create fails somehow related to django-concurrency page = RichTextPage(title='Learn', content='<h1>Title</h1>') page.save() link = Link.objects.create(title='External Link') site = Site.objects.create(name='zh-cn', domain='example.com') utils.build_site_content(site) self.assertCopied(page, site) self.assertCopied(link, site)
def test_nested_pages(self): """Page hierarchy should be preserved on copy.""" # TODO: .create fails somehow related to django-concurrency page = RichTextPage(title='Learn', content='<h1>Title</h1>') page.save() subpage = RichTextPage(title='Sub Learn', content='<h1>Title</h1>', parent=page) subpage.save() site = Site.objects.create(name='zh-cn', domain='example.com') utils.build_site_content(site) self.assertCopied(page, site) self.assertCopied(subpage, site) copy = QuerySet(RichTextPage).get(slug=page.slug, site=site) subcopy = QuerySet(RichTextPage).get(slug=subpage.slug, site=site) self.assertEqual(subcopy.parent_id, copy.pk)
def test_nested_forms_links(self): """Page hierarchy for forms and links should be preserved on copy.""" # TODO: .create fails somehow related to django-concurrency page = RichTextPage(title='Learn', content='<h1>Title</h1>') page.save() form = Form(title='Contact Us', parent=page) form.save() link = Link(title='Foo', parent=page) link.save() site = Site.objects.create(name='zh-cn', domain='example.com') utils.build_site_content(site) self.assertCopied(page, site) self.assertCopied(form, site) self.assertCopied(link, site) copy = QuerySet(RichTextPage).get(slug=page.slug, site=site) formcopy = QuerySet(Form).get(slug=form.slug, site=site) linkcopy = QuerySet(Link).get(slug=link.slug, site=site) self.assertEqual(formcopy.parent_id, copy.pk) self.assertEqual(linkcopy.parent_id, copy.pk)
def test_update_site(self): from django.conf import settings from mezzanine.utils.sites import current_site_id # setup try: old_site_id = settings.SITE_ID except: old_site_id = None site1 = Site.objects.create(domain="site1.com") site2 = Site.objects.create(domain="site2.com") # default behaviour, page gets assigned current site settings.SITE_ID = site2.pk self.assertEqual(settings.SITE_ID, current_site_id()) page = RichTextPage() page.save() self.assertEqual(page.site_id, site2.pk) # Subsequent saves do not update site to current site page.site = site1 page.save() self.assertEqual(page.site_id, site1.pk) # resave w/ update_site=True, page gets assigned current site settings.SITE_ID = site1.pk page.site = site2 page.save(update_site=True) self.assertEqual(page.site_id, site1.pk) # resave w/ update_site=False, page does not update site settings.SITE_ID = site2.pk page.save(update_site=False) self.assertEqual(page.site_id, site1.pk) # When update_site=True, new page gets assigned current site settings.SITE_ID = site2.pk page = RichTextPage() page.site = site1 page.save(update_site=True) self.assertEqual(page.site_id, site2.pk) # When update_site=False, new page keeps current site settings.SITE_ID = site2.pk page = RichTextPage() page.site = site1 page.save(update_site=False) self.assertEqual(page.site_id, site1.pk) # When site explicitly assigned, new page keeps assigned site settings.SITE_ID = site2.pk page = RichTextPage() page.site = site1 page.save() self.assertEqual(page.site_id, site1.pk) # tear down if old_site_id: settings.SITE_ID = old_site_id else: del settings.SITE_ID site1.delete() site2.delete()
def test_upcoming(self): # no upcoming events - should not error response = self.client.get(reverse('event:upcoming')) assert response.status_code == 200 self.assertContains(response, "Next semester's events are being scheduled") self.assertContains(response, "Check back later") self.assertContains( response, reverse('event:by-semester', args=['fall', '2017'])) # use django timezone util for timezone-aware datetime tomorrow = timezone.now() + timedelta(days=1) event_type = EventType.objects.first() next_event = Event.objects.create(start_time=tomorrow, end_time=tomorrow, slug='some-workshop', event_type=event_type, title='A workshop') today = timezone.now() earlier_today = datetime(today.year, today.month, today.day, tzinfo=timezone.get_default_timezone()) earlier_event = Event.objects.create(start_time=earlier_today, end_time=earlier_today + timedelta(hours=1), slug='another-workshop', event_type=event_type, title='Earlier workshop') response = self.client.get(reverse('event:upcoming')) assert next_event in response.context['events'] assert earlier_event in response.context['events'] # summary fields that should be in list view self.assertContains(response, next_event.title) self.assertContains(response, next_event.get_absolute_url()) # (not testing all fields) # should not include past events past_event = Event.objects.filter(end_time__lte=today).first() assert past_event not in response.context['events'] # should include recent events assert past_event in response.context['past'] self.assertContains(response, 'Past Events') self.assertContains(response, past_event.title) self.assertContains(response, past_event.get_absolute_url()) # should include all semesters and years represented in events date_list = response.context['date_list'] assert ('Fall', 2016) in date_list assert ('Spring', 2017) in date_list assert ('Fall', 2017) in date_list # should link to events by semester for semester, year in date_list: self.assertContains( response, reverse('event:by-semester', args=[semester.lower(), year])) # last modified header should be set on response assert response.has_header('last-modified') modified = Event.objects.upcoming().order_by('updated').first().updated modified = modified.strftime('%a, %d %b %Y %H:%M:%S GMT') assert response['Last-Modified'] == modified # and should return 304 not modified when header is present response = self.client.get(reverse('event:upcoming'), HTTP_IF_MODIFIED_SINCE=modified) assert response.status_code == 304 # no upcoming events OR past events Event.objects.all().delete() response = self.client.get(reverse('event:upcoming')) assert response.status_code == 200 self.assertContains(response, "Next semester's events are being scheduled") self.assertContains(response, "Check back later.") # should include blurb if there is a matching page in hierarchy page = RichTextPage(title='Events') # should have slug 'events' page.content = 'An event blurb' page.save() response = self.client.get(reverse('event:upcoming')) self.assertContains(response, 'An event blurb') # should skip blurb if content is empty page.content = '<p> </p>' page.save() response = self.client.get(reverse('event:upcoming')) self.assertNotContains(response, '  ')