wbcore 1.59.15__py2.py3-none-any.whl → 1.60.0__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 (105) hide show
  1. wbcore/admin.py +0 -1
  2. wbcore/configurations/configurations/apps.py +1 -0
  3. wbcore/contrib/agenda/locale/de/LC_MESSAGES/django.po +17 -18
  4. wbcore/contrib/agenda/locale/en/LC_MESSAGES/django.po +17 -17
  5. wbcore/contrib/agenda/locale/fr/LC_MESSAGES/django.po +17 -18
  6. wbcore/contrib/agenda/models/calendar_item.py +9 -0
  7. wbcore/contrib/authentication/authentication.py +1 -3
  8. wbcore/contrib/authentication/configurations.py +0 -1
  9. wbcore/contrib/authentication/locale/de/LC_MESSAGES/django.po +47 -48
  10. wbcore/contrib/authentication/locale/en/LC_MESSAGES/django.po +47 -47
  11. wbcore/contrib/authentication/locale/fr/LC_MESSAGES/django.po +47 -48
  12. wbcore/contrib/authentication/models/users.py +18 -0
  13. wbcore/contrib/color/admin.py +1 -0
  14. wbcore/contrib/color/factories.py +1 -0
  15. wbcore/contrib/content_type/__init__.py +0 -0
  16. wbcore/contrib/content_type/apps.py +5 -0
  17. wbcore/{filters/fields/content_type.py → contrib/content_type/filters.py} +18 -0
  18. wbcore/{content_type → contrib/content_type}/serializers.py +2 -2
  19. wbcore/contrib/content_type/urls.py +15 -0
  20. wbcore/contrib/directory/factories/contacts.py +1 -0
  21. wbcore/contrib/directory/locale/de/LC_MESSAGES/django.po +307 -271
  22. wbcore/contrib/directory/locale/en/LC_MESSAGES/django.po +305 -268
  23. wbcore/contrib/directory/locale/fr/LC_MESSAGES/django.po +305 -269
  24. wbcore/contrib/directory/migrations/0015_alter_emailcontact_address_and_more.py +47 -0
  25. wbcore/contrib/directory/models/contacts.py +15 -22
  26. wbcore/contrib/directory/models/entries.py +82 -2
  27. wbcore/contrib/directory/models/relationships.py +5 -9
  28. wbcore/contrib/directory/tests/test_models.py +5 -3
  29. wbcore/contrib/directory/viewsets/endpoints/__init__.py +2 -0
  30. wbcore/contrib/directory/viewsets/endpoints/entries.py +10 -0
  31. wbcore/contrib/directory/viewsets/entries.py +9 -2
  32. wbcore/contrib/documents/locale/de/LC_MESSAGES/django.po +26 -23
  33. wbcore/contrib/documents/locale/en/LC_MESSAGES/django.po +26 -22
  34. wbcore/contrib/documents/locale/fr/LC_MESSAGES/django.po +26 -23
  35. wbcore/contrib/documents/serializers/document_model_relationships.py +1 -1
  36. wbcore/contrib/documents/viewsets/documents.py +1 -1
  37. wbcore/contrib/guardian/__init__.py +0 -0
  38. wbcore/contrib/guardian/filters.py +1 -0
  39. wbcore/contrib/guardian/models/mixins.py +1 -0
  40. wbcore/contrib/guardian/tasks.py +1 -0
  41. wbcore/contrib/guardian/tests/test_model_mixins.py +1 -0
  42. wbcore/contrib/guardian/tests/test_tasks.py +1 -0
  43. wbcore/contrib/guardian/tests/test_utils.py +1 -0
  44. wbcore/contrib/guardian/tests/test_viewsets.py +1 -0
  45. wbcore/contrib/guardian/urls.py +1 -0
  46. wbcore/contrib/guardian/utils.py +1 -0
  47. wbcore/contrib/guardian/viewsets/configs/buttons.py +1 -0
  48. wbcore/contrib/guardian/viewsets/configs/endpoints.py +1 -0
  49. wbcore/contrib/guardian/viewsets/viewsets.py +1 -0
  50. wbcore/contrib/io/locale/de/LC_MESSAGES/django.po +28 -28
  51. wbcore/contrib/io/locale/en/LC_MESSAGES/django.po +28 -28
  52. wbcore/contrib/io/locale/fr/LC_MESSAGES/django.po +28 -28
  53. wbcore/contrib/notifications/backends/firebase/backends.py +2 -2
  54. wbcore/contrib/notifications/dispatch.py +1 -3
  55. wbcore/contrib/notifications/locale/de/LC_MESSAGES/django.po +2 -3
  56. wbcore/contrib/notifications/locale/en/LC_MESSAGES/django.po +2 -2
  57. wbcore/contrib/notifications/locale/fr/LC_MESSAGES/django.po +2 -3
  58. wbcore/contrib/notifications/models/notification_types.py +5 -7
  59. wbcore/contrib/notifications/models/notifications.py +2 -2
  60. wbcore/contrib/notifications/models/tokens.py +2 -2
  61. wbcore/contrib/tags/filters.py +1 -1
  62. wbcore/contrib/tags/serializers.py +2 -2
  63. wbcore/contrib/workflow/locale/de/LC_MESSAGES/django.po +75 -76
  64. wbcore/contrib/workflow/locale/en/LC_MESSAGES/django.po +75 -75
  65. wbcore/contrib/workflow/locale/fr/LC_MESSAGES/django.po +75 -76
  66. wbcore/contrib/workflow/serializers/process.py +4 -4
  67. wbcore/contrib/workflow/serializers/workflow.py +1 -1
  68. wbcore/filters/__init__.py +0 -1
  69. wbcore/filters/fields/__init__.py +0 -1
  70. wbcore/frontend_user_configuration.py +3 -2
  71. wbcore/locale/de/LC_MESSAGES/django.po +159 -129
  72. wbcore/locale/en/LC_MESSAGES/django.po +158 -129
  73. wbcore/locale/fr/LC_MESSAGES/django.po +159 -129
  74. wbcore/menus/menus.py +8 -5
  75. wbcore/metadata/configs/buttons/view_config.py +4 -1
  76. wbcore/metadata/configs/display/models.py +4 -5
  77. wbcore/metadata/configs/endpoints.py +7 -5
  78. wbcore/migrations/0015_delete_genericmodel.py +16 -0
  79. wbcore/models/base.py +0 -11
  80. wbcore/release_notes/models.py +2 -4
  81. wbcore/serializers/fields/fields.py +4 -2
  82. wbcore/serializers/fields/number.py +9 -0
  83. wbcore/shares/config.py +2 -2
  84. wbcore/signals/merge.py +1 -0
  85. wbcore/test/utils.py +3 -1
  86. wbcore/tests/test_permissions/test_backend.py +1 -3
  87. wbcore/tests/test_something.py +2 -2
  88. wbcore/urls.py +5 -10
  89. wbcore/utils/models.py +73 -4
  90. wbcore/utils/views.py +54 -53
  91. wbcore/viewsets/mixins.py +1 -1
  92. wbcore/viewsets/viewsets.py +1 -1
  93. {wbcore-1.59.15.dist-info → wbcore-1.60.0.dist-info}/METADATA +1 -1
  94. {wbcore-1.59.15.dist-info → wbcore-1.60.0.dist-info}/RECORD +99 -99
  95. wbcore/content_type/filters.py +0 -20
  96. wbcore/pandas/__init__.py +0 -53
  97. wbcore/pandas/fields.py +0 -25
  98. wbcore/pandas/filterset.py +0 -9
  99. wbcore/pandas/utils.py +0 -25
  100. wbcore/pandas/views.py +0 -9
  101. /wbcore/{content_type → contrib/color}/__init__.py +0 -0
  102. /wbcore/{content_type → contrib/content_type}/admin.py +0 -0
  103. /wbcore/{content_type → contrib/content_type}/utils.py +0 -0
  104. /wbcore/{content_type → contrib/content_type}/viewsets.py +0 -0
  105. {wbcore-1.59.15.dist-info → wbcore-1.60.0.dist-info}/WHEEL +0 -0
@@ -7,7 +7,7 @@ msgid ""
7
7
  msgstr ""
8
8
  "Project-Id-Version: PACKAGE VERSION\n"
9
9
  "Report-Msgid-Bugs-To: \n"
10
- "POT-Creation-Date: 2025-05-30 11:37+0200\n"
10
+ "POT-Creation-Date: 2026-01-16 14:04+0100\n"
11
11
  "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
12
12
  "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13
13
  "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -95,91 +95,91 @@ msgstr ""
95
95
  msgid "Tokens"
96
96
  msgstr ""
97
97
 
98
- #: contrib/authentication/models/users.py:25
98
+ #: contrib/authentication/models/users.py:30
99
99
  msgid "No E-Mail provided"
100
100
  msgstr ""
101
101
 
102
- #: contrib/authentication/models/users.py:28
102
+ #: contrib/authentication/models/users.py:33
103
103
  msgid "No Username provided"
104
104
  msgstr ""
105
105
 
106
- #: contrib/authentication/models/users.py:57
106
+ #: contrib/authentication/models/users.py:62
107
107
  #: contrib/authentication/serializers/users.py:144
108
108
  msgid "E-Mail"
109
109
  msgstr ""
110
110
 
111
- #: contrib/authentication/models/users.py:58
111
+ #: contrib/authentication/models/users.py:63
112
112
  msgid "username"
113
113
  msgstr ""
114
114
 
115
- #: contrib/authentication/models/users.py:61
115
+ #: contrib/authentication/models/users.py:66
116
116
  msgid "staff status"
117
117
  msgstr ""
118
118
 
119
- #: contrib/authentication/models/users.py:63
119
+ #: contrib/authentication/models/users.py:68
120
120
  msgid "Specifies whether the user can log into this admin site."
121
121
  msgstr ""
122
122
 
123
- #: contrib/authentication/models/users.py:66
123
+ #: contrib/authentication/models/users.py:71
124
124
  msgid "active"
125
125
  msgstr ""
126
126
 
127
- #: contrib/authentication/models/users.py:69
127
+ #: contrib/authentication/models/users.py:74
128
128
  msgid ""
129
129
  "Specifies whether this user should be treated as active. Unselect this "
130
130
  "instead of deleting accounts."
131
131
  msgstr ""
132
132
 
133
- #: contrib/authentication/models/users.py:73
133
+ #: contrib/authentication/models/users.py:78
134
134
  msgid "register"
135
135
  msgstr ""
136
136
 
137
- #: contrib/authentication/models/users.py:73
137
+ #: contrib/authentication/models/users.py:78
138
138
  msgid "Specifies whether this user has registered its email. "
139
139
  msgstr ""
140
140
 
141
- #: contrib/authentication/models/users.py:75
141
+ #: contrib/authentication/models/users.py:80
142
142
  msgid "date joined"
143
143
  msgstr ""
144
144
 
145
- #: contrib/authentication/models/users.py:84
145
+ #: contrib/authentication/models/users.py:89
146
146
  msgid "user"
147
147
  msgstr ""
148
148
 
149
- #: contrib/authentication/models/users.py:85
149
+ #: contrib/authentication/models/users.py:90
150
150
  msgid "users"
151
151
  msgstr ""
152
152
 
153
- #: contrib/authentication/models/users.py:140
153
+ #: contrib/authentication/models/users.py:145
154
154
  msgid "You need to specify a username or a pair of first and last name"
155
155
  msgstr ""
156
156
 
157
- #: contrib/authentication/models/users_activities.py:18
158
- #: contrib/authentication/models/users_activities.py:21
157
+ #: contrib/authentication/models/users_activities.py:20
158
+ #: contrib/authentication/models/users_activities.py:23
159
159
  msgid "Success"
160
160
  msgstr ""
161
161
 
162
- #: contrib/authentication/models/users_activities.py:19
163
162
  #: contrib/authentication/models/users_activities.py:21
163
+ #: contrib/authentication/models/users_activities.py:23
164
164
  msgid "Failed"
165
165
  msgstr ""
166
166
 
167
- #: contrib/authentication/models/users_activities.py:24
167
+ #: contrib/authentication/models/users_activities.py:26
168
168
  #: contrib/authentication/templates/password_reset_done.html:11
169
- #: contrib/authentication/viewsets/users.py:172
169
+ #: contrib/authentication/viewsets/users.py:174
170
170
  msgid "Login"
171
171
  msgstr ""
172
172
 
173
- #: contrib/authentication/models/users_activities.py:38
173
+ #: contrib/authentication/models/users_activities.py:40
174
174
  #, python-brace-format
175
175
  msgid "Activity of {user} at {date}"
176
176
  msgstr ""
177
177
 
178
- #: contrib/authentication/models/users_activities.py:41
178
+ #: contrib/authentication/models/users_activities.py:43
179
179
  msgid "User Login Activity"
180
180
  msgstr ""
181
181
 
182
- #: contrib/authentication/models/users_activities.py:42
182
+ #: contrib/authentication/models/users_activities.py:44
183
183
  msgid "User Login Activities"
184
184
  msgstr ""
185
185
 
@@ -487,104 +487,104 @@ msgstr ""
487
487
  msgid "New User"
488
488
  msgstr ""
489
489
 
490
- #: contrib/authentication/viewsets/user_activities.py:178
490
+ #: contrib/authentication/viewsets/user_activities.py:179
491
491
  msgid "<b>User Activity</b>"
492
492
  msgstr ""
493
493
 
494
- #: contrib/authentication/viewsets/user_activities.py:179
494
+ #: contrib/authentication/viewsets/user_activities.py:180
495
495
  msgid "Time"
496
496
  msgstr ""
497
497
 
498
- #: contrib/authentication/viewsets/user_activities.py:180
498
+ #: contrib/authentication/viewsets/user_activities.py:181
499
499
  msgid "Cummulative time"
500
500
  msgstr ""
501
501
 
502
- #: contrib/authentication/viewsets/user_activities.py:191
502
+ #: contrib/authentication/viewsets/user_activities.py:192
503
503
  msgid "Hour"
504
504
  msgstr ""
505
505
 
506
- #: contrib/authentication/viewsets/user_activities.py:196
506
+ #: contrib/authentication/viewsets/user_activities.py:197
507
507
  msgid "Day"
508
508
  msgstr ""
509
509
 
510
- #: contrib/authentication/viewsets/user_activities.py:201
510
+ #: contrib/authentication/viewsets/user_activities.py:202
511
511
  msgid "Week"
512
512
  msgstr ""
513
513
 
514
- #: contrib/authentication/viewsets/user_activities.py:206
514
+ #: contrib/authentication/viewsets/user_activities.py:207
515
515
  msgid "Month"
516
516
  msgstr ""
517
517
 
518
- #: contrib/authentication/viewsets/users.py:77
518
+ #: contrib/authentication/viewsets/users.py:79
519
519
  msgid ""
520
520
  "If the email matches a user, it will receive an email inviting him to reset "
521
521
  "his password."
522
522
  msgstr ""
523
523
 
524
- #: contrib/authentication/viewsets/users.py:94
524
+ #: contrib/authentication/viewsets/users.py:96
525
525
  msgid "first and last name are too long. please provider a shorter name."
526
526
  msgstr ""
527
527
 
528
- #: contrib/authentication/viewsets/users.py:101
528
+ #: contrib/authentication/viewsets/users.py:103
529
529
  msgid ""
530
530
  "password is too long. please provider a password shorter than 128 characters."
531
531
  msgstr ""
532
532
 
533
- #: contrib/authentication/viewsets/users.py:109
533
+ #: contrib/authentication/viewsets/users.py:111
534
534
  msgid ""
535
535
  "email is too long. please provider an email shorter than 255 characters."
536
536
  msgstr ""
537
537
 
538
- #: contrib/authentication/viewsets/users.py:128
538
+ #: contrib/authentication/viewsets/users.py:130
539
539
  msgid "Activate your account."
540
540
  msgstr ""
541
541
 
542
- #: contrib/authentication/viewsets/users.py:136
542
+ #: contrib/authentication/viewsets/users.py:138
543
543
  msgid "Please confirm your email address to complete the registration"
544
544
  msgstr ""
545
545
 
546
- #: contrib/authentication/viewsets/users.py:141
546
+ #: contrib/authentication/viewsets/users.py:143
547
547
  msgid "Your account already exists"
548
548
  msgstr ""
549
549
 
550
- #: contrib/authentication/viewsets/users.py:145
550
+ #: contrib/authentication/viewsets/users.py:147
551
551
  msgid "Something went wrong with the submitted data, please try again later"
552
552
  msgstr ""
553
553
 
554
- #: contrib/authentication/viewsets/users.py:149
554
+ #: contrib/authentication/viewsets/users.py:151
555
555
  msgid "email, first_name, last_name and password must be provided"
556
556
  msgstr ""
557
557
 
558
- #: contrib/authentication/viewsets/users.py:170
558
+ #: contrib/authentication/viewsets/users.py:172
559
559
  msgid "Activation Successful"
560
560
  msgstr ""
561
561
 
562
- #: contrib/authentication/viewsets/users.py:171
562
+ #: contrib/authentication/viewsets/users.py:173
563
563
  msgid "You are successfully registered. Please login"
564
564
  msgstr ""
565
565
 
566
- #: contrib/authentication/viewsets/users.py:184
566
+ #: contrib/authentication/viewsets/users.py:186
567
567
  msgid "Activation Failed"
568
568
  msgstr ""
569
569
 
570
- #: contrib/authentication/viewsets/users.py:186
570
+ #: contrib/authentication/viewsets/users.py:188
571
571
  msgid ""
572
572
  "The registration link you clicked was probably expired or your account is "
573
573
  "already activated. Please try to register again."
574
574
  msgstr ""
575
575
 
576
- #: contrib/authentication/viewsets/users.py:188
576
+ #: contrib/authentication/viewsets/users.py:190
577
577
  msgid "Register"
578
578
  msgstr ""
579
579
 
580
- #: contrib/authentication/viewsets/users.py:276
580
+ #: contrib/authentication/viewsets/users.py:278
581
581
  msgid "Password changed."
582
582
  msgstr ""
583
583
 
584
- #: contrib/authentication/viewsets/users.py:319
584
+ #: contrib/authentication/viewsets/users.py:321
585
585
  msgid "Reset Password E-Mail sent: Check your mailbox"
586
586
  msgstr ""
587
587
 
588
- #: contrib/authentication/viewsets/users.py:321
588
+ #: contrib/authentication/viewsets/users.py:323
589
589
  msgid "Reset Password Failed. Please contact an administrator"
590
590
  msgstr ""
@@ -3,12 +3,11 @@
3
3
  # This file is distributed under the same license as the PACKAGE package.
4
4
  # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
5
5
  #
6
- #, fuzzy
7
6
  msgid ""
8
7
  msgstr ""
9
8
  "Project-Id-Version: PACKAGE VERSION\n"
10
9
  "Report-Msgid-Bugs-To: \n"
11
- "POT-Creation-Date: 2025-05-30 11:37+0200\n"
10
+ "POT-Creation-Date: 2026-01-16 14:04+0100\n"
12
11
  "PO-Revision-Date: 2025-05-30 09:40+0000\n"
13
12
  "Language-Team: French (https://app.transifex.com/stainly/teams/171242/fr/)\n"
14
13
  "MIME-Version: 1.0\n"
@@ -96,91 +95,91 @@ msgstr ""
96
95
  msgid "Tokens"
97
96
  msgstr ""
98
97
 
99
- #: contrib/authentication/models/users.py:25
98
+ #: contrib/authentication/models/users.py:30
100
99
  msgid "No E-Mail provided"
101
100
  msgstr ""
102
101
 
103
- #: contrib/authentication/models/users.py:28
102
+ #: contrib/authentication/models/users.py:33
104
103
  msgid "No Username provided"
105
104
  msgstr ""
106
105
 
107
- #: contrib/authentication/models/users.py:57
106
+ #: contrib/authentication/models/users.py:62
108
107
  #: contrib/authentication/serializers/users.py:144
109
108
  msgid "E-Mail"
110
109
  msgstr ""
111
110
 
112
- #: contrib/authentication/models/users.py:58
111
+ #: contrib/authentication/models/users.py:63
113
112
  msgid "username"
114
113
  msgstr ""
115
114
 
116
- #: contrib/authentication/models/users.py:61
115
+ #: contrib/authentication/models/users.py:66
117
116
  msgid "staff status"
118
117
  msgstr ""
119
118
 
120
- #: contrib/authentication/models/users.py:63
119
+ #: contrib/authentication/models/users.py:68
121
120
  msgid "Specifies whether the user can log into this admin site."
122
121
  msgstr ""
123
122
 
124
- #: contrib/authentication/models/users.py:66
123
+ #: contrib/authentication/models/users.py:71
125
124
  msgid "active"
126
125
  msgstr ""
127
126
 
128
- #: contrib/authentication/models/users.py:69
127
+ #: contrib/authentication/models/users.py:74
129
128
  msgid ""
130
129
  "Specifies whether this user should be treated as active. Unselect this "
131
130
  "instead of deleting accounts."
132
131
  msgstr ""
133
132
 
134
- #: contrib/authentication/models/users.py:73
133
+ #: contrib/authentication/models/users.py:78
135
134
  msgid "register"
136
135
  msgstr ""
137
136
 
138
- #: contrib/authentication/models/users.py:73
137
+ #: contrib/authentication/models/users.py:78
139
138
  msgid "Specifies whether this user has registered its email. "
140
139
  msgstr ""
141
140
 
142
- #: contrib/authentication/models/users.py:75
141
+ #: contrib/authentication/models/users.py:80
143
142
  msgid "date joined"
144
143
  msgstr ""
145
144
 
146
- #: contrib/authentication/models/users.py:84
145
+ #: contrib/authentication/models/users.py:89
147
146
  msgid "user"
148
147
  msgstr ""
149
148
 
150
- #: contrib/authentication/models/users.py:85
149
+ #: contrib/authentication/models/users.py:90
151
150
  msgid "users"
152
151
  msgstr ""
153
152
 
154
- #: contrib/authentication/models/users.py:140
153
+ #: contrib/authentication/models/users.py:145
155
154
  msgid "You need to specify a username or a pair of first and last name"
156
155
  msgstr ""
157
156
 
158
- #: contrib/authentication/models/users_activities.py:18
159
- #: contrib/authentication/models/users_activities.py:21
157
+ #: contrib/authentication/models/users_activities.py:20
158
+ #: contrib/authentication/models/users_activities.py:23
160
159
  msgid "Success"
161
160
  msgstr ""
162
161
 
163
- #: contrib/authentication/models/users_activities.py:19
164
162
  #: contrib/authentication/models/users_activities.py:21
163
+ #: contrib/authentication/models/users_activities.py:23
165
164
  msgid "Failed"
166
165
  msgstr ""
167
166
 
168
- #: contrib/authentication/models/users_activities.py:24
167
+ #: contrib/authentication/models/users_activities.py:26
169
168
  #: contrib/authentication/templates/password_reset_done.html:11
170
- #: contrib/authentication/viewsets/users.py:172
169
+ #: contrib/authentication/viewsets/users.py:174
171
170
  msgid "Login"
172
171
  msgstr ""
173
172
 
174
- #: contrib/authentication/models/users_activities.py:38
173
+ #: contrib/authentication/models/users_activities.py:40
175
174
  #, python-brace-format
176
175
  msgid "Activity of {user} at {date}"
177
176
  msgstr ""
178
177
 
179
- #: contrib/authentication/models/users_activities.py:41
178
+ #: contrib/authentication/models/users_activities.py:43
180
179
  msgid "User Login Activity"
181
180
  msgstr ""
182
181
 
183
- #: contrib/authentication/models/users_activities.py:42
182
+ #: contrib/authentication/models/users_activities.py:44
184
183
  msgid "User Login Activities"
185
184
  msgstr ""
186
185
 
@@ -488,105 +487,105 @@ msgstr ""
488
487
  msgid "New User"
489
488
  msgstr ""
490
489
 
491
- #: contrib/authentication/viewsets/user_activities.py:178
490
+ #: contrib/authentication/viewsets/user_activities.py:179
492
491
  msgid "<b>User Activity</b>"
493
492
  msgstr ""
494
493
 
495
- #: contrib/authentication/viewsets/user_activities.py:179
494
+ #: contrib/authentication/viewsets/user_activities.py:180
496
495
  msgid "Time"
497
496
  msgstr ""
498
497
 
499
- #: contrib/authentication/viewsets/user_activities.py:180
498
+ #: contrib/authentication/viewsets/user_activities.py:181
500
499
  msgid "Cummulative time"
501
500
  msgstr ""
502
501
 
503
- #: contrib/authentication/viewsets/user_activities.py:191
502
+ #: contrib/authentication/viewsets/user_activities.py:192
504
503
  msgid "Hour"
505
504
  msgstr ""
506
505
 
507
- #: contrib/authentication/viewsets/user_activities.py:196
506
+ #: contrib/authentication/viewsets/user_activities.py:197
508
507
  msgid "Day"
509
508
  msgstr ""
510
509
 
511
- #: contrib/authentication/viewsets/user_activities.py:201
510
+ #: contrib/authentication/viewsets/user_activities.py:202
512
511
  msgid "Week"
513
512
  msgstr ""
514
513
 
515
- #: contrib/authentication/viewsets/user_activities.py:206
514
+ #: contrib/authentication/viewsets/user_activities.py:207
516
515
  msgid "Month"
517
516
  msgstr ""
518
517
 
519
- #: contrib/authentication/viewsets/users.py:77
518
+ #: contrib/authentication/viewsets/users.py:79
520
519
  msgid ""
521
520
  "If the email matches a user, it will receive an email inviting him to reset "
522
521
  "his password."
523
522
  msgstr ""
524
523
 
525
- #: contrib/authentication/viewsets/users.py:94
524
+ #: contrib/authentication/viewsets/users.py:96
526
525
  msgid "first and last name are too long. please provider a shorter name."
527
526
  msgstr ""
528
527
 
529
- #: contrib/authentication/viewsets/users.py:101
528
+ #: contrib/authentication/viewsets/users.py:103
530
529
  msgid ""
531
530
  "password is too long. please provider a password shorter than 128 "
532
531
  "characters."
533
532
  msgstr ""
534
533
 
535
- #: contrib/authentication/viewsets/users.py:109
534
+ #: contrib/authentication/viewsets/users.py:111
536
535
  msgid ""
537
536
  "email is too long. please provider an email shorter than 255 characters."
538
537
  msgstr ""
539
538
 
540
- #: contrib/authentication/viewsets/users.py:128
539
+ #: contrib/authentication/viewsets/users.py:130
541
540
  msgid "Activate your account."
542
541
  msgstr ""
543
542
 
544
- #: contrib/authentication/viewsets/users.py:136
543
+ #: contrib/authentication/viewsets/users.py:138
545
544
  msgid "Please confirm your email address to complete the registration"
546
545
  msgstr ""
547
546
 
548
- #: contrib/authentication/viewsets/users.py:141
547
+ #: contrib/authentication/viewsets/users.py:143
549
548
  msgid "Your account already exists"
550
549
  msgstr ""
551
550
 
552
- #: contrib/authentication/viewsets/users.py:145
551
+ #: contrib/authentication/viewsets/users.py:147
553
552
  msgid "Something went wrong with the submitted data, please try again later"
554
553
  msgstr ""
555
554
 
556
- #: contrib/authentication/viewsets/users.py:149
555
+ #: contrib/authentication/viewsets/users.py:151
557
556
  msgid "email, first_name, last_name and password must be provided"
558
557
  msgstr ""
559
558
 
560
- #: contrib/authentication/viewsets/users.py:170
559
+ #: contrib/authentication/viewsets/users.py:172
561
560
  msgid "Activation Successful"
562
561
  msgstr ""
563
562
 
564
- #: contrib/authentication/viewsets/users.py:171
563
+ #: contrib/authentication/viewsets/users.py:173
565
564
  msgid "You are successfully registered. Please login"
566
565
  msgstr ""
567
566
 
568
- #: contrib/authentication/viewsets/users.py:184
567
+ #: contrib/authentication/viewsets/users.py:186
569
568
  msgid "Activation Failed"
570
569
  msgstr ""
571
570
 
572
- #: contrib/authentication/viewsets/users.py:186
571
+ #: contrib/authentication/viewsets/users.py:188
573
572
  msgid ""
574
573
  "The registration link you clicked was probably expired or your account is "
575
574
  "already activated. Please try to register again."
576
575
  msgstr ""
577
576
 
578
- #: contrib/authentication/viewsets/users.py:188
577
+ #: contrib/authentication/viewsets/users.py:190
579
578
  msgid "Register"
580
579
  msgstr ""
581
580
 
582
- #: contrib/authentication/viewsets/users.py:276
581
+ #: contrib/authentication/viewsets/users.py:278
583
582
  msgid "Password changed."
584
583
  msgstr ""
585
584
 
586
- #: contrib/authentication/viewsets/users.py:319
585
+ #: contrib/authentication/viewsets/users.py:321
587
586
  msgid "Reset Password E-Mail sent: Check your mailbox"
588
587
  msgstr ""
589
588
 
590
- #: contrib/authentication/viewsets/users.py:321
589
+ #: contrib/authentication/viewsets/users.py:323
591
590
  msgid "Reset Password Failed. Please contact an administrator"
592
591
  msgstr ""
@@ -1,17 +1,22 @@
1
1
  # -*- encoding: utf-8 -*-
2
2
  import unicodedata
3
3
  import uuid
4
+ from contextlib import suppress
4
5
 
5
6
  from django.contrib.auth.models import AbstractBaseUser, BaseUserManager, PermissionsMixin
6
7
  from django.contrib.auth.models import Group as DjangoBaseGroup
7
8
  from django.contrib.auth.models import Permission as DjangoBasePermission
8
9
  from django.contrib.auth.tokens import PasswordResetTokenGenerator
9
10
  from django.db import models
11
+ from django.dispatch import receiver
10
12
  from django.utils import timezone
11
13
  from django.utils.encoding import force_str
12
14
  from django.utils.translation import gettext
13
15
  from django.utils.translation import gettext_lazy as _
14
16
 
17
+ from wbcore.signals import pre_merge
18
+ from wbcore.utils.models import MergeError
19
+
15
20
 
16
21
  class UserManager(BaseUserManager):
17
22
  use_in_migrations = True
@@ -222,3 +227,16 @@ class Permission(DjangoBasePermission):
222
227
  @classmethod
223
228
  def get_representation_label_key(cls):
224
229
  return "{{name}}"
230
+
231
+
232
+ @receiver(pre_merge, sender="directory.Person")
233
+ def pre_merge_person_user(sender: models.Model, merged_object, main_object, **kwargs):
234
+ with suppress(User.DoesNotExist):
235
+ user = User.objects.get(profile=merged_object)
236
+ if User.objects.filter(profile=main_object).exists():
237
+ raise MergeError(
238
+ f"we cannot safely merge person {merged_object} into {main_object}: A user profile already exists for {main_object}"
239
+ )
240
+ else:
241
+ user.profile = main_object
242
+ user.save()
@@ -1,6 +1,7 @@
1
1
  from django.conf import settings
2
2
  from django.contrib import admin
3
3
  from django_better_admin_arrayfield.models.fields import ArrayField
4
+
4
5
  from wbcore.contrib.color.forms import DynamicArrayColorWidget
5
6
  from wbcore.contrib.color.models import ColorGradient
6
7
 
@@ -1,4 +1,5 @@
1
1
  import factory
2
+
2
3
  from wbcore.contrib.color.models import ColorGradient
3
4
 
4
5
 
File without changes
@@ -0,0 +1,5 @@
1
+ from django.apps import AppConfig
2
+
3
+
4
+ class ContentTypeConfig(AppConfig):
5
+ name = "wbcore.contrib.content_type"
@@ -4,13 +4,31 @@ from functools import reduce
4
4
 
5
5
  import django_filters
6
6
  from django.contrib.contenttypes.models import ContentType
7
+ from django.core.exceptions import FieldError
7
8
  from django.db.models import Q
8
9
  from django_filters.constants import EMPTY_VALUES
9
10
 
11
+ from wbcore import filters as wb_filters
10
12
  from wbcore.filters.mixins import WBCoreFilterMixin
11
13
  from wbcore.forms import ContentTypeMultiValueField
12
14
 
13
15
 
16
+ class ContentTypeFilterSet(wb_filters.FilterSet):
17
+ related_name_isnull = wb_filters.CharFilter(method="filter_related_name_isnull")
18
+
19
+ def filter_related_name_isnull(self, queryset, label, value):
20
+ if value:
21
+ try:
22
+ return queryset.filter(**{f"{value}__isnull": False}).distinct()
23
+ except FieldError:
24
+ pass
25
+ return queryset
26
+
27
+ class Meta:
28
+ model = ContentType
29
+ fields = {"id": ["in", "exact"]}
30
+
31
+
14
32
  class MultipleChoiceContentTypeFilter(WBCoreFilterMixin, django_filters.Filter):
15
33
  field_class = ContentTypeMultiValueField
16
34
  filter_type = "text"
@@ -13,7 +13,7 @@ from wbcore.serializers import HyperlinkField
13
13
 
14
14
 
15
15
  class ContentTypeRepresentationSerializer(serializers.RepresentationSerializer):
16
- endpoint = "wbcore:contenttyperepresentation-list"
16
+ endpoint = "wbcore:content_type:contenttyperepresentation-list"
17
17
  value_key = "id"
18
18
 
19
19
  model_title = serializers.SerializerMethodField()
@@ -63,7 +63,7 @@ class GenericModel(models.Model): # noqa
63
63
 
64
64
 
65
65
  class DynamicObjectIDRepresentationSerializer(serializers.RepresentationSerializer):
66
- endpoint = "wbcore:dynamiccontenttyperepresentation-list"
66
+ endpoint = "wbcore:content_type:dynamiccontenttyperepresentation-list"
67
67
  value_key = "{{id}}"
68
68
  label_key = "{{label}}"
69
69
 
@@ -0,0 +1,15 @@
1
+ from django.urls import include, path
2
+
3
+ from wbcore.contrib.content_type.viewsets import ContentTypeRepresentationViewSet, DynamicObjectIDRepresentationViewSet
4
+ from wbcore.routers import WBCoreRouter
5
+
6
+ router = WBCoreRouter()
7
+
8
+ router.register(r"contenttyperepresentation", ContentTypeRepresentationViewSet, basename="contenttyperepresentation")
9
+ router.register(
10
+ r"dynamiccontenttyperepresentation",
11
+ DynamicObjectIDRepresentationViewSet,
12
+ basename="dynamiccontenttyperepresentation",
13
+ )
14
+
15
+ urlpatterns = [path("", include(router.urls))]
@@ -52,6 +52,7 @@ class TelephoneContactFactory(ContactBaseFactory):
52
52
  class EmailContactFactory(ContactBaseFactory):
53
53
  class Meta:
54
54
  model = EmailContact
55
+ django_get_or_create = ["address"]
55
56
 
56
57
  address = factory.Faker("email")
57
58