masstack-python-client 0.0.4__py3-none-any.whl → 0.1.0__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.
- masstack_python_client/__init__.py +1 -1
- masstack_python_client/resources/base.py +59 -0
- masstack_python_client/resources/catalogue.py +22 -43
- masstack_python_client/resources/customers.py +7 -31
- masstack_python_client/resources/enums/technology.py +7 -0
- masstack_python_client/resources/feasibility.py +85 -51
- masstack_python_client/resources/models/fixed_phone.py +6 -0
- masstack_python_client/resources/models/portability.py +44 -0
- masstack_python_client/resources/provision.py +38 -0
- {masstack_python_client-0.0.4.dist-info → masstack_python_client-0.1.0.dist-info}/METADATA +33 -24
- {masstack_python_client-0.0.4.dist-info → masstack_python_client-0.1.0.dist-info}/RECORD +14 -9
- {masstack_python_client-0.0.4.dist-info → masstack_python_client-0.1.0.dist-info}/WHEEL +0 -0
- {masstack_python_client-0.0.4.dist-info → masstack_python_client-0.1.0.dist-info}/licenses/LICENSE +0 -0
- {masstack_python_client-0.0.4.dist-info → masstack_python_client-0.1.0.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
from typing import Optional, Union
|
|
2
|
+
from masstack_python_client.client import MasstackClient
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
class BaseResource:
|
|
6
|
+
__abstract__ = True
|
|
7
|
+
|
|
8
|
+
required_class_attributes = (
|
|
9
|
+
"_api_path",
|
|
10
|
+
"_api_domain",
|
|
11
|
+
"_version",
|
|
12
|
+
)
|
|
13
|
+
|
|
14
|
+
def __init_subclass__(cls, **kwargs):
|
|
15
|
+
super().__init_subclass__(**kwargs)
|
|
16
|
+
|
|
17
|
+
if cls.__dict__.get("__abstract__", False):
|
|
18
|
+
return
|
|
19
|
+
|
|
20
|
+
missing = [
|
|
21
|
+
attr for attr in cls.required_class_attributes if not hasattr(cls, attr)
|
|
22
|
+
]
|
|
23
|
+
|
|
24
|
+
if missing:
|
|
25
|
+
raise TypeError(
|
|
26
|
+
f"{cls.__name__} missing required class attributes: "
|
|
27
|
+
f"{', '.join(missing)}"
|
|
28
|
+
)
|
|
29
|
+
|
|
30
|
+
@classmethod
|
|
31
|
+
def _get_endpoint(cls, suffix: str = "") -> str:
|
|
32
|
+
parts = [
|
|
33
|
+
cls._api_path,
|
|
34
|
+
getattr(cls, "_api_subpath", ""),
|
|
35
|
+
suffix,
|
|
36
|
+
]
|
|
37
|
+
return "/".join(part.strip("/") for part in parts if part)
|
|
38
|
+
|
|
39
|
+
@classmethod
|
|
40
|
+
def _request(
|
|
41
|
+
cls,
|
|
42
|
+
*,
|
|
43
|
+
method: str,
|
|
44
|
+
suffix: Optional[str] = "",
|
|
45
|
+
header: Optional[dict] = None,
|
|
46
|
+
data: Optional[dict] = None,
|
|
47
|
+
params: Optional[dict] = None,
|
|
48
|
+
) -> Union[dict, list]:
|
|
49
|
+
client = MasstackClient()
|
|
50
|
+
func = getattr(client, method)
|
|
51
|
+
|
|
52
|
+
return func(
|
|
53
|
+
api=cls._api_domain,
|
|
54
|
+
version=cls._version,
|
|
55
|
+
endpoint=cls._get_endpoint(suffix),
|
|
56
|
+
params=params,
|
|
57
|
+
data=data,
|
|
58
|
+
header=header,
|
|
59
|
+
)
|
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
from typing import Optional, List
|
|
2
|
-
from masstack_python_client.
|
|
2
|
+
from masstack_python_client.resources.base import BaseResource
|
|
3
|
+
from masstack_python_client.resources.enums.customer_type_name import CustomerTypeName
|
|
4
|
+
from masstack_python_client.resources.enums.sale_type_name import SaleTypeName
|
|
5
|
+
from masstack_python_client.resources.enums.technology_name import TechnologyName
|
|
6
|
+
from masstack_python_client.resources.models.bundled import BundledProduct
|
|
3
7
|
from masstack_python_client.resources.enums.bundled_product_category import (
|
|
4
8
|
BundleCategory,
|
|
5
9
|
)
|
|
@@ -9,50 +13,25 @@ from masstack_python_client.resources.enums.commercial_segment_name import (
|
|
|
9
13
|
from masstack_python_client.resources.enums.customer_segment_name import (
|
|
10
14
|
CustomerSegmentName,
|
|
11
15
|
)
|
|
12
|
-
from masstack_python_client.resources.
|
|
13
|
-
from masstack_python_client.resources.enums.sale_type_name import SaleTypeName
|
|
14
|
-
from masstack_python_client.resources.enums.technology_name import TechnologyName
|
|
15
|
-
from masstack_python_client.resources.models.bundled import BundledProduct
|
|
16
|
+
from masstack_python_client.resources.utils.serialize import remove_none
|
|
16
17
|
|
|
17
18
|
|
|
18
|
-
class CatalogueResource:
|
|
19
|
+
class CatalogueResource(BaseResource):
|
|
19
20
|
"""Support sales and post-sales operations from catalogue perspective
|
|
20
21
|
https://developers.masstack.com/en/docs/apis_catalogue_doc_swagger/2/apioverview/
|
|
21
22
|
"""
|
|
22
23
|
|
|
24
|
+
__abstract__ = True
|
|
23
25
|
_api_domain = "catalogue"
|
|
24
26
|
|
|
25
27
|
|
|
26
28
|
class BundledProducts(CatalogueResource):
|
|
29
|
+
__abstract__ = True
|
|
27
30
|
_api_path = "bundled_products"
|
|
28
31
|
_version = "v2"
|
|
29
32
|
|
|
30
|
-
@classmethod
|
|
31
|
-
def _get_endpoint(cls, subpath: str) -> str:
|
|
32
|
-
return f"{cls._api_path}/{subpath}"
|
|
33
|
-
|
|
34
|
-
@classmethod
|
|
35
|
-
def _request(
|
|
36
|
-
cls,
|
|
37
|
-
method: str,
|
|
38
|
-
subpath: str,
|
|
39
|
-
params: Optional[dict] = None,
|
|
40
|
-
data: Optional[dict] = None,
|
|
41
|
-
) -> dict:
|
|
42
|
-
client = MasstackClient()
|
|
43
|
-
func = getattr(client, method)
|
|
44
|
-
|
|
45
|
-
return func(
|
|
46
|
-
api=cls._api_domain,
|
|
47
|
-
version=cls._version,
|
|
48
|
-
endpoint=cls._get_endpoint(subpath),
|
|
49
|
-
params=params,
|
|
50
|
-
data=data,
|
|
51
|
-
)
|
|
52
|
-
|
|
53
33
|
|
|
54
34
|
class Sellable(BundledProducts):
|
|
55
|
-
|
|
56
35
|
_api_subpath = "sellable"
|
|
57
36
|
|
|
58
37
|
@classmethod
|
|
@@ -87,22 +66,22 @@ class Sellable(BundledProducts):
|
|
|
87
66
|
"""
|
|
88
67
|
params = {
|
|
89
68
|
"commercial_profile_name": commercial_profile_name,
|
|
90
|
-
"technology_name": technology_name,
|
|
69
|
+
"technology_name": technology_name.value if technology_name else None,
|
|
91
70
|
"territory_owner_id": territory_owner_id,
|
|
92
|
-
"category": category,
|
|
93
|
-
"customer_segment_name":
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
"
|
|
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,
|
|
97
82
|
}
|
|
98
83
|
sellable_bundled_products = cls._request(
|
|
99
|
-
"get",
|
|
100
|
-
cls._api_subpath,
|
|
101
|
-
{
|
|
102
|
-
k: (v.value if hasattr(v, "value") else v)
|
|
103
|
-
for k, v in params.items()
|
|
104
|
-
if v is not None
|
|
105
|
-
},
|
|
84
|
+
method="get", params=remove_none(params)
|
|
106
85
|
)
|
|
107
86
|
return [
|
|
108
87
|
BundledProduct.from_dict(**sellable_bundled_product)
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
from typing import Optional
|
|
2
1
|
from dataclasses import asdict
|
|
3
|
-
|
|
4
|
-
from masstack_python_client.
|
|
2
|
+
from masstack_python_client.resources.base import BaseResource
|
|
3
|
+
from masstack_python_client.resources.models.user import UserData
|
|
4
|
+
from masstack_python_client.resources.utils.serialize import remove_none
|
|
5
5
|
from masstack_python_client.resources.enums.document_type_search import (
|
|
6
6
|
DocumentTypeSearch,
|
|
7
7
|
)
|
|
@@ -9,37 +9,17 @@ from masstack_python_client.resources.models.signup import (
|
|
|
9
9
|
SignupRequestData,
|
|
10
10
|
SignupsResponseData,
|
|
11
11
|
)
|
|
12
|
-
from masstack_python_client.resources.models.user import UserData
|
|
13
|
-
from masstack_python_client.resources.utils.serialize import remove_none
|
|
14
12
|
|
|
15
13
|
|
|
16
|
-
class CustomersResource:
|
|
14
|
+
class CustomersResource(BaseResource):
|
|
17
15
|
"""Provide the necessary functionality to be able to give
|
|
18
16
|
E2E coverage to the entire life-cycle of a client
|
|
19
17
|
https://developers.masstack.com/en/docs/apis_customers_doc_swagger/2/apioverview
|
|
20
18
|
"""
|
|
21
19
|
|
|
20
|
+
__abstract__ = True
|
|
22
21
|
_api_domain = "customers"
|
|
23
22
|
|
|
24
|
-
@classmethod
|
|
25
|
-
def _request(
|
|
26
|
-
cls,
|
|
27
|
-
method: str,
|
|
28
|
-
endpoint: str,
|
|
29
|
-
params: Optional[dict] = None,
|
|
30
|
-
data: Optional[dict] = None,
|
|
31
|
-
) -> dict:
|
|
32
|
-
client = MasstackClient()
|
|
33
|
-
func = getattr(client, method)
|
|
34
|
-
|
|
35
|
-
return func(
|
|
36
|
-
api=cls._api_domain,
|
|
37
|
-
version=cls._version,
|
|
38
|
-
endpoint=endpoint,
|
|
39
|
-
params=params,
|
|
40
|
-
data=data,
|
|
41
|
-
)
|
|
42
|
-
|
|
43
23
|
|
|
44
24
|
class SignupsResource(CustomersResource):
|
|
45
25
|
_api_path = "signups"
|
|
@@ -58,7 +38,6 @@ class SignupsResource(CustomersResource):
|
|
|
58
38
|
payload = remove_none(asdict(customer_data))
|
|
59
39
|
result = cls._request(
|
|
60
40
|
method="post",
|
|
61
|
-
endpoint=cls._api_path,
|
|
62
41
|
data=payload,
|
|
63
42
|
)
|
|
64
43
|
|
|
@@ -86,10 +65,7 @@ class Users(CustomersResource):
|
|
|
86
65
|
user id.
|
|
87
66
|
"""
|
|
88
67
|
data = {"document_type": doc_type.value, "document": doc}
|
|
89
|
-
|
|
90
|
-
return cls._request(method="post", endpoint=f"{cls._api_path}/tree", data=data)[
|
|
91
|
-
"id"
|
|
92
|
-
]
|
|
68
|
+
return cls._request(method="post", suffix="tree", data=data)["id"]
|
|
93
69
|
|
|
94
70
|
@classmethod
|
|
95
71
|
def get_user_by_id(cls, user_id: str) -> dict:
|
|
@@ -102,5 +78,5 @@ class Users(CustomersResource):
|
|
|
102
78
|
Returns:
|
|
103
79
|
UserData
|
|
104
80
|
"""
|
|
105
|
-
user = cls._request(method="get",
|
|
81
|
+
user = cls._request(method="get", suffix=user_id)
|
|
106
82
|
return UserData.from_dict(**user)
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import os
|
|
2
|
-
from typing import Optional, List
|
|
3
|
-
from masstack_python_client.
|
|
2
|
+
from typing import Optional, List, Union
|
|
3
|
+
from masstack_python_client.resources.base import BaseResource
|
|
4
|
+
from masstack_python_client.resources.enums.technology import Technology
|
|
5
|
+
from masstack_python_client.resources.models.portability import PortabilityData
|
|
4
6
|
from masstack_python_client.resources.models.address import (
|
|
5
7
|
BuildingData,
|
|
6
8
|
ClarifierData,
|
|
@@ -9,17 +11,75 @@ from masstack_python_client.resources.models.address import (
|
|
|
9
11
|
UnitData,
|
|
10
12
|
)
|
|
11
13
|
|
|
14
|
+
"""
|
|
15
|
+
BaseResource
|
|
16
|
+
└──FeasibilityResource
|
|
17
|
+
├── Coverage
|
|
18
|
+
│ ├── Streets
|
|
19
|
+
│ ├── Buildings
|
|
20
|
+
│ └── Units
|
|
21
|
+
└── Portability
|
|
22
|
+
└── PortabilityCheck
|
|
23
|
+
"""
|
|
12
24
|
|
|
13
|
-
|
|
25
|
+
|
|
26
|
+
class FeasibilityResource(BaseResource):
|
|
14
27
|
"""Resource for feasibility operations
|
|
15
28
|
https://developers.masstack.com/en/docs/apis_feasibility_doc_swagger/1/apioverview
|
|
16
29
|
"""
|
|
17
30
|
|
|
31
|
+
__abstract__ = True
|
|
18
32
|
_api_domain = "feasibility"
|
|
19
33
|
|
|
20
34
|
|
|
21
|
-
class
|
|
35
|
+
class Portability(FeasibilityResource):
|
|
36
|
+
__abstract__ = True
|
|
37
|
+
_api_path = "portability"
|
|
38
|
+
_version = "v2"
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
class PortabilityCheck(Portability):
|
|
42
|
+
_api_subpath = "portabilityCheck"
|
|
43
|
+
|
|
44
|
+
@classmethod
|
|
45
|
+
def check(
|
|
46
|
+
cls,
|
|
47
|
+
number: str,
|
|
48
|
+
address_id: str,
|
|
49
|
+
territory_owner: Optional[str] = None,
|
|
50
|
+
technical_id: Optional[str] = None,
|
|
51
|
+
technology: Technology = Technology.FTTH,
|
|
52
|
+
) -> PortabilityData:
|
|
53
|
+
"""Returns whether the portability process can be carried out
|
|
54
|
+
and whether it requires a new installation
|
|
55
|
+
|
|
56
|
+
Args:
|
|
57
|
+
number (str): Fixed number to be ported
|
|
58
|
+
address_id (str): Unique address ID
|
|
59
|
+
territory_owner (str): Territory owner. Not mandatory if technology is MIFIJO
|
|
60
|
+
technical_id (str): Technical id. Not mandatory if technology is MIFIJO. g17 or g37
|
|
61
|
+
technology (Technology): Technology to be provided
|
|
62
|
+
|
|
63
|
+
Returns:
|
|
64
|
+
PortabilityData
|
|
65
|
+
|
|
66
|
+
"""
|
|
22
67
|
|
|
68
|
+
portability = cls._request(
|
|
69
|
+
method="post",
|
|
70
|
+
data={
|
|
71
|
+
"number": number,
|
|
72
|
+
"territoryOwner": territory_owner,
|
|
73
|
+
"technicalId": technical_id,
|
|
74
|
+
"addressId": address_id,
|
|
75
|
+
"technology": technology.value,
|
|
76
|
+
},
|
|
77
|
+
)
|
|
78
|
+
return PortabilityData.from_dict(**portability)
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
class Coverage(FeasibilityResource):
|
|
82
|
+
__abstract__ = True
|
|
23
83
|
_api_path = "coverage"
|
|
24
84
|
_version = "v1"
|
|
25
85
|
|
|
@@ -31,10 +91,6 @@ class Coverage(FeasibilityResource):
|
|
|
31
91
|
def _sf_channel() -> str:
|
|
32
92
|
return os.environ.get("MASSTACK_COVERAGE_CHANNEL", "")
|
|
33
93
|
|
|
34
|
-
@classmethod
|
|
35
|
-
def _get_endpoint(cls, subpath: str) -> str:
|
|
36
|
-
return f"{cls._api_path}/{subpath}"
|
|
37
|
-
|
|
38
94
|
@classmethod
|
|
39
95
|
def _get_header(cls, uuid: str) -> dict:
|
|
40
96
|
return {
|
|
@@ -44,29 +100,11 @@ class Coverage(FeasibilityResource):
|
|
|
44
100
|
}
|
|
45
101
|
|
|
46
102
|
@classmethod
|
|
47
|
-
def _request(
|
|
48
|
-
cls,
|
|
49
|
-
method: str,
|
|
50
|
-
subpath: str,
|
|
51
|
-
uuid: str,
|
|
52
|
-
data: Optional[dict] = None,
|
|
53
|
-
params: Optional[dict] = None,
|
|
54
|
-
) -> dict:
|
|
55
|
-
client = MasstackClient()
|
|
56
|
-
func = getattr(client, method)
|
|
57
|
-
|
|
58
|
-
return func(
|
|
59
|
-
api=cls._api_domain,
|
|
60
|
-
version=cls._version,
|
|
61
|
-
endpoint=cls._get_endpoint(subpath),
|
|
62
|
-
params=params,
|
|
63
|
-
data=data,
|
|
64
|
-
header=cls._get_header(uuid),
|
|
65
|
-
)
|
|
103
|
+
def _request(cls, *, uuid: str, **kwargs) -> Union[dict, list]:
|
|
104
|
+
return super()._request(header=cls._get_header(uuid), **kwargs)
|
|
66
105
|
|
|
67
106
|
|
|
68
107
|
class Streets(Coverage):
|
|
69
|
-
|
|
70
108
|
_api_subpath = "streets"
|
|
71
109
|
|
|
72
110
|
@classmethod
|
|
@@ -83,9 +121,8 @@ class Streets(Coverage):
|
|
|
83
121
|
|
|
84
122
|
"""
|
|
85
123
|
streets = cls._request(
|
|
86
|
-
"get",
|
|
87
|
-
|
|
88
|
-
uuid,
|
|
124
|
+
method="get",
|
|
125
|
+
uuid=uuid,
|
|
89
126
|
params={"search": text},
|
|
90
127
|
)
|
|
91
128
|
return [StreetData.from_dict(uuid, lang, **street) for street in streets]
|
|
@@ -104,16 +141,15 @@ class Streets(Coverage):
|
|
|
104
141
|
ClarifierData
|
|
105
142
|
"""
|
|
106
143
|
clarifiers = cls._request(
|
|
107
|
-
"get",
|
|
108
|
-
f"
|
|
109
|
-
uuid,
|
|
144
|
+
method="get",
|
|
145
|
+
suffix=f"clarifiers/{street_id}",
|
|
146
|
+
uuid=uuid,
|
|
110
147
|
)
|
|
111
148
|
|
|
112
149
|
return [ClarifierData(uuid, **clarifier) for clarifier in clarifiers]
|
|
113
150
|
|
|
114
151
|
|
|
115
152
|
class Buildings(Coverage):
|
|
116
|
-
|
|
117
153
|
_api_subpath = "buildings"
|
|
118
154
|
|
|
119
155
|
@classmethod
|
|
@@ -129,9 +165,8 @@ class Buildings(Coverage):
|
|
|
129
165
|
BuildingData
|
|
130
166
|
"""
|
|
131
167
|
buildings = cls._request(
|
|
132
|
-
"get",
|
|
133
|
-
|
|
134
|
-
uuid,
|
|
168
|
+
method="get",
|
|
169
|
+
uuid=uuid,
|
|
135
170
|
params={"search": text},
|
|
136
171
|
)
|
|
137
172
|
return [
|
|
@@ -154,9 +189,9 @@ class Buildings(Coverage):
|
|
|
154
189
|
BuildingData
|
|
155
190
|
"""
|
|
156
191
|
building = cls._request(
|
|
157
|
-
"get",
|
|
158
|
-
|
|
159
|
-
uuid,
|
|
192
|
+
method="get",
|
|
193
|
+
suffix=id,
|
|
194
|
+
uuid=uuid,
|
|
160
195
|
params={"unit_to_data": unit_to_data},
|
|
161
196
|
)
|
|
162
197
|
return BuildingData.from_dict(
|
|
@@ -193,9 +228,9 @@ class Buildings(Coverage):
|
|
|
193
228
|
"""
|
|
194
229
|
|
|
195
230
|
buildings = cls._request(
|
|
196
|
-
"post",
|
|
197
|
-
|
|
198
|
-
uuid,
|
|
231
|
+
method="post",
|
|
232
|
+
suffix="search",
|
|
233
|
+
uuid=uuid,
|
|
199
234
|
data={
|
|
200
235
|
"way_name": way_name,
|
|
201
236
|
"number": number,
|
|
@@ -210,7 +245,6 @@ class Buildings(Coverage):
|
|
|
210
245
|
|
|
211
246
|
|
|
212
247
|
class Units(Coverage):
|
|
213
|
-
|
|
214
248
|
_api_subpath = "units"
|
|
215
249
|
|
|
216
250
|
@classmethod
|
|
@@ -229,9 +263,9 @@ class Units(Coverage):
|
|
|
229
263
|
UnitData
|
|
230
264
|
"""
|
|
231
265
|
unit = cls._request(
|
|
232
|
-
"get",
|
|
233
|
-
|
|
234
|
-
uuid,
|
|
266
|
+
method="get",
|
|
267
|
+
suffix=unit_id,
|
|
268
|
+
uuid=uuid,
|
|
235
269
|
params={"parent_coverage": parent_coverage},
|
|
236
270
|
)
|
|
237
271
|
return UnitData.from_dict(
|
|
@@ -257,9 +291,9 @@ class Units(Coverage):
|
|
|
257
291
|
CoverageData
|
|
258
292
|
"""
|
|
259
293
|
unit = cls._request(
|
|
260
|
-
"get",
|
|
261
|
-
|
|
262
|
-
uuid,
|
|
294
|
+
method="get",
|
|
295
|
+
suffix="extra",
|
|
296
|
+
uuid=uuid,
|
|
263
297
|
params={"id": unit_id, "territory_owner": territory_owner},
|
|
264
298
|
)
|
|
265
299
|
return CoverageData.from_dict(
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
from dataclasses import dataclass
|
|
2
|
+
from typing import Optional
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
@dataclass(frozen=True)
|
|
6
|
+
class InstallationInfoData:
|
|
7
|
+
internalAccess: bool
|
|
8
|
+
iua: str
|
|
9
|
+
brand: str
|
|
10
|
+
number: str
|
|
11
|
+
documentNumber: str
|
|
12
|
+
gescal: str
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
@dataclass(frozen=True)
|
|
16
|
+
class OperatorData:
|
|
17
|
+
code: str
|
|
18
|
+
name: str
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
@dataclass(frozen=True)
|
|
22
|
+
class PortabilityData:
|
|
23
|
+
internalPortability: bool
|
|
24
|
+
isPortable: bool
|
|
25
|
+
installationRequired: bool
|
|
26
|
+
operator: OperatorData
|
|
27
|
+
installationInfo: Optional[InstallationInfoData] = None
|
|
28
|
+
|
|
29
|
+
@classmethod
|
|
30
|
+
def from_dict(
|
|
31
|
+
cls,
|
|
32
|
+
operator,
|
|
33
|
+
installationInformation=None,
|
|
34
|
+
**kwargs,
|
|
35
|
+
):
|
|
36
|
+
return cls(
|
|
37
|
+
operator=OperatorData(**operator),
|
|
38
|
+
installationInfo=(
|
|
39
|
+
InstallationInfoData(**installationInformation)
|
|
40
|
+
if installationInformation
|
|
41
|
+
else None
|
|
42
|
+
),
|
|
43
|
+
**kwargs,
|
|
44
|
+
)
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
from masstack_python_client.resources.base import BaseResource
|
|
2
|
+
from masstack_python_client.resources.models.fixed_phone import FixedPhoneData
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
"https://provision-inventory-network.sta.masstack.com/v1/orgs/marblanca/fixed/number"
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class ProvisionNetworkResource(BaseResource):
|
|
9
|
+
"""not documented"""
|
|
10
|
+
|
|
11
|
+
__abstract__ = True
|
|
12
|
+
_api_domain = "provision-inventory-network"
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class FixedPhone(ProvisionNetworkResource):
|
|
16
|
+
_api_path = "fixed"
|
|
17
|
+
_version = "v1"
|
|
18
|
+
|
|
19
|
+
@classmethod
|
|
20
|
+
def get_number(cls, postal_code: str, state: str = "new"):
|
|
21
|
+
"""Obtain fixed numbering for sale.
|
|
22
|
+
|
|
23
|
+
Args:
|
|
24
|
+
postal_code (str): postal code
|
|
25
|
+
state (str): state
|
|
26
|
+
Returns:
|
|
27
|
+
FixedPhoneData
|
|
28
|
+
|
|
29
|
+
"""
|
|
30
|
+
response = cls._request(
|
|
31
|
+
method="get",
|
|
32
|
+
suffix="number",
|
|
33
|
+
params={
|
|
34
|
+
"postal_code": postal_code,
|
|
35
|
+
"state": state,
|
|
36
|
+
},
|
|
37
|
+
)
|
|
38
|
+
return FixedPhoneData(response["number"])
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: masstack-python-client
|
|
3
|
-
Version: 0.0
|
|
3
|
+
Version: 0.1.0
|
|
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
|
|
@@ -25,29 +25,38 @@ This Python API client provides access to masmovil core API domains.
|
|
|
25
25
|
|
|
26
26
|
## Resources
|
|
27
27
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
*
|
|
49
|
-
|
|
50
|
-
|
|
28
|
+
- **Feasibility**
|
|
29
|
+
- Coverage - find an address
|
|
30
|
+
- Streets:
|
|
31
|
+
- *search: returns a list of street by text*
|
|
32
|
+
- *get_building_info_by_street: returns a list of building info by street id*
|
|
33
|
+
- Buildings:
|
|
34
|
+
- *search: returns a list of buildings by text*
|
|
35
|
+
- *multi_search: returns a list of buildings by request body*
|
|
36
|
+
- *get: returns a building by id with a list of units*
|
|
37
|
+
- Units:
|
|
38
|
+
- *get: returns a unit by id with a list of coverages*
|
|
39
|
+
- *get_coverage: returns coverage info for a unit id and territory_owner*
|
|
40
|
+
- Portability - Checks if a landline portability or an access transfer is allowed
|
|
41
|
+
- PortabilityCheck:
|
|
42
|
+
- *check: Returns whether the portability process can be carried out and whether it requires a new* installation
|
|
43
|
+
|
|
44
|
+
- **Customers**
|
|
45
|
+
- Signups - access to signups new clients
|
|
46
|
+
- *post new client*
|
|
47
|
+
- Users
|
|
48
|
+
- *returns customer tree data associated to a given document identification, email or number of the client.*
|
|
49
|
+
- *returns user data by userId*
|
|
50
|
+
|
|
51
|
+
- **Catalogue**
|
|
52
|
+
- bundled_products - access to bundled products
|
|
53
|
+
- Sellable:
|
|
54
|
+
- *get: Returns sellable bundled products*
|
|
55
|
+
|
|
56
|
+
- **Provision inventory network**
|
|
57
|
+
- fixed - Obtain fixed numbering for sale
|
|
58
|
+
- *get number*
|
|
59
|
+
|
|
51
60
|
|
|
52
61
|
## Installation
|
|
53
62
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
masstack_python_client/__init__.py,sha256=
|
|
1
|
+
masstack_python_client/__init__.py,sha256=7LRyRZxlhx4tNNUqgKyx1-kZVfZFo92ukT_0pRZ-gV8,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
|
|
@@ -10,9 +10,11 @@ masstack_python_client/data/province_translation.csv,sha256=Jpd6jbjYaqeNOk9lUA3W
|
|
|
10
10
|
masstack_python_client/data/street_type_translation.csv,sha256=2MGeTs0v6wVz2yRMyZUuoNOYA4NSqKGJCGYIRi9X8Ic,1791
|
|
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
|
-
masstack_python_client/resources/
|
|
14
|
-
masstack_python_client/resources/
|
|
15
|
-
masstack_python_client/resources/
|
|
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
|
|
16
|
+
masstack_python_client/resources/feasibility.py,sha256=eYGIUwMIkDIfrbgR69Um284UJh5KlR0HLOUp-0FcYKE,8425
|
|
17
|
+
masstack_python_client/resources/provision.py,sha256=SfMly7_19-yxXZRuqXaxRzpHUSVIjcxO_Oq7g_K5d2A,997
|
|
16
18
|
masstack_python_client/resources/enums/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
17
19
|
masstack_python_client/resources/enums/bundled_product_category.py,sha256=0rEsOud4kyDVX07DQ15C_DPcw8hZy84bAVj8j7nT22k,388
|
|
18
20
|
masstack_python_client/resources/enums/commercial_segment_name.py,sha256=94yOXfHNCcZNCoR9ELQ-x2tarNin7gdYBVZ-CTzJsGA,101
|
|
@@ -20,18 +22,21 @@ masstack_python_client/resources/enums/customer_segment_name.py,sha256=NSQUUSUGL
|
|
|
20
22
|
masstack_python_client/resources/enums/customer_type_name.py,sha256=mMdZh0D7qLDMxe6QYVQLGMqHqQMBAnZaPkjgE8q_D9Q,99
|
|
21
23
|
masstack_python_client/resources/enums/document_type_search.py,sha256=pniXpUA_odqeKyxS6yYiN2uje0-F1kKXXBLOk0F8UTQ,136
|
|
22
24
|
masstack_python_client/resources/enums/sale_type_name.py,sha256=NWl5j_SkbysOGVBn4-c7gVbzynOiE44Aqj34n_1v_sU,183
|
|
25
|
+
masstack_python_client/resources/enums/technology.py,sha256=ipHLhdY2EMQgmeDzJ0LnvWvdiG_Oq-JHuEb5ZIx5x3g,106
|
|
23
26
|
masstack_python_client/resources/enums/technology_name.py,sha256=7h8LUyZ-2XHAxOZXelUkkFifmk9dCcwmBbWueFABfQ4,90
|
|
24
27
|
masstack_python_client/resources/models/address.py,sha256=hKnEUVVz8AfGjhaDngzQ0HuR4_Z6zhK6Xe8Aj6xJR7I,5451
|
|
25
28
|
masstack_python_client/resources/models/bundled.py,sha256=1zhWZFrQh15slaGSEZIDa1rURU76gRH5czppXYNSyow,1480
|
|
26
29
|
masstack_python_client/resources/models/client_address.py,sha256=7WBiPTce2X6uZUVVZvZlTMgiohbVITUzmKgYYPvpM-w,204
|
|
27
30
|
masstack_python_client/resources/models/client_attribute.py,sha256=rZlLjJeBVD6IpXbSEucujTqcmHhqoJGRTOV1wqyStak,697
|
|
28
31
|
masstack_python_client/resources/models/client_payment.py,sha256=yMGMTuk_07-TzXWO89sCaaZv8soTO9cT0TzfV3xQa1o,262
|
|
32
|
+
masstack_python_client/resources/models/fixed_phone.py,sha256=ihF-iICz89eVhkeyRsX3pXYkODlXRpYPGJLiFiTBilM,98
|
|
33
|
+
masstack_python_client/resources/models/portability.py,sha256=64WjYLyxDCNgwzmqiDgMHnfouwIyxPmQKcaBZGT50L0,926
|
|
29
34
|
masstack_python_client/resources/models/products.py,sha256=cIuUlEKs0OfvBXtYxxUwG4vibfAlZL4uVBK7-nAL9rw,1831
|
|
30
35
|
masstack_python_client/resources/models/signup.py,sha256=Hvo5nZce1ikpUUMEoLt_2g2HipHwh4XRIz344X8_IJk,2018
|
|
31
36
|
masstack_python_client/resources/models/user.py,sha256=N5mwuZN0Saxiro2UXYcCxLL6jrpIU83crHhmrdAcgE8,1080
|
|
32
37
|
masstack_python_client/resources/utils/serialize.py,sha256=F6JxqR2M9HH0TpYKaJritnppWkYlpPztZ9ZC43FdPLg,251
|
|
33
|
-
masstack_python_client-0.0.
|
|
34
|
-
masstack_python_client-0.0.
|
|
35
|
-
masstack_python_client-0.0.
|
|
36
|
-
masstack_python_client-0.0.
|
|
37
|
-
masstack_python_client-0.0.
|
|
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,,
|
|
File without changes
|
{masstack_python_client-0.0.4.dist-info → masstack_python_client-0.1.0.dist-info}/licenses/LICENSE
RENAMED
|
File without changes
|
{masstack_python_client-0.0.4.dist-info → masstack_python_client-0.1.0.dist-info}/top_level.txt
RENAMED
|
File without changes
|