def validate_processed_item(self): if self.queue_item.status != QueueItemStatus.PROCESSED: return Success() if self.queue_item.processing_ended_at is None: return Failure('processing_ended_at should be present') if self.queue_item.waiting_time_estimation is None: return Failure('waiting_time_estimation should be present') return Success()
def skip(self, ): if not self.banner: return Failure('banner is not found') item = self.banner.queue.actual().first() if not item: return Failure('The queue is empty') SkipQueueItemProcessor(item).call() TransitToSkippedState(item).call() return Success()
def validate_telegram_item(self): if self.queue_item.source != QueueItemSource.TELEGRAM: return Success() if self.queue_item.telegram_chat_id is None: return Failure('telegram_chat_id cannot be blank') return Success()
def __get_us_phone_number(self): try: phone_numbers = \ self.client.available_phone_numbers(self.COUNTRY_CODE).\ local.list(limit=self.AVAILABLE_PHONE_NUMBERS_LIMIT) except twilio.base.exceptions.TwilioException as e: return Failure(e['message']) return Success(phone_numbers[0])
def call(self): try: self.client.messages.create( body=f"Your turn", from_=self.item.banner.phone_number, to=self.item.phone_number ) return Success(self.item) except twilio.base.exceptions.TwilioException as e: return Failure(e.msg)
def sms(self, body): try: self.client.messages.create( body=body, from_=self.banner_phone_number, to=self.client_phone_number ) return Success() except twilio.base.exceptions.TwilioException as e: return Failure(e['message'])
def __buy_phone_number(self, phone_number): try: bought_number_info = self.client.incoming_phone_numbers.\ create( phone_number=phone_number, voice_url=settings.TWILIO_BANNER_CALL_CALLBACK_URL, voice_method='POST' ) except twilio.base.exceptions.TwilioRestException as e: return Failure(e.msg) return Success(bought_number_info.phone_number)
def call(self): if not self.is_transition_allowed(): return Failure( f"Queue item with {self.queue_item.state} state can" f" not be transfered to {QueueItemStatus.PROCESSING} state") self.queue_item.status = QueueItemStatus.PROCESSING self.queue_item.processing_started_at = timezone.now() result = QueueItemValidator(self.queue_item).call() if result.failed: return result self.queue_item.save() return Success(self.queue_item)
def call(self): if not self.is_transition_allowed(): return Failure( f"Queue item with {self.queue_item.state} state can" f" not be transfered to {QueueItemStatus.SKIPPED} state") self.queue_item.past = True self.queue_item.status = QueueItemStatus.SKIPPED result = QueueItemValidator(self.queue_item).call() if result.failed: return result self.queue_item.save() return Success(self.queue_item)
def call(self): result = self.validate_processed_item() if result.failed: return result result = self.validate_telegram_item() if result.failed: return result try: self.queue_item.full_clean() except ValidationError as e: return Failure(str(e)) return Success()
def call(self): if not self.is_transition_allowed(): return Failure(f"Queue item with {self.queue_item.state} state can" f" not be transfered to {QueueItemStatus.PROCESSED} state") self.queue_item.past = True self.queue_item.position = -1 self.queue_item.processing_ended_at = timezone.now() self.queue_item.status = QueueItemStatus.PROCESSED self.queue_item.waiting_time_estimation = \ ConvolveWaitingTime(queue_item=self.queue_item).call() result = QueueItemValidator(self.queue_item).call() if result.failed: return result self.queue_item.save() return Success(self.queue_item)
def next(self): if not self.banner: return Failure('banner is not found') current_item = self.banner.queue.actual().\ filter(status=QueueItemStatus.PROCESSING).first() if current_item: result = TransitToProcessedState(current_item).call() if result.failed: return result next_item = self.banner.queue.actual().first() if not next_item: # empty queue return Success() result = TransitToProcessingState(next_item).call() if result.failed: return result return NextQueueItemProcessor(item=next_item).call()
def error_msg_and_failure(self, failure_msg): self.bot.send_message(self.message.chat.id, failure_msg) return Failure(failure_msg)
def error_msg_and_failure(self, failure_msg): self.sms(body=failure_msg) return Failure(failure_msg)
def __check_number_capabilities(self, phone_number_info): if not phone_number_info.capabilities['SMS'] is False: return Success() return Failure('There is no sms capability')