Skip to content

Commit

Permalink
feat: Get Account Outages API (#108)
Browse files Browse the repository at this point in the history
  • Loading branch information
GuyKh committed May 19, 2024
1 parent 413853b commit 45e5262
Show file tree
Hide file tree
Showing 6 changed files with 207 additions and 4 deletions.
1 change: 1 addition & 0 deletions iec_api/const.py
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@
GET_INVOICE_PDF_URL = IEC_API_BASE_URL + "BillingCollection/pdf"
GET_KWH_TARIFF_URL = IEC_API_BASE_URL + "content/en-US/content/tariffs/contentpages/homeelectricitytariff"
GET_CALCULATOR_GADGET_URL = IEC_API_BASE_URL + "content/en-US/calculators/gadget"
GET_OUTAGES_URL = IEC_API_BASE_URL + "outages/transactions/{account_id}/2"

GET_USER_PROFILE_FROM_FAULT_PORTAL_URL = IEC_FAULT_PORTAL_API_URL + "contacts/userprofile"
GET_OUTAGES_FROM_FAULT_PORTAL_URL = IEC_FAULT_PORTAL_API_URL + "accounts/{account_id}/tranzactions/2"
Expand Down
10 changes: 10 additions & 0 deletions iec_api/data.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
GET_ELECTRIC_BILL_URL,
GET_INVOICE_PDF_URL,
GET_LAST_METER_READING_URL,
GET_OUTAGES_URL,
GET_REQUEST_READING_URL,
GET_TENANT_IDENTITY_URL,
HEADERS_WITH_AUTH,
Expand Down Expand Up @@ -48,6 +49,8 @@
from iec_api.models.jwt import JWT
from iec_api.models.meter_reading import MeterReadings
from iec_api.models.meter_reading import decoder as meter_reading_decoder
from iec_api.models.outages import Outage
from iec_api.models.outages import decoder as outages_decoder
from iec_api.models.remote_reading import ReadingResolution, RemoteReadingRequest, RemoteReadingResponse
from iec_api.models.response_descriptor import ResponseWithDescriptor

Expand Down Expand Up @@ -284,3 +287,10 @@ async def get_invoice_pdf(
session, url=GET_INVOICE_PDF_URL, headers=headers, json_data=request
)
return await response.read()


async def get_outages_by_account(session: ClientSession, token: JWT, account_id: str) -> Optional[list[Outage]]:
"""Get Device Type data response from IEC API."""
return await _get_response_with_descriptor(
session, token, GET_OUTAGES_URL.format(account_id=account_id), outages_decoder
)
23 changes: 22 additions & 1 deletion iec_api/iec_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,10 @@
from iec_api import commons, data, fault_portal_data, login, static_data
from iec_api.fault_portal_models.outages import FaultPortalOutage
from iec_api.fault_portal_models.user_profile import UserProfile
from iec_api.models.account import Account
from iec_api.models.contract import Contract
from iec_api.models.contract_check import ContractCheck
from iec_api.models.customer import Account, Customer
from iec_api.models.customer import Customer
from iec_api.models.device import Device, Devices
from iec_api.models.device_identity import DeviceDetails
from iec_api.models.device_type import DeviceType
Expand All @@ -24,6 +25,7 @@
from iec_api.models.invoice import GetInvoicesBody
from iec_api.models.jwt import JWT
from iec_api.models.meter_reading import MeterReadings
from iec_api.models.outages import Outage
from iec_api.models.remote_reading import ReadingResolution, RemoteReadingResponse
from iec_api.usage_calculator.calculator import UsageCalculator

Expand Down Expand Up @@ -72,6 +74,7 @@ def __init__(self, user_id: str | int, session: Optional[ClientSession] = None):
self._login_response: Optional[str] = None # Response from the login attempt
self._bp_number: Optional[str] = None # BP Number associated with the instance
self._contract_id: Optional[str] = None # Contract ID associated with the instance
self._account_id: Optional[str] = None # Account ID associated with the instance

def _shutdown(self):
if not self._session.closed:
Expand Down Expand Up @@ -102,6 +105,7 @@ async def get_accounts(self) -> Optional[List[Account]]:

if accounts and len(accounts) > 0:
self._bp_number = accounts[0].account_number
self._account_id = accounts[0].id

return accounts

Expand Down Expand Up @@ -446,6 +450,23 @@ async def get_efs_messages(

return await data.get_efs_messages(self._session, self._token, contract_id, service_code)

async def get_outages_by_account(self, account_id: Optional[str] = None) -> Optional[List[Outage]]:
"""Get Outages for the Account
Args:
self: The instance of the class.
account_id (str): The Account ID of the meter.
Returns:
list[Outage]: List of the Outages Messages
"""
await self.check_token()

if not account_id:
account_id = self._account_id

assert account_id, "Account Id must be provided"

return await data.get_outages_by_account(self._session, self._token, account_id)

# ----------------
# Fault Portal Endpoints
# ----------------
Expand Down
3 changes: 2 additions & 1 deletion iec_api/models/account.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
from dataclasses import dataclass, field
from typing import Optional
from uuid import UUID

from mashumaro import DataClassDictMixin, field_options
from mashumaro.codecs import BasicDecoder
Expand Down Expand Up @@ -34,7 +35,7 @@
class Account(DataClassDictMixin):
account_number: str = field(metadata=field_options(alias="accountNumber"))
account_type: int = field(metadata=field_options(alias="accountType"))
id: str
id: UUID
email: Optional[str]
telephone: Optional[str]
government_number: str = field(metadata=field_options(alias="governmentNumber"))
Expand Down
4 changes: 2 additions & 2 deletions iec_api/models/customer.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@


@dataclass
class Account(DataClassDictMixin):
class CustomerAccount(DataClassDictMixin):
main_contract_id: str = field(metadata=field_options(alias="mainContractId"))
main_contract_id_type: int = field(metadata=field_options(alias="mainContractIdType"))
company_id: str = field(metadata=field_options(alias="companyId"))
Expand All @@ -53,7 +53,7 @@ class Account(DataClassDictMixin):
class Customer(DataClassDictMixin):
bp_number: str = field(metadata=field_options(alias="bpNumber"))
id_type: int = field(metadata=field_options(alias="idType"))
accounts: list[Account]
accounts: list[CustomerAccount]
customer_status: int = field(metadata=field_options(alias="customerStatus"))
id_number: str = field(metadata=field_options(alias="idNumber"))
first_name: str = field(metadata=field_options(alias="firstName"))
Expand Down
170 changes: 170 additions & 0 deletions iec_api/models/outages.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,170 @@
""" Outages model. """
from dataclasses import dataclass, field
from datetime import datetime
from typing import List, Optional
from uuid import UUID

from mashumaro import DataClassDictMixin, field_options
from mashumaro.codecs import BasicDecoder

from iec_api.models.response_descriptor import ResponseWithDescriptor

# GET https://iecapi.iec.co.il//api/outages/transactions/{account_id}/2
#
# {
# "data": [
# {
# "transactionsInfo": [
# {
# "disconnectDate": "2024-05-17T22:32:16Z",
# "disconnect": {
# "disconnectKey": "17701HESD5840",
# "disconnectType": {
# "displayName": "תקלה איזורית",
# "code": 1,
# "id": "b146f469-819a-ea11-a811-000d3a239ca0"
# },
# "disconnectTreatmentState": {
# "displayName": "החזרת אספקה",
# "code": "6",
# "isConnectIndicationBit": false,
# "id": "7eaecdd3-859a-ea11-a812-000d3a239136"
# },
# "id": "1d9a36ef-9a14-ef11-9f89-7c1e52290237",
# "estimateTreatmentDate": null,
# "energizedDate": "2024-05-18T11:09:41Z"
# },
# "disconnectType": 1
# }
# ],
# "site": {
# "contractNumber": "346496424",
# "address": {
# "region": {
# "name": "חיפה והצפון",
# "id": "909a5d57-d7db-ea11-a813-000d3aabca53"
# },
# "area": {
# "name": "חיפה",
# "id": "0d93fbef-d7db-ea11-a813-000d3aabca53"
# },
# "street": "הגל",
# "houseNumber": "12",
# "city": {
# "name": "טירה",
# "shovalCityCode": "778",
# "logicalName": null,
# "id": "fb0a89b9-29e0-e911-a972-000d3a29fb7a"
# },
# "id": "f5453a99-0472-e811-8106-3863bb358f68"
# },
# "id": "8eb5c7da-e0a5-ea11-a812-000d3aaebb51",
# "x": null,
# "y": null
# }
# }
# ],
# "reponseDescriptor": {
# "isSuccess": true,
# "code": "0",
# "description": ""
# }
# }

# GET https://masa-faultsportalapi.iec.co.il/api/accounts/{{account_id}}/tranzactions/2
#
# # {
# "dataCollection": []
# }


@dataclass
class DisconnectType(DataClassDictMixin):
"""DisconnectType dataclass"""

display_name: str = field(metadata=field_options(alias="displayName"))
code: int = field(metadata=field_options(alias="code"))
id: UUID = field(metadata=field_options(alias="id"))


@dataclass
class DisconnectTreatmentState(DataClassDictMixin):
"""DisconnectTreatmentState dataclass"""

display_name: str = field(metadata=field_options(alias="displayName"))
code: str = field(metadata=field_options(alias="code"))
is_connect_indication_bit: bool = field(metadata=field_options(alias="isConnectIndicationBit"))
id: UUID = field(metadata=field_options(alias="id"))


@dataclass
class Disconnect(DataClassDictMixin):
"""Disconnect dataclass."""

id: UUID = field(metadata=field_options(alias="id"))
estimate_treatment_date: Optional[datetime] = field(metadata=field_options(alias="estimateTreatmentDate"))
energized_date: Optional[str] = field(metadata=field_options(alias="energizedDate"))
disconnect_key: Optional[str] = field(metadata=field_options(alias="disconnectKey"))
disconnect_type: Optional[DisconnectType] = field(metadata=field_options(alias="disconnectType"))
disconnect_treatment_state: Optional[DisconnectTreatmentState] = field(
metadata=field_options(alias="disconnectTreatmentState")
)


@dataclass
class TransactionsInfo(DataClassDictMixin):
"""Transactions Info dataclass."""

disconnect_date: datetime = field(metadata=field_options(alias="disconnectDate"))
disconnect: Disconnect = field(metadata=field_options(alias="disconnect"))
disconnect_type: int = field(metadata=field_options(alias="disconnectType"))


@dataclass
class OutageAddress(DataClassDictMixin):
"""Outage Address dataclass."""

name: str = field(metadata=field_options(alias="name"))
id: UUID = field(metadata=field_options(alias="id"))


@dataclass
class OutageAddressCity(OutageAddress):
"""Outage Address dataclass."""

logical_name: str = field(metadata=field_options(alias="logicalName"))
shoval_city_code: str = field(metadata=field_options(alias="shovalCityCode"))


@dataclass
class OutageAddressFull(DataClassDictMixin):
"""Full Outage Address dataclass."""

region: OutageAddress = field(metadata=field_options(alias="region"))
area: OutageAddress = field(metadata=field_options(alias="area"))
street: str = field(metadata=field_options(alias="street"))
house_number: str = field(metadata=field_options(alias="houseNumber"))
city: OutageAddress = field(metadata=field_options(alias="city"))
id: UUID = field(metadata=field_options(alias="id"))


@dataclass
class Site(DataClassDictMixin):
"""Site dataclass."""

contract_number: str = field(metadata=field_options(alias="contractNumber"))
address: OutageAddressFull = field(metadata=field_options(alias="address"))
id: UUID = field(metadata=field_options(alias="id"))
x: Optional[float] = field(metadata=field_options(alias="x"))
y: Optional[float] = field(metadata=field_options(alias="y"))


@dataclass
class Outage(DataClassDictMixin):
"""Outage dataclass."""

transactions_info: List[TransactionsInfo] = field(metadata=field_options(alias="transactionsInfo"))
site: Site = field(metadata=field_options(alias="site"))


decoder = BasicDecoder(ResponseWithDescriptor[List[Outage]])

0 comments on commit 45e5262

Please sign in to comment.