コード例 #1
0
def item_set_type():
    try:
        data = request.get_json(False, True, False)
        list_id = int(data.get("list_id"))
        item_id = int(data.get("item_id"))
        version_id = data.get("version_id")
        type_ = data.get("type")
        if type_ is not None:
            type_ = ListItemType[type_]
    except (AttributeError, KeyError, TypeError, ValueError):
        print(format_exc())
        print(f"data: {data}")
        return jsonify({"status": "missing or invalid data"}), 400

    try:
        list_item = ListItem.query.get((list_id, item_id))
        if list_item is None:
            if version_id != "none":
                raise StaleDataError()

            list_item = ListItem(
                list_id=list_id,
                item_id=item_id,
                type_=type_ if type_ is not None else ListItemType.selection,
                selection=False,
                number=Decimal(),
                text="",
            )
            database.session.add(list_item)
        else:
            if version_id != list_item.version_id:
                raise StaleDataError()

            list_item.type_ = type_ if type_ is not None else list_item.type_.next(
            )

        if (list_item.type_ == ListItemType.none
                and list_item.selection is False
                and list_item.number == Decimal() and list_item.text == ""):
            database.session.delete(list_item)

        database.session.commit()
        return jsonify({
            "status":
            "ok",
            "type":
            list_item.type_.name,
            "version":
            list_item.version_id if inspect(list_item).persistent else "none",
        })
    except (IntegrityError, StaleDataError):
        database.session.rollback()
        flash(
            "The item has not been updated due to concurrent modification.",
            "error",
        )
        return jsonify({
            "status": "cancel",
            "cancel_url": url_for("list.item", list_id=list_id)
        })
コード例 #2
0
def find_by_id_versioned(entity_type, entity_id, version_id):
    try:
        return Session().query(entity_type).\
            filter(entity_type.id == entity_id).\
            filter(entity_type.version_id == version_id).one()
    except NoResultFound:
        raise StaleDataError(
            "Entity not found for version - id: {}, version: {}".format(
                entity_id, version_id))
コード例 #3
0
def get_record(uuid, record_version=None):
    record = InspireRecord.get_record(uuid, with_deleted=True)

    if record_version and record.model.version_id < record_version:
        LOGGER.warning(
            "Reading stale data",
            uuid=str(uuid),
            version=record_version,
            current_version=record.model.version_id,
        )
        raise StaleDataError()
    return record
コード例 #4
0
    def test_staledataerror_response(self, mocked_crud):

        error = StaleDataError("Some reason")
        mocked_crud.side_effect = error
        data = SiteDataSchemaCreate(**self.sitedataschema_data)
        response = self.client.open("/api/v1/sitedataschemas",
                                    method="POST",
                                    data=json.dumps(data),
                                    content_type="application/json",
                                    headers=self.headers)
        r_data = json.loads(response.data)
        self.assertEqual(response.status_code, 500)
        self.assertEqual("StaleDataError(Some reason)", r_data["error"])
コード例 #5
0
 def _get_record_version(cls, record_uuid, record_version):
     RecordMetadataVersion = version_class(RecordMetadata)
     try:
         record = RecordMetadataVersion.query.filter_by(
             id=record_uuid, version_id=record_version).one()
     except NoResultFound:
         LOGGER.warning(
             "Reading stale data",
             uuid=str(record_uuid),
             version=record_version,
         )
         raise StaleDataError()
     record_class = InspireRecord.get_class_for_record(record.json)
     if record_class != cls:
         record = record_class(record.json, model=record)
     return record
コード例 #6
0
    def test_staledataerror_response(self, mocked_crud):

        error = StaleDataError("Some reason")
        mocked_crud.side_effect = error
        data = Domain(
            **{
                "name": ("%s" % uuid.uuid1())[:30],
                "description": "a super cool test domain",
            })
        response = self.client.open('/api/v1/domains',
                                    method='POST',
                                    data=json.dumps(data),
                                    content_type='application/json',
                                    headers=self.headers)
        r_data = json.loads(response.data)
        self.assertEqual(response.status_code, 500)
        self.assertEqual("StaleDataError(Some reason)", r_data["error"])
コード例 #7
0
def set_filter():
    try:
        data = request.get_json(False, True, False)
        filter_ = data.get("item_id")
        version_id = data.get("version_id")
    except (AttributeError, TypeError, ValueError):
        print(format_exc())
        print(f"data: {data}")
        return jsonify({"status": "missing or invalid data"}), 400

    try:
        if current_user.version_id != version_id:
            raise StaleDataError()

        current_user.filter_ = filter_ if filter_ != "All" else None
        database.session.commit()
        return jsonify({"status": "ok"})
    except (IntegrityError, StaleDataError):
        database.session.rollback()
        flash(
            "The item has not been updated due to concurrent modification.",
            "error",
        )
        return jsonify({"status": "cancel"})