def post(self) -> (str, int):
        """
        Save or Update a Widget
        Parameters can be passed using a POST request.
        POST request JSON body parameters:
            :param data:  Widget JSON data
            :param widgetID: Widget Id
            :param x: x coordinate of the widget layout
            :param y: y coordinate of the widget layout
            :param h: height of the widget layout
            :param w: width of the widget layout
            :param static: layout static property
        :returns : A response message and an appropriate HTTP status code
        """
        args = self.reqparse_post.parse_args()

        current_user = Users.find_by_email(get_jwt_identity())
        curr_widget = None

        if "widget_id" in args:
            curr_widget = WidgetModel.get_widget_by_id_and_user_id(
                args["widget_id"], current_user.id)

            if curr_widget:
                curr_widget.data = args["data"]
            else:
                abort(HTTPStatus.NOT_FOUND,
                      error="Widget with Id {} not found".format(
                          args["widget_id"]))

        else:
            # Create a layout for the new widget
            layout = Layouts(1, 0, 0, args['height'], args['width'], False)
            curr_widget = WidgetModel(current_user.id, layout, args["data"])

        try:
            db.session.add(curr_widget)
            # flush session to get new widgetID to assign to layout
            db.session.flush()
            self.update_layout(curr_widget, args)
            db.session.commit()
        except exc.SQLAlchemyError as e:
            logger.error(e.with_traceback(e.__traceback__))
            abort(HTTPStatus.BAD_REQUEST.value,
                  error="exc.SQLAlchemyError: create_widget")
        response = self.get_reponse_template(curr_widget,
                                             updated="widget_id" in args)
        return response, HTTPStatus.OK
    def make_dummy_widgets(self, number_of_widgets: int = 1) -> [int]:
        """
        Creates widgets for tests
        :param number_of_widgets: the number of widgets to create
        :type number_of_widgets:    int
        :return: A list of the widget ids created
        """
        widget_ids = []
        for _ in range(number_of_widgets):
            new_widget = WidgetModel(self.user.id, Layouts(-1, 0, 0, 5, 5, False), self.get_widget_data())
            db.session.add(new_widget)
            db.session.flush()
            # new_widget.layout.layout.widget_id = new_widget.id
            db.session.commit()
            widget_ids.append(new_widget.id)

        return widget_ids
Example #3
0
def test_widget_model() -> NoReturn:
    """
    Tests that widget data can be persisted and fetched from the database
    """
    # Create a Layout instance required for Widget
    dummy_layout = Layouts(-1, 5, 4, 3, 2, True)
    # Persist a Widget to the database
    new_widget = WidgetModel(dependencies.user.id, dummy_layout,
                             dependencies.get_widget_data())
    db.session.add(new_widget)
    # Flush session to get Widgets Id for the layout
    db.session.flush()
    dummy_layout.widget_id = new_widget.id
    db.session.commit()
    # Fetch widget from database and check they are the same instance
    fetched_widget = WidgetModel.get_widget_by_id(new_widget.id)
    assert fetched_widget is new_widget
    assert fetched_widget.layout is new_widget.layout