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.
@@ -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
- dump_product_data,
15
- dump_product_data_with_check,
16
- get_pagination_info,
17
- ID_FIELD,
18
- parse_product_data,
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
- self.products_table = self.tables_list[self.config.NOCODB_PRODUCTS]
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, PRODUCT_IMAGES_LOOKUP_FIELD]
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", CATEGORY_NAME_FIELD, CATEGORY_PARENT_ID_FIELD, CATEGORY_ID_OF_CATEGORY_FIELD]
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, NOCODB_CHECKOUT_MODES,PRODUCT_CATEGORY_STRUCTURE
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
- CATEGORY_NAME_FIELD = config.CATEGORY_NAME_FIELD
43
- CATEGORY_PARENT_ID_FIELD = config.CATEGORY_PARENT_ID_FIELD
44
- CATEGORY_PARENT_FIELD = config.CATEGORY_PARENT_FIELD
45
- CATEGORY_ID_OF_CATEGORY_FIELD = config.CATEGORY_ID_OF_CATEGORY_FIELD
46
-
47
- PRODUCT_NAME_FIELD = config.PRODUCT_NAME_FIELD
48
- PRODUCT_DESCRIPTION_FIELD = config.PRODUCT_DESCRIPTION_FIELD
49
- PRODUCT_PRICE_FIELD = config.PRODUCT_PRICE_FIELD
50
- PRODUCT_CURRENCY_FIELD = config.PRODUCT_CURRENCY_FIELD
51
- PRODUCT_STOCK_FIELD = config.PRODUCT_STOCK_FIELD
52
- PRODUCT_CATEGORY_NAME_FIELD = config.PRODUCT_CATEGORY_NAME_FIELD
53
- PRODUCT_CATEGORY_STRUCTURE=config.PRODUCT_CATEGORY_STRUCTURE
54
- PRODUCT_CATEGORY_ID_FIELD = config.PRODUCT_CATEGORY_ID_FIELD
55
- PRODUCT_IMAGE_FIELD = config.PRODUCT_IMAGE_FIELD
56
- PRODUCT_DISCOUNT_PRICE_FIELD = config.PRODUCT_DISCOUNT_PRICE_FIELD
57
- PRODUCT_CATEGORY_ID_LOOKUP_FIELD = config.PRODUCT_CATEGORY_ID_LOOKUP_FIELD
58
- PRODUCT_IMAGES_LOOKUP_FIELD = config.PRODUCT_IMAGES_LOOKUP_FIELD
59
- PRODUCT_REQUIRED_OPTIONS_FIELD = config.PRODUCT_REQUIRED_OPTIONS_FIELD
60
- PRODUCT_CATEGORIES_EXTRA_OPTIONS_FIELD = config.PRODUCT_CATEGORIES_EXTRA_OPTIONS_FIELD
61
- PRODUCT_CATEGORIES_EXTRA_OPTION_NAMES_FIELD = config.PRODUCT_CATEGORIES_EXTRA_OPTION_NAMES_FIELD
62
- PRODUCT_EXTRA_CHOICE_REQUIRED_FIELD = config.PRODUCT_EXTRA_CHOICE_REQUIRED_FIELD
63
- PRODUCT_ID_FIELD = config.PRODUCT_ID_FIELD
64
- PRODUCT_EXTERNAL_ID = config.PRODUCT_EXTERNAL_ID
65
- PRODUCT_CHECKOUT_MODE = config.PRODUCT_CHECKOUT_MODE
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
- NOCODB_CHECKOUT_MODES = config.NOCODB_CHECKOUT_MODES
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: NOCODB_CHECKOUT_MODES,
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=self.category_manager.categories)
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.2
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=aysw55ZUxBLq46hNfkRGsnJirL2CZLw0ipS0w3Gc6mY,6299
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=w2BygSOEAQcyRMvszttsRDldP2G2HN2YBlm2MjdN1HE,7481
9
- tgshops_integrations/nocodb_connector/client.py,sha256=U2rNozjluWVul-VZroQW-8b2j6nEtKrhOkFMz1L8KmI,12022
10
- tgshops_integrations/nocodb_connector/model_mapping.py,sha256=UY6QHCba8o8J28duCgAzx95agGlE1pLagkNdZLV5nro,8719
11
- tgshops_integrations/nocodb_connector/products_management.py,sha256=GfxD9nuL4ixVK4wfvITvwYHXippL1Gqfl9un8fS70Ic,6187
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.2.dist-info/METADATA,sha256=L_ljhaqjzNAoYFtZ6IpPYbKvhh52ym_zMUh1tDPQAOA,2844
14
- tgshops_integrations-4.2.dist-info/WHEEL,sha256=pkctZYzUS4AYVn6dJ-7367OJZivF2e8RA9b_ZBjif18,92
15
- tgshops_integrations-4.2.dist-info/top_level.txt,sha256=HFNtxqDpzmlF4ZLnMiwhbU7pOa_YozxU2zBl0bnUmcY,21
16
- tgshops_integrations-4.2.dist-info/RECORD,,
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,,