code: def put(self, resource_id):
          
          resource = self.__model__.query.get(resource_id)
          if resource:
              error_message = is_valid_method(self.__model__, resource)
              if error_message:
                  raise BadRequestException(error_message)
              resource.update(request.json)
              db.session().merge(resource)
              db.session().commit()
              return jsonify(resource)
  
          resource = self.__model__(**request.json)  # pylint: disable=not-callable
          error_message = is_valid_method(self.__model__, resource)
          if error_message:
              raise BadRequestException(error_message)
          db.session().add(resource)
          db.session().commit()
          return self._created_response(resource)
docs: Return the JSON representation of a new resource created or updated
          through an HTTP PUT call.
  
          If resource_id is not provided, it is assumed the primary key field is
          included and a totally new resource is created. Otherwise, the existing
          resource referred to by *resource_id* is updated with the provided JSON
          data. This method is idempotent.
  
          :returns: ``HTTP 201`` if a new resource is created
          :returns: ``HTTP 200`` if a resource is updated
          :returns: ``HTTP 400`` if the request is malformed or missing data