示例#1
0
    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
示例#2
0
 def setUp(self):
     self.client = Client()
     try:
         Page.objects.get(name='home')
     except Page.DoesNotExist:
         home = Page(name='home', title='home')
         home.save()
示例#3
0
文件: views.py 项目: tochitake/wakeo
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))
示例#4
0
    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)
示例#5
0
    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
示例#6
0
    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)
示例#8
0
 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()
示例#9
0
文件: models.py 项目: mammique/opst
    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()
示例#10
0
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)
示例#11
0
    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()                
示例#12
0
    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()
示例#13
0
    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)
示例#14
0
    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)
示例#15
0
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)
示例#16
0
    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)
示例#17
0
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)
示例#18
0
    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)
示例#19
0
    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)
示例#20
0
文件: api.py 项目: yakky/pycon_site
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)
示例#21
0
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)
示例#22
0
    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)