def update_or_create(model, defaults={}, commit=True, **kwargs): """ Equivalent of Django's update_or_create, with an additional option to commit the transaction (commits by default). @param model: Model to update, e.g. Song @param defaults: Parameters to update, e.g. { 'playback_count': 1000, 'likes_count': 10 } @param commit: Commit the transaction? @param **kwargs: Parameters to check uniqueness on, e.g. { 'title': 'How We Do', 'artist': '50 Cent' } """ model_instance = DB_SESSION.query(model).filter_by(**kwargs).first() if model_instance: for arg, value in defaults.iteritems(): setattr(model_instance, arg, value) if commit: DB_SESSION.commit() return model_instance, True else: params = { k: v for k, v in kwargs.iteritems() } params.update(defaults) model_instance = model(**params) DB_SESSION.add(model_instance) if commit: DB_SESSION.commit() return model_instance, False
def artists(): def artist_filter(artist_str): stop_words = ['ft.', 'feat', 'featuring', '_', '+', '/', '|'] artist_str = artist_str.lower() for stop_word in stop_words: if stop_word in artist_str: return False return True # Result set is a list of tuples [('[Artist]',), ...] artists = [s[0] for s in DB_SESSION.query(Song.artist.distinct()) if artist_filter(s[0])] return jsonify({ 'length': len(artists), 'data': artists })