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
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