tgshops-integrations 4.2__py3-none-any.whl → 4.5__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- tgshops_integrations/middlewares/gateway.py +31 -20
- tgshops_integrations/nocodb_connector/categories_management.py +15 -13
- tgshops_integrations/nocodb_connector/client.py +10 -0
- tgshops_integrations/nocodb_connector/model_mapping.py +33 -31
- tgshops_integrations/nocodb_connector/products_management.py +2 -2
- {tgshops_integrations-4.2.dist-info → tgshops_integrations-4.5.dist-info}/METADATA +1 -1
- {tgshops_integrations-4.2.dist-info → tgshops_integrations-4.5.dist-info}/RECORD +9 -9
- {tgshops_integrations-4.2.dist-info → tgshops_integrations-4.5.dist-info}/WHEEL +0 -0
- {tgshops_integrations-4.2.dist-info → tgshops_integrations-4.5.dist-info}/top_level.txt +0 -0
@@ -5,23 +5,13 @@ import importlib.util
|
|
5
5
|
from aiocache import cached
|
6
6
|
from models.products import ProductModel
|
7
7
|
|
8
|
-
# TODO: For test purposes, remove in production
|
9
|
-
import sys
|
10
|
-
sys.path.append('/home/latoff/Desktop/MarketBots')
|
11
|
-
|
12
8
|
from tgshops_integrations.nocodb_connector.client import NocodbClient
|
13
9
|
from tgshops_integrations.nocodb_connector.model_mapping import (
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
PRODUCT_CATEGORY_ID_LOOKUP_FIELD,
|
20
|
-
PRODUCT_NAME_FIELD,
|
21
|
-
PRODUCT_PRICE_FIELD,
|
22
|
-
PRODUCT_STOCK_FIELD,
|
23
|
-
PRODUCT_IMAGES_LOOKUP_FIELD,
|
24
|
-
PRODUCT_EXTERNAL_ID,
|
10
|
+
dump_product_data,
|
11
|
+
dump_product_data_with_check,
|
12
|
+
get_pagination_info,
|
13
|
+
parse_product_data,
|
14
|
+
initialize_model_mapping
|
25
15
|
)
|
26
16
|
from tgshops_integrations.nocodb_connector.categories_management import CategoryManager
|
27
17
|
from tgshops_integrations.nocodb_connector.products_management import ProductManager
|
@@ -36,6 +26,13 @@ def custom_key_builder(func, *args, **kwargs):
|
|
36
26
|
kwargs_key_part = "-".join(f"{key}-{value}" for key, value in sorted(kwargs.items()))
|
37
27
|
return f"{func.__name__}-{args_key_part}-{kwargs_key_part}"
|
38
28
|
|
29
|
+
def language_check(data):
|
30
|
+
if "Категории" in data.tables_list.keys():
|
31
|
+
return "RUS"
|
32
|
+
elif "Categories" in data.tables_list.keys():
|
33
|
+
return "EN"
|
34
|
+
else:
|
35
|
+
raise Exception('Language cant be extracted.')
|
39
36
|
|
40
37
|
class Gateway(NocodbClient):
|
41
38
|
|
@@ -57,8 +54,12 @@ class Gateway(NocodbClient):
|
|
57
54
|
self.special_attributes = special_attributes
|
58
55
|
self.filter_buttons = filter_buttons
|
59
56
|
|
57
|
+
self.language = "EN"
|
58
|
+
|
60
59
|
if config_path:
|
60
|
+
|
61
61
|
self.load_config_from_path(config_path)
|
62
|
+
self.config_path = config_path
|
62
63
|
|
63
64
|
def load_config_from_path(self, config_path: Path):
|
64
65
|
"""Loads configuration from the specified path."""
|
@@ -73,25 +74,35 @@ class Gateway(NocodbClient):
|
|
73
74
|
"""Loads necessary data including tables, categories, and products."""
|
74
75
|
self.SOURCE = SOURCE
|
75
76
|
self.tables_list = await self.get_all_tables()
|
76
|
-
|
77
|
+
|
78
|
+
language = language_check(self)
|
79
|
+
initialize_model_mapping(self.config_path,language=language)
|
80
|
+
|
81
|
+
self.products_table = self.tables_list[self.config.NOCODB_TABLES[language]["NOCODB_PRODUCTS"]]
|
77
82
|
self.category_manager = CategoryManager(
|
78
|
-
table_id=self.tables_list[self.config.NOCODB_CATEGORIES],
|
83
|
+
table_id=self.tables_list[self.config.NOCODB_TABLES[language]["NOCODB_CATEGORIES"]],
|
79
84
|
NOCODB_HOST=self.NOCODB_HOST,
|
80
85
|
NOCODB_API_KEY=self.NOCODB_API_KEY,
|
81
86
|
logging=True,
|
82
87
|
filter_buttons=self.filter_buttons,
|
88
|
+
config=self.config,
|
89
|
+
language=language
|
83
90
|
)
|
84
91
|
self.product_manager = ProductManager(
|
85
|
-
table_id=self.tables_list[self.config.NOCODB_PRODUCTS],
|
92
|
+
table_id=self.tables_list[self.config.NOCODB_TABLES[language]["NOCODB_PRODUCTS"]],
|
86
93
|
NOCODB_HOST=self.NOCODB_HOST,
|
87
94
|
NOCODB_API_KEY=self.NOCODB_API_KEY,
|
88
95
|
logging=True,
|
96
|
+
config=self.config,
|
97
|
+
language=language
|
89
98
|
)
|
90
99
|
|
91
100
|
@cached(ttl=60, key_builder=custom_key_builder)
|
92
101
|
async def update_attributes(self, products: List[ProductModel]):
|
93
102
|
"""Updates attributes for the product table."""
|
94
|
-
system_attributes = [PRODUCT_EXTERNAL_ID,
|
103
|
+
system_attributes = [self.config.NOCODB_PRODUCTS[self.language]['PRODUCT_EXTERNAL_ID'],
|
104
|
+
self.config.NOCODB_PRODUCTS[self.language]['PRODUCT_IMAGES_LOOKUP_FIELD']]
|
105
|
+
|
95
106
|
attributes = await self.get_table_meta(table_name=self.products_table)
|
96
107
|
self.columns = [item['title'].lower() for item in attributes.get('columns', [])]
|
97
108
|
|
@@ -127,7 +138,7 @@ class Gateway(NocodbClient):
|
|
127
138
|
special_attributes=self.special_attributes,
|
128
139
|
)
|
129
140
|
if current_hash != existing_hash:
|
130
|
-
await self.product_manager.update_product(product=product)
|
141
|
+
await self.product_manager.update_product(product=product,data_check=self.category_manager.categories)
|
131
142
|
else:
|
132
143
|
checked_data = dump_product_data_with_check(
|
133
144
|
data=product,
|
@@ -5,12 +5,6 @@ from tgshops_integrations.models.categories import CategoryModel, CategoryRespon
|
|
5
5
|
from tgshops_integrations.models.products import ProductModel
|
6
6
|
from tgshops_integrations.nocodb_connector.client import custom_key_builder, NocodbClient
|
7
7
|
from tgshops_integrations.nocodb_connector.model_mapping import (
|
8
|
-
# CATEGORY_IMAGE_FIELD,
|
9
|
-
CATEGORY_NAME_FIELD,
|
10
|
-
CATEGORY_PARENT_FIELD,
|
11
|
-
CATEGORY_PARENT_ID_FIELD,
|
12
|
-
PRODUCT_NAME_FIELD,
|
13
|
-
CATEGORY_ID_OF_CATEGORY_FIELD,
|
14
8
|
dump_category_data,
|
15
9
|
get_pagination_info,
|
16
10
|
parse_category_data,
|
@@ -26,19 +20,27 @@ class CategoryManager(NocodbClient):
|
|
26
20
|
NOCODB_API_KEY=None,
|
27
21
|
SOURCE=None,
|
28
22
|
filter_buttons=None,
|
23
|
+
config=None,
|
24
|
+
language="EN"
|
29
25
|
):
|
30
26
|
super().__init__(NOCODB_HOST=NOCODB_HOST, NOCODB_API_KEY=NOCODB_API_KEY, SOURCE=SOURCE)
|
31
27
|
self.NOCODB_HOST = NOCODB_HOST
|
32
28
|
self.NOCODB_API_KEY = NOCODB_API_KEY
|
33
29
|
self.SOURCE = SOURCE
|
34
30
|
self.CONFIG_TYPE = config_type
|
31
|
+
|
32
|
+
self.config=config
|
33
|
+
self.language=language
|
35
34
|
self.categories_table = table_id
|
36
35
|
self.external_categories = {}
|
37
36
|
self.logging = logging
|
38
37
|
self.filter_categories = []
|
39
38
|
self.filter_buttons = filter_buttons or []
|
40
|
-
self.required_fields = [CATEGORY_NAME_FIELD]
|
41
|
-
self.projection = ["Id",
|
39
|
+
self.required_fields = self.config.NOCODB_CATEGORIES[self.language]['CATEGORY_NAME_FIELD']
|
40
|
+
self.projection = ["Id",
|
41
|
+
self.config.NOCODB_CATEGORIES[self.language]["CATEGORY_NAME_FIELD"],
|
42
|
+
self.config.NOCODB_CATEGORIES[self.language]["CATEGORY_PARENT_ID_FIELD"],
|
43
|
+
self.config.NOCODB_CATEGORIES[self.language]["CATEGORY_ID_OF_CATEGORY_FIELD"]]
|
42
44
|
|
43
45
|
@cached(ttl=30, key_builder=custom_key_builder)
|
44
46
|
async def get_categories(self, table_id: str) -> List[CategoryModel]:
|
@@ -71,9 +73,9 @@ class CategoryManager(NocodbClient):
|
|
71
73
|
@cached(ttl=30, key_builder=custom_key_builder)
|
72
74
|
async def get_categories_in_category(self, table_id: str, category_id: str) -> List[CategoryModel]:
|
73
75
|
extra_where = (
|
74
|
-
f"({CATEGORY_PARENT_ID_FIELD},eq,{category_id})"
|
76
|
+
f"({self.config.NOCODB_CATEGORIES[self.language]['CATEGORY_PARENT_ID_FIELD']},eq,{category_id})"
|
75
77
|
if category_id
|
76
|
-
else f"({CATEGORY_PARENT_FIELD},eq,0)"
|
78
|
+
else f"({self.config.NOCODB_CATEGORIES[self.language]['CATEGORY_PARENT_FIELD']},eq,0)"
|
77
79
|
)
|
78
80
|
records = await self.get_table_records(
|
79
81
|
table_name=self.categories_table,
|
@@ -84,7 +86,7 @@ class CategoryManager(NocodbClient):
|
|
84
86
|
return [parse_category_data(record) for record in records]
|
85
87
|
|
86
88
|
async def update_categories(self, external_products: List[ProductModel],with_properties: bool = False) -> None:
|
87
|
-
self.categories = await self.get_product_categories(table_id=self.categories_table, table_name=PRODUCT_NAME_FIELD)
|
89
|
+
self.categories = await self.get_product_categories(table_id=self.categories_table, table_name=self.config.NOCODB_PRODUCTS[self.language]['PRODUCT_NAME_FIELD'])
|
88
90
|
categories_list = list(self.categories.keys())
|
89
91
|
properties_to_create = []
|
90
92
|
parent_id=0
|
@@ -121,13 +123,13 @@ class CategoryManager(NocodbClient):
|
|
121
123
|
table_id=self.categories_table,
|
122
124
|
category_name=product_property,
|
123
125
|
category_id=new_id,
|
124
|
-
table_name=PRODUCT_NAME_FIELD,
|
126
|
+
table_name=self.config.NOCODB_PRODUCTS[self.language]['PRODUCT_NAME_FIELD'],
|
125
127
|
)
|
126
128
|
if self.logging:
|
127
129
|
logger.info(f"New Category: {new_property}")
|
128
130
|
new_id += 1
|
129
131
|
|
130
|
-
self.categories = await self.get_product_categories(table_id=self.categories_table, table_name=PRODUCT_NAME_FIELD)
|
132
|
+
self.categories = await self.get_product_categories(table_id=self.categories_table, table_name=self.config.NOCODB_PRODUCTS[self.language]['PRODUCT_NAME_FIELD'])
|
131
133
|
|
132
134
|
async def link_categories(self, parent_id: int, child_id: int):
|
133
135
|
metadata = await self.get_table_meta(self.categories_table)
|
@@ -92,6 +92,16 @@ class NocodbClient:
|
|
92
92
|
if response.status_code == 200:
|
93
93
|
return response.json()
|
94
94
|
raise Exception(response.text)
|
95
|
+
|
96
|
+
async def update_table_record(self, table_name: str, record_id: str, updated_data: dict) -> bool:
|
97
|
+
url = f"{self.NOCODB_HOST}/tables/{table_name}/records"
|
98
|
+
updated_data["id"] = int(record_id)
|
99
|
+
if updated_data["ID"]:
|
100
|
+
updated_data.pop("ID")
|
101
|
+
response = await self.httpx_client.patch(url, json=updated_data)
|
102
|
+
if response.status_code == 200:
|
103
|
+
return True
|
104
|
+
raise Exception(response.text)
|
95
105
|
|
96
106
|
async def create_table_record(self, table_name: str, record: dict) -> dict:
|
97
107
|
"""
|
@@ -6,7 +6,6 @@ from pathlib import Path
|
|
6
6
|
from tgshops_integrations.models.categories import CategoryModel, CategoryResponseModel, PaginationResponseModel
|
7
7
|
from tgshops_integrations.models.products import ExtraAttribute, ProductModel
|
8
8
|
|
9
|
-
|
10
9
|
# Helper function to load `config.py` dynamically
|
11
10
|
def load_config(config_path: str):
|
12
11
|
"""
|
@@ -23,7 +22,7 @@ def load_config(config_path: str):
|
|
23
22
|
|
24
23
|
|
25
24
|
# Initialize model mapping constants dynamically from config
|
26
|
-
def initialize_model_mapping(config_path: str):
|
25
|
+
def initialize_model_mapping(config_path: str,language="EN"):
|
27
26
|
"""
|
28
27
|
Load and initialize global constants for model mapping from a config file.
|
29
28
|
"""
|
@@ -33,38 +32,41 @@ def initialize_model_mapping(config_path: str):
|
|
33
32
|
global PRODUCT_IMAGE_FIELD, PRODUCT_DISCOUNT_PRICE_FIELD, PRODUCT_CATEGORY_ID_LOOKUP_FIELD, PRODUCT_IMAGES_LOOKUP_FIELD
|
34
33
|
global PRODUCT_REQUIRED_OPTIONS_FIELD, PRODUCT_CATEGORIES_EXTRA_OPTIONS_FIELD, PRODUCT_CATEGORIES_EXTRA_OPTION_NAMES_FIELD
|
35
34
|
global PRODUCT_EXTRA_CHOICE_REQUIRED_FIELD, PRODUCT_ID_FIELD, PRODUCT_EXTERNAL_ID, PRODUCT_CHECKOUT_MODE
|
36
|
-
global NEW_ID_FIELD,
|
35
|
+
global NEW_ID_FIELD, NOBBLESHOMES_CHECKOUT_MODES,PRODUCT_CATEGORY_STRUCTURE
|
37
36
|
|
38
37
|
config = load_config(config_path)
|
39
38
|
|
40
|
-
CATEGORY_IMAGE_FIELD = config.CATEGORY_IMAGE_FIELD
|
41
39
|
ID_FIELD = config.ID_FIELD
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
40
|
+
CATEGORY_IMAGE_FIELD = config.NOCODB_CATEGORIES[language]["CATEGORY_IMAGE_FIELD"]
|
41
|
+
CATEGORY_NAME_FIELD = config.NOCODB_CATEGORIES[language]["CATEGORY_NAME_FIELD"]
|
42
|
+
CATEGORY_PARENT_ID_FIELD = config.NOCODB_CATEGORIES[language]["CATEGORY_PARENT_ID_FIELD"]
|
43
|
+
CATEGORY_PARENT_FIELD = config.NOCODB_CATEGORIES[language]["CATEGORY_PARENT_FIELD"]
|
44
|
+
CATEGORY_ID_OF_CATEGORY_FIELD = config.NOCODB_CATEGORIES[language]["CATEGORY_ID_OF_CATEGORY_FIELD"]
|
45
|
+
|
46
|
+
PRODUCT_NAME_FIELD = config.NOCODB_PRODUCTS[language]["PRODUCT_NAME_FIELD"]
|
47
|
+
PRODUCT_DESCRIPTION_FIELD = config.NOCODB_PRODUCTS[language]["PRODUCT_DESCRIPTION_FIELD"]
|
48
|
+
PRODUCT_PRICE_FIELD = config.NOCODB_PRODUCTS[language]["PRODUCT_PRICE_FIELD"]
|
49
|
+
PRODUCT_CURRENCY_FIELD = config.NOCODB_PRODUCTS[language]["PRODUCT_CURRENCY_FIELD"]
|
50
|
+
PRODUCT_STOCK_FIELD = config.NOCODB_PRODUCTS[language]["PRODUCT_STOCK_FIELD"]
|
51
|
+
PRODUCT_CATEGORY_NAME_FIELD = config.NOCODB_PRODUCTS[language]["PRODUCT_CATEGORY_NAME_FIELD"]
|
52
|
+
PRODUCT_CATEGORY_STRUCTURE = config.NOCODB_PRODUCTS[language]["PRODUCT_CATEGORY_STRUCTURE"]
|
53
|
+
PRODUCT_CATEGORY_ID_FIELD = config.NOCODB_PRODUCTS[language]["PRODUCT_CATEGORY_ID_FIELD"]
|
54
|
+
PRODUCT_IMAGE_FIELD = config.NOCODB_PRODUCTS[language]["PRODUCT_IMAGE_FIELD"]
|
55
|
+
PRODUCT_DISCOUNT_PRICE_FIELD = config.NOCODB_PRODUCTS[language]["PRODUCT_DISCOUNT_PRICE_FIELD"]
|
56
|
+
PRODUCT_CATEGORY_ID_LOOKUP_FIELD = config.NOCODB_PRODUCTS[language]["PRODUCT_CATEGORY_ID_LOOKUP_FIELD"]
|
57
|
+
PRODUCT_IMAGES_LOOKUP_FIELD = config.NOCODB_PRODUCTS[language]["PRODUCT_IMAGES_LOOKUP_FIELD"]
|
58
|
+
PRODUCT_REQUIRED_OPTIONS_FIELD = config.NOCODB_PRODUCTS[language]["PRODUCT_REQUIRED_OPTIONS_FIELD"]
|
59
|
+
PRODUCT_CATEGORIES_EXTRA_OPTIONS_FIELD = config.NOCODB_PRODUCTS[language]["PRODUCT_CATEGORIES_EXTRA_OPTIONS_FIELD"]
|
60
|
+
PRODUCT_CATEGORIES_EXTRA_OPTION_NAMES_FIELD = config.NOCODB_PRODUCTS[language]["PRODUCT_CATEGORIES_EXTRA_OPTION_NAMES_FIELD"]
|
61
|
+
PRODUCT_EXTRA_CHOICE_REQUIRED_FIELD = config.NOCODB_PRODUCTS[language]["PRODUCT_EXTRA_CHOICE_REQUIRED_FIELD"]
|
62
|
+
PRODUCT_ID_FIELD = config.NOCODB_PRODUCTS[language]["PRODUCT_ID_FIELD"]
|
63
|
+
PRODUCT_EXTERNAL_ID = config.NOCODB_PRODUCTS[language]["PRODUCT_EXTERNAL_ID"]
|
64
|
+
PRODUCT_CHECKOUT_MODE = config.NOCODB_PRODUCTS[language]["PRODUCT_CHECKOUT_MODE"]
|
65
|
+
|
66
66
|
NEW_ID_FIELD = config.NEW_ID_FIELD
|
67
|
-
|
67
|
+
|
68
|
+
#TODO should be in config for task, the selling modes
|
69
|
+
NOBBLESHOMES_CHECKOUT_MODES = config.NOBBLESHOMES_CHECKOUT_MODES
|
68
70
|
|
69
71
|
|
70
72
|
def get_pagination_info(page_info: dict) -> PaginationResponseModel:
|
@@ -150,7 +152,7 @@ def dump_product_data_with_check(data: ProductModel, data_check: dict) -> dict:
|
|
150
152
|
PRODUCT_CATEGORY_NAME_FIELD: [data.product_properties] if data.product_properties else None,
|
151
153
|
PRODUCT_CATEGORY_ID_FIELD: [{"Id": data_check[item]} for item in data.product_properties] if data.product_properties else None,
|
152
154
|
PRODUCT_IMAGE_FIELD: preview_url,
|
153
|
-
PRODUCT_CHECKOUT_MODE:
|
155
|
+
PRODUCT_CHECKOUT_MODE: NOBBLESHOMES_CHECKOUT_MODES,
|
154
156
|
PRODUCT_DISCOUNT_PRICE_FIELD: data.final_price,
|
155
157
|
}
|
156
158
|
|
@@ -163,7 +165,7 @@ async def parse_product_data(data: dict) -> ProductModel:
|
|
163
165
|
"""
|
164
166
|
Parses raw product data into a ProductModel.
|
165
167
|
"""
|
166
|
-
preview_url = [image['url'] for image in data.get(PRODUCT_IMAGE_FIELD, [])]
|
168
|
+
preview_url = [image['url'] for image in data.get(PRODUCT_IMAGE_FIELD, []) if image['url']]
|
167
169
|
|
168
170
|
# Dynamically add extra attributes
|
169
171
|
extra_attributes = [
|
@@ -98,11 +98,11 @@ class ProductManager(NocodbClient):
|
|
98
98
|
)
|
99
99
|
return [parse_product_data(record) for record in records]
|
100
100
|
|
101
|
-
async def update_product(self, product: ProductModel):
|
101
|
+
async def update_product(self, product: ProductModel,data_check=[]):
|
102
102
|
"""
|
103
103
|
Updates an existing product in the table.
|
104
104
|
"""
|
105
|
-
data = dump_product_data_with_check(data=product, data_check=
|
105
|
+
data = dump_product_data_with_check(data=product, data_check=data_check)
|
106
106
|
await self.update_table_record(
|
107
107
|
table_name=self.products_table,
|
108
108
|
record_id=product.id,
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: tgshops-integrations
|
3
|
-
Version: 4.
|
3
|
+
Version: 4.5
|
4
4
|
Summary: Library is intended to provide the integration of the external service or CRM system with the TelegramShops/It allows to configure the relationship between NocoDB list of the products used further to display in the shop/As a resultss the products can be synchronized and updated uppon the request.
|
5
5
|
Home-page: https://git.the-devs.com/virtual-shops/shop-system/shop-backend-integrations/integration-library/integration-library
|
6
6
|
Author: Dimi Latoff
|
@@ -1,16 +1,16 @@
|
|
1
1
|
tgshops_integrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
2
2
|
tgshops_integrations/middlewares/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
3
|
-
tgshops_integrations/middlewares/gateway.py,sha256=
|
3
|
+
tgshops_integrations/middlewares/gateway.py,sha256=2czpeJ0oGNHxAdXysyk3jKnKKwgrJbFaN6OY3fTeSp0,6868
|
4
4
|
tgshops_integrations/models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
5
5
|
tgshops_integrations/models/categories.py,sha256=EG6C8g5dOfXB2MH-vtqH13aqB7_VyOobY2FHpDb-fsY,977
|
6
6
|
tgshops_integrations/models/products.py,sha256=4XC6fyC91TAWj5oaX0A26kT_UizZIGaf4qyrVv9lPpQ,1403
|
7
7
|
tgshops_integrations/nocodb_connector/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
8
|
-
tgshops_integrations/nocodb_connector/categories_management.py,sha256=
|
9
|
-
tgshops_integrations/nocodb_connector/client.py,sha256=
|
10
|
-
tgshops_integrations/nocodb_connector/model_mapping.py,sha256=
|
11
|
-
tgshops_integrations/nocodb_connector/products_management.py,sha256=
|
8
|
+
tgshops_integrations/nocodb_connector/categories_management.py,sha256=jVbgkKmCDUuGj1zZyIO041m0pvQRnV0pyEZGnwDa2U4,7921
|
9
|
+
tgshops_integrations/nocodb_connector/client.py,sha256=3MLTOLInxhsr4H0nt71k09ozgUyRzGV2onYZuFWQJzI,12487
|
10
|
+
tgshops_integrations/nocodb_connector/model_mapping.py,sha256=rTzBH6lKbxcLTvlOSVkIriSOYjnwhqIHx0wiXPTxHwo,9540
|
11
|
+
tgshops_integrations/nocodb_connector/products_management.py,sha256=q0zrlybfnnXeAiqDpchV_zq4BoMJUS6q2zid1eshSM0,6179
|
12
12
|
tgshops_integrations/nocodb_connector/tables.py,sha256=ha_QXZXd93mht0fR5E1nM0wUpz1ePon-pIdO2HI67l8,356
|
13
|
-
tgshops_integrations-4.
|
14
|
-
tgshops_integrations-4.
|
15
|
-
tgshops_integrations-4.
|
16
|
-
tgshops_integrations-4.
|
13
|
+
tgshops_integrations-4.5.dist-info/METADATA,sha256=6ZcGuG7uliCX-UbfUGrPnANkXMVb-7l9EPCIFHcoSk8,2844
|
14
|
+
tgshops_integrations-4.5.dist-info/WHEEL,sha256=pkctZYzUS4AYVn6dJ-7367OJZivF2e8RA9b_ZBjif18,92
|
15
|
+
tgshops_integrations-4.5.dist-info/top_level.txt,sha256=HFNtxqDpzmlF4ZLnMiwhbU7pOa_YozxU2zBl0bnUmcY,21
|
16
|
+
tgshops_integrations-4.5.dist-info/RECORD,,
|
File without changes
|
File without changes
|