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) })
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))
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
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"])
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
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"])
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"})