Beispiel #1
0
    def __init__(self, app):
        super().__init__()
        self.app = app
        self.showMaximized()
        self.image_service = ImageService()
        self.storage_service = StorageService()
        self.stacked_widget = QStackedWidget()
        self.stacked_widget.showMaximized()

        self.main_widget = MainWidget(self)
        self.settings_widget = SettingsWidget(self, Settings())
        self.pattern_widget = PatternWidget(self, Pattern())

        self.stacked_widget.addWidget(self.main_widget)
        self.stacked_widget.addWidget(self.pattern_widget)
        self.stacked_widget.addWidget(self.settings_widget)

        self.setCentralWidget(self.stacked_widget)

        self.selected_pattern_name = None
        self.selected_settings_name = None
        self.pattern = None
        self.settings = None
        self._create_actions()
        self._set_menu_bar()
        self._set_tool_bar()
        self.errors_color = QColor(255, 0, 0)
    def notify(ch, method, pros, data):
        body = json.loads(data.decode("utf-8"))

        group_id = body.get("group_id")
        user_id = body.get("user")
        notification_platform_name = body.get("provider")

        if not notification_platform_name:
            return None

        storage_service = StorageService()
        users_phones = storage_service.get_users(group_id=group_id,
                                                 user_id=user_id)
        platform_instance = PlatformFactory.platform(
            platform_name=notification_platform_name)
        users = platform_instance.build_platform_users_object(
            users_phones_list=users_phones)

        body.update({"users": users})

        return platform_instance.notify(notification_payload=body)
Beispiel #3
0
class StorageServiceTest(unittest.TestCase):
    def setUp(self):
        self.storage_service = StorageService()
        self.pattern_name = 'test_pattern'
        self.pattern = self.create_pattern(self.pattern_name)
        self.settings_name = 'test_settings'
        self.settings = Settings(self.settings_name)

    def create_pattern(self, pattern_name):
        bin_image = np.random.randint(2, size=(20, 10))
        bin_image[bin_image == 1] = 255
        keypoints = [
            cv2.KeyPoint(5, 5, 2, -1, 0, 0, -1),
            cv2.KeyPoint(2, 2, 1, -1, 1, 1, -1)
        ]
        descriptors = np.random.randint(256, size=(len(keypoints), 32))
        return Pattern(pattern_name, bin_image, keypoints, descriptors)

    def test_pattern(self):
        self.storage_service.save_pattern(self.pattern, overwrite=True)
        pattern = self.storage_service.load_pattern(self.pattern_name)
        self.assertEqual(self.pattern, pattern)

    def test_settings(self):
        self.storage_service.save_settings(self.settings, overwrite=True)
        settings = self.storage_service.load_settings(self.settings_name)
        self.assertEqual(self.settings, settings)
Beispiel #4
0
    def platform_response(self, exception, notification_payload):
        """
            ## Trying to fix rate-limit or service down by retrying.
            ## After max of retries are exceeded we will log the payload
        """
        exception_code = exception.code
        exception_message = exception.msg

        remaining_retries = \
            notification_payload.get("remaining_retries", settings.NOTIFICATION_SENDING_MAX_TRIES + 1) - 1
        logged = notification_payload.get("logged", False)

        if exception_code in TwilioExceptionsCodes.RATE_LIMIT_LIST_CODES_EXCEPTION and remaining_retries > 0:
            self.message_queue_dep.send(message=notification_payload)
        elif not logged:
            notification_payload.update({
                "exception_code": exception_code,
                "exception_message": exception_message,
                "logged": True
            })
            notification_payload.pop("_id", None)
            storage_service = StorageService()
            storage_service.insert_failure(doc_data=notification_payload)
Beispiel #5
0
    def platform_response(self, exception, notification_payload):
        """
            # TODO check FCM exceptions to differentiate between
                ## Exceptions that we need to log it for monitoring
                ## Exceptions such as rate-limit or service down to retry.
        """
        remaining_retries = \
            notification_payload.get("remaining_retries", settings.NOTIFICATION_SENDING_MAX_TRIES + 1) - 1
        logged = notification_payload.get("logged", False)

        notification_payload.update({
            "exception_message": exception.__repr__(),
            "remaining_retries": remaining_retries,
            "logged": logged
        })

        if remaining_retries == 0:
            notification_payload.pop("_id", None)
            storage_service = StorageService()
            storage_service.insert_failure(doc_data=notification_payload)
            notification_payload.update({"logged": True})

        if remaining_retries > 0:
            self.message_queue_dep.send(message=notification_payload)
Beispiel #6
0
    def __init__(self, parent, model):
        super().__init__()
        self.parent = parent
        self.model = model

        self.storage_service = StorageService()
        self.image_service = ImageService()
        self.image_widget = ImageWidget(self)
        self.model_box = self._create_model_box()

        self.hbox = QHBoxLayout()
        self.hbox.addWidget(self.image_widget)
        self.hbox.addWidget(self.model_box)
        self.model_box.setMaximumWidth(550)
        self.setLayout(self.hbox)
 def __init__(self, message_helper):
     self.storage_service = StorageService()
     self.message_helper = message_helper
class StorageHelper:
    def __init__(self, message_helper):
        self.storage_service = StorageService()
        self.message_helper = message_helper

    def add_new_transaction(self, transactions: List[StandardTransaction]):
        """
            Проверяем есть ли новые транзации, и возвращаем только новые
        :param transaction:
        :return:
        """
        # Запрос к СУБД на предмет новых транзакций
        session = self.storage_service.create_session()

        for item in transactions:
            db_item = session.query(StandardTransaction).filter_by(
                orderID=item.orderID).first()
            if not db_item:
                # Добавить в хранилище
                session.add(item)
                self.message_helper.send_notify("New transaction: \n" +
                                                item.to_telegram_str())

            elif db_item.ordStatus == "Filled":
                # Пропускаем транзацкию если она завершена
                continue

            elif db_item.ordStatus == "Canceled":
                # Пропускаем транзацкию если она завершена
                continue
            else:
                if item.ordStatus != db_item.ordStatus:
                    session.query(StandardTransaction).filter_by(orderID=item.orderID).\
                        update({"ordStatus": item.ordStatus, "read_status": 0})
                    self.message_helper.send_notify("New status: \n" +
                                                    item.to_telegram_str())

                    if item.ordStatus == "Filled":
                        # Обновляем время завершения транзацкии что бы отчет таймера выполнить
                        self.time_filled_client_update(session, item.orderID)

        session.commit()
        session.close()

    def read_transactions(self) -> List[StandardTransaction]:
        session = self.storage_service.create_session()
        unread_transaction = session.query(StandardTransaction).filter_by(
            read_status=0).all()
        for item in unread_transaction:
            session.query(StandardTransaction).filter_by(orderID=item.orderID). \
                update({"read_status": 1})
        read_transaction = copy.deepcopy(unread_transaction)
        session.commit()
        session.close()
        return read_transaction

    def add_order(self, order: ClientTransaction):
        session = self.storage_service.create_session()
        session.add(order)
        session.commit()
        session.close()

    def update_client_transaction(self,
                                  transactions: List[StandardTransaction]):
        # Запрос к СУБД на предмет новых транзакций
        session = self.storage_service.create_session()
        # storage_transactions = session.query(Transaction).filter(Transaction.orderID.in_(array_orders)).all()
        for item in transactions:
            db_item = session.query(ClientTransaction).filter_by(
                orderID=item.orderID).first()
            if not db_item:
                pass
            else:
                if item.ordStatus != db_item.ordStatus:
                    session.query(ClientTransaction).filter_by(orderID=item.orderID). \
                        update({"ordStatus": item.ordStatus})
                    self.message_helper.send_notify("New status: \n" +
                                                    item.to_telegram_str())
        session.commit()
        session.close()

    def get_client_order_by_reference(self, orderID_reference):
        result = []
        session = self.storage_service.create_session()
        transactions = session.query(ClientTransaction).filter_by(
            orderID_reference=orderID_reference).all()
        for item in transactions:
            result.append(item.orderID)
        return result

    def is_time_up(self, orderID):
        session = self.storage_service.create_session()
        transaction = session.query(ClientTransaction).filter_by(
            orderID=orderID).first()
        if not transaction:
            return False
        if transaction.time_up == 1:
            return False
        else:
            return True

    def get_client_order(self, orderID) -> ClientTransaction:
        session = self.storage_service.create_session()
        transaction = session.query(ClientTransaction).filter_by(
            orderID=orderID).first()
        session.expunge_all()
        return transaction

    def time_up_completed(self, orderID):
        session = self.storage_service.create_session()
        session.query(ClientTransaction).filter_by(orderID=orderID). \
            update({"time_up": 1})
        session.commit()
        session.close()

    def time_filled_client_update(self, session, orderID_reference):
        time_filled_reference = datetime.datetime.utcnow().strftime(
            "%Y-%m-%dT%H:%M:%S.%fZ")
        session.query(ClientTransaction).filter_by(orderID_reference=orderID_reference). \
            update({"time_filled_reference": time_filled_reference})
Beispiel #9
0
 def setUp(self):
     self.storage_service = StorageService()
     self.pattern_name = 'test_pattern'
     self.pattern = self.create_pattern(self.pattern_name)
     self.settings_name = 'test_settings'
     self.settings = Settings(self.settings_name)
Beispiel #10
0
 def __init__(self):
     self.storage_service = StorageService()
     self.message_queue_dep = ConsumerMessageQueue()
Beispiel #11
0
 def __init__(self):
     self.storage_service = StorageService()
Beispiel #12
0
class StorageHelper:
    def __init__(self):
        self.storage_service = StorageService()

    def user_add(self, user: User):
        session = self.storage_service.create_session()
        db_item = session.query(User).filter_by(telegram_id=user.telegram_id).first()
        if not db_item:
            # Добавить в хранилище
            session.add(user)
        session.commit()
        session.close()

    def get_active_users(self)->List[User]:
        session = self.storage_service.create_session()
        db_items = session.query(User).filter_by(status=True).all()
        session.expunge_all()
        session.close()
        return db_items

    def get_stat_users(self)->List[User]:
        session = self.storage_service.create_session()
        db_items = session.query(User).options(joinedload(User.parsers)).all()
        session.expunge_all()
        session.close()
        return db_items

    def user_change_status(self, telegram_id):
        session = self.storage_service.create_session()
        db_item = session.query(User).filter_by(telegram_id=telegram_id).first()
        if db_item:
            # Добавить в хранилище
            db_item.status = not db_item.status
        session.commit()
        session.close()

    def link_add(self, url):
        session = self.storage_service.create_session()
        db_item = session.query(LinkParser).filter_by(url=url).first()
        if not db_item:
            # Добавить в хранилище
            session.add(LinkParser(url=url))
        session.commit()
        session.close()

    def get_link_parser(self)->List[LinkParser]:
        session = self.storage_service.create_session()
        db_items = session.query(LinkParser).options(joinedload(LinkParser.users)).all()
        session.expunge_all()
        session.close()
        return db_items

    def add_parser_to_user(self, telegram_id, parser_id):
        session = self.storage_service.create_session()
        db_user = session.query(User).get(telegram_id)
        db_parser = session.query(LinkParser).get(parser_id)
        if db_user:
            # Добавить в хранилище
            db_user.parsers.append(db_parser)
        session.commit()
        session.close()

    def del_parser_to_user(self, telegram_id, parser_id):
        session = self.storage_service.create_session()
        db_user = session.query(User).get(telegram_id)
        db_parser = session.query(LinkParser).get(parser_id)
        if db_user:
            # Добавить в хранилище
            db_user.parsers.remove(db_parser)
        session.commit()
        session.close()

    def get_active_parser(self):
        session = self.storage_service.create_session()
        db_items = session.query(LinkParser).options(joinedload(LinkParser.users)).all()
        active_parser = []
        for parser in db_items:
            active_users = [i for i in parser.users if (i.status and not i.user_block)]
            if active_users:
                active_parser.append(parser)
        session.expunge_all()
        session.close()
        return active_parser

    def add_products(self, products: List[Product]):
        if not products:
            return
        session = self.storage_service.create_session()
        for product in products:
            db_item = session.query(Product).filter_by(url=product.url).first()
            if not db_item:
                session.add(product)
        session.commit()
        session.close()

    def read_product(self) -> List[Product]:
        session = self.storage_service.create_session()
        unread_transaction = session.query(Product).filter_by(is_send=0).all()
        for item in unread_transaction:
            session.query(Product).filter_by(url=item.url). \
                update({"is_send": 1})
        read_product = copy.deepcopy(unread_transaction)
        session.commit()
        session.close()
        return read_product

    def link_del(self, parser_id):
        session = self.storage_service.create_session()
        db_item = session.query(LinkParser).get(parser_id)
        if db_item:
            # удалим в хранилище
            session.delete(db_item)
        session.commit()
        session.close()
Beispiel #13
0
class MainWindow(QMainWindow):
    def __init__(self, app):
        super().__init__()
        self.app = app
        self.showMaximized()
        self.image_service = ImageService()
        self.storage_service = StorageService()
        self.stacked_widget = QStackedWidget()
        self.stacked_widget.showMaximized()

        self.main_widget = MainWidget(self)
        self.settings_widget = SettingsWidget(self, Settings())
        self.pattern_widget = PatternWidget(self, Pattern())

        self.stacked_widget.addWidget(self.main_widget)
        self.stacked_widget.addWidget(self.pattern_widget)
        self.stacked_widget.addWidget(self.settings_widget)

        self.setCentralWidget(self.stacked_widget)

        self.selected_pattern_name = None
        self.selected_settings_name = None
        self.pattern = None
        self.settings = None
        self._create_actions()
        self._set_menu_bar()
        self._set_tool_bar()
        self.errors_color = QColor(255, 0, 0)

    def _create_actions(self):
        self.new_pattern_action = QAction(
            QIcon(os.path.join(ICONS_DIR, 'add.png')), "New pattern", self)
        self.new_pattern_action.triggered.connect(
            self._new_pattern_action_handler)

        self.new_settings_action = QAction(
            QIcon(os.path.join(ICONS_DIR, 'settings.png')), "New settings",
            self)
        self.new_settings_action.triggered.connect(
            self._new_settings_action_handler)

        self.next_image_action = QAction(
            QIcon(os.path.join(ICONS_DIR, 'next')), "Next image", self)
        self.next_image_action.triggered.connect(
            self._next_image_action_handler)
        self.next_image_action.setEnabled(False)

        self.errors_color_action = QAction(
            QIcon(os.path.join(ICONS_DIR, 'color.png')), "Errors marker", self)
        self.errors_color_action.triggered.connect(
            self._errors_color_action_handler)

        self.exit_action = QAction('Exit', self)
        self.exit_action.triggered.connect(self.app.quit)

    def _create_pattern_combo(self):
        self.pattern_combo = QComboBox(self)
        avaliable_pcbs = self.storage_service.get_avaliable_pattern_names()
        for name in avaliable_pcbs:
            self.pattern_combo.addItem(name)

        self.pattern_combo.activated[str].connect(
            self._selected_pattern_action_handler)

    def _create_settings_combo(self):
        self.settings_combo = QComboBox(self)
        avaliable_settings_names = self.storage_service.get_avaliable_settings_names(
        )
        for name in avaliable_settings_names:
            self.settings_combo.addItem(name)

        self.settings_combo.activated[str].connect(
            self._selected_settings_action_handler)

    def _set_menu_bar(self):
        menu_bar = self.menuBar()
        menu_file = menu_bar.addMenu('File')

        menu_file.addAction(self.new_pattern_action)
        menu_file.addAction(self.exit_action)

    def _set_tool_bar(self):
        self._create_pattern_combo()
        self._create_settings_combo()
        self.tool_bar = self.addToolBar('Tools')

        self.tool_bar.addWidget(self.pattern_combo)
        self.tool_bar.addAction(self.new_pattern_action)
        self.tool_bar.addSeparator()

        self.tool_bar.addWidget(self.settings_combo)
        self.tool_bar.addAction(self.new_settings_action)
        self.tool_bar.addAction(self.errors_color_action)
        self.tool_bar.addSeparator()

        self.tool_bar.addAction(self.next_image_action)

    def _new_pattern_action_handler(self):
        file_dialog = QFileDialog(self)
        file_dialog.setNameFilters(["All Files (*)", "Images (*.png *.jpg)"])
        file_dialog.selectNameFilter("Images (*.png *.jpg)")
        if file_dialog.exec_():
            filename = file_dialog.selectedFiles()[0]
            with wait_cursor():
                image_orig = cv2.imread(filename, cv2.IMREAD_COLOR)
                self.stacked_widget.removeWidget(self.pattern_widget)
                self.settings_widget = PatternWidget(self, Pattern())
                self.stacked_widget.addWidget(self.pattern_widget)
                self.stacked_widget.setCurrentWidget(self.pattern_widget)
                self.pattern_widget.setImage(image_orig)
                self.pattern_widget.update()

    def _new_settings_action_handler(self):
        file_dialog = QFileDialog(self)
        file_dialog.setNameFilters(["All Files (*)", "Images (*.png *.jpg)"])
        file_dialog.selectNameFilter("Images (*.png *.jpg)")
        if file_dialog.exec_():
            filename = file_dialog.selectedFiles()[0]
            with wait_cursor():
                image_orig = cv2.imread(filename, cv2.IMREAD_COLOR)
                self.stacked_widget.removeWidget(self.settings_widget)
                self.settings_widget = SettingsWidget(self, Settings())
                self.stacked_widget.addWidget(self.settings_widget)
                self.stacked_widget.setCurrentWidget(self.settings_widget)
                self.settings_widget.setImage(image_orig)
                self.settings_widget.update()

    def _next_image_action_handler(self):
        #all requirements met, don't check again
        image_orig = self.storage_service.next_image()
        if image_orig != None:
            with wait_cursor():
                images = self.image_service.transform_image(
                    image_orig, self.settings)
                images = self.image_service.compare(self.pattern, images,
                                                    self.settings)
                bgr = [
                    self.errors_color.blue(),
                    self.errors_color.green(),
                    self.errors_color.red()
                ]
                images = self.image_service.mark_errors(images, bgr)
                self.stacked_widget.removeWidget(self.main_widget)
                self.main_widget = MainWidget(self)
                self.stacked_widget.addWidget(self.main_widget)
                self.stacked_widget.setCurrentWidget(self.main_widget)
                self.main_widget.setImage(images)

    def _errors_color_action_handler(self):
        color = QColorDialog.getColor()
        if color.isValid():
            self.errors_color = color

    def _selected_pattern_action_handler(self, name):
        self.selected_pattern_name = name
        self.pattern = self.storage_service.load_pattern(
            self.selected_pattern_name)
        self._toggle_next_image_action()

    def _selected_settings_action_handler(self, name):
        self.selected_settings_name = name
        self.settings = self.storage_service.load_settings(
            self.selected_settings_name)
        self._toggle_next_image_action()

    def _toggle_next_image_action(self):
        if self.selected_pattern_name and self.selected_pattern_name != PATTERN_COMBO_NAME and self.selected_settings_name and self.selected_settings_name != SETTINGS_COMBO_NAME:
            self.next_image_action.setEnabled(True)
        else:
            self.next_image_action.setEnabled(False)

    ### PUBLIC METHODS ###

    def pattern_finished(self, pattern_name):
        if pattern_name:
            self.pattern_combo.clear()
            avaliable_pattern_names = self.storage_service.get_avaliable_pattern_names(
            )
            for name in avaliable_pattern_names:
                self.pattern_combo.addItem(name)
            index = self.pattern_combo.findText(pattern_name)
            self.pattern_combo.setCurrentIndex(index)
            self.selected_pattern_name = pattern_name
            self._toggle_next_image_action()
        self.stacked_widget.setCurrentWidget(self.main_widget)

    def settings_finished(self, settings_name):
        if settings_name:
            self.settings_combo.clear()
            avaliable_settings_names = self.storage_service.get_avaliable_settings_names(
            )
            for name in avaliable_settings_names:
                self.settings_combo.addItem(name)
            index = self.settings_combo.findText(settings_name)
            self.settings_combo.setCurrentIndex(index)
            self.selected_settings_name = name
            self._toggle_next_image_action()
        self.stacked_widget.setCurrentWidget(self.main_widget)