masstack-python-client 0.1.0__py3-none-any.whl → 0.1.1__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.
@@ -1,4 +1,4 @@
1
- __version__ = "0.1.0"
1
+ __version__ = "0.1.1"
2
2
  __homepage__ = "https://somconnexio.coop/"
3
3
  __author__ = "Borja Gimeno <borja.gimeno@somconnexio.coop>"
4
4
  __license__ = "GPL-3.0-only"
@@ -13,7 +13,7 @@ from masstack_python_client.resources.enums.commercial_segment_name import (
13
13
  from masstack_python_client.resources.enums.customer_segment_name import (
14
14
  CustomerSegmentName,
15
15
  )
16
- from masstack_python_client.resources.utils.serialize import remove_none
16
+ from masstack_python_client.resources.utils.normalize import normalize
17
17
 
18
18
 
19
19
  class CatalogueResource(BaseResource):
@@ -61,28 +61,20 @@ class Sellable(BundledProducts):
61
61
  sale_type_name(SaleTypeName): sale type name
62
62
 
63
63
  Returns:
64
- BundledProduct
64
+ List[BundledProduct]
65
65
 
66
66
  """
67
67
  params = {
68
68
  "commercial_profile_name": commercial_profile_name,
69
- "technology_name": technology_name.value if technology_name else None,
69
+ "technology_name": technology_name,
70
70
  "territory_owner_id": territory_owner_id,
71
- "category": category.value if category else None,
72
- "customer_segment_name": (
73
- customer_segment_name.value if customer_segment_name else None
74
- ),
75
- "commercial_segment_name": (
76
- commercial_segment_name.value if commercial_segment_name else None
77
- ),
78
- "customer_type_name": (
79
- customer_type_name.value if customer_type_name else None
80
- ),
81
- "sale_type_name": sale_type_name.value if sale_type_name else None,
71
+ "category": category,
72
+ "customer_segment_name": customer_segment_name,
73
+ "commercial_segment_name": commercial_segment_name,
74
+ "customer_type_name": customer_type_name,
75
+ "sale_type_name": sale_type_name,
82
76
  }
83
- sellable_bundled_products = cls._request(
84
- method="get", params=remove_none(params)
85
- )
77
+ sellable_bundled_products = cls._request(method="get", params=normalize(params))
86
78
  return [
87
79
  BundledProduct.from_dict(**sellable_bundled_product)
88
80
  for sellable_bundled_product in sellable_bundled_products
@@ -1,7 +1,7 @@
1
1
  from dataclasses import asdict
2
2
  from masstack_python_client.resources.base import BaseResource
3
3
  from masstack_python_client.resources.models.user import UserData
4
- from masstack_python_client.resources.utils.serialize import remove_none
4
+ from masstack_python_client.resources.utils.normalize import normalize
5
5
  from masstack_python_client.resources.enums.document_type_search import (
6
6
  DocumentTypeSearch,
7
7
  )
@@ -35,7 +35,7 @@ class SignupsResource(CustomersResource):
35
35
  Returns:
36
36
  SignupsResponseData
37
37
  """
38
- payload = remove_none(asdict(customer_data))
38
+ payload = normalize(asdict(customer_data))
39
39
  result = cls._request(
40
40
  method="post",
41
41
  data=payload,
@@ -0,0 +1,6 @@
1
+ from enum import Enum
2
+
3
+
4
+ class DonorLineType(Enum):
5
+ POSTPAID = "C"
6
+ PREPAID = "P"
@@ -0,0 +1,6 @@
1
+ from enum import Enum
2
+
3
+
4
+ class OperationType(Enum):
5
+ INSTANT = 1
6
+ SCHEDULED = 2
@@ -1,5 +1,8 @@
1
1
  from dataclasses import dataclass, field
2
- from typing import List, Dict, Any
2
+ from typing import Optional, List, Dict, Any
3
+
4
+ from masstack_python_client.resources.enums.donor_line_type import DonorLineType
5
+ from masstack_python_client.resources.enums.operation_type import OperationType
3
6
 
4
7
 
5
8
  @dataclass(frozen=True)
@@ -43,13 +46,33 @@ class Info:
43
46
  )
44
47
 
45
48
 
49
+ @dataclass(frozen=True)
50
+ class PortabilityInfo:
51
+ operator_id: str
52
+ internal_portability: bool
53
+ installation_required: bool
54
+ operation_type: Optional[OperationType] = OperationType.INSTANT
55
+ donor_line_type: Optional[DonorLineType] = DonorLineType.POSTPAID
56
+
57
+
46
58
  @dataclass(frozen=True)
47
59
  class Landline:
48
60
  product_id: int
49
61
  number: str
62
+ portability_info: Optional[PortabilityInfo] = None
50
63
  services: List = field(default_factory=list)
51
64
  wants_communications: bool = False
52
- # TODO portability_info
65
+
66
+ @classmethod
67
+ def from_dict(cls, product_id, number, portability_info=None, **data) -> "Landline":
68
+ return cls(
69
+ product_id,
70
+ number,
71
+ portability_info=(
72
+ PortabilityInfo(**portability_info) if portability_info else None
73
+ ),
74
+ **data,
75
+ )
53
76
 
54
77
 
55
78
  @dataclass(frozen=True)
@@ -58,9 +81,9 @@ class Ftth:
58
81
  connection_type: str = ""
59
82
  installer: str = "MM"
60
83
  wants_communications: bool = False
61
- # TODO access_reuse
62
- # TODO access_reuse_choice
63
- # TODO iua
84
+ access_reuse: str = None
85
+ access_reuse_choice: bool = False
86
+ iua: str = None
64
87
 
65
88
 
66
89
  @dataclass(frozen=True)
@@ -85,6 +108,6 @@ class Bundle:
85
108
  territory_owner,
86
109
  installation_info=info,
87
110
  delivery_info=info,
88
- landline=Landline(**data["land_line"]),
111
+ landline=Landline.from_dict(**data["land_line"]),
89
112
  ftth=Ftth(**data["ftth"]),
90
113
  )
@@ -0,0 +1,27 @@
1
+ from enum import Enum
2
+
3
+
4
+ def normalize(obj):
5
+ """Recursively prepare an object for API serialization.
6
+
7
+ Traverses dicts and lists removing None values and converting
8
+ Enum members to their primitive values.
9
+
10
+ Args:
11
+ obj: The object to normalize. Supported types:
12
+ - dict: filters out None values and recurses on remaining values.
13
+ - list: filters out None items and recurses on remaining items.
14
+ - Enum: returns its primitive value.
15
+ - Any other type: returned as-is.
16
+
17
+ Returns:
18
+ The serialized object, ready to be sent as an API payload.
19
+ """
20
+ if isinstance(obj, dict):
21
+ return {k: normalize(v) for k, v in obj.items() if v is not None}
22
+ elif isinstance(obj, list):
23
+ return [normalize(v) for v in obj if v is not None]
24
+ elif isinstance(obj, Enum):
25
+ return obj.value
26
+ else:
27
+ return obj
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: masstack-python-client
3
- Version: 0.1.0
3
+ Version: 0.1.1
4
4
  Summary: This Python API client provides access to masmovil core API domains
5
5
  Author-email: Borja Gimeno <borja.gimeno@somconnexio.coop>
6
6
  License: GPL-3.0-only
@@ -1,4 +1,4 @@
1
- masstack_python_client/__init__.py,sha256=7LRyRZxlhx4tNNUqgKyx1-kZVfZFo92ukT_0pRZ-gV8,154
1
+ masstack_python_client/__init__.py,sha256=cIbh6HfgSC2KVnbWlTpxEt9G647-wvmPvv5wR59YVqE,154
2
2
  masstack_python_client/client.py,sha256=5b52Q2ekABi7DlZPsNobcmaJXOKzZfhKE_kHvNEqE9Q,2496
3
3
  masstack_python_client/exceptions.py,sha256=HkX1cP4Ryeas59CzIVW8N5gmnRE1x0yQUQwS3tm9QZQ,2115
4
4
  masstack_python_client/auth/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -11,8 +11,8 @@ masstack_python_client/data/street_type_translation.csv,sha256=2MGeTs0v6wVz2yRMy
11
11
  masstack_python_client/data/unit_translation.csv,sha256=34FPfaCC1eSmBfV0BbHSHJ-tktQk7YLlfT8tMxnfnys,194
12
12
  masstack_python_client/resources/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
13
13
  masstack_python_client/resources/base.py,sha256=yCzYXBjjyelWOF7lQsabtib662Goebx0h1OHJVv4OMs,1508
14
- masstack_python_client/resources/catalogue.py,sha256=a-lIaI_XfwVMgCsNqeqnC7iPYuoiUa2co2LtfRuLgWk,3732
15
- masstack_python_client/resources/customers.py,sha256=cCYAiYZuVrTd2XIdbVJdJJDcrVOHxo_pxCAHj_4oYOE,2401
14
+ masstack_python_client/resources/catalogue.py,sha256=-9Jn_en0REEN-yknuzhrY4LsSeErxN89tPPIQpTIax0,3397
15
+ masstack_python_client/resources/customers.py,sha256=fSI1SN8U4uiyYEvJQtzpUgUTtqhx7fKjYKt6bfLrOvE,2397
16
16
  masstack_python_client/resources/feasibility.py,sha256=eYGIUwMIkDIfrbgR69Um284UJh5KlR0HLOUp-0FcYKE,8425
17
17
  masstack_python_client/resources/provision.py,sha256=SfMly7_19-yxXZRuqXaxRzpHUSVIjcxO_Oq7g_K5d2A,997
18
18
  masstack_python_client/resources/enums/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -21,6 +21,8 @@ masstack_python_client/resources/enums/commercial_segment_name.py,sha256=94yOXfH
21
21
  masstack_python_client/resources/enums/customer_segment_name.py,sha256=NSQUUSUGL-vYEUe4w9deym9Vuez-QGn26hs_2fOojh0,163
22
22
  masstack_python_client/resources/enums/customer_type_name.py,sha256=mMdZh0D7qLDMxe6QYVQLGMqHqQMBAnZaPkjgE8q_D9Q,99
23
23
  masstack_python_client/resources/enums/document_type_search.py,sha256=pniXpUA_odqeKyxS6yYiN2uje0-F1kKXXBLOk0F8UTQ,136
24
+ masstack_python_client/resources/enums/donor_line_type.py,sha256=VKf4aUgSa1jXGnY062tUPreKA1PPvFvO_bXiJO9Jf5I,88
25
+ masstack_python_client/resources/enums/operation_type.py,sha256=cBfWs59HhvglpJcrTPwybsuFvsv0FTm0xW7RvMvweYQ,85
24
26
  masstack_python_client/resources/enums/sale_type_name.py,sha256=NWl5j_SkbysOGVBn4-c7gVbzynOiE44Aqj34n_1v_sU,183
25
27
  masstack_python_client/resources/enums/technology.py,sha256=ipHLhdY2EMQgmeDzJ0LnvWvdiG_Oq-JHuEb5ZIx5x3g,106
26
28
  masstack_python_client/resources/enums/technology_name.py,sha256=7h8LUyZ-2XHAxOZXelUkkFifmk9dCcwmBbWueFABfQ4,90
@@ -31,12 +33,12 @@ masstack_python_client/resources/models/client_attribute.py,sha256=rZlLjJeBVD6Ip
31
33
  masstack_python_client/resources/models/client_payment.py,sha256=yMGMTuk_07-TzXWO89sCaaZv8soTO9cT0TzfV3xQa1o,262
32
34
  masstack_python_client/resources/models/fixed_phone.py,sha256=ihF-iICz89eVhkeyRsX3pXYkODlXRpYPGJLiFiTBilM,98
33
35
  masstack_python_client/resources/models/portability.py,sha256=64WjYLyxDCNgwzmqiDgMHnfouwIyxPmQKcaBZGT50L0,926
34
- masstack_python_client/resources/models/products.py,sha256=cIuUlEKs0OfvBXtYxxUwG4vibfAlZL4uVBK7-nAL9rw,1831
36
+ masstack_python_client/resources/models/products.py,sha256=dSFZ2Cdn1xbEXlklcUr9qHfTj9tnTJcdYIcsTlHgmoc,2657
35
37
  masstack_python_client/resources/models/signup.py,sha256=Hvo5nZce1ikpUUMEoLt_2g2HipHwh4XRIz344X8_IJk,2018
36
38
  masstack_python_client/resources/models/user.py,sha256=N5mwuZN0Saxiro2UXYcCxLL6jrpIU83crHhmrdAcgE8,1080
37
- masstack_python_client/resources/utils/serialize.py,sha256=F6JxqR2M9HH0TpYKaJritnppWkYlpPztZ9ZC43FdPLg,251
38
- masstack_python_client-0.1.0.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
39
- masstack_python_client-0.1.0.dist-info/METADATA,sha256=QFUhcDcoe8BWRK2r0MxxZVwY7eI03zlg1l19eXHbrEA,4076
40
- masstack_python_client-0.1.0.dist-info/WHEEL,sha256=aeYiig01lYGDzBgS8HxWXOg3uV61G9ijOsup-k9o1sk,91
41
- masstack_python_client-0.1.0.dist-info/top_level.txt,sha256=q_iYlqJq22lhg_2O2iktARr7Mzz3QfjaW4l6J4vwyE8,23
42
- masstack_python_client-0.1.0.dist-info/RECORD,,
39
+ masstack_python_client/resources/utils/normalize.py,sha256=3XXrh4WxujpoxouKoTP1WZQomQhuirk6KW_3ZYsvBGQ,901
40
+ masstack_python_client-0.1.1.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
41
+ masstack_python_client-0.1.1.dist-info/METADATA,sha256=49OZS-pIpZySj6M4W3e3EMWmY82NM6e7zyIby9IkrCU,4076
42
+ masstack_python_client-0.1.1.dist-info/WHEEL,sha256=aeYiig01lYGDzBgS8HxWXOg3uV61G9ijOsup-k9o1sk,91
43
+ masstack_python_client-0.1.1.dist-info/top_level.txt,sha256=q_iYlqJq22lhg_2O2iktARr7Mzz3QfjaW4l6J4vwyE8,23
44
+ masstack_python_client-0.1.1.dist-info/RECORD,,
@@ -1,7 +0,0 @@
1
- def remove_none(obj):
2
- if isinstance(obj, dict):
3
- return {k: remove_none(v) for k, v in obj.items() if v is not None}
4
- elif isinstance(obj, list):
5
- return [remove_none(v) for v in obj if v is not None]
6
- else:
7
- return obj