def test_underscore_delete_many_query(self, mock_clean, mock_on_bulk): from sqlalchemy.orm.query import Query items = Query('asd') clean_items = Query("ASD") clean_items.all = Mock(return_value=[1, 2, 3]) clean_items.delete = Mock() mock_clean.return_value = clean_items count = docs.BaseMixin._delete_many(items) mock_clean.assert_called_once_with(items) clean_items.delete.assert_called_once_with(synchronize_session=False) mock_on_bulk.assert_called_once_with(docs.BaseMixin, [1, 2, 3], None) assert count == clean_items.delete()
def test_underscore_delete_many_query( self, mock_clean, mock_on_bulk): from sqlalchemy.orm.query import Query items = Query('asd') clean_items = Query("ASD") clean_items.all = Mock(return_value=[1, 2, 3]) clean_items.delete = Mock() mock_clean.return_value = clean_items count = docs.BaseMixin._delete_many(items) mock_clean.assert_called_once_with(items) clean_items.delete.assert_called_once_with( synchronize_session=False) mock_on_bulk.assert_called_once_with( docs.BaseMixin, [1, 2, 3], None) assert count == clean_items.delete()
def delete(self, table, params): """ :param table: table from where to delete :type table: str :param params: dictionary of which line(s) to delete :type params: dict :return: S_OK() || S_ERROR() """ session = self.sessionMaker_o() found = False for ext in self.extensions: try: table_c = getattr( __import__(ext + __name__, globals(), locals(), [table]), table) found = True break except (ImportError, AttributeError): continue # If not found in extensions, import it from DIRAC base (this same module). if not found: table_c = getattr( __import__(__name__, globals(), locals(), [table]), table) # handling query conditions found in 'Meta' older = params.get('Meta', {}).get('older', None) newer = params.get('Meta', {}).get('newer', None) order = params.get('Meta', {}).get('order', None) limit = params.get('Meta', {}).get('limit', None) params.pop('Meta', None) try: deleteQuery = Query(table_c, session=session) for columnName, columnValue in params.iteritems(): if not columnValue: continue column_a = getattr(table_c, columnName.lower()) if isinstance(columnValue, (list, tuple)): deleteQuery = deleteQuery.filter( column_a.in_(list(columnValue))) elif isinstance(columnValue, (basestring, datetime.datetime, bool)): deleteQuery = deleteQuery.filter(column_a == columnValue) else: self.log.error("type(columnValue) == %s" % type(columnValue)) if older: column_a = getattr(table_c, older[0].lower()) deleteQuery = deleteQuery.filter(column_a < older[1]) if newer: column_a = getattr(table_c, newer[0].lower()) deleteQuery = deleteQuery.filter(column_a > newer[1]) if order: order = [order] if isinstance(order, basestring) else list(order) column_a = getattr(table_c, order[0].lower()) if len(order) == 2 and order[1].lower() == 'desc': deleteQuery = deleteQuery.order_by(desc(column_a)) else: deleteQuery = deleteQuery.order_by(column_a) if limit: deleteQuery = deleteQuery.limit(int(limit)) res = deleteQuery.delete( synchronize_session=False) #FIXME: unsure about it session.commit() return S_OK(res) except exc.SQLAlchemyError as e: session.rollback() self.log.exception("delete: unexpected exception", lException=e) return S_ERROR("delete: unexpected exception %s" % e) finally: session.close()
def delete( self, table, params ): """ :param table: table from where to delete :type table: str :param params: dictionary of which line(s) to delete :type params: dict :return: S_OK() || S_ERROR() """ session = self.sessionMaker_o() found = False for ext in self.extensions: try: table_c = getattr(__import__(ext + __name__, globals(), locals(), [table]), table) found = True break except (ImportError, AttributeError): continue # If not found in extensions, import it from DIRAC base (this same module). if not found: table_c = getattr(__import__(__name__, globals(), locals(), [table]), table) # handling query conditions found in 'Meta' older = params.get('Meta', {}).get('older', None) newer = params.get('Meta', {}).get('newer', None) order = params.get('Meta', {}).get('order', None) limit = params.get('Meta', {}).get('limit', None) params.pop('Meta', None) try: deleteQuery = Query(table_c, session = session) for columnName, columnValue in params.iteritems(): if not columnValue: continue column_a = getattr(table_c, columnName.lower()) if isinstance(columnValue, (list, tuple)): deleteQuery = deleteQuery.filter(column_a.in_(list(columnValue))) elif isinstance(columnValue, (basestring, datetime.datetime, bool) ): deleteQuery = deleteQuery.filter(column_a == columnValue) else: self.log.error("type(columnValue) == %s" %type(columnValue)) if older: column_a = getattr(table_c, older[0].lower()) deleteQuery = deleteQuery.filter(column_a < older[1]) if newer: column_a = getattr(table_c, newer[0].lower()) deleteQuery = deleteQuery.filter(column_a > newer[1]) if order: order = [order] if isinstance(order, basestring) else list(order) column_a = getattr(table_c, order[0].lower()) if len(order) == 2 and order[1].lower() == 'desc': deleteQuery = deleteQuery.order_by(desc(column_a)) else: deleteQuery = deleteQuery.order_by(column_a) if limit: deleteQuery = deleteQuery.limit(int(limit)) res = deleteQuery.delete(synchronize_session=False) #FIXME: unsure about it session.commit() return S_OK(res) except exc.SQLAlchemyError as e: session.rollback() self.log.exception( "delete: unexpected exception", lException = e ) return S_ERROR( "delete: unexpected exception %s" % e ) finally: session.close()