def get_or_create_root(self): """ Creates the root node used to store all page types for the current site if it doesn't exist. """ root_page = PageType.get_root_page(site=self._site) if not root_page: root_page = Page( publisher_is_draft=True, in_navigation=False, is_page_type=True, ) root_page.set_tree_node(self._site) root_page.save() if not root_page.has_translation(self._language): api.create_title( language=self._language, title=ugettext('Page Types'), page=root_page, slug=PAGE_TYPES_ID, path=PAGE_TYPES_ID, ) return root_page.node
def setUp(self): self.client = Client() try: Page.objects.get(name='home') except Page.DoesNotExist: home = Page(name='home', title='home') home.save()
def page_create(request, page_id=None): if page_id: page = get_object_or_404(Page, pk=page_id) else: page = Page() if request.method == 'POST': form = PageForm(request.POST, instance=page) serial = MakeRndCode() serialCd = serial.mkrnd() if form.is_valid(): page = form.save(commit=False) page.serialcd = serialCd #response = HttpResponse('test') response = redirect('cms:member_list') response['location'] += '?S=' + serialCd + '&case=1' #response.set_cookie('serial_cd', serialCd) page.save() #return redirect('cms:member_list') #return render(request, 'cms/member_list.html') return response else: form = PageForm(instance=page) #初回きた時はGetなので、そのままindexを渡す #POSTでリクエストがきたら、Saveして、メンバーリストに飛ばす #ここからはクッキーでIDを渡す #DBにはPageIDを持つ return render(request, 'cms/index.html', dict(form=form))
def test_empty_menu_tags_template(self): templ_menu = Template.objects.create(name='menu') templ_menu.content = """ {% load menu_tags %} <html> <head> </head> <body> {% show_menu %} {% show_sub_menu 1 %} {% show_menu_below_id "meta" %} {% show_breadcrumb %} </body> </html> """ templ_menu.save() s = Site.objects.get(id=1) p = Page(template="menu", site=s) p.save() url = self._site_url() response = self.client.post(url, {'name': s.name, 'domain': s.domain, 'templates': [templ_menu.id]}) self.assertEquals(response.status_code, 302)
def create_page(self, parent_page=None, user=None, position="last-child", title=None, site=1, published=False, in_navigation=False, moderate=False, language=None, title_extra=None, **extra): """ Common way for page creation with some checks """ _thread_locals.user = user if not language: language = settings.LANGUAGES[0][0] if settings.CMS_SITE_LANGUAGES.get(site, False): language = settings.CMS_SITE_LANGUAGES[site][0] site = Site.objects.get(pk=site) page_data = { 'site': site, 'template': 'nav_playground.html', 'published': published, 'in_navigation': in_navigation, } if user: page_data['created_by'] = user page_data['changed_by'] = user if parent_page: page_data['parent'] = parent_page page_data.update(extra) page = Page(**page_data) if parent_page: page.insert_at(self.reload(parent_page), position) page.save() if settings.CMS_MODERATOR and user: page.pagemoderator_set.create(user=user) if not title: title = 'test page %d' % self.counter slug = 'test-page-%d' % self.counter else: slug = slugify(title) self.counter = self.counter + 1 if not title_extra: title_extra = {} self.create_title( title=title, slug=slug, language=language, page=page, **title_extra) del _thread_locals.user return page
def create_page(self, parent_page=None, user=None, position="last-child", title=None, site=1, published=False, in_navigation=False, moderate=False, language=None, title_extra=None, **extra): """ Common way for page creation with some checks """ _thread_locals.user = user if not language: language = settings.LANGUAGES[0][0] if settings.CMS_SITE_LANGUAGES.get(site, False): language = settings.CMS_SITE_LANGUAGES[site][0] site = Site.objects.get(pk=site) page_data = { 'site': site, 'template': 'nav_playground.html', 'published': published, 'in_navigation': in_navigation, } if user: page_data['created_by'] = user page_data['changed_by'] = user if parent_page: page_data['parent'] = parent_page page_data.update(extra) page = Page(**page_data) if parent_page: page.insert_at(self.reload(parent_page), position) page.save() if settings.CMS_MODERATOR and user: page.pagemoderator_set.create(user=user) if not title: title = 'test page %d' % self.counter slug = 'test-page-%d' % self.counter else: slug = slugify(title) self.counter = self.counter + 1 if not title_extra: title_extra = {} self.create_title(title=title, slug=slug, language=language, page=page, **title_extra) del _thread_locals.user return page
def add_tree(self, count, root=None, depth=1): CMS_GTE_35 = hasattr(Page, 'node') for node in range(0, count): new_page = Page( created_by='script', changed_by='script', in_navigation=True, template='INHERIT', ) if CMS_GTE_35: parent_node = root.node if root else None new_page.set_tree_node(site=self.site, target=parent_node, position='last-child') new_page.save() else: new_page.site = self.site new_page.parent_id = getattr(root, 'pk', None) # This saves the page new_page = Page.add_root(instance=new_page) if root: new_page = new_page.move(target=root.reload(), pos='last-child') try: node_path = new_page.node.path except AttributeError: node_path = new_page.path for language in self.languages: new_page.title_set.create( language=language, title=node_path, slug=node_path, path='/'.join(self.path_regex.findall(node_path)), ) new_page.update_languages(self.languages) if self.base_page: for ph in self.base_page.placeholders.all(): new_ph = new_page.placeholders.create(slot=ph.slot) for language in self.languages: plugins = ph.get_plugins_list(language) if plugins: ph.copy_plugins(new_ph, language) else: new_page.rescan_placeholders() self.stdout.write("Created page %s" % node_path) if depth <= self.max_depth and bool(random.getrandbits(1)): self.add_tree(count=self.max_count_children, root=new_page, depth=depth + 1)
def setUp(self): self.p = Page(title='A great page', name='great-page', text='A great page on a great site') self.p.save() try: Page.objects.get(name='home') except Page.DoesNotExist: home = Page(name='home', title='home') home.save()
def update(self): import feedparser from time import mktime from datetime import datetime from slugify import slugify from django.contrib.sites.models import Site from cms.models import Page, Title from cms.plugins.text.models import Text try: p_last = self.pages.latest('publication_date') except Page.DoesNotExist: p_last = None try: for e in feedparser.parse(self.url)['entries']: date = e.get('published_parsed') title = e.get('title') body = e.get('summary') url = e.get('link') if date and title and body: date = datetime.fromtimestamp(mktime(date)) if p_last and date <= p_last.publication_date: continue p=Page(site=Site.objects.all()[0], in_navigation=False, published=True, template='page-full.html') p.publication_date = date if self.parent_page: p.parent = self.parent_page p.save() self.pages.add(p) self.save() t=Title(language='en', title=title, slug='%s-%s' % (slugify(title), p.pk), page=p) t.save() pl=p.placeholders.get(slot='page') if url: body = u'%s<p><a href="%s">Lire la suite de l\'article…</a></p>' % (body, url) txt=Text(body=body, language='en', plugin_type='TextPlugin') txt.save() pl.cmsplugin_set.add(txt) pl.save() except: pass self.update_last = datetime.now() self.save()
def copy_pages(): pages = PagesPage.objects.order_by('tree_id', 'lft', ) # remove all the previous pages CMSPage.objects.all().delete() parents = {} for page in pages: cmspage = CMSPage() # replicate the language independent structure information # thanks to the common ancestor we can reuse exactly the same tree # information cmspage.pk = page.pk cmspage.creation_date = page.creation_date cmspage.publication_date = page.publication_date cmspage.publication_end_date = page.publication_end_date cmspage.changed_date = page.last_modification_date cmspage.template = 'django_' + page.template cmspage.level = page.level cmspage.lft = page.lft cmspage.rght = page.rght cmspage.tree_id = page.tree_id cmspage.site_id = 1 if page.parent_id in parents: cmspage.parent = parents[page.parent_id] cmspage.save(no_signals=True) cmspage.rescan_placeholders() parents[cmspage.pk] = cmspage # replicate the language dependent data for language in page.get_languages(): cmstitle = Title() cmstitle.language = language cmstitle.title = page.title(language) cmstitle.slug = page.slug(language) cmstitle.page = cmspage cmstitle.update_path() cmstitle.save() contents = page.content_by_language(language) for content in contents: if content.type in ('subtitle', 'text', 'right-column'): placeholder = cmspage.placeholders.get(slot=content.type) # For the main placeholders we need to scan whether content # is markdown or plain HTML # This is a very naif check, but does the trick in this # context if content.body.find('<p>') > -1: add_plugin(placeholder, plugin_type='TextPlugin', language=language, body=content.body) else: add_plugin(placeholder, plugin_type='MarkItUpPlugin', language=language, body=content.body) elif content.type not in ('slug', 'title'): # Fallback import placeholder = cmspage.placeholders.get(slot=content.type) add_plugin(placeholder, plugin_type='TextPlugin', language=language, body=content.body)
def setUp(self): settings.APPEND_SLASH = False self.site = Site.objects.get_current() page = Page() page.site = self.site page.save() page.publish() self.page = page title = Title(title="Hello world!") title.page = page title.language = u'en' title.save()
def _test_menu_tag_template(self, tag_expression): templ_menu = Template.objects.create(name='menu') templ_menu.content = "{% load menu_tags %}" + tag_expression templ_menu.save() templ_sub_menu = Template.objects.create(name='sub-menu') templ_sub_menu.content = "content" templ_sub_menu.save() s = Site.objects.get(id=1) p = Page(template="menu", site=s) p.save() self._trigger_validation_error_on_site_form( s.name, s.domain, [templ_menu.id], 'all_required', s.id)
def test_menu_and_sub_menu_tag_template(self): s = Site.objects.get(id=1) templ_menu = Template.objects.create(name='menu') templ_menu.content = "{% load menu_tags %} {% show_menu 0 100 100 100 'sub-menu' %}" templ_menu.save() templ_sub_menu = Template.objects.create(name='sub-menu') templ_sub_menu.content = "{% load menu_tags %} {% show_menu 0 100 100 100 'sub-sub-menu' %}" templ_sub_menu.save() templ_sub_menu.sites.add(s) templ_sub_sub_menu = Template.objects.create(name='sub-sub-menu') templ_sub_sub_menu.content = "content" templ_sub_sub_menu.save() p = Page(template="menu", site=s) p.save() self._trigger_validation_error_on_site_form( s.name, s.domain, [templ_menu.id, templ_sub_menu.id], 'all_required', s.id)
def new(request, site): active_site = Site.get_cached_by_id(site) if request.method != 'POST': return redirect('admin:sites.pages.page.list', active_site.id) slug = request.POST['slug'].strip().strip('/') unused_system_url = not is_system_url(slug, active_site) unused_page_slug = Page.slug_is_unique(slug, active_site) if not unused_system_url or not unused_page_slug: messages.error(request, 'slug_not_unique') return redirect('admin:sites.pages.page.new', active_site.id) page = Page( title=request.POST['title'], slug=slug, published=False, created_by=request.user, parent=Page.objects.get(id=request.POST['parent_id']), site=active_site, ) page.save() version = Version( page=page, article=None, version=1, owner=request.user, active=True, ) version.save() create_template(request.POST['template'], version) return redirect('admin:sites.pages.page.edit', active_site.id, version.id)
def insert_test_content(self): # Insert a page p = Page(site=Site.objects.get_current(), reverse_id=self.test_data['reverse_id'], template=TEMPLATE_NAME, published=True, publisher_state=1, publisher_is_draft=False) p.save() t = Title(page=p, language=settings.LANGUAGES[0][0], slug=self.test_data['slug'], title=self.test_data['title']) t.save() # Placeholders have been inserted on post_save signal: self.test_placeholders = {} for placeholder in p.placeholders.all(): self.test_placeholders[placeholder.slot] = placeholder # Insert another page that is not the home page p2 = Page(parent=p, site=Site.objects.get_current(), reverse_id=self.test_data2['reverse_id'], template=TEMPLATE_NAME, published=True, publisher_state=1, publisher_is_draft=False) p2.save() t2 = Title(page=p2, language=settings.LANGUAGES[0][0], slug=self.test_data2['slug'], title=self.test_data2['title']) t2.save() # Insert some test Text plugins pl = Text(plugin_type='TextPlugin', page=p, language=settings.LANGUAGES[0][0], placeholder=self.test_placeholders['main'], position=0, body=self.test_data['text_main']) pl.insert_at(None, commit=True) pl = Text(plugin_type='TextPlugin', page=p, language=settings.LANGUAGES[0][0], placeholder=self.test_placeholders['sub'], position=0, body=self.test_data['text_sub']) pl.insert_at(None, commit=True) # Insert another page that is not the home page p3 = Page(parent=p2, site=Site.objects.get_current(), reverse_id=self.test_data3['reverse_id'], template=TEMPLATE_NAME, published=True, publisher_state=1, publisher_is_draft=False) p3.save() t3 = Title(page=p3, language=settings.LANGUAGES[0][0], slug=self.test_data3['slug'], title=self.test_data3['title']) t3.save() # Placeholders have been inserted on post_save signal: self.test_placeholders3 = {} for placeholder in p3.placeholders.all(): self.test_placeholders3[placeholder.slot] = placeholder # # Insert some test Text plugins pl = Text(plugin_type='TextPlugin', page=p3, language=settings.LANGUAGES[0][0], placeholder=self.test_placeholders3['sub'], position=0, body=self.test_data3['text_sub']) pl.insert_at(None, commit=True) # Reload test pages self.test_page = Page.objects.get(pk=p.pk) self.test_page2 = Page.objects.get(pk=p2.pk) self.test_page3 = Page.objects.get(pk=p3.pk)
class TestPages(TestCase): fixtures = ['test-data/profile.json'] def setUp(self): self.p = Page(title='A great page', name='great-page', text='A great page on a great site') self.p.save() try: Page.objects.get(name='home') except Page.DoesNotExist: home = Page(name='home', title='home') home.save() def test_new_page(self): self.assertTrue(str(self.p)) self.p.published = True self.p.save() self.assertTrue(self.p.date_published) def test_markdown_page(self): self.assertTrue(self.p.markdown_text) self.assertFalse(self.p.markdown_sidebar) self.p.sidebar = 'hurray!' self.p.save() self.assertTrue(self.p.markdown_sidebar) def test_page_absolute_url(self): home = Page.objects.get(name='home') self.assertEqual(home.get_absolute_url(), '/home.html') def test_index(self): response = self.client.get('/index.html') self.assertEqual(response.status_code, 200) def test_home(self): response = self.client.get('/home.html') self.assertEqual(response.status_code, 200)
def test_site_has_all_templates_required(self): created = [] for t_name in ['templA', 'templB', 'templC', 'templD']: templ = Template.objects.create(name=t_name) templ.content = "content" templ.save() created.append(templ) templA, templB, templC, templD = tuple(created) templA.content = '{% extends "templB" %}' templB.content = '{% include "templC" %}' templC.content = 'content' for t_instance in [templA, templB, templC]: t_instance.save() self._trigger_validation_error_on_site_form( "siteA", "siteA.com", [templA.id], 'all_required') s = Site.objects.get(id=1) self._trigger_validation_error_on_site_form( s.name, s.domain, [templA.id], 'all_required', s.id) templC.content = '{% invalid_tag %}' templC.save() self._trigger_validation_error_on_site_form( s.name, s.domain, [templA.id], 'syntax_error', s.id) templC.content = '{% extends "NonExistent" %}' templC.save() self._trigger_validation_error_on_site_form( s.name, s.domain, [templA.id], 'required_not_exist', s.id) templC.content = 'content' templC.save() p = Page(template="templD", site=s) p.save() self._trigger_validation_error_on_site_form( s.name, s.domain, [templA.id, templB.id, templC.id], 'required_in_pages', s.id) templD.sites.clear() self._trigger_validation_error_on_site_form( s.name, s.domain, [templA.id, templB.id, templC.id], 'required_in_pages', s.id) Page.objects.filter(id=p.id).update(template='NonExistent') self._trigger_validation_error_on_site_form( s.name, s.domain, [templA.id, templB.id, templC.id], 'nonexistent_in_pages', s.id) Page.objects.filter(id=p.id).update(template='templA') templD.sites.add(s) self._trigger_validation_error_on_site_form( s.name, s.domain, [templA.id, templB.id, templC.id], 'orphan', s.id)
def insert_test_content(self): # Insert a page p = Page(site=Site.objects.get_current(), reverse_id=self.test_data['reverse_id'], template=TEMPLATE_NAME, published=True, publisher_state=1, publisher_is_draft=False) p.save() t = Title(page=p, language=settings.LANGUAGES[0][0], slug=self.test_data['slug'], title=self.test_data['title']) t.save() # Placeholders have been inserted on post_save signal: self.test_placeholders = {} for placeholder in p.placeholders.all(): self.test_placeholders[placeholder.slot] = placeholder # Insert another page that is not the home page p2 = Page(parent=p, site=Site.objects.get_current(), reverse_id=self.test_data2['reverse_id'], template=TEMPLATE_NAME, published=True, publisher_state=1, publisher_is_draft=False) p2.save() t2 = Title(page=p2, language=settings.LANGUAGES[0][0], slug=self.test_data2['slug'], title=self.test_data2['title']) t2.save() # Insert some test Text plugins pl = Text(plugin_type='TextPlugin', page=p, language=settings.LANGUAGES[0][0], placeholder=self.test_placeholders['main'], position=0, body=self.test_data['text_main']) pl.insert_at(None, save=True) pl = Text(plugin_type='TextPlugin', page=p, language=settings.LANGUAGES[0][0], placeholder=self.test_placeholders['sub'], position=0, body=self.test_data['text_sub']) pl.insert_at(None, save=True) # Insert another page that is not the home page p3 = Page(parent=p2, site=Site.objects.get_current(), reverse_id=self.test_data3['reverse_id'], template=TEMPLATE_NAME, published=True, publisher_state=1, publisher_is_draft=False) p3.save() t3 = Title(page=p3, language=settings.LANGUAGES[0][0], slug=self.test_data3['slug'], title=self.test_data3['title']) t3.save() # Placeholders have been inserted on post_save signal: self.test_placeholders3 = {} for placeholder in p3.placeholders.all(): self.test_placeholders3[placeholder.slot] = placeholder # # Insert some test Text plugins pl = Text(plugin_type='TextPlugin', page=p3, language=settings.LANGUAGES[0][0], placeholder=self.test_placeholders3['sub'], position=0, body=self.test_data3['text_sub']) pl.insert_at(None, save=True) # Reload test pages self.test_page = Page.objects.get(pk=p.pk) self.test_page2 = Page.objects.get(pk=p2.pk) self.test_page3 = Page.objects.get(pk=p3.pk)
def copy_pages(): pages = PagesPage.objects.order_by( 'tree_id', 'lft', ) # remove all the previous pages CMSPage.objects.all().delete() parents = {} for page in pages: cmspage = CMSPage() # replicate the language independent structure information # thanks to the common ancestor we can reuse exactly the same tree # information cmspage.pk = page.pk cmspage.creation_date = page.creation_date cmspage.publication_date = page.publication_date cmspage.publication_end_date = page.publication_end_date cmspage.changed_date = page.last_modification_date cmspage.template = 'django_' + page.template cmspage.level = page.level cmspage.lft = page.lft cmspage.rght = page.rght cmspage.tree_id = page.tree_id cmspage.site_id = 1 if page.parent_id in parents: cmspage.parent = parents[page.parent_id] cmspage.save(no_signals=True) cmspage.rescan_placeholders() parents[cmspage.pk] = cmspage # replicate the language dependent data for language in page.get_languages(): cmstitle = Title() cmstitle.language = language cmstitle.title = page.title(language) cmstitle.slug = page.slug(language) cmstitle.page = cmspage cmstitle.update_path() cmstitle.save() contents = page.content_by_language(language) for content in contents: if content.type in ('subtitle', 'text', 'right-column'): placeholder = cmspage.placeholders.get(slot=content.type) # For the main placeholders we need to scan whether content # is markdown or plain HTML # This is a very naif check, but does the trick in this # context if content.body.find('<p>') > -1: add_plugin(placeholder, plugin_type='TextPlugin', language=language, body=content.body) else: add_plugin(placeholder, plugin_type='MarkItUpPlugin', language=language, body=content.body) elif content.type not in ('slug', 'title'): # Fallback import placeholder = cmspage.placeholders.get(slot=content.type) add_plugin(placeholder, plugin_type='TextPlugin', language=language, body=content.body)
def create(request): if not request.user.is_admin_in_forening(request.active_forening): return render(request, 'central/admin/sites/create_disallowed.html') available_site_types = [] for t in Site.TYPE_CHOICES: if t[0] == 'mal': if not request.user.has_perm('sherpa/admin'): continue available_site_types.append(t) site_templates = Site.objects.filter( forening=Forening.DNT_CENTRAL_ID, type='mal', ).order_by('title') context = { 'available_site_types': available_site_types, 'site_templates': site_templates, 'template_types': Site.TEMPLATE_TYPE_CHOICES, } if request.method == 'GET': context['form'] = CreateSiteForm(request.user, auto_id='%s') return render(request, 'central/admin/sites/create.html', context) elif request.method == 'POST': form = CreateSiteForm(request.user, request.POST, auto_id='%s') context['form'] = form if not form.is_valid(): return render(request, 'central/admin/sites/create.html', context) if not request.POST['domain-type'] in ['fqdn', 'subdomain']: raise PermissionDenied site_forening = form.cleaned_data['forening'] type = form.cleaned_data['type'] title = form.cleaned_data['title'] template_main = form.cleaned_data['template_main'] template_type = form.cleaned_data['template_type'] template_description = form.cleaned_data['template_description'] domain = form.cleaned_data['domain'] site = Site( domain=domain, type=type, forening=site_forening, title=title, template_main=template_main, template_type=template_type, template_description=template_description, ) site.save() # If this is a main template, clear other templates of this type in case any of them were previous main if site.type == 'mal' and site.template_main: Site.objects.filter( type=site.type, template_type=site.template_type, ).exclude( id=site.id, ).update( template_main=False ) # Invalidate the forening's homepage site cache cache.delete('forening.homepage_site.%s' % site_forening.id) if 'use-template' not in request.POST: # User explicitly requested not to clone any template, just create a front page page = Page( site=site, title='Forside', published=True, created_by=request.user, created_date=datetime.now(), ) page.save() version = Version( page=page, version=1, owner=request.user, ) version.save() elif request.POST.get('template', '').strip() == '': # Sherpa-admin error; a site-template for the chosen site type doesn't exist! # This needs to be fixed. logger.error( "Sherpa-bruker opprettet en site med en mal som ikke finnes", extra={ 'request': request, 'missing_template_type': request.POST.get('missing-template-type', '<unknown>'), } ) site.delete() messages.error(request, 'invalid_template') return render(request, 'central/admin/sites/create.html', context) else: # All right, let's clone the entire template site # Note that for most objects, we'll just set the primary key to None, change the site field to the # new site, and save it, which will insert a new object. # For related fields, we'll need to save the related set in memory before saving the new object, so # that we can iterate it, clone them and re-relate them to the new object # Additionally, replace domain name references in content from the template-domain to the new one template_site = Site.get_cached_by_id(request.POST['template']) assert template_site.type == 'mal' # Menus for menu in Menu.objects.filter(site=template_site): menu.id = None menu.site = site # Replace domain references with the new site domain menu.url = re.sub(template_site.domain, site.domain, menu.url) menu.save() # Pages # Used to map old IDs to their new corresponding pages. This is needed because the parent reference can't # be duplicated, it needs to be updated with its corresponding new parent page_id_mapping = {} # Order by the left value in order to insert new nodes in a consistent way for page in Page.objects.filter(site=template_site).order_by('lft'): versions = page.versions.all() old_id = page.id page.id = None page.site = site # Reset MPTT state and let our library recreate them page.tree_id = None page.lft = None page.rght = None page.level = None # Set parent to the corresponding clone; use the old parent id to retrieve it if page.parent is not None: page.parent = page_id_mapping[page.parent.id] # Change creation to the user creating the new site and reset modification page.created_by = request.user page.created_date = datetime.now() page.modified_by = None page.modified_date = None # Insert the new node appropriately if page.parent is None: Page.objects.insert_node(page, target=None, save=True) else: Page.objects.insert_node(page, target=page.parent, position='last-child', save=True) page.save() # Remember which old id maps to this page page_id_mapping[old_id] = page for version in versions: rows = version.rows.all() version.id = None version.page = page version.save() for row in rows: columns = row.columns.all() row.id = None row.version = version row.save() for column in columns: contents = column.contents.all() column.id = None column.row = row column.save() for content in contents: content.id = None content.column = column # Replace domain references with the new site domain # Use a json dump with prepended/trailing quotes stripped to ensure the # replacement string is properly escaped if inserted into json-formatted content json_safe_domain = json.dumps(site.domain)[1:-1] content.content = re.sub(template_site.domain, json_safe_domain, content.content) # For aktiviteteslisting-widgets, force arranger-filter to the new site's related # forening if content.type == 'widget': parsed_content = json.loads(content.content) if parsed_content['widget'] == 'aktivitet_listing': # Note that the list of ids contains strings, because we forgot to convert # it to int in the widget-editor save logic, but that's not a problem since # the filter lookup will implicitly convert it. So force it to str to be # consistent parsed_content['foreninger'] = [str(site.forening.id)] content.content = json.dumps(parsed_content) content.save() # Articles for article in Article.objects.filter(site=template_site): versions = article.versions.all() article.id = None article.site = site # Change creation to the user creating the new site and reset modification article.created_by = request.user article.created_date = datetime.now() article.modified_by = None article.modified_date = None article.save() for version in versions: rows = version.rows.all() version.id = None version.article = article version.save() for row in rows: columns = row.columns.all() row.id = None row.version = version row.save() for column in columns: contents = column.contents.all() column.id = None column.row = row column.save() for content in contents: content.id = None content.column = column # Replace domain references with the new site domain # Use a json dump with prepended/trailing quotes stripped to ensure the # replacement string is properly escaped if inserted into json-formatted content json_safe_domain = json.dumps(site.domain)[1:-1] content.content = re.sub(template_site.domain, json_safe_domain, content.content) # For aktiviteteslisting-widgets, force arranger-filter to the new site's related # forening if content.type == 'widget': parsed_content = json.loads(content.content) if parsed_content['widget'] == 'aktivitet_listing': # Note that the list of ids contains strings, because we forgot to convert # it to int in the widget-editor save logic, but that's not a problem since # the filter lookup will implicitly convert it. So force it to str to be # consistent parsed_content['foreninger'] = [str(site.forening.id)] content.content = json.dumps(parsed_content) content.save() # Campaigns for campaign in Campaign.objects.filter(site=template_site): campaign_texts = campaign.text.all() campaign.id = None campaign.site = site # Replace domain references with the new site domain campaign.button_anchor = re.sub(template_site.domain, site.domain, campaign.button_anchor) campaign.save() for campaign_text in campaign_texts: campaign_text.id = None campaign_text.campaign = campaign campaign_text.save() # Add default language menu options LanguageMenuOption.objects.create( site=site, label="English", destination="https://english.dnt.no/", sort=1 ) LanguageMenuOption.objects.create( site=site, label="Deutsch", destination="https://deutsch.dnt.no/", sort=2 ) LanguageMenuOption.objects.create( site=site, label="Français", destination="https://www.dnt.no/francais/", sort=3 ) request.session.modified = True messages.info(request, 'site_created') return redirect('admin:sites.show', site.id)
def test_sites_unassigned(self): siteA = Site.objects.create(name="siteA", domain="siteA") templA = Template.objects.create(name='templA') templA.content = 'content' templA.save() templA.sites.add(siteA) p = Page(template="templA", site=siteA) p.save() self._trigger_validation_error_on_template_form( 'templA', 'content', [1], 'page_use', templA.id) self._update_template( 'templA', 'content', [1, siteA.id], templA.id) Page.objects.filter(id=p.id).update(template='templNonExistent') self._trigger_validation_error_on_template_form( 'templA', 'content', [1], 'nonexistent_in_pages', templA.id) templB = Template.objects.create(name='templB') templB.content = '{% invalid_tag %}' templB.save() templB.sites.add(siteA) Page.objects.filter(id=p.id).update(template='templB') self._trigger_validation_error_on_template_form( 'templA', 'content', [1], 'syntax_error_unassigning', templA.id) templC = Template.objects.create(name='templC') templC.content = '{% include "NonExistent" %}' templC.save() templC.sites.add(siteA) templB.content = '{% extends "templC" %}' templB.save() Page.objects.filter(id=p.id).update(template='templB') self._trigger_validation_error_on_template_form( 'templA', 'content', [1], 'missing_template_use', templA.id) templC.content = '{% include "templA" %}' templC.save() self._trigger_validation_error_on_template_form( 'templA', 'content', [1], 'page_template_use', templA.id) templD = Template.objects.create(name='templD') templD.content = 'content' templD.save() templD.sites.add(siteA) Page.objects.filter(id=p.id).update(template='templD') self._trigger_validation_error_on_template_form( 'templA', 'content', [1], 'site_template_use', templA.id) templB.content = '{% extends "templC" %}{% invalid_tag %}' templB.save() self._trigger_validation_error_on_template_form( 'templA', 'content', [1], 'syntax_error_unassigning', templA.id) templB.content = '{% extends "templC" %}{% include "NonExistent" %}' templB.save() self._trigger_validation_error_on_template_form( 'templA', 'content', [1], 'missing_template_use', templA.id) p.delete() self._trigger_validation_error_on_template_form( 'templA', 'content', [1], 'missing_template_use', templA.id)