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.
Files changed (73) hide show
  1. wbcore/contrib/color/admin.py +28 -0
  2. wbcore/contrib/color/apps.py +5 -0
  3. wbcore/contrib/color/enums.py +17 -0
  4. wbcore/contrib/color/factories.py +10 -0
  5. wbcore/contrib/color/fields.py +29 -0
  6. wbcore/contrib/color/forms.py +13 -0
  7. wbcore/contrib/color/models.py +62 -0
  8. wbcore/contrib/color/tests/conftest.py +10 -0
  9. wbcore/contrib/color/tests/test_color_models.py +61 -0
  10. wbcore/contrib/color/tests/test_fields.py +25 -0
  11. wbcore/contrib/documents/tests/conftest.py +30 -0
  12. wbcore/contrib/documents/tests/test_models.py +144 -0
  13. wbcore/contrib/example_app/tests/test_models/test_event.py +87 -0
  14. wbcore/contrib/example_app/tests/test_models/test_match.py +210 -0
  15. wbcore/contrib/example_app/tests/test_models/test_others.py +159 -0
  16. wbcore/contrib/example_app/tests/test_serializers/test_league_serializer.py +34 -0
  17. wbcore/contrib/example_app/tests/test_serializers/test_match_serializer.py +134 -0
  18. wbcore/contrib/example_app/tests/test_serializers/test_role_serializer.py +13 -0
  19. wbcore/contrib/example_app/tests/test_serializers/test_sport_serializer.py +14 -0
  20. wbcore/contrib/example_app/tests/test_serializers/test_stadium_serializer.py +14 -0
  21. wbcore/contrib/example_app/tests/test_serializers/test_team_result_serializer.py +30 -0
  22. wbcore/contrib/example_app/tests/test_serializers/test_team_serializer.py +70 -0
  23. wbcore/contrib/example_app/tests/test_viewsets/test_event_viewset.py +162 -0
  24. wbcore/contrib/example_app/tests/test_viewsets/test_league_viewset.py +84 -0
  25. wbcore/contrib/example_app/tests/test_viewsets/test_match_viewset.py +65 -0
  26. wbcore/contrib/example_app/tests/test_viewsets/test_person_viewset.py +166 -0
  27. wbcore/contrib/example_app/tests/test_viewsets/test_role_viewset.py +75 -0
  28. wbcore/contrib/example_app/tests/test_viewsets/test_sport_viewset.py +75 -0
  29. wbcore/contrib/example_app/tests/test_viewsets/test_stadium_viewset.py +75 -0
  30. wbcore/contrib/example_app/tests/test_viewsets/test_team_viewset.py +92 -0
  31. wbcore/contrib/example_app/tests/test_viewsets/test_teamresult_viewset.py +58 -0
  32. wbcore/contrib/example_app/tests/test_viewsets/test_utils_viewsets.py +124 -0
  33. wbcore/contrib/guardian/apps.py +6 -0
  34. wbcore/contrib/guardian/configurations.py +3 -0
  35. wbcore/contrib/guardian/filters.py +21 -0
  36. wbcore/contrib/guardian/tasks.py +10 -0
  37. wbcore/contrib/guardian/urls.py +12 -0
  38. wbcore/contrib/guardian/utils.py +124 -0
  39. wbcore/contrib/notifications/viewsets/configs/notification_types.py +27 -0
  40. wbcore/contrib/notifications/viewsets/configs/notifications.py +85 -0
  41. wbcore/contrib/workflow/tests/test_models/step/test_decision_step.py +79 -0
  42. wbcore/contrib/workflow/tests/test_models/step/test_email_step.py +45 -0
  43. wbcore/contrib/workflow/tests/test_models/step/test_finish_step.py +105 -0
  44. wbcore/contrib/workflow/tests/test_models/step/test_join_step.py +127 -0
  45. wbcore/contrib/workflow/tests/test_models/step/test_script_step.py +24 -0
  46. wbcore/contrib/workflow/tests/test_models/step/test_split_step.py +49 -0
  47. wbcore/contrib/workflow/tests/test_models/step/test_step.py +621 -0
  48. wbcore/contrib/workflow/tests/test_models/step/test_user_step.py +225 -0
  49. wbcore/contrib/workflow/tests/test_models/test_condition.py +103 -0
  50. wbcore/contrib/workflow/tests/test_models/test_data.py +134 -0
  51. wbcore/contrib/workflow/tests/test_models/test_process.py +98 -0
  52. wbcore/contrib/workflow/tests/test_models/test_transition.py +128 -0
  53. wbcore/contrib/workflow/tests/test_models/test_workflow.py +358 -0
  54. wbcore/templates/forms.py +0 -0
  55. wbcore/test/e2e_helpers_methods/e2e_checks.py +121 -0
  56. wbcore/test/e2e_helpers_methods/e2e_helper_methods.py +395 -0
  57. wbcore/tests/test_permissions/test_backend.py +29 -0
  58. {wbcore-2.2.3.dist-info → wbcore-2.2.5.dist-info}/METADATA +1 -1
  59. {wbcore-2.2.3.dist-info → wbcore-2.2.5.dist-info}/RECORD +60 -16
  60. wbcore/contrib/agenda/release_notes/1_0_0.md +0 -13
  61. wbcore/contrib/authentication/release_notes/1_0_0.md +0 -13
  62. wbcore/contrib/currency/release_notes/1_0_0.md +0 -13
  63. wbcore/contrib/directory/release_notes/1_0_0.md +0 -13
  64. wbcore/contrib/directory/release_notes/1_0_1.md +0 -13
  65. wbcore/contrib/documents/release_notes/1_0_0.md +0 -13
  66. wbcore/contrib/geography/release_notes/1_0_0.md +0 -13
  67. wbcore/contrib/io/release_notes/1_0_0.md +0 -13
  68. wbcore/contrib/notifications/release_notes/1_0_0.md +0 -13
  69. wbcore/contrib/tags/release_notes/1_0_0.md +0 -13
  70. wbcore/docs/orderable.md +0 -29
  71. wbcore/docs/reparent.md +0 -13
  72. wbcore/templates/reversion/compare_detail.html +0 -19
  73. {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}
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: wbcore
3
- Version: 2.2.3
3
+ Version: 2.2.5
4
4
  Author-email: Christopher Wittlinger <c.wittlinger@stainly.com>
5
5
  Requires-Dist: boto3==1.*
6
6
  Requires-Dist: celery[redis]==5.*
@@ -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.3.dist-info/METADATA,sha256=jQJXNrBTWiyhfvcseyr5wuBpiP7RO2T-38JEXd9U3lc,2174
1034
- wbcore-2.2.3.dist-info/WHEEL,sha256=aO3RJuuiFXItVSnAUEmQ0yRBvv9e1sbJh68PtuQkyAE,105
1035
- wbcore-2.2.3.dist-info/RECORD,,
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,,