wbcore 2.2.3__py2.py3-none-any.whl → 2.2.5__py2.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.
- wbcore/contrib/color/admin.py +28 -0
- wbcore/contrib/color/apps.py +5 -0
- wbcore/contrib/color/enums.py +17 -0
- wbcore/contrib/color/factories.py +10 -0
- wbcore/contrib/color/fields.py +29 -0
- wbcore/contrib/color/forms.py +13 -0
- wbcore/contrib/color/models.py +62 -0
- wbcore/contrib/color/tests/conftest.py +10 -0
- wbcore/contrib/color/tests/test_color_models.py +61 -0
- wbcore/contrib/color/tests/test_fields.py +25 -0
- wbcore/contrib/documents/tests/conftest.py +30 -0
- wbcore/contrib/documents/tests/test_models.py +144 -0
- wbcore/contrib/example_app/tests/test_models/test_event.py +87 -0
- wbcore/contrib/example_app/tests/test_models/test_match.py +210 -0
- wbcore/contrib/example_app/tests/test_models/test_others.py +159 -0
- wbcore/contrib/example_app/tests/test_serializers/test_league_serializer.py +34 -0
- wbcore/contrib/example_app/tests/test_serializers/test_match_serializer.py +134 -0
- wbcore/contrib/example_app/tests/test_serializers/test_role_serializer.py +13 -0
- wbcore/contrib/example_app/tests/test_serializers/test_sport_serializer.py +14 -0
- wbcore/contrib/example_app/tests/test_serializers/test_stadium_serializer.py +14 -0
- wbcore/contrib/example_app/tests/test_serializers/test_team_result_serializer.py +30 -0
- wbcore/contrib/example_app/tests/test_serializers/test_team_serializer.py +70 -0
- wbcore/contrib/example_app/tests/test_viewsets/test_event_viewset.py +162 -0
- wbcore/contrib/example_app/tests/test_viewsets/test_league_viewset.py +84 -0
- wbcore/contrib/example_app/tests/test_viewsets/test_match_viewset.py +65 -0
- wbcore/contrib/example_app/tests/test_viewsets/test_person_viewset.py +166 -0
- wbcore/contrib/example_app/tests/test_viewsets/test_role_viewset.py +75 -0
- wbcore/contrib/example_app/tests/test_viewsets/test_sport_viewset.py +75 -0
- wbcore/contrib/example_app/tests/test_viewsets/test_stadium_viewset.py +75 -0
- wbcore/contrib/example_app/tests/test_viewsets/test_team_viewset.py +92 -0
- wbcore/contrib/example_app/tests/test_viewsets/test_teamresult_viewset.py +58 -0
- wbcore/contrib/example_app/tests/test_viewsets/test_utils_viewsets.py +124 -0
- wbcore/contrib/guardian/apps.py +6 -0
- wbcore/contrib/guardian/configurations.py +3 -0
- wbcore/contrib/guardian/filters.py +21 -0
- wbcore/contrib/guardian/tasks.py +10 -0
- wbcore/contrib/guardian/urls.py +12 -0
- wbcore/contrib/guardian/utils.py +124 -0
- wbcore/contrib/notifications/viewsets/configs/notification_types.py +27 -0
- wbcore/contrib/notifications/viewsets/configs/notifications.py +85 -0
- wbcore/contrib/workflow/tests/test_models/step/test_decision_step.py +79 -0
- wbcore/contrib/workflow/tests/test_models/step/test_email_step.py +45 -0
- wbcore/contrib/workflow/tests/test_models/step/test_finish_step.py +105 -0
- wbcore/contrib/workflow/tests/test_models/step/test_join_step.py +127 -0
- wbcore/contrib/workflow/tests/test_models/step/test_script_step.py +24 -0
- wbcore/contrib/workflow/tests/test_models/step/test_split_step.py +49 -0
- wbcore/contrib/workflow/tests/test_models/step/test_step.py +621 -0
- wbcore/contrib/workflow/tests/test_models/step/test_user_step.py +225 -0
- wbcore/contrib/workflow/tests/test_models/test_condition.py +103 -0
- wbcore/contrib/workflow/tests/test_models/test_data.py +134 -0
- wbcore/contrib/workflow/tests/test_models/test_process.py +98 -0
- wbcore/contrib/workflow/tests/test_models/test_transition.py +128 -0
- wbcore/contrib/workflow/tests/test_models/test_workflow.py +358 -0
- wbcore/templates/forms.py +0 -0
- wbcore/test/e2e_helpers_methods/e2e_checks.py +121 -0
- wbcore/test/e2e_helpers_methods/e2e_helper_methods.py +395 -0
- wbcore/tests/test_permissions/test_backend.py +29 -0
- {wbcore-2.2.3.dist-info → wbcore-2.2.5.dist-info}/METADATA +1 -1
- {wbcore-2.2.3.dist-info → wbcore-2.2.5.dist-info}/RECORD +60 -16
- wbcore/contrib/agenda/release_notes/1_0_0.md +0 -13
- wbcore/contrib/authentication/release_notes/1_0_0.md +0 -13
- wbcore/contrib/currency/release_notes/1_0_0.md +0 -13
- wbcore/contrib/directory/release_notes/1_0_0.md +0 -13
- wbcore/contrib/directory/release_notes/1_0_1.md +0 -13
- wbcore/contrib/documents/release_notes/1_0_0.md +0 -13
- wbcore/contrib/geography/release_notes/1_0_0.md +0 -13
- wbcore/contrib/io/release_notes/1_0_0.md +0 -13
- wbcore/contrib/notifications/release_notes/1_0_0.md +0 -13
- wbcore/contrib/tags/release_notes/1_0_0.md +0 -13
- wbcore/docs/orderable.md +0 -29
- wbcore/docs/reparent.md +0 -13
- wbcore/templates/reversion/compare_detail.html +0 -19
- {wbcore-2.2.3.dist-info → wbcore-2.2.5.dist-info}/WHEEL +0 -0
|
@@ -0,0 +1,395 @@
|
|
|
1
|
+
from pytest_django.live_server_helper import LiveServer
|
|
2
|
+
from selenium.common.exceptions import TimeoutException
|
|
3
|
+
from selenium.webdriver.common.action_chains import ActionChains
|
|
4
|
+
from selenium.webdriver.common.by import By
|
|
5
|
+
from selenium.webdriver.remote.webdriver import WebDriver
|
|
6
|
+
from selenium.webdriver.remote.webelement import WebElement
|
|
7
|
+
from selenium.webdriver.support import expected_conditions as EC
|
|
8
|
+
from selenium.webdriver.support.wait import WebDriverWait
|
|
9
|
+
from wbcore import serializers as wb_serializers
|
|
10
|
+
|
|
11
|
+
WAIT_TIME_SEC = 30
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def login(driver: WebDriver, user_mail: str | None, user_password: str | None):
|
|
15
|
+
"""Automatically logs in a user into the workbench.
|
|
16
|
+
|
|
17
|
+
Args:
|
|
18
|
+
driver (WebDriver): Selenium webdriver.
|
|
19
|
+
user_mail (str | None): The users email.
|
|
20
|
+
user_password (str | None): The users password
|
|
21
|
+
"""
|
|
22
|
+
write_text(driver, "//input[@placeholder='E-Mail']", user_mail)
|
|
23
|
+
write_text(driver, "//input[@placeholder='Password']", user_password)
|
|
24
|
+
click_element_by_path(driver, "//button[@label='Login']")
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def set_up(driver: WebDriver, server: LiveServer, user_mail: str, user_password: str):
|
|
28
|
+
"""Used for setting up the test environment and needs to be called before executing the test logic.
|
|
29
|
+
|
|
30
|
+
Args:
|
|
31
|
+
driver (WebDriver): Selenium webdriver.
|
|
32
|
+
server (LiveServer): Live server.
|
|
33
|
+
user_mail (str): The email of the user used for authentication.
|
|
34
|
+
user_password (str): The password of the user used for authentication.
|
|
35
|
+
"""
|
|
36
|
+
driver.get(server.url)
|
|
37
|
+
driver.set_window_size(1920, 1080)
|
|
38
|
+
login(driver, user_mail, user_password)
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def open_menu_item(driver: WebDriver, *menu_items, perform_mouse_move=False):
|
|
42
|
+
"""Automatically opens a menu item of the CRM.
|
|
43
|
+
|
|
44
|
+
Args:
|
|
45
|
+
driver (WebDriver): The Selenium webdriver.
|
|
46
|
+
*menu_items: The path to the menu item you want to open (e.g. for Person you would have to insert "CRM", "Persons" to get to the person list.)
|
|
47
|
+
perform_mouse_move (bool, optional): Should the mouse move after opening the correct menu item. This can be helpful, when the navigation bar block certain things. When moving the mouse away from the navigation bar, the bar will collapse. Defaults to False.
|
|
48
|
+
"""
|
|
49
|
+
actions = ActionChains(driver, 1000)
|
|
50
|
+
ele = find_element(driver, "//div[@title='Navigation']")
|
|
51
|
+
actions.move_to_element(ele).perform()
|
|
52
|
+
|
|
53
|
+
for menu_item in menu_items:
|
|
54
|
+
click_element_by_path(driver, f"//div[@title='{menu_item}']")
|
|
55
|
+
|
|
56
|
+
if perform_mouse_move:
|
|
57
|
+
window_width = (driver.get_window_size().get("width")) / 1.75
|
|
58
|
+
actions.move_by_offset(window_width, 0).perform()
|
|
59
|
+
actions.click()
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
def open_create_instance(driver: WebDriver, *menu_items: str, create_instance_title: str):
|
|
63
|
+
"""Opens a create instance widget
|
|
64
|
+
|
|
65
|
+
Args:
|
|
66
|
+
driver (WebDriver): The Selenium webdriver.
|
|
67
|
+
*menu_items: The path to the menu item you want to open (e.g. for Person you would have to insert "CRM", "Persons" to get to the person list.)
|
|
68
|
+
create_instance_title (str): The title of the create instance button (e.g. Create Activity)
|
|
69
|
+
"""
|
|
70
|
+
actions = ActionChains(driver, 1000)
|
|
71
|
+
open_menu_item(driver, *menu_items)
|
|
72
|
+
click_element_by_path(driver, f"//span[@title='{create_instance_title}']")
|
|
73
|
+
window_width = (driver.get_window_size().get("width")) / 2
|
|
74
|
+
actions.move_by_offset(window_width, 0).perform()
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
def write_text(driver: WebDriver, xpath: str, text: str) -> WebElement:
|
|
78
|
+
"""Writes a given text into an element. Requires the element to be writable.
|
|
79
|
+
|
|
80
|
+
Args:
|
|
81
|
+
driver (WebDriver): Selenium webdriver.
|
|
82
|
+
xpath (str): The xpath leading to the element.
|
|
83
|
+
text (str): The desired text.
|
|
84
|
+
|
|
85
|
+
Returns:
|
|
86
|
+
WebElement: The element in which it was written.
|
|
87
|
+
"""
|
|
88
|
+
element = find_element(driver, xpath)
|
|
89
|
+
element.send_keys(text)
|
|
90
|
+
|
|
91
|
+
return element
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
def approve_form(driver: WebDriver, element: WebElement):
|
|
95
|
+
click_button_by_label(driver, "Approve")
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
# ====================================================================================================================================== #
|
|
99
|
+
# ========================================================== FINDING ELEMENTS ========================================================== #
|
|
100
|
+
# ====================================================================================================================================== #
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
def find_element(driver: WebDriver, xpath: str, wait_sec=WAIT_TIME_SEC) -> WebElement | None:
|
|
104
|
+
"""Find a single web element on the current page.
|
|
105
|
+
|
|
106
|
+
Args:
|
|
107
|
+
driver (WebDriver): Selenium webdriver.
|
|
108
|
+
xpath (str): The xpath used to look up the element.
|
|
109
|
+
wait_sec (int): the seconds the driver waits for the element to be visible.
|
|
110
|
+
|
|
111
|
+
Returns:
|
|
112
|
+
WebElement: The found element.
|
|
113
|
+
"""
|
|
114
|
+
try:
|
|
115
|
+
return WebDriverWait(driver, wait_sec).until(lambda x: x.find_element(By.XPATH, xpath))
|
|
116
|
+
except TimeoutException:
|
|
117
|
+
return None
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
def find_element_by_text(driver: WebDriver, text: str, wait_sec=WAIT_TIME_SEC) -> WebElement | None:
|
|
121
|
+
"""Find a web element based on a string.
|
|
122
|
+
|
|
123
|
+
Args:
|
|
124
|
+
driver (WebDriver): Selenium webdriver.
|
|
125
|
+
text (str): The text that appears in the element we are searching
|
|
126
|
+
|
|
127
|
+
Returns:
|
|
128
|
+
WebElement: The found element.
|
|
129
|
+
"""
|
|
130
|
+
try:
|
|
131
|
+
xpath: str = f"//*[contains(text(), '{text}')]//parent::div"
|
|
132
|
+
return WebDriverWait(driver, wait_sec).until(lambda x: x.find_element(By.XPATH, xpath))
|
|
133
|
+
except TimeoutException:
|
|
134
|
+
return None
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
# ====================================================================================================================================== #
|
|
138
|
+
# ========================================================= CLICKING ELEMENTS ========================================================== #
|
|
139
|
+
# ====================================================================================================================================== #
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
def click_element(driver: WebDriver, element: WebElement) -> None:
|
|
143
|
+
"""Click a given web element.
|
|
144
|
+
|
|
145
|
+
Args:
|
|
146
|
+
driver (WebDriver): Selenium webdriver.
|
|
147
|
+
xpath (str): The element that needs clicking.
|
|
148
|
+
"""
|
|
149
|
+
element.click()
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
def click_element_by_path(driver: WebDriver, xpath: str, wait_sec=WAIT_TIME_SEC) -> None:
|
|
153
|
+
"""Click on the item corresponding to the xpath.
|
|
154
|
+
|
|
155
|
+
Args:
|
|
156
|
+
driver (WebDriver): Selenium webdriver.
|
|
157
|
+
xpath (str): The xpath leading to the element.
|
|
158
|
+
"""
|
|
159
|
+
try:
|
|
160
|
+
WebDriverWait(driver, wait_sec).until(EC.presence_of_element_located((By.XPATH, xpath))).click()
|
|
161
|
+
except TimeoutException:
|
|
162
|
+
return []
|
|
163
|
+
|
|
164
|
+
|
|
165
|
+
def click_button_by_label(driver: WebDriver, label: str):
|
|
166
|
+
"""Clicks a button according to its label.
|
|
167
|
+
|
|
168
|
+
Args:
|
|
169
|
+
driver (WebDriver): Selenium webdriver.
|
|
170
|
+
label (str): The button label.
|
|
171
|
+
"""
|
|
172
|
+
click_element_by_path(driver, f"//button[@label='{label}']")
|
|
173
|
+
|
|
174
|
+
|
|
175
|
+
def click_new_button(driver: WebDriver):
|
|
176
|
+
"""Clicks the new button on the current page.
|
|
177
|
+
|
|
178
|
+
Args:
|
|
179
|
+
driver (WebDriver): Selenium webdriver.
|
|
180
|
+
"""
|
|
181
|
+
click_element_by_path(driver, "//button[contains(@class, 'new-button')]")
|
|
182
|
+
|
|
183
|
+
|
|
184
|
+
def click_cancel_on_button(driver: WebDriver, button_label: str):
|
|
185
|
+
"""Clicks the cancel symbol on the button with the specified label.
|
|
186
|
+
|
|
187
|
+
Args:
|
|
188
|
+
driver (WebDriver): Selenium webdriver.
|
|
189
|
+
label (str): The button label.
|
|
190
|
+
"""
|
|
191
|
+
click_element_by_path(driver, f"//td[@title='{button_label}']//parent::tr//div//span[.='cancel']")
|
|
192
|
+
|
|
193
|
+
|
|
194
|
+
def click_close_all_widgets(driver: WebDriver):
|
|
195
|
+
"""Clicks the close all widgets button.
|
|
196
|
+
|
|
197
|
+
Args:
|
|
198
|
+
driver (WebDriver): Selenium webdriver.
|
|
199
|
+
"""
|
|
200
|
+
click_element_by_path(driver, "//button[@title='Close all widgets']")
|
|
201
|
+
|
|
202
|
+
|
|
203
|
+
# ====================================================================================================================================== #
|
|
204
|
+
# ========================================================= HANDLE FORM FIELDS ========================================================= #
|
|
205
|
+
# ====================================================================================================================================== #
|
|
206
|
+
|
|
207
|
+
|
|
208
|
+
def edit_form_fields(driver: WebDriver, serializer: wb_serializers, changes: dict[str]):
|
|
209
|
+
"""A method to edit the fields in a form.
|
|
210
|
+
|
|
211
|
+
Args:
|
|
212
|
+
driver (WebDriver): The Selenium webdriver.
|
|
213
|
+
serializer (wb_serializers): The serializer that matches the model of the form.
|
|
214
|
+
changes (dict[str]): A dict containing the changes. The dict keys should have the names of the corresponding fields (e.g. {"last_name": "Hotzenplotz"}).
|
|
215
|
+
"""
|
|
216
|
+
field_list = list(changes.keys())
|
|
217
|
+
for field in field_list:
|
|
218
|
+
if not changes.get(field):
|
|
219
|
+
continue
|
|
220
|
+
if type(serializer.fields[field]) is wb_serializers.CharField:
|
|
221
|
+
find_element(
|
|
222
|
+
driver, f"//label[contains(text(), '{serializer.fields[field].label}')]//parent::div//input"
|
|
223
|
+
).clear()
|
|
224
|
+
write_text(
|
|
225
|
+
driver,
|
|
226
|
+
f"//label[contains(text(), '{serializer.fields[field].label}')]//parent::div//input",
|
|
227
|
+
changes[field],
|
|
228
|
+
)
|
|
229
|
+
elif type(serializer.fields[field]) is wb_serializers.ChoiceField:
|
|
230
|
+
click_element_by_path(
|
|
231
|
+
driver,
|
|
232
|
+
f"//label[contains(text(), '{serializer.fields[field].label}')]//parent::div//span[text()='expand_more']",
|
|
233
|
+
)
|
|
234
|
+
click_element_by_path(driver, f"//div[contains(text(),'{changes[field]}')]")
|
|
235
|
+
elif type(serializer.fields[field]) is wb_serializers.PrimaryKeyRelatedField:
|
|
236
|
+
click_element_by_path(
|
|
237
|
+
driver,
|
|
238
|
+
f"//label[contains(text(), '{serializer.fields[field].label}')]//parent::div//span[text()='expand_more']",
|
|
239
|
+
)
|
|
240
|
+
click_element_by_path(driver, f"//li[contains(text(),'{changes[field]}')]")
|
|
241
|
+
|
|
242
|
+
|
|
243
|
+
def fill_out_form_fields(driver: WebDriver, serializer: wb_serializers, field_list: list[str], entity):
|
|
244
|
+
"""A method to fill out the fields in a form.
|
|
245
|
+
|
|
246
|
+
Args:
|
|
247
|
+
driver (WebDriver): The Selenium webdriver.
|
|
248
|
+
serializer (wb_serializers): The serializer that matches the model of the form.
|
|
249
|
+
field_list (list[str]): A list of the field names to be changed.
|
|
250
|
+
entity (_type_): An entity on which the changes to the form are based. The entity should be created via the corresponding factory. (The entity should be created by using the Factory build method: e.g. PersonFactory.build())
|
|
251
|
+
"""
|
|
252
|
+
for field in field_list:
|
|
253
|
+
if type(serializer.fields[field]) in [wb_serializers.CharField, wb_serializers.IntegerField]:
|
|
254
|
+
write_text(
|
|
255
|
+
driver,
|
|
256
|
+
f"//label[contains(text(), '{serializer.fields[field].label}')]//parent::div//input",
|
|
257
|
+
getattr(entity, field),
|
|
258
|
+
)
|
|
259
|
+
elif type(serializer.fields[field]) is wb_serializers.ChoiceField:
|
|
260
|
+
click_element_by_path(
|
|
261
|
+
driver,
|
|
262
|
+
f"//label[contains(text(), '{serializer.fields[field].label}')]//parent::div//span[text()='expand_more']",
|
|
263
|
+
)
|
|
264
|
+
click_element_by_path(driver, f"//div[contains(text(), '{getattr(entity, field)}')]")
|
|
265
|
+
elif type(serializer.fields[field]) is wb_serializers.PrimaryKeyRelatedField:
|
|
266
|
+
click_element_by_path(
|
|
267
|
+
driver,
|
|
268
|
+
f"//label[contains(text(), '{serializer.fields[field].label}')]//parent::div//span[text()='expand_more']",
|
|
269
|
+
)
|
|
270
|
+
click_element_by_path(driver, f"//li[contains(text(), '{getattr(entity, field)}')]")
|
|
271
|
+
elif type(serializer.fields[field]) is wb_serializers.BooleanField:
|
|
272
|
+
click_element_by_path(
|
|
273
|
+
driver,
|
|
274
|
+
f"//label[contains(text(), '{serializer.fields[field].label}')]//parent::div//div//span[text()='{'Yes' if {getattr(entity, field)} else 'No'}']",
|
|
275
|
+
)
|
|
276
|
+
|
|
277
|
+
|
|
278
|
+
# ====================================================================================================================================== #
|
|
279
|
+
# ======================================================== HANDLE LIST INSTANCES ======================================================= #
|
|
280
|
+
# ====================================================================================================================================== #
|
|
281
|
+
|
|
282
|
+
|
|
283
|
+
def edit_list_instance(
|
|
284
|
+
driver: WebDriver,
|
|
285
|
+
actions,
|
|
286
|
+
list_name: str,
|
|
287
|
+
serializer: wb_serializers.ModelSerializer,
|
|
288
|
+
new_inputs: dict,
|
|
289
|
+
):
|
|
290
|
+
"""Edits a list instance.
|
|
291
|
+
|
|
292
|
+
Args:
|
|
293
|
+
driver (WebDriver): The Selenium webdriver.
|
|
294
|
+
actions (_type_): The selenium action chains.
|
|
295
|
+
list_name (str): The name of the list (e.g.: Persons)
|
|
296
|
+
serializer (wb_serializers.ModelSerializer): The model serializer that matches the lists model.
|
|
297
|
+
new_inputs (dict): A dict containing changes. The dict keys should have the names of the corresponding fields (e.g. {"last_name": "Hotzenplotz"}).
|
|
298
|
+
"""
|
|
299
|
+
list_element = find_element(driver, f"//div[text()='{list_name}']")
|
|
300
|
+
actions.double_click(list_element).perform()
|
|
301
|
+
if unlock_button := find_element(driver, "//button[@label='Unlock']"):
|
|
302
|
+
click_element(driver, unlock_button)
|
|
303
|
+
edit_form_fields(driver, serializer, new_inputs)
|
|
304
|
+
click_element_by_path(driver, "//button[@label='Save and close']")
|
|
305
|
+
|
|
306
|
+
|
|
307
|
+
def delete_list_entry(driver: WebDriver, actions: ActionChains, title: str):
|
|
308
|
+
"""Deletes a list entry. Requires that you are already in the correct list view.
|
|
309
|
+
|
|
310
|
+
Args:
|
|
311
|
+
driver (WebDriver): The Selenium webdriver.
|
|
312
|
+
actions (ActionChains): The selenium action chains.
|
|
313
|
+
title (str): The title of the list element that shall be deleted.
|
|
314
|
+
"""
|
|
315
|
+
list_element = find_element(driver, f"//div[text()='{title}']")
|
|
316
|
+
actions.context_click(list_element).perform()
|
|
317
|
+
click_element_by_path(driver, "//span[text()='Delete instance']")
|
|
318
|
+
click_element_by_path(driver, "//button[@label='Confirm']")
|
|
319
|
+
|
|
320
|
+
|
|
321
|
+
# ====================================================================================================================================== #
|
|
322
|
+
# =========================================================== HANDLE FILTERS =========================================================== #
|
|
323
|
+
# ====================================================================================================================================== #
|
|
324
|
+
|
|
325
|
+
|
|
326
|
+
def navigate_to_filter(driver: WebDriver, *menu_items):
|
|
327
|
+
"""Navigates to a specified list instance and opens the filter menu there.
|
|
328
|
+
|
|
329
|
+
Args:
|
|
330
|
+
driver (WebDriver): Selenium webdriver
|
|
331
|
+
menu_item (str): The menu in which the filters should be open. You need to specify the whole path to the menu. E.g. ["CRM", "Persons"] to get to the CRMs persons menu.
|
|
332
|
+
"""
|
|
333
|
+
actions = ActionChains(driver, 1000)
|
|
334
|
+
open_menu_item(driver, *menu_items)
|
|
335
|
+
# we need to move the mouse away from the side bar, so that the side bar closes.
|
|
336
|
+
window_width = (driver.get_window_size().get("width")) / 2
|
|
337
|
+
window_height = (driver.get_window_size().get("height")) / 2
|
|
338
|
+
actions.move_by_offset(window_width, window_height).perform()
|
|
339
|
+
|
|
340
|
+
filter_menu_btn = find_element(driver, "//button[@data-testid='control-bar-toggle-button']")
|
|
341
|
+
click_element(driver, filter_menu_btn)
|
|
342
|
+
|
|
343
|
+
|
|
344
|
+
def select_filter(driver: WebDriver, label: str, option: str):
|
|
345
|
+
"""Select a filter from the filter menu a filter by the corresponding label.
|
|
346
|
+
|
|
347
|
+
Args:
|
|
348
|
+
driver (WebDriver): Selenium webdriver
|
|
349
|
+
label (str): The filter label. (e.g. "Status" for the status - filter )
|
|
350
|
+
option (str): The filter choice. (e.g. the "Planned" choice for the status filter)
|
|
351
|
+
"""
|
|
352
|
+
no_activity_choices = find_element(
|
|
353
|
+
driver, f"//label[text()='{label}']/parent::div//parent::div/button[contains(span, 'expand_more')]"
|
|
354
|
+
)
|
|
355
|
+
click_element(driver, no_activity_choices)
|
|
356
|
+
click_element_by_path(driver, f"//li//div[text()='{option}']")
|
|
357
|
+
click_element_by_path(driver, "//button[@label='Apply']")
|
|
358
|
+
|
|
359
|
+
|
|
360
|
+
def select_async_filter(driver: WebDriver, label: str, option: str):
|
|
361
|
+
"""Select a async filter from the filter menu a filter by the corresponding label.
|
|
362
|
+
|
|
363
|
+
Args:
|
|
364
|
+
driver (WebDriver): Selenium webdriver
|
|
365
|
+
label (str): The filter label. (e.g. "Status" for the status - filter )
|
|
366
|
+
option (str): The filter choice. (e.g. the "Planned" choice for the status filter)
|
|
367
|
+
"""
|
|
368
|
+
no_activity_choices = find_element(
|
|
369
|
+
driver, f"//label[text()='{label}']/parent::div//parent::span[contains(text(), 'expand_more')]"
|
|
370
|
+
)
|
|
371
|
+
click_element(driver, no_activity_choices)
|
|
372
|
+
click_element_by_path(driver, f"//li[@title='{option}']")
|
|
373
|
+
click_element_by_path(driver, "//button[@label='Apply']")
|
|
374
|
+
|
|
375
|
+
|
|
376
|
+
def select_column_filter(driver: WebDriver, label: str, option: str):
|
|
377
|
+
"""Select a filter from a list column by the corresponding label.
|
|
378
|
+
|
|
379
|
+
Args:
|
|
380
|
+
driver (WebDriver): Selenium webdriver
|
|
381
|
+
label (str): The filter label. (e.g. "Status" for the status - filter )
|
|
382
|
+
option (str): The filter choice. (e.g. the "Planned" choice for the status filter)
|
|
383
|
+
"""
|
|
384
|
+
click_element_by_path(
|
|
385
|
+
driver,
|
|
386
|
+
f"//div[contains(@class, 'ag-cell-label-container') and ./div/span/text()='{label}']//span[contains(@class, 'ag-header-cell-menu-button')]",
|
|
387
|
+
)
|
|
388
|
+
click_element_by_path(
|
|
389
|
+
driver, "//div[@class='ag-tabs-header ag-menu-header']//span[contains(@class, 'ag-icon-filter')]"
|
|
390
|
+
)
|
|
391
|
+
click_element_by_path(
|
|
392
|
+
driver,
|
|
393
|
+
f"//div[contains(@class, 'ag-virtual-list-container')]//div[contains(@class, 'ag-virtual-list-item') and ./div/div/div/text()='{option}']//input",
|
|
394
|
+
)
|
|
395
|
+
click_element_by_path(driver, "//button[@type='submit']")
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import pytest
|
|
2
|
+
from django.contrib.auth import get_user_model
|
|
3
|
+
from django.contrib.auth.models import Permission
|
|
4
|
+
from django.contrib.contenttypes.models import ContentType
|
|
5
|
+
from faker import Faker
|
|
6
|
+
from wbcore.permissions.shortcuts import get_internal_users
|
|
7
|
+
|
|
8
|
+
User = get_user_model()
|
|
9
|
+
|
|
10
|
+
fake = Faker()
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def create_internal_user():
|
|
14
|
+
from wbcore.permissions.registry import user_registry
|
|
15
|
+
|
|
16
|
+
user = User.objects.create(is_active=True, username=fake.user_name(), email=fake.email())
|
|
17
|
+
permission = Permission.objects.get_or_create(
|
|
18
|
+
content_type=ContentType.objects.get_for_model(User), codename="is_internal_user"
|
|
19
|
+
)[0]
|
|
20
|
+
user.user_permissions.add(permission)
|
|
21
|
+
user_registry.reset_cache()
|
|
22
|
+
return user
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
@pytest.mark.django_db
|
|
26
|
+
class TestBackend:
|
|
27
|
+
def test_get_internal_users(self):
|
|
28
|
+
user = create_internal_user()
|
|
29
|
+
assert set(get_internal_users()) == {user}
|
|
@@ -78,7 +78,6 @@ wbcore/contrib/agenda/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRk
|
|
|
78
78
|
wbcore/contrib/agenda/models/__init__.py,sha256=IfSBX-jDEegu6HvZ6a2EvFkUV6tYu1v29FxlxXbpTHE,94
|
|
79
79
|
wbcore/contrib/agenda/models/calendar_item.py,sha256=yLt5_joIMQ8RilmfQ2rh4d18zGjDMzSJ_C-FuNkfmYQ,8273
|
|
80
80
|
wbcore/contrib/agenda/models/conference_room.py,sha256=nHI50Fkj71VfeKD0yF8gq8v_w0naTCdDm6MjS7QMhlo,2794
|
|
81
|
-
wbcore/contrib/agenda/release_notes/1_0_0.md,sha256=R4dJ7bqiHOQrKseVY0O7_untC6-1I9BBYy8qJYIdYLw,162
|
|
82
81
|
wbcore/contrib/agenda/release_notes/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
83
82
|
wbcore/contrib/agenda/serializers/__init__.py,sha256=CD2G1X_UUFegj3vznA1bswKxMWlKEo2zVgEx95-NC9c,285
|
|
84
83
|
wbcore/contrib/agenda/serializers/calendar_item.py,sha256=zHbJtgt9XxgnNf6aL-1Fh44SPGHTqvmbxzR3bUh3nUs,2608
|
|
@@ -140,7 +139,6 @@ wbcore/contrib/authentication/models/__init__.py,sha256=GhtPxWgZEUcbFQt2ArdB6OPj
|
|
|
140
139
|
wbcore/contrib/authentication/models/tokens.py,sha256=QGNz4Tejy6KqxOnrIGIGC4PPbKsP-CbGQ3AXNsN-zW4,5415
|
|
141
140
|
wbcore/contrib/authentication/models/users.py,sha256=PFvsLQ6W15Z_tROgagV_S8coeUa1-fIabJiasVgHO1U,7867
|
|
142
141
|
wbcore/contrib/authentication/models/users_activities.py,sha256=pAwEDe3jquoQZnXeMAQDmDntv2oCI1DgVTxYGBiDTKs,4225
|
|
143
|
-
wbcore/contrib/authentication/release_notes/1_0_0.md,sha256=pZ6rgeR5mTB3vabX3eaEJXMSfs7m4a1SEbYdpAmXwyI,170
|
|
144
142
|
wbcore/contrib/authentication/release_notes/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
145
143
|
wbcore/contrib/authentication/serializers/__init__.py,sha256=pY77syWz4VtH1RlGMv5-0nlnneDshvNDmk-N52lBXIc,455
|
|
146
144
|
wbcore/contrib/authentication/serializers/users.py,sha256=-j-ORm7yGvJaaTmFwqTytOhrTzW8L21WhbHGIN92V5U,14329
|
|
@@ -174,9 +172,19 @@ wbcore/contrib/authentication/viewsets/menu/users.py,sha256=6LjN8jgaYhx_yyONaSZr
|
|
|
174
172
|
wbcore/contrib/authentication/viewsets/titles/__init__.py,sha256=31xz3WVIyV_uCYd1dsqfPPwhnRdEzW86IhFGFrAXLOM,330
|
|
175
173
|
wbcore/contrib/authentication/viewsets/titles/user_activities.py,sha256=gaQU6aq3Wz-_kUbTqV0OsJ1jfk9UIkPB-aoVFeW9-so,978
|
|
176
174
|
wbcore/contrib/authentication/viewsets/titles/users.py,sha256=chz_J0zV4KwwROrh6As031ELOFqLViIJVikqPuzwLEg,715
|
|
175
|
+
wbcore/contrib/color/admin.py,sha256=wtvcldVeqGWvDTcLsW1FZwssyFNn5HfL-2v0rJEk9LU,959
|
|
176
|
+
wbcore/contrib/color/apps.py,sha256=OdA_ws68vvKlCrcxrryrT07fDzarKKDkz-1KsUG8eHk,103
|
|
177
|
+
wbcore/contrib/color/enums.py,sha256=yj1SqcQZdrcmXsY6VB1NT5d7aTZgkd2DamJt7jxiKAw,500
|
|
178
|
+
wbcore/contrib/color/factories.py,sha256=1J-0QnyhYFIpkD29aC5n8cPIY6SUdZti0Ra9GwgkX70,314
|
|
179
|
+
wbcore/contrib/color/fields.py,sha256=dPT1LyOyNujlgEKfh34pTPZS0nLQDOe63JhVrfH7KB0,806
|
|
180
|
+
wbcore/contrib/color/forms.py,sha256=FZxi4RzNnWYGJm9e9oYecxOSYAenB7XB9SEVW1AcIn4,435
|
|
181
|
+
wbcore/contrib/color/models.py,sha256=EkvpYI1cQhO-9n7xv2vuJm1fM_X0-1A4hpkQXrHbIPc,1963
|
|
177
182
|
wbcore/contrib/color/migrations/0001_initial.py,sha256=DvS0kImKDdSeIN7sPVEiy2Bbuv4GvEES9I196KyKWS0,1082
|
|
178
183
|
wbcore/contrib/color/migrations/0002_alter_colorgradient_colors.py,sha256=s5Lub5wPnJwfDw8GRCq0zd5DU5STpBt9GVDxVHxKLBM,705
|
|
179
184
|
wbcore/contrib/color/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
185
|
+
wbcore/contrib/color/tests/conftest.py,sha256=b5t60JOOYt-gMYIMzVWnqPWbxH_5UYW9UGQAl-KfUmc,364
|
|
186
|
+
wbcore/contrib/color/tests/test_color_models.py,sha256=QtUxPob50odTImEjlEoPOkj8uO66S8eQbfl1fw8eB8M,2506
|
|
187
|
+
wbcore/contrib/color/tests/test_fields.py,sha256=bcbEOR5bQSU20UqVZJzslh3WXCmDJT4LzxqZPnuisVk,686
|
|
180
188
|
wbcore/contrib/currency/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
181
189
|
wbcore/contrib/currency/admin.py,sha256=hNS_9jDMUcikV1T3soU0MQVJDvya7w-9wyW3dR__Ik8,1080
|
|
182
190
|
wbcore/contrib/currency/apps.py,sha256=10grJHw9gyBLDfbVJ-gGGUFcU5AgTaH7uBFr8j0bshE,106
|
|
@@ -198,7 +206,6 @@ wbcore/contrib/currency/import_export/parsers/fixerio/__init__.py,sha256=47DEQpj
|
|
|
198
206
|
wbcore/contrib/currency/import_export/parsers/fixerio/currency_fx_rates.py,sha256=pGO36qKVqdhwWjJpuQqa-UO0i_UWIVtQF3-jAUvoyV4,1242
|
|
199
207
|
wbcore/contrib/currency/migrations/0001_initial.py,sha256=v1bMEVABzqAHn6D9jdBzbj4j5wTrUYDc7_fONdEQ7Jw,3063
|
|
200
208
|
wbcore/contrib/currency/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
201
|
-
wbcore/contrib/currency/release_notes/1_0_0.md,sha256=Hm_Jt3S7nv30s3-Hl_ie0xkHgrRsZLuiBpOXkIDj2UE,164
|
|
202
209
|
wbcore/contrib/currency/release_notes/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
203
210
|
wbcore/contrib/currency/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
204
211
|
wbcore/contrib/currency/tests/conftest.py,sha256=WVsiPAsvPDwt9SsCSrUjM-jg5uc02Nqor8xQFltoZm8,200
|
|
@@ -277,8 +284,6 @@ wbcore/contrib/directory/models/__init__.py,sha256=XtnmU5YUr3SGig6PsSfGsWUaiBaX6
|
|
|
277
284
|
wbcore/contrib/directory/models/contacts.py,sha256=ESgEK-HQlkDwXyFZjLjuOq__dA0NF7JJE7kxEu7ps-4,18398
|
|
278
285
|
wbcore/contrib/directory/models/entries.py,sha256=viCSvIbNqPp7HLHu9rCPDgexvUdy3fOkpbJS6qoMrqo,31456
|
|
279
286
|
wbcore/contrib/directory/models/relationships.py,sha256=TtY-10eXZNA7w8ThJB7AxXboU9DuxvQLi9Y99_OZzHg,22607
|
|
280
|
-
wbcore/contrib/directory/release_notes/1_0_0.md,sha256=Twbl9RMLO6dbbm5dVoKorw8BecRqAYsKeobcNmDWHu8,165
|
|
281
|
-
wbcore/contrib/directory/release_notes/1_0_1.md,sha256=yHolV-HwBmIavaPn9pg0ABRgxQ-eKIuiAs-phKb_ix0,285
|
|
282
287
|
wbcore/contrib/directory/release_notes/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
283
288
|
wbcore/contrib/directory/serializers/__init__.py,sha256=I_gLUVnGsqp-97RLbXgD6kqvtLseT9mjR4suvpy5_PU,2165
|
|
284
289
|
wbcore/contrib/directory/serializers/companies.py,sha256=oP8C4Q_X4B1X4-FCAjWZjRV8C-OyHffhKyuGGcKvY6A,5493
|
|
@@ -350,13 +355,14 @@ wbcore/contrib/documents/models/document_types.py,sha256=6Ekqq_qNisqdbeL-Ck0sqkk
|
|
|
350
355
|
wbcore/contrib/documents/models/documents.py,sha256=GyGIJtrm0_BWppg1LUaL69VR6-dXSamDrbqCL-si_5Y,11256
|
|
351
356
|
wbcore/contrib/documents/models/mixins.py,sha256=6b_FO8ZTQ779f28O33auYdrIXDmnnMOIKvfQOkivjl8,230
|
|
352
357
|
wbcore/contrib/documents/models/shareable_links.py,sha256=OD-PaO7u_7FXRgHATm8FrqTTaxoZR5NoLpP8C-pQdv4,2840
|
|
353
|
-
wbcore/contrib/documents/release_notes/1_0_0.md,sha256=MIX-LM8Rr4odLJACp0SBNVn1OwQzdkTmPyDgMV1ImH4,164
|
|
354
358
|
wbcore/contrib/documents/release_notes/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
355
359
|
wbcore/contrib/documents/serializers/__init__.py,sha256=JQBjKbR6-rG5eIy4K0eSlH55vtdwqqztpqmhxC7yJa0,503
|
|
356
360
|
wbcore/contrib/documents/serializers/document_model_relationships.py,sha256=AvtHk3OGePZc3dXfqZjBtQrJhd_hx-2eUVsZZFfHKK4,962
|
|
357
361
|
wbcore/contrib/documents/serializers/document_types.py,sha256=j5RHyHKNAT07zcANz7ePg3M9bwzg43k3O4F3DBrVU_o,1506
|
|
358
362
|
wbcore/contrib/documents/serializers/documents.py,sha256=Urs5mU7cQsCw2BWRSNjkTdKGwd4TG-bqSaWaoMMoQtc,2406
|
|
359
363
|
wbcore/contrib/documents/serializers/shareable_links.py,sha256=SqelV7qQ56Sm-28cnT0ALZ5gHeBchUz9bQ3w8I29IP8,3318
|
|
364
|
+
wbcore/contrib/documents/tests/conftest.py,sha256=AP5whxYNsf77YBXRJEAV3V7bvkv7eX8KpXV-lMDyEUk,899
|
|
365
|
+
wbcore/contrib/documents/tests/test_models.py,sha256=sg8L_WUYsapBrschDV-KNVkHAF4t0nl4UkiTqMVrIDE,5054
|
|
360
366
|
wbcore/contrib/documents/viewsets/__init__.py,sha256=xo7GDVcZyBEQNrcOHydO-dFj68i8rBJ36Noxvgv_isY,461
|
|
361
367
|
wbcore/contrib/documents/viewsets/document_model_relationships.py,sha256=g7AeGHbA2wGyJfI8k4uXPIoICUMp34n9GnJ_QcNwjAs,975
|
|
362
368
|
wbcore/contrib/documents/viewsets/document_types.py,sha256=L18h3PpwuLxVb9wIWc407Ipn2DgKvM436uIerPePFLo,1415
|
|
@@ -438,6 +444,26 @@ wbcore/contrib/example_app/tests/e2e/e2e_example_app_utility.py,sha256=u2o4lDQwW
|
|
|
438
444
|
wbcore/contrib/example_app/tests/e2e/test_league.py,sha256=bWYYKc2-6VHWyuhrE1nSYqGXzJR8tjocqIYaiy_gNng,2798
|
|
439
445
|
wbcore/contrib/example_app/tests/e2e/test_person.py,sha256=fMaKfSulgXh85mNqzx4X-idFvK8DzHSStHFzc9rfrp4,2846
|
|
440
446
|
wbcore/contrib/example_app/tests/e2e/test_teams.py,sha256=Ci5DO06HcHu75qgxZBMw6bwVv2BEKVW0l9FCETtUJkk,2279
|
|
447
|
+
wbcore/contrib/example_app/tests/test_models/test_event.py,sha256=aThO0Z29vnwrUjZQpws6T6UWb6cpol0mjf8X93mR_pE,2912
|
|
448
|
+
wbcore/contrib/example_app/tests/test_models/test_match.py,sha256=C2TvmGAwz9pWDfK9JUIRr78wjUoq1TpccLskL6cLrGI,8358
|
|
449
|
+
wbcore/contrib/example_app/tests/test_models/test_others.py,sha256=SCJPT6yNyXHDyvmiOwL5MfX30fOPBgir7OEiiwhJvYo,5767
|
|
450
|
+
wbcore/contrib/example_app/tests/test_serializers/test_league_serializer.py,sha256=j-h6SJWgvb_PqBDhrWHuALkpaARhflABKjpXcBBlSdY,1413
|
|
451
|
+
wbcore/contrib/example_app/tests/test_serializers/test_match_serializer.py,sha256=gxQjSIuSGHopu70i2BqIynC0fXpYOBTEegiHcg8cLsk,5560
|
|
452
|
+
wbcore/contrib/example_app/tests/test_serializers/test_role_serializer.py,sha256=P8NUNCjbiz8grwX0nBoG8Y7v2GkZe_oq-As4rCBLpX0,516
|
|
453
|
+
wbcore/contrib/example_app/tests/test_serializers/test_sport_serializer.py,sha256=ilE43gIfG8H8x98KBrZOdI27U1P44dujAkLwc6Cmob0,527
|
|
454
|
+
wbcore/contrib/example_app/tests/test_serializers/test_stadium_serializer.py,sha256=d5OadgCZHC1UMSTarpunQHP8LP-rEjB1wWz5oUROQo8,547
|
|
455
|
+
wbcore/contrib/example_app/tests/test_serializers/test_team_result_serializer.py,sha256=lOu8sXjG6iQlLoKoWjcIA1EYauPiBDio4qFBWExCHK4,1116
|
|
456
|
+
wbcore/contrib/example_app/tests/test_serializers/test_team_serializer.py,sha256=ZQ6_-yHBazQod0HQuJQtF-XdcXpRDNVOYey9VuaLWho,3025
|
|
457
|
+
wbcore/contrib/example_app/tests/test_viewsets/test_event_viewset.py,sha256=uuTHZeaRBAh795sB8V8zIxqO35JcHL_pKFP2HZ4Xpvg,7531
|
|
458
|
+
wbcore/contrib/example_app/tests/test_viewsets/test_league_viewset.py,sha256=tdxmyZ_gXbskTO4N16Xv--5MHC9sMKmaW1ZH3rMFy_Y,3702
|
|
459
|
+
wbcore/contrib/example_app/tests/test_viewsets/test_match_viewset.py,sha256=1KkFdtMQi-9KmijXjeFtKj1n2-RO_CEhho-Mjb4ENFY,2814
|
|
460
|
+
wbcore/contrib/example_app/tests/test_viewsets/test_person_viewset.py,sha256=-8Vl8w6t48NSFvwDlDqWUnSgRqDaAz_dKf-QzjeYAys,7523
|
|
461
|
+
wbcore/contrib/example_app/tests/test_viewsets/test_role_viewset.py,sha256=cbFYwNqAKkqIQbqUbPX0OOjP_p0fdcU6J-pq_UMkBaA,3223
|
|
462
|
+
wbcore/contrib/example_app/tests/test_viewsets/test_sport_viewset.py,sha256=hpcwwBEhx4Cpow3w67RobKTJ6w4CZyeYO7fEuYOHQXM,3229
|
|
463
|
+
wbcore/contrib/example_app/tests/test_viewsets/test_stadium_viewset.py,sha256=3bHRo9aVTbaAdQBMJ5UkQVwCZOVxkkOdr-ly_Ct6G8w,3288
|
|
464
|
+
wbcore/contrib/example_app/tests/test_viewsets/test_team_viewset.py,sha256=4z21fNmXoFALPwlwLPajCT_qGFw-yx_01RLofAsLW1g,4159
|
|
465
|
+
wbcore/contrib/example_app/tests/test_viewsets/test_teamresult_viewset.py,sha256=-xeXMc3dLsvGPo8wabm-ULyIswNSRnS1jLkMURDg_30,2539
|
|
466
|
+
wbcore/contrib/example_app/tests/test_viewsets/test_utils_viewsets.py,sha256=s3W6w4hojZwmXOU1mYCNL7_GsS6PVHB4gKyznjWjRwE,5058
|
|
441
467
|
wbcore/contrib/example_app/viewsets/__init__.py,sha256=OSYKL4GYm6rIobWC4-ZTd1B0k1fcaaIrs0RHQ6EB56Q,1271
|
|
442
468
|
wbcore/contrib/example_app/viewsets/event.py,sha256=KQ6OSM1iu_aQvlu5ewH-qNj3LuIqBkownXIbiBnKD_E,10129
|
|
443
469
|
wbcore/contrib/example_app/viewsets/league.py,sha256=gCVQxsTzPx64EGyqWufiiuovKbeOfT2xW3lzh4ZMgus,2316
|
|
@@ -490,7 +516,6 @@ wbcore/contrib/geography/import_export/resources/__init__.py,sha256=47DEQpj8HBSa
|
|
|
490
516
|
wbcore/contrib/geography/import_export/resources/geography.py,sha256=Du4aCwtQCm_GHeN8ThNIImJwpM8UfAgansOPfkJGirQ,386
|
|
491
517
|
wbcore/contrib/geography/migrations/0001_initial.py,sha256=aK3R_L0jKa-5KEBJGrmS2U8ZgsP7Wno5gpL8Joa_N2k,4458
|
|
492
518
|
wbcore/contrib/geography/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
493
|
-
wbcore/contrib/geography/release_notes/1_0_0.md,sha256=NrP1LZ-N04QilS28vyPzokjfwjTGWs3eZ8ML3Gpw7nA,165
|
|
494
519
|
wbcore/contrib/geography/release_notes/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
495
520
|
wbcore/contrib/geography/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
496
521
|
wbcore/contrib/geography/tests/conftest.py,sha256=5H96elG8pEiEvUrl2pXavyghjM3mV4wYy_kJFGRj5nM,341
|
|
@@ -521,6 +546,12 @@ wbcore/contrib/gleap/views.py,sha256=8UthTu7LRRW_pi8muUDWzXVtBaQhwCRNox9JSriF5lQ
|
|
|
521
546
|
wbcore/contrib/gleap/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
522
547
|
wbcore/contrib/gleap/tests/conftest.py,sha256=q9RKC6JpBsW4ZlgtnuB_V1uHtKUys4Zn0BGu3m4NbRI,36
|
|
523
548
|
wbcore/contrib/gleap/tests/tests.py,sha256=jtPqW_ATh8OFIEb4R8RMMrhAbcNrB0FamOj1L3slT4E,714
|
|
549
|
+
wbcore/contrib/guardian/apps.py,sha256=dHE4YM4uk92w5Xsmk_P1agutR_1jQytTq9dRDaj-BAU,139
|
|
550
|
+
wbcore/contrib/guardian/configurations.py,sha256=rzSTs_4zbADDSnmqgqRHYd83gKdPAGyrHdegQtnH-qQ,168
|
|
551
|
+
wbcore/contrib/guardian/filters.py,sha256=36dXy8IaSyPDKc7QkAip4d_12U1luCOKH3ujXgjBHqg,752
|
|
552
|
+
wbcore/contrib/guardian/tasks.py,sha256=DrHBQCkjgBIof2XbR4rwm9zH4b2LwCduKUXL_wNm8pg,516
|
|
553
|
+
wbcore/contrib/guardian/urls.py,sha256=UCUiYxALnbEH7ZNKs4jp_xBx6vHClsVi9Hd_NR1_0Wg,412
|
|
554
|
+
wbcore/contrib/guardian/utils.py,sha256=7gIVVkVjS6c7enomR3L3VfbN_CcbDD4VL2kWgNb39I8,5205
|
|
524
555
|
wbcore/contrib/guardian/migrations/0001_initial.py,sha256=IB4_ls922OVdC3r_9FhIFR_xom0wic2NOwYG9gRo8S8,4609
|
|
525
556
|
wbcore/contrib/guardian/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
526
557
|
wbcore/contrib/guardian/models/__init__.py,sha256=63_HSsJbwNgPPt67vyZKHm5dqB8X-YIAF6tRlK9YgQk,64
|
|
@@ -583,7 +614,6 @@ wbcore/contrib/io/migrations/0005_exportsource_data_alter_exportsource_query_str
|
|
|
583
614
|
wbcore/contrib/io/migrations/0006_alter_exportsource_query_params.py,sha256=JHnzz6C1Mr2kVcD5bBJMO6eNvqSFfvw6c0NoGL7pcqs,578
|
|
584
615
|
wbcore/contrib/io/migrations/0007_alter_exportsource_query_params.py,sha256=xHVM23caWAPjo1eTrfTm37G20j8r_AxapoEgb685c2Q,617
|
|
585
616
|
wbcore/contrib/io/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
586
|
-
wbcore/contrib/io/release_notes/1_0_0.md,sha256=1nJ-vnOKk4l5-gU8GTyKrvoz-YUKSGyX96KBoFDlKQc,238
|
|
587
617
|
wbcore/contrib/io/release_notes/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
588
618
|
wbcore/contrib/io/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
589
619
|
wbcore/contrib/io/tests/conftest.py,sha256=ycb7GE_yHhF9ExUH5E5vdAsYtu_h_9ft-AITp5fOGVU,1193
|
|
@@ -623,7 +653,6 @@ wbcore/contrib/notifications/models/__init__.py,sha256=l7E4YjFreG6YeBCjcYJrK1Zn2
|
|
|
623
653
|
wbcore/contrib/notifications/models/notification_types.py,sha256=Ocdiayt3OaEunNGnqVMmwyDhxJWGaq5iY0-M4ssBWxI,3830
|
|
624
654
|
wbcore/contrib/notifications/models/notifications.py,sha256=htMR0cDYjX71GNehnIsTOm2sLNAmzuAQuExfav7Fjbg,2645
|
|
625
655
|
wbcore/contrib/notifications/models/tokens.py,sha256=iTT07HtljTiGb7QeGdRmROFU7txsOX7xvkpjauutZjU,1543
|
|
626
|
-
wbcore/contrib/notifications/release_notes/1_0_0.md,sha256=pyuuGK8zEp7sbPchnpXyPngwJ9-qvrm0dJh3P2DJGIg,168
|
|
627
656
|
wbcore/contrib/notifications/release_notes/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
628
657
|
wbcore/contrib/notifications/serializers/__init__.py,sha256=VTZMTbvPTO1A6gI30qSVXFzfQjrQtGt7Rr0be7swy8A,181
|
|
629
658
|
wbcore/contrib/notifications/serializers/notification_types.py,sha256=LDc_qy_eT7mmW62S18Qqk_68HAA5n6BtMc5zX0gaxbs,988
|
|
@@ -649,6 +678,8 @@ wbcore/contrib/notifications/viewsets/__init__.py,sha256=LvuSAnXRTv5tixtnLaLnx1O
|
|
|
649
678
|
wbcore/contrib/notifications/viewsets/menus.py,sha256=MzL4GtpgwGgbprte_mF_-iYcfkKIooMYufR4GA2kQQ8,528
|
|
650
679
|
wbcore/contrib/notifications/viewsets/notification_types.py,sha256=T4xBEzrlsYHnjTpq4MMfXY-yKOZiTRhPRjkjfMa_3EY,1489
|
|
651
680
|
wbcore/contrib/notifications/viewsets/notifications.py,sha256=-H-n0DEmBagNtxx5y59eEXqxm0bPo98NnuHJLaCcF4Y,2253
|
|
681
|
+
wbcore/contrib/notifications/viewsets/configs/notification_types.py,sha256=YCPjlWl2KRbWXQUXKknN-7B8jA0Kwk9PWHPXvCMsSZA,1066
|
|
682
|
+
wbcore/contrib/notifications/viewsets/configs/notifications.py,sha256=qr8vCTu87OmYuvhXAbO_MgdwHDHlphJRili903rF8fs,3281
|
|
652
683
|
wbcore/contrib/tags/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
653
684
|
wbcore/contrib/tags/admin.py,sha256=gIgCl7P4_d2x5FK1Gs5dYwWISY7beWclwQXHRkoZhrI,433
|
|
654
685
|
wbcore/contrib/tags/apps.py,sha256=DSaqTCfj8DjVBHQdQtrRQvrw-wF_igOE9DUvMv47EK4,234
|
|
@@ -662,7 +693,6 @@ wbcore/contrib/tags/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5
|
|
|
662
693
|
wbcore/contrib/tags/models/__init__.py,sha256=o5Oqc0SJ5kZWQ466Z5Wgj8J9Ppsv1E3JcuLHWM5p9Zw,66
|
|
663
694
|
wbcore/contrib/tags/models/mixins.py,sha256=B3UhUsU3veuGsh_cx6-VASxvUMVPKanaOknkYp0SmFg,950
|
|
664
695
|
wbcore/contrib/tags/models/tags.py,sha256=0Ov0c_fhQVPQqRG3aiO3hCGQycjrPguG_AvXEGqSyBU,3181
|
|
665
|
-
wbcore/contrib/tags/release_notes/1_0_0.md,sha256=jG3JupsX-qW0P8UN2ktJJce_7mCMCc1fAL-nbiCJJnE,160
|
|
666
696
|
wbcore/contrib/tags/release_notes/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
667
697
|
wbcore/contrib/tags/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
668
698
|
wbcore/contrib/tags/tests/conftest.py,sha256=V4H8IpNANaDnkKSP6cfFgFBDyQnJQ5jd-LqQMqpdovA,176
|
|
@@ -735,6 +765,19 @@ wbcore/contrib/workflow/tests/test_serializers.py,sha256=ln-nfFCCEDM1gcjEn_Mcya8
|
|
|
735
765
|
wbcore/contrib/workflow/tests/test_viewsets.py,sha256=c3rYPOXEGgo6vVZJdEjDYdjFUC2JtLvLYn-5kxkVuU0,16285
|
|
736
766
|
wbcore/contrib/workflow/tests/test_workflow_assignees.py,sha256=sn1glbTX_zyx_XwAqmlPuAWz36-28gpto52tJpXqgV4,9274
|
|
737
767
|
wbcore/contrib/workflow/tests/tests.py,sha256=yI7_Faa73iKPZgKadeeVXxNl96TgGuRFWXQCjNsJSGc,583
|
|
768
|
+
wbcore/contrib/workflow/tests/test_models/test_condition.py,sha256=nQ9rzQEPpn17PzX6FXoa8ArRweXbIC8qMLXjpOIBOc8,4704
|
|
769
|
+
wbcore/contrib/workflow/tests/test_models/test_data.py,sha256=4WrmvopH3QErWCOSvjsnfvCOOnCyaQ_KKmAAPSJy3CY,5369
|
|
770
|
+
wbcore/contrib/workflow/tests/test_models/test_process.py,sha256=cJCcWGXbcKSK34BtcNVg56nQXMogAtKeufbPf82Z8yw,4580
|
|
771
|
+
wbcore/contrib/workflow/tests/test_models/test_transition.py,sha256=IBsK9sRp0pCVO4t00C7Z0kjmhhSHNPOpQ4YxgDrhltg,5106
|
|
772
|
+
wbcore/contrib/workflow/tests/test_models/test_workflow.py,sha256=SueEle20ZHuHlUW6dKUfnHzIUE5p8urS5vUsi4fWTwQ,19559
|
|
773
|
+
wbcore/contrib/workflow/tests/test_models/step/test_decision_step.py,sha256=--nWOXEeH033tVYIrJFL7qtJetgCIP8ipCv1SguxxIE,3156
|
|
774
|
+
wbcore/contrib/workflow/tests/test_models/step/test_email_step.py,sha256=deKABwoVfW_ejgZVSZQPkc-YHEiyVYKiqE_KxydEYgM,2058
|
|
775
|
+
wbcore/contrib/workflow/tests/test_models/step/test_finish_step.py,sha256=vTSIjU7phy7nIzy7F9FULxuxeKZrV9nb08aHQB4C3s0,5339
|
|
776
|
+
wbcore/contrib/workflow/tests/test_models/step/test_join_step.py,sha256=IFISyc1U5Tz4-8MonIcDXy1PR63KionC4t8CKessJ9g,6376
|
|
777
|
+
wbcore/contrib/workflow/tests/test_models/step/test_script_step.py,sha256=--S5YIC1LTWsDFrU3b3Yh8f-Nv8fRmmp2haSqK1qsSQ,1041
|
|
778
|
+
wbcore/contrib/workflow/tests/test_models/step/test_split_step.py,sha256=A4GvrDkeRgYkImkfGrgbRZJl6nn8ZAEjsxOxJzz40sk,1743
|
|
779
|
+
wbcore/contrib/workflow/tests/test_models/step/test_step.py,sha256=RfdZ2UPoao5erbaQIBWu-LkSYM3QOjrMeRL7EC9JUVY,32843
|
|
780
|
+
wbcore/contrib/workflow/tests/test_models/step/test_user_step.py,sha256=lKajp_SIP-tNQTislIIcrygFepOi_l7Kc63Wby7HYyk,11906
|
|
738
781
|
wbcore/contrib/workflow/viewsets/__init__.py,sha256=PGsFZrKbNTXJF-VrrjtN3ItA6OIn1sW-ypcyWrQEX-g,557
|
|
739
782
|
wbcore/contrib/workflow/viewsets/condition.py,sha256=8BWj-nTp8uACx2BHmwXP4hJT8dvMH2DNMtIrSXmvMpc,1399
|
|
740
783
|
wbcore/contrib/workflow/viewsets/data.py,sha256=YuR_0Qz9ByEacAhO3cLtYjoN0KbUV8zmFhKd6QhTy0o,1249
|
|
@@ -777,8 +820,6 @@ wbcore/crontab/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
|
777
820
|
wbcore/crontab/serializers.py,sha256=rplcmnRCFQZHwGHmBdVpQ5aHWP4U-RiORzjF8P5EkrE,812
|
|
778
821
|
wbcore/crontab/viewsets.py,sha256=YSHnWlLfIIxQCnGpCtYT-il8Pwy-B_xEOnKHor4zr_w,334
|
|
779
822
|
wbcore/docs/__init__.py,sha256=Kx0rV2qqhRwcy-DGwHDCJ9ch-UxVisB6A5kNQ1W5v78,773
|
|
780
|
-
wbcore/docs/orderable.md,sha256=lJYGpZACSsbGTgADpXfOHdBU3GXbsrE9OnlXIV9IHEY,2429
|
|
781
|
-
wbcore/docs/reparent.md,sha256=_pWHAuRwSQZRcvRxa7tsNKVdRP4Nj6O0Zdbwk9AsB9Q,839
|
|
782
823
|
wbcore/filters/__init__.py,sha256=I4NntVOrIgMTPh49Ek5K6J6jEGR6Y8YR_TEVtNOJunw,491
|
|
783
824
|
wbcore/filters/backends.py,sha256=7XX5LcFrAFE5jvFj5qSjww4VMux8aKRlcQKmZxdIiKY,730
|
|
784
825
|
wbcore/filters/defaults.py,sha256=669h3-_fFrUelMIYuZiIYXW6SSKGjNcAHTuJUGCHEhM,1987
|
|
@@ -939,13 +980,15 @@ wbcore/signals/merge.py,sha256=CpGvmqNjtuVjG_vN-NQs3j28j-FL1ZfqEJOv9GgLslY,171
|
|
|
939
980
|
wbcore/signals/models.py,sha256=EAf6bz7eugVva29e_m8LiZTtkR-3g_veRAHpN4_2lP4,436
|
|
940
981
|
wbcore/signals/permissions.py,sha256=H3jAeAmRcHJDPzKUnReITnk0vUEfG1LHiPoB-ygu3R8,71
|
|
941
982
|
wbcore/signals/serializers.py,sha256=0ciF0DZTQYnkqZx8G1Yl3aM0JoWUpGRnmr93jqVlVeQ,286
|
|
983
|
+
wbcore/templates/forms.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
942
984
|
wbcore/templates/reversion/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
943
|
-
wbcore/templates/reversion/compare_detail.html,sha256=1bg0o6ycoCvlw630T1dH3LXJifXx1YndLcm_eJQvbIs,520
|
|
944
985
|
wbcore/test/__init__.py,sha256=gxYHDwZugGf-eRh7sG5z7247y5uvyDIHmsm4J0ajBis,713
|
|
945
986
|
wbcore/test/mixins.py,sha256=U6emQX8diJedJuBenN1Zww3P2Jlg6i1eaitRkmNMTgk,34745
|
|
946
987
|
wbcore/test/signals.py,sha256=UX7n9zsak30feE1GLXkwAhLEbmRnllNPu17D1top6YI,174
|
|
947
988
|
wbcore/test/tests.py,sha256=LyVreaI32ub-RFwSOc4tt9OF1WvL3xU4RfcJib6BIu8,4616
|
|
948
989
|
wbcore/test/utils.py,sha256=WcY_psyHP782HW1_1-5NuT-IVNTc3Fn7cu6q_IgCuxc,8405
|
|
990
|
+
wbcore/test/e2e_helpers_methods/e2e_checks.py,sha256=sfzmwGK8_mzILZlAlPHb_H7dvVxaXLvkLu-PWAdH5Lk,4139
|
|
991
|
+
wbcore/test/e2e_helpers_methods/e2e_helper_methods.py,sha256=HOIXvDNlYtBa1gIQGdomDZmeINPQBWVV2XzLolnx7WE,17621
|
|
949
992
|
wbcore/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
950
993
|
wbcore/tests/conftest.py,sha256=XWVhrLuyY80o_-qMx4HQu0-k2h-GKw-xXnNMyUIcbjQ,1425
|
|
951
994
|
wbcore/tests/models.py,sha256=QYJRhVMJZ6nENYuO-ktieiKvw3clxy57n3Is5h0tcmg,207
|
|
@@ -989,6 +1032,7 @@ wbcore/tests/test_new_display/test_pages.py,sha256=j3eycrVezN9qd8f5A2yxDi80skyPN
|
|
|
989
1032
|
wbcore/tests/test_new_display/test_sections.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
990
1033
|
wbcore/tests/test_new_display/test_shortcuts.py,sha256=je0ERwpK6K_ud5gVK8iDTt4gqfMDbJmR7OU-QWVqlRs,1413
|
|
991
1034
|
wbcore/tests/test_new_display/test_utils.py,sha256=44sa-__4qGkPIed89Zp2SwzF1CCVdZlKK0AUeRpBfcw,1544
|
|
1035
|
+
wbcore/tests/test_permissions/test_backend.py,sha256=8jPkbvVpfxFrXrkUG_Hye8kaU8pw9OIeGwvVRJhsvNo,890
|
|
992
1036
|
wbcore/tests/test_serializers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
993
1037
|
wbcore/tests/test_serializers/test_fields.py,sha256=0PY-G6dGLUjElTZCwRJnEdjJUkHjZ4zT7oDEn5LTvW0,6427
|
|
994
1038
|
wbcore/tests/test_serializers/test_mixins.py,sha256=0S17rEEQXPEmkaeGL8V4c6NAP2qlS_j8WXnLahDWY1E,1552
|
|
@@ -1030,6 +1074,6 @@ wbcore/viewsets/generics.py,sha256=lKDq9UY_Tyc56u1bqaIEvHGgoaXwXxpZ1c3fLVteptI,1
|
|
|
1030
1074
|
wbcore/viewsets/mixins.py,sha256=87hc4P_NmpEvafmPdcymYcTWNpFze9FcEBziKwgurDg,11717
|
|
1031
1075
|
wbcore/viewsets/utils.py,sha256=-6KU7VJV6dv4hcHVqF6OfxLEhr3O8A_PpGyfjl7r1KE,881
|
|
1032
1076
|
wbcore/viewsets/viewsets.py,sha256=3FH6vyy-qOR5JWs4-E9C4PpAs95ZIfhhSoMusDH114s,4642
|
|
1033
|
-
wbcore-2.2.
|
|
1034
|
-
wbcore-2.2.
|
|
1035
|
-
wbcore-2.2.
|
|
1077
|
+
wbcore-2.2.5.dist-info/METADATA,sha256=N5k-xK8Tlglz-7V6ncpDv9rg-tP1TbFvz-lo054IEUI,2174
|
|
1078
|
+
wbcore-2.2.5.dist-info/WHEEL,sha256=aO3RJuuiFXItVSnAUEmQ0yRBvv9e1sbJh68PtuQkyAE,105
|
|
1079
|
+
wbcore-2.2.5.dist-info/RECORD,,
|