示例#1
0
    def test_get_by_id(self):

        node = Node(id=1, weight=0)
        node2 = Node(id=2, weight=1)
        self.session.add(node)
        self.session.add(node2)

        self.assertEqual(Node.get_by_id(self.session, 1), node)
        self.assertEqual(Node.get_by_id(self.session, 2), node2)
示例#2
0
    def move(self):

        response = copy.deepcopy(self._response)

        try:
            # The ID of the node which want be moved.
            node_id = self.request.params.get("moved_node_id")
            if not node_id is None:
                node_id = int(node_id)

            # The ID of the new parent node.
            parent_id = self.request.params.get("new_parent_id")
            if not parent_id is None:
                parent_id = int(parent_id)

            # The ID of the previous node of 'node_id' in the new position.
            previous_node_id = self.request.params.get("previous_node_id")
            if previous_node_id == "":
                previous_node_id = None
            elif not previous_node_id is None:
                previous_node_id = int(previous_node_id)

            # The ID of the next node of 'node_id' in the new position.
            next_node_id = self.request.params.get("next_node_id")
            if next_node_id == "":
                next_node_id = None
            elif not next_node_id is None:
                next_node_id = int(next_node_id)

            Node.move(self.session, node_id, parent_id, previous_node_id, next_node_id)

        except (TypeError, NoResultFound, ConstraintError) as e:
            log.exception("Bad request params.")
            self.session.rollback()
            self.request.response.status = 400
            response["errors"] = {}
            response["success"] = False
            response["errors"]["400"] = str(e)

        except Exception as e:
            log.exception("Unknown Error.")
            self.session.rollback()
            self.request.response.status = 500
            response["errors"] = {}
            response["success"] = False
            response["errors"]["500"] = str(e)

        else:
            self.session.commit()
            self.request.response.status = 200
            response["errors"] = {}
            response["dataset"] = []
            response["dataset_len"] = 1
            response["success"] = True

        return response
示例#3
0
    def test_get_max_weight(self):
        node1 = Menu(id=1, weight=10)
        self.session.add(node1)
        node2 = Page(id=2, parent=node1, weight=20)
        self.session.add(node2)
        node3 = Page(id=3, parent=node2, weight=30)
        self.session.add(node3)

        self.assertEqual(Node.get_max_weight(self.session, parent=None), 10)
        self.assertEqual(Node.get_max_weight(self.session, parent=node1), 20)
        self.assertEqual(Node.get_max_weight(self.session, parent=node2), 30)
        # Node.get_max_weight return None when the query is empty.
        self.assertEqual(Node.get_max_weight(self.session, parent=node3), 0)
示例#4
0
 def tree(self):
     language = self.request.language
     # FIXME: don't load all database!!!
     # HINT: add parameter 'level' to the request to load first N levels.
     return [
         node.to_dict(language) for node in Node.all(self.session) if isinstance(node, Menu) and node.parent == None
     ]
示例#5
0
    def test_move_end(self):
        menu = Menu(id=1, parent=None, weight=0)
        self.session.add(menu)
        page = Page(id=2, parent=menu, weight=1)
        self.session.add(page)
        section = Section(id=3, parent=menu, weight=2)
        self.session.add(section)
        page2 = Page(id=4, parent=section, weight=3)
        self.session.add(page2)
        external_link = ExternalLink(id=5, parent=menu, weight=4)
        self.session.add(external_link)
        internal_link = InternalLink(id=6, parent=menu, weight=5)
        self.session.add(internal_link)
        self.session.flush()
        # Test move node at the end of branch.
        weight = page2.weight + 1
        Node.move(self.session,
                  id_=5, parent_id=3, previous_node_id=4, next_node_id=None)
        self.session.flush()
        self.assertEqual(weight, external_link.weight)

        # Test move node at the beginning of branch
        weight = page2.weight
        Node.move(self.session,
                  id_=6, parent_id=3, previous_node_id=None, next_node_id=4)
        self.session.flush()
        self.assertEqual(weight, internal_link.weight)

        # Test move node in the middle of branch
        weight = section.weight
        Node.move(self.session,
                  id_=6, parent_id=1, previous_node_id=2, next_node_id=3)
        self.session.flush()
        self.assertEqual(weight, internal_link.weight)
示例#6
0
    def delete(self):

        response = copy.deepcopy(self._response)

        try:
            id_ = int(self.request.params.get("id"))
            Node.remove(self.session, id_)

        except (TypeError, NoResultFound, ConstraintError) as e:
            log.exception("Bad request params.")
            self.session.rollback()
            self.request.response.status = 400
            response["success"] = False
            error = str(e)
            if error.split(":")[0] == "0001":
                error = "Rimozione vietata: Menu."
            elif error.split(":")[0] == "0002":
                error = "Rimozione vietata: ultima Pagina del sito."
            elif error.split(":")[0] == "0003":
                error = "Rimozione vietata: eliminare prima i figli."
            elif error.split(":")[0] == "0004":
                error = "Rimozione vietata: la pagina e' riferita da altre."
            response["error"] = error

        except Exception as e:
            log.exception("Unknown Error.")
            self.session.rollback()
            self.request.response.status = 500
            response["success"] = False
            response["error"] = str(e)

        else:
            self.session.commit()
            self.request.response.status = 200
            response["error"] = ""
            response["dataset"] = []
            response["dataset_len"] = 1
            response["success"] = True

        return response
示例#7
0
    def info(self):

        response = copy.deepcopy(self._response)

        try:
            language = self.request.language
            node = Node.get(self.session, int(self.request.params.get("id")))
            translation = node.get_translation(language)

        except (NoResultFound, TypeError, ValueError) as e:
            log.exception("Bad request.")
            response["data"] = None
            response["datalen"] = 0
            response["success"] = False
            response["message"] = str(e)
            self.request.response.status = 400

        except Exception as e:
            log.exception("Unknown error.")
            response["data"] = None
            response["datalen"] = 0
            response["success"] = False
            response["message"] = str(e)
            self.request.response.status = 500

        else:
            dict_ = translation.to_dict()
            try:
                dict_["home"] = node.home
            except:
                pass
            response["data"] = dict_
            response["datalen"] = 1
            response["success"] = True
            response["message"] = "Information retrieved."
            self.request.response.status = 200

        return response
示例#8
0
    def test_get_by_enabled(self):

        node1 = Node(id=1, weight=10, enabled=True)
        self.session.add(node1)
        node2 = Node(id=2, weight=20, enabled=False)
        self.session.add(node2)
        node3 = Node(id=3, weight=30, enabled=True)
        self.session.add(node3)
        node4 = Node(id=4, weight=40, enabled=False)
        self.session.add(node4)

        self.assertIn(node1, Node.get_by_enabled(self.session, True))
        self.assertIn(node3, Node.get_by_enabled(self.session, True))
        self.assertIn(node2, Node.get_by_enabled(self.session, False))
        self.assertIn(node4, Node.get_by_enabled(self.session, False))
        self.assertEqual(len(Node.get_by_enabled(self.session, True)), 2)
        self.assertEqual(len(Node.get_by_enabled(self.session,
                                                 False, start=0, limit=0)), 0)
        self.assertEqual(len(Node.get_by_enabled(self.session,
                                                 False, start=0, limit=1)), 1)
        self.assertEqual(len(Node.get_by_enabled(self.session,
                                                 False, start=0, limit=2)), 2)
        self.assertEqual(len(Node.get_by_enabled(self.session,
                                                 False, start=1)), 1)
        self.assertEqual(len(Node.get_by_enabled(self.session,
                                                 False, start=2)), 0)
        self.assertEqual(len(Node.get_by_enabled(self.session,
                                                 False, start=-1)), 1)
    def _create(self, params):

            parent_url = urlparse(params['parent_url']).path
            if parent_url.startswith('/admin'):
                parent_url = parent_url.replace('/admin', '', 1)
            parent_url = parent_url.rsplit('.', 1)[0]

            node_info = MediaCollectionPageInfo.get_by_url(self.session,
                                                           parent_url)

            # Node attributes.
            enabled = params.get('enabled', 'on')
            enabled = True if enabled.lower() == 'on' else False
            hidden = params.get('hidden', 'off')
            hidden = True if hidden.lower() == 'on' else False
            max_weight = Node.get_max_weight(self.session, node_info.node)
            weight = params.get('weight', max_weight)
            #self.log.debug(max_weight)
            weight = int(weight) + 1
            # Page attributes.
            home = params.get('home', 'off')
            home = True if home.lower() == 'on' else False
            sitemap_priority = params.get('sitemap_priority')
            sitemap_priority = int(sitemap_priority) if sitemap_priority else 1
            # FIXME: add the right view needed by MediaItemPage rendering.
            view = View.get(self.session, 1)
            file_id = params.get('file', {}).get('id')

            node = MediaItemPage(enabled=enabled,
                                 hidden=hidden,
                                 parent=node_info.node,
                                 weight=weight,
                                 home=home,
                                 sitemap_priority=sitemap_priority,
                                 view=view,
                                 file_id=file_id)

            # NodeInfo attributes.
            translation = params.get('translations')[0]
            label = translation['label']
            language = self.request.language
            # CommonInfo attributes.
            title = translation.get('title', label)
            url_part = translation.get('url_part', title).strip()
            url_part = urlify(url_part)
            meta_description = translation.get('meta_description')
            head_content = translation.get('head_content')
            # Page attributes.
            content = translation.get('content', '')

            node_info = MediaItemPageInfo(label=label,
                                          node=node,
                                          lang=language,
                                          title=title,
                                          url_part=url_part,
                                          meta_description=meta_description,
                                          head_content=head_content,
                                          content=content)

            self.session.add(node)
            self.session.add(node_info)
            node_info.translate(enabled_only=True)

            return node
示例#10
0
    def update(self):

        response = copy.deepcopy(self._response)

        try:

            language = self.request.language
            node_id = int(self.request.params.get("id"))
            node = Node.get(self.session, node_id)
            info = node.get_translation(language)

            # Node attributes.
            enabled = self.request.params.get("enabled", "off")
            if enabled is None:
                enabled = node.enabled
            else:
                enabled = True if enabled.lower() == "on" else False
            # NodeInfo attributes
            label = self.request.params.get("button_label", info.label)
            # CommonInfo attributes.
            title = self.request.params.get("title", info.title)
            url_part = self.request.params.get("url_part", info.url_part).strip()
            url_part = urlify(url_part)
            meta_description = self.request.params.get("meta_description", info.meta_description)
            head_content = self.request.params.get("head_content", info.head_content)

            node.enabled = enabled
            info.title = title
            info.label = label
            info.meta_description = meta_description
            info.head_content = head_content

            if isinstance(node, (Page, Section)) and info.url_part != url_part:
                log.debug("Change url_part from '%s' to '%s'.", info.url_part, url_part)
                info.url_part = url_part

            if isinstance(node, Page):
                home = self.request.params.get("home", "")
                home = True if home.lower() == "on" else False
                if home:
                    Page.set_homepage(self.session, node)
                view_id = int(self.request.params.get("page_type_id", node.view.id))
                node.view = View.get(self.session, view_id)

            elif isinstance(node, InternalLink):
                node.linked_to = Node.get(self.session, int(request.params.get("linked_to")))

            elif isinstance(node, ExternalLink):
                ext_url = request.params.get("external_url", "")
                if not ext_url.startswith("http://"):
                    ext_url = "http://" + ext_url
                info.ext_url = ext_url

            """ FIXME: purge cache.
            if routing_changed:
                reload_routing()
            else:
                aybu.cms.lib.cache.flush_all()
            """

        except (TypeError, NoResultFound) as e:
            log.exception("Bad request params.")
            self.session.rollback()
            self.request.response.status = 400
            response["errors"] = {}
            response["success"] = False
            response["errors"]["400"] = str(e)

        except Exception as e:
            log.exception("Unknown Error.")
            self.session.rollback()
            self.request.response.status = 500
            response["errors"] = {}
            response["success"] = False
            response["errors"]["500"] = str(e)

        else:
            self.session.commit()
            self.request.response.status = 200
            response["errors"] = {}
            response["dataset"] = [{"id": node.id}]
            response["dataset_len"] = 1
            response["success"] = True

        return response
示例#11
0
    def create(self):

        response = copy.deepcopy(self._response)

        try:
            language = self.request.language
            type_ = self.request.params.get("type")  # Specify model entity.

            # Node attributes.
            enabled = self.request.params.get("enabled", "off")
            enabled = True if enabled.lower() == "on" else False

            # FIXME: check JS to verify 'hidden' support.
            hidden = self.request.params.get("hidden", "off")
            hidden = True if hidden.lower() == "on" else False
            parent = self.request.params.get("parent_id")
            if not parent:
                parent = "1"
            parent = Node.get(self.session, parent)
            weight = self.request.params.get("weight", Node.get_max_weight(self.session, parent))
            weight = int(weight) + 1

            # NodeInfo attributes
            label = self.request.params.get("button_label")

            # CommonInfo attributes.
            title = self.request.params.get("title", "No title")
            url_part = self.request.params.get("url_part", title).strip()
            url_part = urlify(url_part)
            meta_description = self.request.params.get("meta_description")
            head_content = self.request.params.get("head_content")

            if type_ == "Section":

                node = Section(enabled=enabled, hidden=hidden, parent=parent, weight=weight)
                node_info = SectionInfo(
                    label=label,
                    node=node,
                    lang=language,
                    title=title,
                    url_part=url_part,
                    meta_description=meta_description,
                    head_content=head_content,
                )

            elif type_ in ("Page", "MediaCollectionPage"):
                # Page attributes.
                sitemap_priority = self.request.params.get("sitemap_priority")
                if not sitemap_priority:
                    sitemap_priority = 1
                sitemap_priority = int(sitemap_priority)
                view = self.request.params.get("page_type_id")
                if type_ == "MediaCollectionPage":
                    # FIXME:
                    # add supporto to restrict some views to a specific node.
                    view = View.get_by_name(self.session, "MEDIA COLLECTION")
                    view = view[0] if view else None
                else:
                    view = View.get(self.session, view)

                if not Page.new_page_allowed:
                    raise QuotaError("New pages are not allowed.")

                content = self.request.params.get("content", u"<h2>{}</h2>".format(title))

                if type_ == "Page":
                    node_cls = Page
                    nodeinfo_cls = PageInfo
                elif type_ == "MediaCollectionPage":
                    node_cls = MediaCollectionPage
                    nodeinfo_cls = MediaCollectionPageInfo

                node = node_cls(
                    enabled=enabled,
                    hidden=hidden,
                    parent=parent,
                    weight=weight,
                    sitemap_priority=sitemap_priority,
                    view=view,
                )
                node_info = nodeinfo_cls(
                    label=label,
                    node=node,
                    lang=language,
                    title=title,
                    url_part=url_part,
                    meta_description=meta_description,
                    head_content=head_content,
                    content=content,
                )

            elif type_ == "InternalLink":

                linked_to = self.request.params.get("linked_to")
                linked_to = Page.get(self.session, linked_to)

                node = InternalLink(enabled=enabled, hidden=hidden, parent=parent, weight=weight, linked_to=linked_to)
                node_info = InternalLinkInfo(label=label, node=node, lang=language)

            elif type_ == "ExternalLink":
                ext_url = self.request.params.get("external_url")
                node = ExternalLink(enabled=enabled, hidden=hidden, parent=parent, weight=weight)
                node_info = ExternalLinkInfo(label=label, node=node, lang=language, ext_url=ext_url)

            else:
                raise NotImplementedError("Cannot create: %s" % type_)

            self.session.add(node)
            self.session.add(node_info)
            node_info.translate(enabled_only=True)
            self.session.flush()
            if type_ == "Page":
                home = self.request.params.get("home", "off")
                home = True if home.lower() == "on" else False
                if home:
                    Page.set_homepage(self.session, node)

        except NotImplementedError as e:
            log.exception("Not Implemented.")
            self.session.rollback()
            self.request.response.status = 501  # HTTP 501 Not Implemented Error.
            response["errors"] = {}
            response["success"] = False
            response["errors"]["501"] = "Cannot create %s entity." % type_

        except QuotaError as e:
            log.exception("Quota Error.")
            self.session.rollback()
            self.request.response.status = 500
            response["errors"] = {}
            response["success"] = False
            response["errors"]["500"] = "Maximum pages number reached."

        except MultipleResultsFound as e:
            log.exception("Pages URls must be unique.")
            self.session.rollback()
            self.request.response.status = 409
            response["errors"] = {}
            response["success"] = False
            response["errors"]["409"] = str(e)

        except Exception as e:
            log.exception("Unknown Error.")
            self.session.rollback()
            self.request.response.status = 500
            response["errors"] = {}
            response["success"] = False
            response["errors"]["500"] = str(e)

        else:
            self.session.commit()
            self.request.response.status = 200
            response["errors"] = {}
            response["dataset"] = [{"id": node.id}]
            response["dataset_len"] = 1
            response["success"] = True

        return response