clear-skies 1.19.27__py3-none-any.whl → 1.19.29__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 clear-skies might be problematic. Click here for more details.

@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: clear-skies
3
- Version: 1.19.27
3
+ Version: 1.19.29
4
4
  Summary: A framework for building backends in the cloud
5
5
  Home-page: https://github.com/cmancone/clearskies
6
6
  License: MIT
@@ -55,8 +55,8 @@ clearskies/backends/memory_backend.py,sha256=6Ts_NtP9S_QisvpNcQKO0CUqhCRAuL3d5LZ
55
55
  clearskies/backends/restful_api_advanced_search_backend.py,sha256=uiR4SEKhLNmczYJEAkVMIdPWxQc4YWSp-_WzcSL7DEo,5480
56
56
  clearskies/backends/secrets_backend.py,sha256=4lzrgdL_O_pgCT5HknV2gotFgp9GzjQ5_2n0-4H4kvs,2204
57
57
  clearskies/binding_config.py,sha256=bF8LBNEgJacwKCqToAtDqN9hv5omzU7zt_4qB9KPtE0,457
58
- clearskies/column_types/__init__.py,sha256=QHEFFd3wRXvaOR7uZk-bpVLlLoTiN3D4S8sBU9rFwCE,4330
59
- clearskies/column_types/audit.py,sha256=smgAnDzNS5n3_1ESeyqn6KDv_1k6gOYRqrFb8S2_TrQ,9143
58
+ clearskies/column_types/__init__.py,sha256=u9M34F9t5jsCHpE-_6MpoSqFh3WJyfHe8wF9UlMzFj0,4464
59
+ clearskies/column_types/audit.py,sha256=2YcrZVVElpOUdmxYTQ_6CshL1HVou6fz65dOOs_b8Gw,9659
60
60
  clearskies/column_types/belongs_to.py,sha256=tH1tbTOfjifSNuVjO-KbMF7GiUIoLfcDItrrS3TGGM8,11044
61
61
  clearskies/column_types/boolean.py,sha256=1yyM1CUfgD84pPE65c1OP1Qjf_J0Z45hjPrDR51AUkQ,1878
62
62
  clearskies/column_types/category_tree.py,sha256=PgNmzZPyqYS5NADH_QTCxLvDXZFxzv5ESKTkvPrrLXo,9140
@@ -77,6 +77,7 @@ clearskies/column_types/integer.py,sha256=dGIluusPmhLRNg7PplOJLbQI2AXojqRBUHt8ek
77
77
  clearskies/column_types/json.py,sha256=TbZkdwCoZYhbALUxof2jENGfaq2i5TlcyBcmo7XzDGQ,652
78
78
  clearskies/column_types/many_to_many.py,sha256=Yu5wmMkVqRteMrH_8uSZK-bM_IrfDyv6AFb92iJ1FZs,11984
79
79
  clearskies/column_types/many_to_many_with_data.py,sha256=NOYjZedeLIWVyDV4BTRyNmhkNHZzx6SkHLFbL-VqHQU,7769
80
+ clearskies/column_types/phone.py,sha256=aUKshuknqcklA0LhUAdIgCslmAXXnWtXln1q5js8Eh8,1611
80
81
  clearskies/column_types/select.py,sha256=1oBslTJ_7QCjlFeEcwJVRL-ED4sXwCESVFRAOonvG2I,297
81
82
  clearskies/column_types/string.py,sha256=XbHC31TmlW0k86cvdVJBDyowU8Xis6Te6R0rPLXgLpI,863
82
83
  clearskies/column_types/updated.py,sha256=FNyRK-PS6lgFQ9QN2VrcIZP2g5EHGhll6pf-MgqMH7s,566
@@ -202,7 +203,7 @@ clearskies/tests/simple_api/models/__init__.py,sha256=nUA0W6fgXw_Bxa9CudkaDkC80t
202
203
  clearskies/tests/simple_api/models/status.py,sha256=PEhPbaQh5qdUNHp8O0gz91LOLENAEBtqSaHxUPXchaM,699
203
204
  clearskies/tests/simple_api/models/user.py,sha256=5_P4Tp1tTdX7PkMJ__epPM5MA7JAeVYGas69vcWloLc,819
204
205
  clearskies/tests/simple_api/users_api.py,sha256=KYXCgEofDxHeRdQK67txN5oYUPvxxmB8JTku7L-apk4,2344
205
- clear_skies-1.19.27.dist-info/LICENSE,sha256=3Ehd0g3YOpCj8sqj0Xjq5qbOtjjgk9qzhhD9YjRQgOA,1053
206
- clear_skies-1.19.27.dist-info/METADATA,sha256=c9j9MWbb37TZ3JJzWLD9Tdr0eCocVDkNTyDCl-CeEf4,1712
207
- clear_skies-1.19.27.dist-info/WHEEL,sha256=d2fvjOD7sXsVzChCqf0Ty0JbHKBaLYwDbGQDwQTnJ50,88
208
- clear_skies-1.19.27.dist-info/RECORD,,
206
+ clear_skies-1.19.29.dist-info/LICENSE,sha256=3Ehd0g3YOpCj8sqj0Xjq5qbOtjjgk9qzhhD9YjRQgOA,1053
207
+ clear_skies-1.19.29.dist-info/METADATA,sha256=_9U68Hm392uXjqQs-x5bGay9azxktjOnXlxfs_LIsbk,1712
208
+ clear_skies-1.19.29.dist-info/WHEEL,sha256=d2fvjOD7sXsVzChCqf0Ty0JbHKBaLYwDbGQDwQTnJ50,88
209
+ clear_skies-1.19.29.dist-info/RECORD,,
@@ -19,6 +19,7 @@ from .integer import Integer
19
19
  from .json import JSON
20
20
  from .many_to_many import ManyToMany
21
21
  from .many_to_many_with_data import ManyToManyWithData
22
+ from .phone import Phone
22
23
  from .select import Select
23
24
  from .string import String
24
25
  from .updated import Updated
@@ -110,6 +111,10 @@ def many_to_many_with_data(name, **kwargs):
110
111
  return build_column_config(name, ManyToManyWithData, **kwargs)
111
112
 
112
113
 
114
+ def phone(name, **kwargs):
115
+ return build_column_config(name, Phone, **kwargs)
116
+
117
+
113
118
  def select(name, **kwargs):
114
119
  return build_column_config(name, Select, **kwargs)
115
120
 
@@ -171,6 +176,8 @@ __all__ = [
171
176
  "ManyToMany",
172
177
  "many_to_many_with_data",
173
178
  "ManyToManyWithData",
179
+ "phone",
180
+ "Phone",
174
181
  "select",
175
182
  "Select",
176
183
  "string",
@@ -131,9 +131,14 @@ class Audit(has_many.HasMany):
131
131
  for key in new_data.keys():
132
132
  if key in exclude_columns:
133
133
  continue
134
+ if key in parent_columns:
135
+ column_data = parent_columns[key].to_json(model)
136
+ else:
137
+ column_data = {key: new_data[key]}
138
+
134
139
  create_data = {
135
140
  **create_data,
136
- **parent_columns[key].to_json(model),
141
+ **column_data,
137
142
  }
138
143
  if key in mask_columns and key in create_data:
139
144
  create_data[key] = "****"
@@ -154,11 +159,19 @@ class Audit(has_many.HasMany):
154
159
  continue
155
160
  from_data = {
156
161
  **from_data,
157
- **parent_columns[column].to_json(old_model),
162
+ **(
163
+ parent_columns[column].to_json(old_model)
164
+ if column in parent_columns
165
+ else {column: old_data.get(column)}
166
+ ),
158
167
  }
159
168
  to_data = {
160
169
  **to_data,
161
- **parent_columns[column].to_json(model),
170
+ **(
171
+ parent_columns[column].to_json(model)
172
+ if column in parent_columns
173
+ else {column: model._data.get(column)}
174
+ ),
162
175
  }
163
176
  if column in mask_columns and column in to_data:
164
177
  to_data[column] = "****"
@@ -187,7 +200,7 @@ class Audit(has_many.HasMany):
187
200
  continue
188
201
  final_data = {
189
202
  **final_data,
190
- **parent_columns[key].to_json(model),
203
+ **(parent_columns[key].to_json(model) if key in parent_columns else {key: model.data.get(key)}),
191
204
  }
192
205
 
193
206
  for key in mask_columns:
@@ -0,0 +1,48 @@
1
+ from .string import String
2
+ import re
3
+
4
+
5
+ class Phone(String):
6
+ my_configs = [
7
+ "usa_only",
8
+ ]
9
+
10
+ def __init__(self, di):
11
+ super().__init__(di)
12
+
13
+ def to_backend(self, data):
14
+ if self.name not in data:
15
+ return data
16
+
17
+ # phone numbers are stored as only digits.
18
+ return {**data, **{self.name: re.sub(r"\D", "", data[self.name])}}
19
+
20
+ def input_error_for_value(self, value, operator=None):
21
+ if type(value) != str:
22
+ return f"Value must be a string for {self.name}"
23
+
24
+ # we'll allow spaces, dashes, parenthesis, dashes, and plus signs.
25
+ # if there is anything else then it's not a valid phone number.
26
+ # However, we don't do more detailed validation, because I'm too lazy to
27
+ # figure out what is and is not a valid phone number, especially when
28
+ # you get to the world of international numbers.
29
+ if re.search(r"[^\d \-()+]", value):
30
+ return "Invalid phone number"
31
+
32
+ # for some final validation (especially US numbers) work only with the digits.
33
+ value = re.sub(r"\D", "", value)
34
+
35
+ if len(value) > 15:
36
+ return "Invalid phone number"
37
+
38
+ # we can't be too short unless we're doing a fuzzy search
39
+ if len(value) < 10 and operator and operator.lower() != "like":
40
+ return "Invalid phone number"
41
+
42
+ if self.config("usa_only", silent=True):
43
+ if len(value) > 11:
44
+ return "Invalid phone number"
45
+ if value[0] == "1" and len(value) != 11:
46
+ return "Invalid phone number"
47
+
48
+ return ""