def test_manager_get_plugin_configuration(plugin_configuration):
    plugins = [
        "tests.plugins.sample_plugins.PluginSample",
        "tests.plugins.sample_plugins.PluginInactive",
    ]
    manager = PluginsManager(plugins=plugins)
    plugin = manager.get_plugin("PluginSample")
    configuration_from_db = PluginConfiguration.objects.get(name="PluginSample")
    assert plugin.DEFAULT_CONFIGURATION == configuration_from_db.configuration
Esempio n. 2
0
def test_manager_get_plugin_configuration(plugin_configuration):
    plugins = [
        "saleor.plugins.tests.sample_plugins.PluginSample",
        "saleor.plugins.tests.sample_plugins.PluginInactive",
    ]
    manager = PluginsManager(plugins=plugins)
    plugin = manager.get_plugin(PluginSample.PLUGIN_ID)
    configuration_from_db = PluginConfiguration.objects.get(
        identifier=PluginSample.PLUGIN_ID
    )
    assert plugin.DEFAULT_CONFIGURATION == configuration_from_db.configuration
Esempio n. 3
0
def synchronize_allegro_offers_task():
    manage = PluginsManager(plugins=["saleor.plugins.allegro.plugin.AllegroPlugin"])
    plugin_configs = manage.get_plugin(AllegroPlugin.PLUGIN_ID)
    conf = {item["name"]: item["value"] for item in plugin_configs.configuration}
    token = conf.get('token_value')
    env = conf.get('env')
    allegro_api = AllegroAPI(token, env)
    params = {'publication.status': ['ACTIVE'], 'limit': '1', 'offset': 0}
    response = allegro_api.get_request('sale/offers', params)
    total_count = json.loads(response.text).get('totalCount')

    if total_count is None:
        return
    limit = 1000
    errors = []
    updated_amount = 0

    for i in range(int(int(total_count) / limit) + 1):
        offset = i * limit
        params = {'publication.status': ['ACTIVE'], 'limit': limit, 'offset': offset}
        response = allegro_api.get_request('sale/offers', params)
        logger.info(
            f'Fetching 1000 offers status: {response.status_code}, offset: {offset}')
        offers = json.loads(response.text).get('offers')
        if offers:
            skus = [offer.get('external').get('id') for offer in offers]
            product_variants = list(
                ProductVariant.objects.select_related('product').filter(sku__in=skus))
            products_to_update = []
            for offer in offers:
                product_errors = []
                sku = offer.get('external').get('id')
                offer_id = offer.get('id')
                variant = next((x for x in product_variants if x.sku == sku), None)
                if variant:
                    product = variant.product
                    product_errors = valid_product(product)
                    if product.private_metadata.get('publish.allegro.id') != offer_id:
                        product.private_metadata['publish.allegro.id'] = offer_id
                        products_to_update.append(product)
                else:
                    product_errors.append('nie znaleziono produktu o podanym SKU')

                if product_errors:
                    errors.append({'sku': sku, 'errors': product_errors})

            if products_to_update:
                Product.objects.bulk_update(products_to_update, ['private_metadata'])
                updated_amount += len(products_to_update)

    html_errors_list = plugin_configs.create_table(errors)

    send_mail(html_errors_list, updated_amount)
def test_plugin_add_new_configuration(
    new_config, new_config_structure, monkeypatch,
):
    monkeypatch.setattr(PluginInactive, "DEFAULT_ACTIVE", True)
    monkeypatch.setattr(
        PluginInactive, "DEFAULT_CONFIGURATION", [new_config],
    )
    config_structure = {"Foo": new_config_structure}
    monkeypatch.setattr(PluginInactive, "CONFIG_STRUCTURE", config_structure)
    manager = PluginsManager(plugins=["tests.plugins.sample_plugins.PluginInactive"])
    plugin = manager.get_plugin("PluginInactive")
    assert len(plugin.configuration) == 1
    assert plugin.configuration[0] == {**new_config, **new_config_structure}
def test_plugin_updates_configuration_shape(
    new_config, new_config_structure, plugin_configuration, monkeypatch,
):

    config_structure = PluginSample.CONFIG_STRUCTURE.copy()
    config_structure["Foo"] = new_config_structure
    monkeypatch.setattr(PluginSample, "CONFIG_STRUCTURE", config_structure)

    monkeypatch.setattr(
        PluginSample,
        "DEFAULT_CONFIGURATION",
        plugin_configuration.configuration + [new_config],
    )

    manager = PluginsManager(plugins=["tests.plugins.sample_plugins.PluginSample"])
    plugin = manager.get_plugin("PluginSample")

    assert len(plugin.configuration) == 5
    assert plugin.configuration[-1] == {**new_config, **new_config_structure}
 def handle(self, *args, **options):
     manage = PluginsManager(
         plugins=["saleor.plugins.allegroSync.plugin.AllegroSyncPlugin"])
     plugin = manage.get_plugin(AllegroSyncPlugin.PLUGIN_ID)
     plugin.type = options['type']
     plugin.synchronize_allegro_offers()
    def remove_null_values_from_allegro_offers(self, options):

        manage = PluginsManager(
            plugins=["saleor.plugins.allegro.plugin.AllegroPlugin"])
        plugin_configs = manage.get_plugin(AllegroPlugin.PLUGIN_ID)
        conf = {
            item["name"]: item["value"]
            for item in plugin_configs.configuration
        }
        token = conf.get('token_value')
        self.allegro_api = AllegroAPI(token)

        data = self.read_csv(options['path'])

        skus = data['sku']
        product_variants = list(ProductVariant.objects.filter(sku__in=skus))

        sku_errors = []

        for product_variant in product_variants:

            self.product = {}
            errors = []

            if product_variant:
                saleor_product = product_variant.product
                allegro_id = saleor_product.private_metadata.get(
                    'publish.allegro.id')

                if allegro_id is not None:
                    category_id = saleor_product.product_type.metadata.get(
                        'allegro.mapping.categoryId')

                    require_parameters = self.allegro_api.get_require_parameters(
                        category_id)

                    parameters_mapper = ParametersMapperFactory().get_mapper()

                    parameters = parameters_mapper.set_product(
                        saleor_product).set_require_parameters(
                            require_parameters).run_mapper()

                    product_mapper = ProductMapperFactory().get_mapper()

                    try:
                        product = product_mapper.set_saleor_product(saleor_product) \
                        .set_saleor_images(self.allegro_api.upload_images(saleor_product)) \
                        .set_saleor_parameters(parameters).set_category(
                        category_id).set_obj_publication_starting_at('2020-10-10 10:10').\
                            set_offer_type('AUCTION').run_mapper()
                    except:
                        pass

                    offer = self.allegro_api.update_allegro_offer(
                        allegro_product=product, allegro_id=allegro_id)

                    if 'error' in offer:
                        errors.append(offer.get('error_description'))

                    elif 'errors' in offer:
                        errors += offer['errors']

                    elif offer['validation'].get('errors') is not None:
                        if len(offer['validation'].get('errors')) > 0:
                            for error in offer['validation'].get('errors'):
                                errors.append(error['message'])
                else:
                    errors.append('produkt nie ma allegro id')

                sku_errors.append({
                    'sku': product_variant.sku,
                    'errors': errors
                })

        html_errors_list = plugin_configs.create_table(sku_errors)
        return self.send_mail(html_errors_list, options)