def get_fluff_tables(self): fluff_pillows = [get_pillow_instance(x) for x in settings.PILLOWTOPS['fluff']] tables = set() for pillow in fluff_pillows: if pillow.save_direct_to_sql: name = pillow.indicator_class()._table.name tables.add((name, name)) return tables
def _try_legacy_import(pillow_name_or_class): try: return get_pillow_instance(pillow_name_or_class) except ValueError: # all fluff pillows have module path of 'fluff' so can't be imported directly if '.' in pillow_name_or_class: _, pillow_name_or_class = pillow_name_or_class.rsplit('.', 1) try: return get_pillow_by_name(pillow_name_or_class) except PillowNotFoundError: return None
def pillows(self): return [get_pillow_instance(name) for name in self.pillow_names]
def process_pillow_retry(error_doc_id): # Redis error logged in get_redis_client try: client = cache_core.get_redis_client() except cache_core.RedisClientError: return # Prevent more than one task from processing this error, just in case # it got enqueued twice. lock = client.lock( "pillow-retry-processing-%s" % error_doc_id, timeout=settings.PILLOW_RETRY_PROCESSING_LOCK_TIMEOUT*60 ) if lock.acquire(blocking=False): try: error_doc = PillowError.objects.get(id=error_doc_id) except PillowError.DoesNotExist: return pillow_class = error_doc.pillow try: pillow = get_pillow_instance(pillow_class) except ValueError: # all fluff pillows have module path of 'fluff' so can't be imported directly _, pillow_class_name = pillow_class.rsplit('.', 1) try: pillow = get_pillow_by_name(pillow_class_name) except PillowNotFoundError: pillow = None if not pillow: notify_error(( "Could not find pillowtop class '%s' while attempting a retry. " "If this pillow was recently deleted then this will be automatically cleaned up eventually. " "If not, then this should be looked into." ) % pillow_class) try: error_doc.total_attempts = PillowError.multi_attempts_cutoff() + 1 error_doc.save() finally: release_lock(lock, True) return change = error_doc.change_object if pillow.include_docs: try: change.set_document(pillow.get_couch_db().open_doc(change.id)) except ResourceNotFound: change.deleted = True try: try: from corehq.apps.userreports.pillow import ConfigurableIndicatorPillow if isinstance(pillow, ConfigurableIndicatorPillow): raise Exception('this is temporarily not supported!') except ImportError: pass pillow.process_change(change, is_retry_attempt=True) except Exception: ex_type, ex_value, ex_tb = sys.exc_info() error_doc.add_attempt(ex_value, ex_tb) error_doc.queued = False error_doc.save() else: error_doc.delete() finally: release_lock(lock, True)