python-terminusgps 1.10.0__py3-none-any.whl → 1.10.2__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.

Potentially problematic release.


This version of python-terminusgps might be problematic. Click here for more details.

@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: python-terminusgps
3
- Version: 1.10.0
3
+ Version: 1.10.2
4
4
  Summary: Provides abstractions/utilities for working with Wialon API, Authorize.NET API, AWS API, and more.
5
5
  Project-URL: Documentation, https://app.terminusgps.com/docs/apps/python-terminusgps/index.html
6
6
  Project-URL: Repository, https://github.com/terminusgps/python-terminusgps
@@ -1,7 +1,7 @@
1
- terminusgps/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1
+ terminusgps/__init__.py,sha256=BJidT8yzGBfc8PXQX7ZUjoV3SIAMJZrsbsleQryIGJU,1134
2
2
  terminusgps/settings.py,sha256=JMcMFqNQRIcljIZrEsU9pm9AhxG-gcnDC7EONKd3ShE,502
3
3
  terminusgps/authorizenet/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
- terminusgps/authorizenet/auth.py,sha256=kWsqRT9OVEAQuNxDzQNzY1x2SqmvJr-HAbLwgkILntk,997
4
+ terminusgps/authorizenet/auth.py,sha256=JuP-l23PRnsnufda5f29Y61K9yhT6p6pRMEH5KGzmp0,564
5
5
  terminusgps/authorizenet/profiles/__init__.py,sha256=QKjMKcXpCSCEhv6LBCz0yGP8t0VxAyKyYRS4_HLYnxQ,114
6
6
  terminusgps/authorizenet/profiles/addresses.py,sha256=ffAi3LcEOB3Xsr9f4N_PfjSZcN3I9dTKNamoAmnLpo4,3838
7
7
  terminusgps/authorizenet/profiles/base.py,sha256=IooSz_PTeq23IIgq6upx2CcpWEOXgK3mFNylADYlF3I,2553
@@ -9,23 +9,23 @@ terminusgps/authorizenet/profiles/customers.py,sha256=iEuNFP6PHuGdFQftgxxKpQFYaG
9
9
  terminusgps/authorizenet/profiles/payments.py,sha256=qOWp-gO6qBCADP98WjoNCHm-jtq7DY5-moiPsOnT5yI,5263
10
10
  terminusgps/aws/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
11
11
  terminusgps/aws/secrets.py,sha256=kgRA77rs0mD4berWRLkPtJLOe4Grf--o5f8NzwQqXCk,360
12
- terminusgps/twilio/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
13
- terminusgps/twilio/caller.py,sha256=VQecBgi-rI9UwHjz5RzyVdtkuNB52ftmcfIqymh0guk,2280
12
+ terminusgps/twilio/__init__.py,sha256=dYo41F2jft_eHDWSUtSpKGSRG1bewq_qClqilUJZkYM,33
13
+ terminusgps/twilio/caller.py,sha256=XLMONHnojYZ0QVS0UlJlBZkL2qw3LO2b53jWJ4uv6oM,1832
14
14
  terminusgps/wialon/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
15
- terminusgps/wialon/constants.py,sha256=aybYcNcHyar2lz_6BlQbMWpbcHW6eyJeq05QwuiqZQ0,3078
15
+ terminusgps/wialon/constants.py,sha256=g06sNgWtSvY1pZljbH9KMsArhs8jFZRgJM9GT4Gluf0,3079
16
16
  terminusgps/wialon/errors.py,sha256=SV9pVwU6FZ_zGlGP6zJN6aLE2auF4TfHFISQLiPMKrI,1758
17
17
  terminusgps/wialon/flags.py,sha256=-OoH-eZM54yjRqxsAXL8VImdQu_7C0OAxCrFqaCEuko,13510
18
- terminusgps/wialon/session.py,sha256=AntMZQA7g5FAnEHzPCVopmfDgigP1JFp-zYv8_H7xEg,9792
19
- terminusgps/wialon/utils.py,sha256=vo5-md05VzyFtM98AxG7_gI2TVgOecqY9K78tQErxDU,3429
18
+ terminusgps/wialon/session.py,sha256=YClz5dMQ4vshznngOYkW-kVPh4YAGDx4QHyOGpPwd-k,9474
19
+ terminusgps/wialon/utils.py,sha256=9xJq5eAWm-vu0nJVJ7eUcwhJhMCrGjS1p__4CIBXYm4,3407
20
20
  terminusgps/wialon/items/__init__.py,sha256=3BVthghekMvhMQSzQgBMlD_phxmKSmp3Zvmo-z0O8Bs,211
21
- terminusgps/wialon/items/base.py,sha256=CuDctBbR0NwW9Fo--05iozSx7GkNysvAFXvdidggJjg,6693
21
+ terminusgps/wialon/items/base.py,sha256=r0cDn7c1vKVARPmODbGPkeP2F-sktCqVofIb1Q_gsCQ,6694
22
22
  terminusgps/wialon/items/resource.py,sha256=xElMYSMyKA5y8rIP0EeF429MBV2hbLZcS6SokftvrOs,5641
23
23
  terminusgps/wialon/items/retranslator.py,sha256=zsQXqOhH1zFe5_e8DROPu60z3v6xPWOEPyMCi2IqJAo,3861
24
24
  terminusgps/wialon/items/route.py,sha256=qOHPN_rejwiGqvwWzlwmUIAIyc3lKavCalf8ki66rx0,760
25
- terminusgps/wialon/items/unit.py,sha256=mEYQRpICELQPR3dyDJVRzoKeIuFRnPgkqK-Oo6xuIP4,6306
25
+ terminusgps/wialon/items/unit.py,sha256=AUPoECgjzxnBxTAjPCbSVL_OzqCP7Oa4vjprFT3gJJ8,7275
26
26
  terminusgps/wialon/items/unit_group.py,sha256=1yc7ldPIgGbtiTj0djRDWmt6Q9K_VT9sxOaioasbbLY,5212
27
- terminusgps/wialon/items/user.py,sha256=bkcMw_YiocaMuhP_pBfB7apjAZwnsOzGScnGkn8Ybbw,6107
28
- python_terminusgps-1.10.0.dist-info/METADATA,sha256=dPXjLEr-PHdgIL2lWYevYO4FhHwjk-DcwhxyXGXbQys,912
29
- python_terminusgps-1.10.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
30
- python_terminusgps-1.10.0.dist-info/licenses/COPYING,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
31
- python_terminusgps-1.10.0.dist-info/RECORD,,
27
+ terminusgps/wialon/items/user.py,sha256=p_NA4iXLappr44RKwt9EHv_v0jc1XOQU_mJWe61s_qI,6077
28
+ python_terminusgps-1.10.2.dist-info/METADATA,sha256=mOx5v7vNDP2-65IJpMHgC2epvklGGClRyb2FGrjPEjE,912
29
+ python_terminusgps-1.10.2.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
30
+ python_terminusgps-1.10.2.dist-info/licenses/COPYING,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
31
+ python_terminusgps-1.10.2.dist-info/RECORD,,
terminusgps/__init__.py CHANGED
@@ -0,0 +1,20 @@
1
+ from django.conf import settings, ImproperlyConfigured
2
+
3
+ if not hasattr(settings, "DEBUG"):
4
+ raise ImproperlyConfigured("'DEBUG' setting is required.")
5
+ if not hasattr(settings, "MERCHANT_AUTH_LOGIN_ID"):
6
+ raise ImproperlyConfigured("'MERCHANT_AUTH_LOGIN_ID' setting is required.")
7
+ if not hasattr(settings, "MERCHANT_AUTH_TRANSACTION_KEY"):
8
+ raise ImproperlyConfigured("'MERCHANT_AUTH_TRANSACTION_KEY' setting is required.")
9
+ if not hasattr(settings, "TWILIO_FROM_NUMBER"):
10
+ raise ImproperlyConfigured("'TWILIO_FROM_NUMBER' setting is required.")
11
+ if not hasattr(settings, "TWILIO_MESSAGING_SID"):
12
+ raise ImproperlyConfigured("'TWILIO_MESSAGING_SID' setting is required.")
13
+ if not hasattr(settings, "TWILIO_SID"):
14
+ raise ImproperlyConfigured("'TWILIO_SID' setting is required.")
15
+ if not hasattr(settings, "TWILIO_TOKEN"):
16
+ raise ImproperlyConfigured("'TWILIO_TOKEN' setting is required.")
17
+ if not hasattr(settings, "WIALON_TOKEN"):
18
+ raise ImproperlyConfigured("'WIALON_TOKEN' setting is required.")
19
+ if not hasattr(settings, "WIALON_ADMIN_ID"):
20
+ raise ImproperlyConfigured("'WIALON_ADMIN_ID' setting is required.")
@@ -2,14 +2,6 @@ from authorizenet.apicontractsv1 import merchantAuthenticationType
2
2
  from authorizenet.constants import constants
3
3
 
4
4
  from django.conf import settings
5
- from django.core.exceptions import ImproperlyConfigured
6
-
7
- if not hasattr(settings, "DEBUG"):
8
- raise ImproperlyConfigured("'DEBUG' setting is required.")
9
- if not hasattr(settings, "MERCHANT_AUTH_LOGIN_ID"):
10
- raise ImproperlyConfigured("'MERCHANT_AUTH_LOGIN_ID' setting is required.")
11
- if not hasattr(settings, "MERCHANT_AUTH_TRANSACTION_KEY"):
12
- raise ImproperlyConfigured("'MERCHANT_AUTH_TRANSACTION_KEY' setting is required.")
13
5
 
14
6
 
15
7
  def get_merchant_auth() -> merchantAuthenticationType:
@@ -0,0 +1 @@
1
+ from .caller import TwilioCaller
@@ -3,29 +3,20 @@ from typing import Any
3
3
  import asyncio
4
4
  import twilio.rest
5
5
 
6
- from django.conf import settings, ImproperlyConfigured
6
+ from django.conf import settings
7
7
  from twilio.http.async_http_client import AsyncTwilioHttpClient
8
8
 
9
- if not hasattr(settings, "TWILIO_FROM_NUMBER"):
10
- raise ImproperlyConfigured("'TWILIO_FROM_NUMBER' setting is required.")
11
- if not hasattr(settings, "TWILIO_MESSAGING_SID"):
12
- raise ImproperlyConfigured("'TWILIO_MESSAGING_SID' setting is required.")
13
- if not hasattr(settings, "TWILIO_SID"):
14
- raise ImproperlyConfigured("'TWILIO_SID' setting is required.")
15
- if not hasattr(settings, "TWILIO_TOKEN"):
16
- raise ImproperlyConfigured("'TWILIO_TOKEN' setting is required.")
17
-
18
9
 
19
10
  class TwilioCaller:
20
11
  def __init__(self) -> None:
12
+ self.client_sid = settings.TWILIO_SID
13
+ self.client_token = settings.TWILIO_TOKEN
21
14
  self.from_number = settings.TWILIO_FROM_NUMBER
22
- self.messaging_service_sid = settings.TWILIO_MESSAGING_SID
15
+ self.messaging_sid = settings.TWILIO_MESSAGING_SID
23
16
 
24
17
  def __enter__(self) -> "TwilioCaller":
25
18
  self.client = twilio.rest.Client(
26
- settings.TWILIO_SID,
27
- settings.TWILIO_TOKEN,
28
- http_client=AsyncTwilioHttpClient(),
19
+ self.client_sid, self.client_token, http_client=AsyncTwilioHttpClient()
29
20
  )
30
21
  return self
31
22
 
@@ -61,5 +52,5 @@ class TwilioCaller:
61
52
  to=to_number,
62
53
  from_=self.from_number,
63
54
  body=message,
64
- messaging_service_sid=self.messaging_service_sid,
55
+ messaging_service_sid=self.messaging_sid,
65
56
  )
@@ -1,5 +1,6 @@
1
1
  from django.db import models
2
2
  from django.utils.translation import gettext_lazy as _
3
+
3
4
  from terminusgps.wialon import flags
4
5
 
5
6
 
@@ -1,4 +1,5 @@
1
1
  from abc import abstractmethod
2
+
2
3
  from terminusgps.wialon import flags
3
4
  from terminusgps.wialon.session import WialonSession
4
5
 
@@ -144,9 +144,9 @@ class WialonUnit(WialonBase):
144
144
 
145
145
  def get_phone_numbers(self) -> list[str]:
146
146
  """
147
- Retrieves all phone numbers assigned to this Wialon unit.
147
+ Retrieves all phone numbers assigned to the unit.
148
148
 
149
- This includes any attached drivers, custom fields, and normally assigned unit phone numbers.
149
+ This includes any attached drivers, custom/admin fields, or otherwise assigned phone numbers.
150
150
 
151
151
  :raises WialonError: If something goes wrong with Wialon.
152
152
  :returns: A list of phone numbers.
@@ -154,28 +154,48 @@ class WialonUnit(WialonBase):
154
154
 
155
155
  """
156
156
 
157
- phone_numbers = []
158
- phones_0 = self._get_driver_phone_numbers()
159
- phones_1 = self._get_cfield_phone_numbers()
157
+ phone_numbers: list[str] = []
158
+ phones_0: list[str] | None = self._get_driver_phone_numbers()
159
+ phones_1: list[str] | None = self._get_cfield_phone_numbers()
160
+ phones_2: list[str] | None = self._get_afield_phone_numbers()
160
161
 
161
- if phones_0:
162
+ if phones_0 is not None:
162
163
  phone_numbers.extend(phones_0)
163
- if phones_1:
164
+ if phones_1 is not None:
164
165
  phone_numbers.extend(phones_1)
166
+ if phones_2 is not None:
167
+ phone_numbers.extend(phones_2)
165
168
  return list(dict.fromkeys(phone_numbers)) # Removes duplicate phone numbers
166
169
 
167
- def _get_cfield_phone_numbers(self) -> list[str] | None:
170
+ def _get_afield_phone_numbers(self, key: str = "to_number") -> list[str] | None:
168
171
  """
169
- Retrives any phone numbers saved in the unit's custom 'to_number' field.
172
+ Retrives any phone numbers saved in an admin field by key.
170
173
 
174
+ :param key: An admin field key. Default is ``"to_number"``.
175
+ :type key: :py:obj:`str`
176
+ :raises WialonError: If something goes wrong with Wialon.
177
+ :returns: A list of phone numbers, if the unit has admin phone number fields.
178
+ :rtype: :py:obj:`list` | :py:obj:`None`
179
+
180
+ """
181
+ for field_name, field_val in self.afields.items():
182
+ if field_name == key:
183
+ return self.clean_phone_numbers([field_val])
184
+
185
+ def _get_cfield_phone_numbers(self, key: str = "to_number") -> list[str] | None:
186
+ """
187
+ Retrives any phone numbers saved in a custom field by key.
188
+
189
+ :param key: A custom field key. Default is ``"to_number"``.
190
+ :type key: :py:obj:`str`
171
191
  :raises WialonError: If something goes wrong with Wialon.
172
192
  :returns: A list of phone numbers, if the unit has custom phone number fields.
173
193
  :rtype: :py:obj:`list` | :py:obj:`None`
174
194
 
175
195
  """
176
- for key, value in self.cfields.items():
177
- if key == "to_number":
178
- return self.clean_phone_numbers([value])
196
+ for field_name, field_val in self.cfields.items():
197
+ if field_name == key:
198
+ return self.clean_phone_numbers([field_val])
179
199
 
180
200
  def _get_driver_phone_numbers(self) -> list[str] | None:
181
201
  """
@@ -1,8 +1,7 @@
1
1
  from urllib.parse import quote_plus
2
2
 
3
- from terminusgps.wialon import flags
3
+ from terminusgps.wialon import constants, flags
4
4
  from terminusgps.wialon.items.base import WialonBase
5
- from terminusgps.wialon import constants
6
5
 
7
6
 
8
7
  class WialonUser(WialonBase):
@@ -2,7 +2,6 @@ import threading
2
2
 
3
3
  from wialon.api import Wialon, WialonError
4
4
  from django.conf import settings
5
- from django.core.exceptions import ImproperlyConfigured
6
5
 
7
6
  from .errors import (
8
7
  WialonLogoutError,
@@ -34,10 +33,6 @@ class WialonSession:
34
33
  :rtype: :py:obj:`None`
35
34
 
36
35
  """
37
- if not hasattr(settings, "WIALON_TOKEN"):
38
- raise ImproperlyConfigured("'WIALON_TOKEN' setting is required.")
39
- if not hasattr(settings, "WIALON_ADMIN_ID"):
40
- raise ImproperlyConfigured("'WIALON_ADMIN_ID' setting is required.")
41
36
 
42
37
  self.wialon_api = Wialon(scheme=scheme, host=host, port=port, sid=sid)
43
38
  self.token = token
@@ -1,4 +1,3 @@
1
- from enum import Enum
2
1
  import secrets
3
2
  import string
4
3