wbcrm 1.56.8__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 (182) hide show
  1. wbcrm/__init__.py +1 -0
  2. wbcrm/admin/__init__.py +5 -0
  3. wbcrm/admin/accounts.py +60 -0
  4. wbcrm/admin/activities.py +104 -0
  5. wbcrm/admin/events.py +43 -0
  6. wbcrm/admin/groups.py +8 -0
  7. wbcrm/admin/products.py +9 -0
  8. wbcrm/apps.py +5 -0
  9. wbcrm/configurations/__init__.py +1 -0
  10. wbcrm/configurations/base.py +16 -0
  11. wbcrm/dynamic_preferences_registry.py +38 -0
  12. wbcrm/factories/__init__.py +14 -0
  13. wbcrm/factories/accounts.py +57 -0
  14. wbcrm/factories/activities.py +124 -0
  15. wbcrm/factories/groups.py +24 -0
  16. wbcrm/factories/products.py +11 -0
  17. wbcrm/filters/__init__.py +10 -0
  18. wbcrm/filters/accounts.py +80 -0
  19. wbcrm/filters/activities.py +204 -0
  20. wbcrm/filters/groups.py +21 -0
  21. wbcrm/filters/products.py +38 -0
  22. wbcrm/filters/signals.py +95 -0
  23. wbcrm/fixtures/wbcrm.json +1215 -0
  24. wbcrm/kpi_handlers/activities.py +171 -0
  25. wbcrm/locale/de/LC_MESSAGES/django.mo +0 -0
  26. wbcrm/locale/de/LC_MESSAGES/django.po +1557 -0
  27. wbcrm/locale/de/LC_MESSAGES/django.po.translated +1630 -0
  28. wbcrm/locale/en/LC_MESSAGES/django.mo +0 -0
  29. wbcrm/locale/en/LC_MESSAGES/django.po +1466 -0
  30. wbcrm/locale/fr/LC_MESSAGES/django.mo +0 -0
  31. wbcrm/locale/fr/LC_MESSAGES/django.po +1467 -0
  32. wbcrm/migrations/0001_initial_squashed_squashed_0032_productcompanyrelationship_alter_product_prospects_and_more.py +3948 -0
  33. wbcrm/migrations/0002_alter_activity_repeat_choice.py +32 -0
  34. wbcrm/migrations/0003_remove_activity_external_id_and_more.py +63 -0
  35. wbcrm/migrations/0004_alter_activity_status.py +28 -0
  36. wbcrm/migrations/0005_account_accountrole_accountroletype_and_more.py +182 -0
  37. wbcrm/migrations/0006_alter_activity_location.py +17 -0
  38. wbcrm/migrations/0007_alter_account_status.py +23 -0
  39. wbcrm/migrations/0008_alter_activity_options.py +16 -0
  40. wbcrm/migrations/0009_alter_account_is_public.py +19 -0
  41. wbcrm/migrations/0010_alter_account_reference_id.py +17 -0
  42. wbcrm/migrations/0011_activity_summary.py +22 -0
  43. wbcrm/migrations/0012_alter_activity_summary.py +17 -0
  44. wbcrm/migrations/0013_account_action_plan_account_relationship_status_and_more.py +34 -0
  45. wbcrm/migrations/0014_alter_account_relationship_status.py +24 -0
  46. wbcrm/migrations/0015_alter_activity_type.py +23 -0
  47. wbcrm/migrations/0016_auto_20241205_1015.py +106 -0
  48. wbcrm/migrations/0017_event.py +40 -0
  49. wbcrm/migrations/0018_activity_search_vector.py +24 -0
  50. wbcrm/migrations/__init__.py +0 -0
  51. wbcrm/models/__init__.py +5 -0
  52. wbcrm/models/accounts.py +648 -0
  53. wbcrm/models/activities.py +1419 -0
  54. wbcrm/models/events.py +15 -0
  55. wbcrm/models/groups.py +119 -0
  56. wbcrm/models/llm/activity_summaries.py +41 -0
  57. wbcrm/models/llm/analyze_relationship.py +50 -0
  58. wbcrm/models/products.py +86 -0
  59. wbcrm/models/recurrence.py +280 -0
  60. wbcrm/preferences.py +13 -0
  61. wbcrm/report/activity_report.py +110 -0
  62. wbcrm/serializers/__init__.py +23 -0
  63. wbcrm/serializers/accounts.py +141 -0
  64. wbcrm/serializers/activities.py +525 -0
  65. wbcrm/serializers/groups.py +30 -0
  66. wbcrm/serializers/products.py +58 -0
  67. wbcrm/serializers/recurrence.py +91 -0
  68. wbcrm/serializers/signals.py +71 -0
  69. wbcrm/static/wbcrm/markdown/documentation/activity.md +86 -0
  70. wbcrm/static/wbcrm/markdown/documentation/activitytype.md +20 -0
  71. wbcrm/static/wbcrm/markdown/documentation/group.md +2 -0
  72. wbcrm/static/wbcrm/markdown/documentation/product.md +11 -0
  73. wbcrm/synchronization/__init__.py +0 -0
  74. wbcrm/synchronization/activity/__init__.py +0 -0
  75. wbcrm/synchronization/activity/admin.py +73 -0
  76. wbcrm/synchronization/activity/backend.py +214 -0
  77. wbcrm/synchronization/activity/backends/__init__.py +0 -0
  78. wbcrm/synchronization/activity/backends/google/__init__.py +2 -0
  79. wbcrm/synchronization/activity/backends/google/google_calendar_backend.py +406 -0
  80. wbcrm/synchronization/activity/backends/google/request_utils/__init__.py +16 -0
  81. wbcrm/synchronization/activity/backends/google/request_utils/external_to_internal/create.py +75 -0
  82. wbcrm/synchronization/activity/backends/google/request_utils/external_to_internal/delete.py +78 -0
  83. wbcrm/synchronization/activity/backends/google/request_utils/external_to_internal/update.py +155 -0
  84. wbcrm/synchronization/activity/backends/google/request_utils/internal_to_external/update.py +181 -0
  85. wbcrm/synchronization/activity/backends/google/tasks.py +21 -0
  86. wbcrm/synchronization/activity/backends/google/tests/__init__.py +0 -0
  87. wbcrm/synchronization/activity/backends/google/tests/conftest.py +1 -0
  88. wbcrm/synchronization/activity/backends/google/tests/test_data.py +81 -0
  89. wbcrm/synchronization/activity/backends/google/tests/test_google_backend.py +319 -0
  90. wbcrm/synchronization/activity/backends/google/tests/test_utils.py +274 -0
  91. wbcrm/synchronization/activity/backends/google/typing_informations.py +139 -0
  92. wbcrm/synchronization/activity/backends/google/utils.py +217 -0
  93. wbcrm/synchronization/activity/backends/outlook/__init__.py +0 -0
  94. wbcrm/synchronization/activity/backends/outlook/backend.py +593 -0
  95. wbcrm/synchronization/activity/backends/outlook/msgraph.py +436 -0
  96. wbcrm/synchronization/activity/backends/outlook/parser.py +432 -0
  97. wbcrm/synchronization/activity/backends/outlook/tests/__init__.py +0 -0
  98. wbcrm/synchronization/activity/backends/outlook/tests/conftest.py +1 -0
  99. wbcrm/synchronization/activity/backends/outlook/tests/fixtures.py +606 -0
  100. wbcrm/synchronization/activity/backends/outlook/tests/test_admin.py +118 -0
  101. wbcrm/synchronization/activity/backends/outlook/tests/test_backend.py +274 -0
  102. wbcrm/synchronization/activity/backends/outlook/tests/test_controller.py +249 -0
  103. wbcrm/synchronization/activity/backends/outlook/tests/test_parser.py +174 -0
  104. wbcrm/synchronization/activity/controller.py +627 -0
  105. wbcrm/synchronization/activity/dynamic_preferences_registry.py +119 -0
  106. wbcrm/synchronization/activity/preferences.py +27 -0
  107. wbcrm/synchronization/activity/shortcuts.py +16 -0
  108. wbcrm/synchronization/activity/tasks.py +21 -0
  109. wbcrm/synchronization/activity/urls.py +7 -0
  110. wbcrm/synchronization/activity/utils.py +46 -0
  111. wbcrm/synchronization/activity/views.py +41 -0
  112. wbcrm/synchronization/admin.py +1 -0
  113. wbcrm/synchronization/apps.py +14 -0
  114. wbcrm/synchronization/dynamic_preferences_registry.py +1 -0
  115. wbcrm/synchronization/management.py +36 -0
  116. wbcrm/synchronization/tasks.py +1 -0
  117. wbcrm/synchronization/urls.py +5 -0
  118. wbcrm/tasks.py +264 -0
  119. wbcrm/templates/email/activity.html +98 -0
  120. wbcrm/templates/email/activity_report.html +6 -0
  121. wbcrm/templates/email/daily_summary.html +72 -0
  122. wbcrm/templates/email/global_daily_summary.html +85 -0
  123. wbcrm/tests/__init__.py +0 -0
  124. wbcrm/tests/accounts/__init__.py +0 -0
  125. wbcrm/tests/accounts/test_models.py +393 -0
  126. wbcrm/tests/accounts/test_viewsets.py +88 -0
  127. wbcrm/tests/conftest.py +76 -0
  128. wbcrm/tests/disable_signals.py +62 -0
  129. wbcrm/tests/e2e/__init__.py +1 -0
  130. wbcrm/tests/e2e/e2e_wbcrm_utility.py +83 -0
  131. wbcrm/tests/e2e/test_e2e.py +370 -0
  132. wbcrm/tests/test_assignee_methods.py +40 -0
  133. wbcrm/tests/test_chartviewsets.py +112 -0
  134. wbcrm/tests/test_dto.py +64 -0
  135. wbcrm/tests/test_filters.py +52 -0
  136. wbcrm/tests/test_models.py +217 -0
  137. wbcrm/tests/test_recurrence.py +292 -0
  138. wbcrm/tests/test_report.py +21 -0
  139. wbcrm/tests/test_serializers.py +171 -0
  140. wbcrm/tests/test_tasks.py +95 -0
  141. wbcrm/tests/test_viewsets.py +967 -0
  142. wbcrm/tests/tests.py +121 -0
  143. wbcrm/typings.py +109 -0
  144. wbcrm/urls.py +67 -0
  145. wbcrm/viewsets/__init__.py +22 -0
  146. wbcrm/viewsets/accounts.py +122 -0
  147. wbcrm/viewsets/activities.py +341 -0
  148. wbcrm/viewsets/buttons/__init__.py +7 -0
  149. wbcrm/viewsets/buttons/accounts.py +27 -0
  150. wbcrm/viewsets/buttons/activities.py +89 -0
  151. wbcrm/viewsets/buttons/signals.py +17 -0
  152. wbcrm/viewsets/display/__init__.py +12 -0
  153. wbcrm/viewsets/display/accounts.py +110 -0
  154. wbcrm/viewsets/display/activities.py +444 -0
  155. wbcrm/viewsets/display/groups.py +22 -0
  156. wbcrm/viewsets/display/products.py +105 -0
  157. wbcrm/viewsets/endpoints/__init__.py +8 -0
  158. wbcrm/viewsets/endpoints/accounts.py +25 -0
  159. wbcrm/viewsets/endpoints/activities.py +30 -0
  160. wbcrm/viewsets/endpoints/groups.py +7 -0
  161. wbcrm/viewsets/endpoints/products.py +9 -0
  162. wbcrm/viewsets/groups.py +38 -0
  163. wbcrm/viewsets/menu/__init__.py +8 -0
  164. wbcrm/viewsets/menu/accounts.py +18 -0
  165. wbcrm/viewsets/menu/activities.py +49 -0
  166. wbcrm/viewsets/menu/groups.py +16 -0
  167. wbcrm/viewsets/menu/products.py +20 -0
  168. wbcrm/viewsets/mixins.py +35 -0
  169. wbcrm/viewsets/previews/__init__.py +1 -0
  170. wbcrm/viewsets/previews/activities.py +10 -0
  171. wbcrm/viewsets/products.py +57 -0
  172. wbcrm/viewsets/recurrence.py +27 -0
  173. wbcrm/viewsets/titles/__init__.py +13 -0
  174. wbcrm/viewsets/titles/accounts.py +23 -0
  175. wbcrm/viewsets/titles/activities.py +61 -0
  176. wbcrm/viewsets/titles/products.py +13 -0
  177. wbcrm/viewsets/titles/utils.py +46 -0
  178. wbcrm/workflows/__init__.py +1 -0
  179. wbcrm/workflows/assignee_methods.py +25 -0
  180. wbcrm-1.56.8.dist-info/METADATA +11 -0
  181. wbcrm-1.56.8.dist-info/RECORD +182 -0
  182. wbcrm-1.56.8.dist-info/WHEEL +5 -0
@@ -0,0 +1,3948 @@
1
+ # Generated by Django 4.1.8 on 2023-04-19 05:48
2
+
3
+ import datetime
4
+ import uuid
5
+
6
+ import django.contrib.postgres.fields
7
+ import django.contrib.postgres.fields.ranges
8
+ import django.contrib.postgres.operations
9
+ import django.core.validators
10
+ import django.db.models.deletion
11
+ import django.utils.timezone
12
+ import django_fsm
13
+ import wbcore.contrib.directory.models.entries
14
+ import wbcore.contrib.icons.models
15
+ import wbcore.models.fields
16
+ import wbcore.utils.models
17
+ import wbcrm.models.activities
18
+ from django.db import migrations, models
19
+
20
+ # Functions from the following migrations need manual copying.
21
+ # Move them and any dependencies into this file, then update the
22
+
23
+
24
+ class Migration(migrations.Migration):
25
+ initial = True
26
+
27
+ dependencies = [
28
+ ("directory", "0001_initial"),
29
+ ("directory", "0002_auto_20230414_1553"),
30
+ ("authentication", "0003_alter_user_profile"),
31
+ ("geography", "0001_initial"),
32
+ ("agenda", "0002_initial"),
33
+ ("currency", "0001_initial"),
34
+ ]
35
+
36
+ operations = [
37
+ migrations.CreateModel(
38
+ name="Entry",
39
+ fields=[
40
+ ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
41
+ ("entry_type", models.CharField(max_length=255)),
42
+ ("additional_fields", models.JSONField(blank=True, default=dict, null=True)),
43
+ (
44
+ "rating",
45
+ models.IntegerField(
46
+ default=0,
47
+ validators=[
48
+ django.core.validators.MinValueValidator(0),
49
+ django.core.validators.MaxValueValidator(5),
50
+ ],
51
+ ),
52
+ ),
53
+ ("search_name", models.CharField(blank=True, max_length=512, null=True)),
54
+ ],
55
+ ),
56
+ migrations.CreateModel(
57
+ name="EntryStatus",
58
+ fields=[
59
+ ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
60
+ ("title", models.CharField(max_length=255)),
61
+ ],
62
+ options={
63
+ "verbose_name_plural": "Entry Status",
64
+ "verbose_name": "Entry Status",
65
+ "ordering": ("title",),
66
+ },
67
+ ),
68
+ migrations.CreateModel(
69
+ name="PersonPrefix",
70
+ fields=[
71
+ ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
72
+ ("title", models.CharField(max_length=10)),
73
+ ],
74
+ options={
75
+ "verbose_name_plural": "Person Prefixes",
76
+ "verbose_name": "Person Prefix",
77
+ "ordering": ("title",),
78
+ },
79
+ ),
80
+ migrations.CreateModel(
81
+ name="Tag",
82
+ fields=[
83
+ ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
84
+ ("text", models.CharField(max_length=255, unique=True)),
85
+ ],
86
+ options={
87
+ "verbose_name_plural": "Tags",
88
+ "verbose_name": "Tag",
89
+ "ordering": ("text",),
90
+ },
91
+ ),
92
+ migrations.CreateModel(
93
+ name="Company",
94
+ fields=[
95
+ (
96
+ "entry_ptr",
97
+ models.OneToOneField(
98
+ auto_created=True,
99
+ on_delete=django.db.models.deletion.CASCADE,
100
+ parent_link=True,
101
+ primary_key=True,
102
+ serialize=False,
103
+ to="wbcrm.entry",
104
+ ),
105
+ ),
106
+ ("title", models.CharField(max_length=255, verbose_name="Title")),
107
+ (
108
+ "type",
109
+ models.CharField(
110
+ choices=[
111
+ ("ASSET_MANAGER", "Asset Manager"),
112
+ ("BANK", "Bank"),
113
+ ("COMPANY", "Company"),
114
+ ("CONSULTANT", "Consultant"),
115
+ ("FAMILY_OFFICE", "Family Office"),
116
+ ("FOUNDATION", "Foundation"),
117
+ ("INDEPENDANT_WEALTH_MANAGER", "Independant Wealth Manager"),
118
+ ("INSURANCE", "Insurance"),
119
+ ("PENSION_FUND", "Pension Fund"),
120
+ ("PRIVATE_CUSTOMER", "Private Customer"),
121
+ ("SERVICE_PROVIDER", "Service Provider"),
122
+ ("UNVERSITY", "University"),
123
+ ("OTHER", "Other"),
124
+ ],
125
+ default="COMPANY",
126
+ max_length=32,
127
+ verbose_name="Type",
128
+ ),
129
+ ),
130
+ ("asset_allocation", models.CharField(default="", max_length=255, verbose_name="Asset Allocation")),
131
+ ("assets_under_management", models.CharField(default="", max_length=255, verbose_name="AUM")),
132
+ ("discretionairy_advisory", models.FloatField(default=0.0, verbose_name="Discretionairy Advisory")),
133
+ ("geographic_focus", models.CharField(default="", max_length=255, verbose_name="Geographic Focus")),
134
+ ("headcount", models.CharField(default="", max_length=32, verbose_name="Number of employees")),
135
+ (
136
+ "tiering",
137
+ models.CharField(
138
+ choices=[("ONE", "1"), ("TWO", "2"), ("THREE", "3"), ("FOUR", "4")],
139
+ default="ONE",
140
+ max_length=16,
141
+ verbose_name="Tiering",
142
+ ),
143
+ ),
144
+ ("description", models.TextField(default="", verbose_name="Description")),
145
+ ],
146
+ options={
147
+ "verbose_name_plural": "Companies",
148
+ "verbose_name": "Company",
149
+ },
150
+ bases=("wbcrm.entry",),
151
+ ),
152
+ migrations.CreateModel(
153
+ name="Person",
154
+ fields=[
155
+ (
156
+ "entry_ptr",
157
+ models.OneToOneField(
158
+ auto_created=True,
159
+ on_delete=django.db.models.deletion.CASCADE,
160
+ parent_link=True,
161
+ primary_key=True,
162
+ serialize=False,
163
+ to="wbcrm.entry",
164
+ ),
165
+ ),
166
+ ("first_name", models.CharField(max_length=255, verbose_name="First Name")),
167
+ ("last_name", models.CharField(max_length=255, verbose_name="First Name")),
168
+ (
169
+ "position",
170
+ models.CharField(blank=True, default="", max_length=255, null=True, verbose_name="Position"),
171
+ ),
172
+ ("birthday", models.DateField(blank=True, null=True, verbose_name="Birthday")),
173
+ (
174
+ "personality_profile_red",
175
+ models.FloatField(
176
+ default=0,
177
+ validators=[
178
+ django.core.validators.MinValueValidator(0),
179
+ django.core.validators.MaxValueValidator(1),
180
+ ],
181
+ verbose_name="Personality Profile: Red",
182
+ ),
183
+ ),
184
+ (
185
+ "personality_profile_green",
186
+ models.FloatField(
187
+ default=0,
188
+ validators=[
189
+ django.core.validators.MinValueValidator(0),
190
+ django.core.validators.MaxValueValidator(1),
191
+ ],
192
+ verbose_name="Personality Profile: Green",
193
+ ),
194
+ ),
195
+ (
196
+ "personality_profile_blue",
197
+ models.FloatField(
198
+ default=0,
199
+ validators=[
200
+ django.core.validators.MinValueValidator(0),
201
+ django.core.validators.MaxValueValidator(1),
202
+ ],
203
+ verbose_name="Personality Profile: Blue",
204
+ ),
205
+ ),
206
+ (
207
+ "prefix",
208
+ models.CharField(
209
+ choices=[
210
+ ("MR", "Mr."),
211
+ ("MRS", "Mrs."),
212
+ ("MS", "Ms."),
213
+ ("PROF", "Prof."),
214
+ ("DR", "Dr."),
215
+ ("MED", "Med."),
216
+ ("ME", "Me."),
217
+ ],
218
+ default="MR",
219
+ max_length=4,
220
+ verbose_name="Prefix",
221
+ ),
222
+ ),
223
+ ("active_employee", models.BooleanField(default=True, verbose_name="Available Employee")),
224
+ ("formal", models.BooleanField(default=True, verbose_name="Format")),
225
+ (
226
+ "employers",
227
+ models.ManyToManyField(
228
+ blank=True,
229
+ help_text="The person's employers",
230
+ related_name="employees",
231
+ to="wbcrm.company",
232
+ verbose_name="Companies/Employers",
233
+ ),
234
+ ),
235
+ ],
236
+ options={
237
+ "verbose_name_plural": "Persons",
238
+ "verbose_name": "Person",
239
+ },
240
+ bases=("wbcrm.entry",),
241
+ ),
242
+ migrations.AddField(
243
+ model_name="entry",
244
+ name="status",
245
+ field=models.ForeignKey(
246
+ null=True, on_delete=django.db.models.deletion.SET_NULL, related_name="entries", to="wbcrm.entrystatus"
247
+ ),
248
+ ),
249
+ migrations.AddField(
250
+ model_name="entry",
251
+ name="tags",
252
+ field=models.ManyToManyField(blank=True, related_name="entries", to="wbcrm.tag"),
253
+ ),
254
+ migrations.AddField(
255
+ model_name="entry",
256
+ name="in_charge",
257
+ field=models.ManyToManyField(blank=True, related_name="in_charge_of", to="wbcrm.person"),
258
+ ),
259
+ migrations.AddField(
260
+ model_name="entry",
261
+ name="last_change",
262
+ field=models.DateTimeField(auto_now=True, default=django.utils.timezone.now),
263
+ ),
264
+ migrations.AddField(
265
+ model_name="entry",
266
+ name="last_change_user",
267
+ field=models.ForeignKey(
268
+ null=True, on_delete=django.db.models.deletion.CASCADE, related_name="locked_models", to="wbcrm.entry"
269
+ ),
270
+ ),
271
+ migrations.AddField(
272
+ model_name="entry",
273
+ name="social_charges",
274
+ field=models.FloatField(blank=True, null=True),
275
+ ),
276
+ migrations.AddField(
277
+ model_name="entry",
278
+ name="vat",
279
+ field=models.FloatField(blank=True, null=True),
280
+ ),
281
+ migrations.AddField(
282
+ model_name="entry",
283
+ name="vat_id",
284
+ field=models.CharField(blank=True, max_length=512, null=True),
285
+ ),
286
+ migrations.AlterModelOptions(
287
+ name="entry",
288
+ options={},
289
+ ),
290
+ migrations.AlterField(
291
+ model_name="entry",
292
+ name="last_change_user",
293
+ field=models.ForeignKey(
294
+ null=True, on_delete=django.db.models.deletion.SET_NULL, related_name="locked_models", to="wbcrm.entry"
295
+ ),
296
+ ),
297
+ migrations.AlterModelOptions(
298
+ name="entry",
299
+ options={
300
+ "permissions": (
301
+ ("view_all_entry", "Can view all entries"),
302
+ ("view_employer_entry", "You can view your employer entry."),
303
+ ("view_colleague_entry", "You can view your colleague entry."),
304
+ ),
305
+ "verbose_name": "Entry",
306
+ "verbose_name_plural": "Entries",
307
+ },
308
+ ),
309
+ migrations.AddField(
310
+ model_name="entry",
311
+ name="management_fees_label",
312
+ field=models.CharField(default="Management Fees", max_length=255),
313
+ ),
314
+ migrations.AddField(
315
+ model_name="entry",
316
+ name="performance_fees_label",
317
+ field=models.CharField(default="Performance Fees", max_length=255),
318
+ ),
319
+ migrations.AddField(
320
+ model_name="entry",
321
+ name="split_invoice",
322
+ field=models.BooleanField(default=False),
323
+ ),
324
+ migrations.AddField(
325
+ model_name="entry",
326
+ name="profile_image",
327
+ field=models.FileField(blank=True, null=True, upload_to="system/profile_images"),
328
+ ),
329
+ migrations.AddField(
330
+ model_name="entry",
331
+ name="signature",
332
+ field=models.FileField(blank=True, null=True, upload_to="system/signatures"),
333
+ ),
334
+ migrations.AlterModelOptions(
335
+ name="entry",
336
+ options={"verbose_name": "Entry", "verbose_name_plural": "Entries"},
337
+ ),
338
+ migrations.RemoveField(
339
+ model_name="entry",
340
+ name="management_fees_label",
341
+ ),
342
+ migrations.RemoveField(
343
+ model_name="entry",
344
+ name="performance_fees_label",
345
+ ),
346
+ migrations.RemoveField(
347
+ model_name="entry",
348
+ name="social_charges",
349
+ ),
350
+ migrations.RemoveField(
351
+ model_name="entry",
352
+ name="split_invoice",
353
+ ),
354
+ migrations.RemoveField(
355
+ model_name="entry",
356
+ name="vat",
357
+ ),
358
+ migrations.RemoveField(
359
+ model_name="entry",
360
+ name="vat_id",
361
+ ),
362
+ migrations.RemoveField(
363
+ model_name="entry",
364
+ name="last_change",
365
+ ),
366
+ migrations.RemoveField(
367
+ model_name="entry",
368
+ name="last_change_user",
369
+ ),
370
+ migrations.RenameField(
371
+ model_name="entry",
372
+ old_name="status",
373
+ new_name="status_old",
374
+ ),
375
+ migrations.RenameField(
376
+ model_name="entry",
377
+ old_name="tags",
378
+ new_name="tags_old",
379
+ ),
380
+ migrations.AddField(
381
+ model_name="entry",
382
+ name="customer_status",
383
+ field=models.CharField(
384
+ choices=[
385
+ ("CLIENT", "Client"),
386
+ ("PROSPECTIVE", "Prospective"),
387
+ ("DEAD_END", "Dead-End"),
388
+ ("BUSINESS_INTRODUCER", "Business Introducer"),
389
+ ("INDUSTRY_EXPORT", "Industry Expert"),
390
+ ("SERVICE_PROVIDER", "Service Provider"),
391
+ ],
392
+ default="PROSPECTIVE",
393
+ max_length=32,
394
+ verbose_name="Status",
395
+ ),
396
+ ),
397
+ migrations.CreateModel(
398
+ name="DynamicCharField",
399
+ fields=[
400
+ ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
401
+ (
402
+ "linkage",
403
+ models.CharField(
404
+ choices=[("PERSON", "PERSON"), ("COMPANY", "COMPANY"), ("BOTH", "BOTH")],
405
+ default="BOTH",
406
+ max_length=10,
407
+ ),
408
+ ),
409
+ ("title", models.CharField(max_length=64)),
410
+ ("key", models.CharField(blank=True, max_length=64, null=True, unique=True)),
411
+ ],
412
+ options={
413
+ "abstract": False,
414
+ },
415
+ ),
416
+ migrations.CreateModel(
417
+ name="DynamicChoiceField",
418
+ fields=[
419
+ ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
420
+ (
421
+ "linkage",
422
+ models.CharField(
423
+ choices=[("PERSON", "PERSON"), ("COMPANY", "COMPANY"), ("BOTH", "BOTH")],
424
+ default="BOTH",
425
+ max_length=10,
426
+ ),
427
+ ),
428
+ ("title", models.CharField(max_length=64)),
429
+ ("key", models.CharField(blank=True, max_length=64, null=True, unique=True)),
430
+ (
431
+ "choices",
432
+ django.contrib.postgres.fields.ArrayField(base_field=models.CharField(max_length=32), size=None),
433
+ ),
434
+ ],
435
+ options={
436
+ "abstract": False,
437
+ },
438
+ ),
439
+ migrations.CreateModel(
440
+ name="DynamicRangeField",
441
+ fields=[
442
+ ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
443
+ (
444
+ "linkage",
445
+ models.CharField(
446
+ choices=[("PERSON", "PERSON"), ("COMPANY", "COMPANY"), ("BOTH", "BOTH")],
447
+ default="BOTH",
448
+ max_length=10,
449
+ ),
450
+ ),
451
+ ("title", models.CharField(max_length=64)),
452
+ ("key", models.CharField(blank=True, max_length=64, null=True, unique=True)),
453
+ ("range_min", models.FloatField()),
454
+ ("range_max", models.FloatField()),
455
+ ],
456
+ options={
457
+ "abstract": False,
458
+ },
459
+ ),
460
+ migrations.AlterField(
461
+ model_name="entry",
462
+ name="in_charge",
463
+ field=models.ManyToManyField(
464
+ blank=True,
465
+ help_text="People in charge of this entry",
466
+ related_name="in_charge_of",
467
+ to="wbcrm.person",
468
+ verbose_name="In Charge",
469
+ ),
470
+ ),
471
+ migrations.RemoveField(
472
+ model_name="entry",
473
+ name="status_old",
474
+ ),
475
+ migrations.RemoveField(
476
+ model_name="entry",
477
+ name="tags_old",
478
+ ),
479
+ migrations.CreateModel(
480
+ name="Activity",
481
+ fields=[
482
+ ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
483
+ ("title", models.CharField(max_length=255, verbose_name="Title")),
484
+ ("description", models.TextField(default="", verbose_name="Description")),
485
+ ("result", models.TextField(default="", verbose_name="Review")),
486
+ ("start", models.DateTimeField(blank=True, null=True, verbose_name="Start")),
487
+ ("end", models.DateTimeField(blank=True, null=True, verbose_name="End")),
488
+ (
489
+ "unplanned_year",
490
+ models.IntegerField(
491
+ blank=True,
492
+ null=True,
493
+ validators=[
494
+ django.core.validators.MinValueValidator(1000),
495
+ django.core.validators.MaxValueValidator(9999),
496
+ ],
497
+ ),
498
+ ),
499
+ (
500
+ "unplanned_quarter",
501
+ models.IntegerField(
502
+ blank=True,
503
+ null=True,
504
+ validators=[
505
+ django.core.validators.MinValueValidator(1),
506
+ django.core.validators.MaxValueValidator(4),
507
+ ],
508
+ ),
509
+ ),
510
+ (
511
+ "unplanned_month",
512
+ models.IntegerField(
513
+ blank=True,
514
+ null=True,
515
+ validators=[
516
+ django.core.validators.MinValueValidator(1),
517
+ django.core.validators.MaxValueValidator(12),
518
+ ],
519
+ ),
520
+ ),
521
+ (
522
+ "unplanned_week",
523
+ models.IntegerField(
524
+ blank=True,
525
+ null=True,
526
+ validators=[
527
+ django.core.validators.MinValueValidator(1),
528
+ django.core.validators.MaxValueValidator(52),
529
+ ],
530
+ ),
531
+ ),
532
+ (
533
+ "unplanned_day",
534
+ models.IntegerField(
535
+ blank=True,
536
+ null=True,
537
+ validators=[
538
+ django.core.validators.MinValueValidator(1),
539
+ django.core.validators.MaxValueValidator(366),
540
+ ],
541
+ ),
542
+ ),
543
+ (
544
+ "unplanned_week_day",
545
+ models.IntegerField(
546
+ blank=True,
547
+ null=True,
548
+ validators=[
549
+ django.core.validators.MinValueValidator(1),
550
+ django.core.validators.MaxValueValidator(7),
551
+ ],
552
+ ),
553
+ ),
554
+ ("location", models.CharField(blank=True, max_length=255, null=True, verbose_name="Location")),
555
+ (
556
+ "location_longitude",
557
+ models.DecimalField(
558
+ blank=True, decimal_places=6, max_digits=9, null=True, verbose_name="Longitude"
559
+ ),
560
+ ),
561
+ (
562
+ "location_latitude",
563
+ models.DecimalField(
564
+ blank=True, decimal_places=6, max_digits=9, null=True, verbose_name="Latitude"
565
+ ),
566
+ ),
567
+ ("created", models.DateTimeField(auto_now_add=True, verbose_name="Created")),
568
+ ("edited", models.DateTimeField(auto_now=True, verbose_name="Edited")),
569
+ (
570
+ "assigned_to",
571
+ models.ForeignKey(
572
+ blank=True,
573
+ help_text="The person in charge to handle this activity",
574
+ null=True,
575
+ on_delete=django.db.models.deletion.SET_NULL,
576
+ related_name="activities",
577
+ to="wbcrm.person",
578
+ verbose_name="Assigned to",
579
+ ),
580
+ ),
581
+ (
582
+ "creator",
583
+ models.ForeignKey(
584
+ blank=True,
585
+ help_text="The creator of this activity",
586
+ null=True,
587
+ on_delete=django.db.models.deletion.SET_NULL,
588
+ related_name="activities_owned",
589
+ to="wbcrm.person",
590
+ verbose_name="Creator",
591
+ ),
592
+ ),
593
+ (
594
+ "participants",
595
+ models.ManyToManyField(
596
+ blank=True,
597
+ help_text="The list of participants",
598
+ related_name="participates",
599
+ to="wbcrm.entry",
600
+ verbose_name="Participants",
601
+ ),
602
+ ),
603
+ (
604
+ "preceded_by",
605
+ models.ForeignKey(
606
+ blank=True,
607
+ help_text="The precedant activity",
608
+ null=True,
609
+ on_delete=django.db.models.deletion.SET_NULL,
610
+ related_name="followed_by",
611
+ to="wbcrm.activity",
612
+ verbose_name="Preceded by",
613
+ ),
614
+ ),
615
+ (
616
+ "status",
617
+ django_fsm.FSMField(
618
+ choices=[
619
+ ("CANCELLED", "Cancelled"),
620
+ ("UNPLANNED", "Unplanned"),
621
+ ("PLANNED", "Planned"),
622
+ ("FINISHED", "Finished"),
623
+ ("REVIEWED", "Reviewed"),
624
+ ],
625
+ default="PLANNED",
626
+ max_length=50,
627
+ verbose_name="Status",
628
+ ),
629
+ ),
630
+ (
631
+ "type",
632
+ models.CharField(
633
+ choices=[
634
+ ("CALL", "Call"),
635
+ ("EMAIL", "E-Mail"),
636
+ ("MEETING", "Meeting"),
637
+ ("EVENT", "Event"),
638
+ ("BUSINESS_TRAVEL", "Travel"),
639
+ ("HOLIDAY", "Absence"),
640
+ ("LUNCH", "Lunch"),
641
+ ("TASK", "Task"),
642
+ ("ENCOUNTER", "Encounter"),
643
+ ("OTHER", "Other"),
644
+ ],
645
+ default="CALL",
646
+ max_length=16,
647
+ verbose_name="Type",
648
+ ),
649
+ ),
650
+ (
651
+ "all_day",
652
+ models.BooleanField(
653
+ default=False,
654
+ help_text="Check this if the activity span throughout the day",
655
+ verbose_name="All Day",
656
+ ),
657
+ ),
658
+ (
659
+ "conference_room",
660
+ models.BooleanField(
661
+ default=False,
662
+ help_text="Check this if the activity takes place in the conference room",
663
+ verbose_name="Conference Room",
664
+ ),
665
+ ),
666
+ (
667
+ "all_team",
668
+ models.BooleanField(
669
+ default=False,
670
+ help_text="Check this if the activity involves all employees",
671
+ verbose_name="Team Meeting",
672
+ ),
673
+ ),
674
+ (
675
+ "importance",
676
+ models.CharField(
677
+ choices=[("LOW", "Low"), ("MEDIUM", "Medium"), ("HIGH", "High")],
678
+ default="LOW",
679
+ max_length=16,
680
+ verbose_name="Importance",
681
+ ),
682
+ ),
683
+ (
684
+ "reminder_choice",
685
+ models.CharField(
686
+ choices=[
687
+ ("NEVER", "Never"),
688
+ ("EVENT_TIME", "At time of event"),
689
+ ("MINUTES_5", "5 minutes before"),
690
+ ("MINUTES_15", "15 minutes before"),
691
+ ("MINUTES_30", "30 minutes before"),
692
+ ("HOURS_1", "1 hour before"),
693
+ ("HOURS_2", "2 hour before"),
694
+ ("HOURS_12", "12 hour before"),
695
+ ("WEEKS_1", "1 week before"),
696
+ ],
697
+ default="MINUTES_15",
698
+ help_text="Send a reminder (Email and System notification)",
699
+ max_length=16,
700
+ verbose_name="Remind Me",
701
+ ),
702
+ ),
703
+ (
704
+ "repeat_choice",
705
+ models.CharField(
706
+ choices=[
707
+ ("NEVER", "Never"),
708
+ ("RRULE:FREQ=DAILY", "Daily"),
709
+ ("RRULE:FREQ=WEEKLY", "Weekly"),
710
+ ("RRULE:FREQ=MONTHLY", "Monthly"),
711
+ ("RRULE:FREQ=YEARLY", "Yearly"),
712
+ ],
713
+ default="NEVER",
714
+ help_text="Repeat activity at the specified frequency",
715
+ max_length=32,
716
+ verbose_name="Repeat In",
717
+ ),
718
+ ),
719
+ ],
720
+ options={
721
+ "verbose_name": "Activity",
722
+ "verbose_name_plural": "Activities",
723
+ "permissions": [("receive_global_daily_summery", "Receive daily activity summary")],
724
+ },
725
+ ),
726
+ migrations.CreateModel(
727
+ name="ActivityOccurrence",
728
+ fields=[
729
+ ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
730
+ ("start", models.DateTimeField(db_index=True)),
731
+ ("end", models.DateTimeField(blank=True, db_index=True, null=True)),
732
+ ("repeat_until", models.DateField(blank=True, null=True)),
733
+ (
734
+ "event",
735
+ models.ForeignKey(
736
+ on_delete=django.db.models.deletion.CASCADE,
737
+ related_name="occurrences",
738
+ to="wbcrm.activity",
739
+ verbose_name="Event",
740
+ ),
741
+ ),
742
+ ],
743
+ options={
744
+ "ordering": ("start", "end"),
745
+ "abstract": False,
746
+ },
747
+ ),
748
+ migrations.CreateModel(
749
+ name="BankingContact",
750
+ fields=[
751
+ ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
752
+ ("primary", models.BooleanField(default=False, verbose_name="Primary")),
753
+ ("institute", models.CharField(max_length=255, verbose_name="Institute")),
754
+ (
755
+ "institute_additional",
756
+ models.CharField(blank=True, max_length=255, null=True, verbose_name="Institute (Additional)"),
757
+ ),
758
+ ("iban", models.CharField(max_length=34, verbose_name="IBAN")),
759
+ ("swift_bic", models.CharField(blank=True, max_length=11, null=True, verbose_name="SWIFT/BIC")),
760
+ (
761
+ "entry",
762
+ models.ForeignKey(
763
+ on_delete=django.db.models.deletion.CASCADE,
764
+ related_name="banking",
765
+ to="wbcrm.entry",
766
+ verbose_name="Entry",
767
+ ),
768
+ ),
769
+ (
770
+ "location",
771
+ models.CharField(
772
+ choices=[("WORK", "Work"), ("PRIVATE", "Private"), ("HOME", "Home"), ("OTHER", "Other")],
773
+ default="WORK",
774
+ max_length=32,
775
+ verbose_name="Location",
776
+ ),
777
+ ),
778
+ ],
779
+ options={
780
+ "verbose_name_plural": "Banking Contacts",
781
+ "verbose_name": "Banking Contact",
782
+ },
783
+ bases=(wbcore.utils.models.PrimaryMixin, models.Model),
784
+ ),
785
+ migrations.CreateModel(
786
+ name="EmailContact",
787
+ fields=[
788
+ ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
789
+ ("primary", models.BooleanField(default=False, verbose_name="Primary")),
790
+ ("address", models.EmailField(max_length=254, verbose_name="Email Address")),
791
+ (
792
+ "entry",
793
+ models.ForeignKey(
794
+ on_delete=django.db.models.deletion.CASCADE,
795
+ related_name="emails",
796
+ to="wbcrm.entry",
797
+ verbose_name="Entry",
798
+ ),
799
+ ),
800
+ (
801
+ "location",
802
+ models.CharField(
803
+ choices=[("WORK", "Work"), ("PRIVATE", "Private"), ("HOME", "Home"), ("OTHER", "Other")],
804
+ default="WORK",
805
+ max_length=32,
806
+ verbose_name="Location",
807
+ ),
808
+ ),
809
+ ],
810
+ options={
811
+ "verbose_name_plural": "E-Mail Contacts",
812
+ "verbose_name": "E-Mail Contact",
813
+ },
814
+ bases=(wbcore.utils.models.PrimaryMixin, models.Model),
815
+ ),
816
+ migrations.AlterField(
817
+ model_name="entry",
818
+ name="additional_fields",
819
+ field=models.JSONField(blank=True, default=dict, null=True, verbose_name="Additional Fields"),
820
+ ),
821
+ migrations.AlterField(
822
+ model_name="entry",
823
+ name="entry_type",
824
+ field=models.CharField(max_length=255, verbose_name="Type"),
825
+ ),
826
+ migrations.AlterField(
827
+ model_name="entry",
828
+ name="rating",
829
+ field=models.IntegerField(
830
+ default=0,
831
+ validators=[django.core.validators.MinValueValidator(0), django.core.validators.MaxValueValidator(5)],
832
+ verbose_name="Rating",
833
+ ),
834
+ ),
835
+ migrations.AlterField(
836
+ model_name="entry",
837
+ name="search_name",
838
+ field=models.CharField(blank=True, max_length=512, null=True, verbose_name="Search Name"),
839
+ ),
840
+ migrations.CreateModel(
841
+ name="TelephoneContact",
842
+ fields=[
843
+ ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
844
+ ("primary", models.BooleanField(default=False, verbose_name="Primary")),
845
+ ("number", models.CharField(max_length=255, verbose_name="Number")),
846
+ (
847
+ "entry",
848
+ models.ForeignKey(
849
+ on_delete=django.db.models.deletion.CASCADE,
850
+ related_name="telephones",
851
+ to="wbcrm.entry",
852
+ verbose_name="Entry",
853
+ ),
854
+ ),
855
+ (
856
+ "location",
857
+ models.CharField(
858
+ choices=[("WORK", "Work"), ("PRIVATE", "Private"), ("HOME", "Home"), ("OTHER", "Other")],
859
+ default="WORK",
860
+ max_length=32,
861
+ verbose_name="Location",
862
+ ),
863
+ ),
864
+ (
865
+ "telephone_type",
866
+ models.CharField(
867
+ choices=[("FIX", "Fix"), ("CELL", "Cell"), ("FAX", "Fax"), ("OTHER", "Other")],
868
+ default="FIX",
869
+ max_length=32,
870
+ verbose_name="Type",
871
+ ),
872
+ ),
873
+ ],
874
+ options={
875
+ "verbose_name_plural": "Telephone Contacts",
876
+ "verbose_name": "Telephone Contact",
877
+ },
878
+ bases=(wbcore.utils.models.PrimaryMixin, models.Model),
879
+ ),
880
+ migrations.CreateModel(
881
+ name="WebsiteContact",
882
+ fields=[
883
+ ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
884
+ ("primary", models.BooleanField(default=False, verbose_name="Primary")),
885
+ ("url", models.URLField(verbose_name="URL")),
886
+ (
887
+ "entry",
888
+ models.ForeignKey(
889
+ on_delete=django.db.models.deletion.CASCADE,
890
+ related_name="websites",
891
+ to="wbcrm.entry",
892
+ verbose_name="Entry",
893
+ ),
894
+ ),
895
+ (
896
+ "location",
897
+ models.CharField(
898
+ choices=[("WORK", "Work"), ("PRIVATE", "Private"), ("HOME", "Home"), ("OTHER", "Other")],
899
+ default="WORK",
900
+ max_length=32,
901
+ verbose_name="Location",
902
+ ),
903
+ ),
904
+ ],
905
+ options={
906
+ "verbose_name_plural": "Website Contacts",
907
+ "verbose_name": "Website Contact",
908
+ },
909
+ bases=(wbcore.utils.models.PrimaryMixin, models.Model),
910
+ ),
911
+ migrations.CreateModel(
912
+ name="EntryInChargeRequest",
913
+ fields=[
914
+ ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
915
+ (
916
+ "type",
917
+ models.CharField(
918
+ choices=[("REMOVE", "Remove"), ("ADD", "Add")],
919
+ default="ADD",
920
+ max_length=24,
921
+ verbose_name="Type",
922
+ ),
923
+ ),
924
+ (
925
+ "changer",
926
+ models.ForeignKey(
927
+ null=True,
928
+ on_delete=django.db.models.deletion.SET_NULL,
929
+ related_name="in_charge_changer",
930
+ to="wbcrm.person",
931
+ ),
932
+ ),
933
+ (
934
+ "entry",
935
+ models.ForeignKey(
936
+ help_text="The entry under supervision",
937
+ on_delete=django.db.models.deletion.CASCADE,
938
+ related_name="in_charge_source",
939
+ to="wbcrm.entry",
940
+ verbose_name="Entry",
941
+ ),
942
+ ),
943
+ (
944
+ "in_charge",
945
+ models.ForeignKey(
946
+ help_text="Who is in charge of this entry",
947
+ on_delete=django.db.models.deletion.CASCADE,
948
+ related_name="in_charge_target",
949
+ to="wbcrm.person",
950
+ verbose_name="In Charge",
951
+ ),
952
+ ),
953
+ (
954
+ "status",
955
+ django_fsm.FSMField(
956
+ choices=[("PENDING", "Pending"), ("DENIED", "Denied"), ("APPROVED", "Approved")],
957
+ default="PENDING",
958
+ max_length=50,
959
+ ),
960
+ ),
961
+ ("created", models.DateTimeField(auto_now_add=True, verbose_name="Created")),
962
+ ],
963
+ options={
964
+ "permissions": (
965
+ (
966
+ "change_if_company_in_charge_person",
967
+ "If you are in charge of a company you can change the in charge fields of a person within the company and also approve changes.",
968
+ ),
969
+ ("change_in_charge_entry", "You can change in the in charge fields of everybody."),
970
+ ("view_all_entryinchargerequest", "View all requests."),
971
+ ),
972
+ "verbose_name": "In Charge Request",
973
+ "verbose_name_plural": "In Charge Requests",
974
+ },
975
+ ),
976
+ migrations.CreateModel(
977
+ name="AddressContact",
978
+ fields=[
979
+ ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
980
+ ("primary", models.BooleanField(default=False, verbose_name="Primary")),
981
+ ("street", models.CharField(blank=True, max_length=255, null=True, verbose_name="Street")),
982
+ (
983
+ "street_additional",
984
+ models.CharField(blank=True, max_length=255, null=True, verbose_name="Street (additional)"),
985
+ ),
986
+ ("zip", models.CharField(blank=True, max_length=255, null=True, verbose_name="ZIP")),
987
+ ("city", models.CharField(max_length=255, verbose_name="City")),
988
+ ("province", models.CharField(blank=True, max_length=255, null=True, verbose_name="Province")),
989
+ (
990
+ "entry",
991
+ models.ForeignKey(
992
+ on_delete=django.db.models.deletion.CASCADE,
993
+ related_name="addresses",
994
+ to="wbcrm.entry",
995
+ verbose_name="Entry",
996
+ ),
997
+ ),
998
+ (
999
+ "location",
1000
+ models.CharField(
1001
+ choices=[("WORK", "Work"), ("PRIVATE", "Private"), ("HOME", "Home"), ("OTHER", "Other")],
1002
+ default="WORK",
1003
+ max_length=32,
1004
+ verbose_name="Location",
1005
+ ),
1006
+ ),
1007
+ ],
1008
+ options={
1009
+ "verbose_name_plural": "Address Contacts",
1010
+ "verbose_name": "Address Contact",
1011
+ },
1012
+ bases=(wbcore.utils.models.PrimaryMixin, models.Model),
1013
+ ),
1014
+ migrations.AlterField(
1015
+ model_name="activity",
1016
+ name="participants",
1017
+ field=models.ManyToManyField(
1018
+ blank=True,
1019
+ help_text="The list of participants",
1020
+ related_name="participates",
1021
+ to="wbcrm.entry",
1022
+ verbose_name="Activity Participants",
1023
+ ),
1024
+ ),
1025
+ migrations.AlterField(
1026
+ model_name="entry",
1027
+ name="in_charge",
1028
+ field=models.ManyToManyField(
1029
+ blank=True,
1030
+ help_text="People in charge of this entry",
1031
+ related_name="in_charge_of",
1032
+ to="wbcrm.person",
1033
+ verbose_name="In Charge s",
1034
+ ),
1035
+ ),
1036
+ migrations.AddField(
1037
+ model_name="activity",
1038
+ name="reviewed_at",
1039
+ field=models.DateTimeField(blank=True, null=True, verbose_name="Reviewed at"),
1040
+ ),
1041
+ migrations.AddField(
1042
+ model_name="activity",
1043
+ name="latest_reviewer",
1044
+ field=models.ForeignKey(
1045
+ blank=True,
1046
+ help_text="The latest person to review the activity",
1047
+ null=True,
1048
+ on_delete=django.db.models.deletion.SET_NULL,
1049
+ related_name="activities_reviewed",
1050
+ to="wbcrm.person",
1051
+ verbose_name="Latest Reviewer",
1052
+ ),
1053
+ ),
1054
+ migrations.CreateModel(
1055
+ name="PersonGroup",
1056
+ fields=[
1057
+ ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
1058
+ ("title", models.CharField(max_length=255)),
1059
+ ("persons", models.ManyToManyField(blank=True, related_name="groups", to="wbcrm.person")),
1060
+ ],
1061
+ options={
1062
+ "verbose_name": "Person Group",
1063
+ "verbose_name_plural": "Person Groups",
1064
+ },
1065
+ ),
1066
+ migrations.DeleteModel(
1067
+ name="EntryStatus",
1068
+ ),
1069
+ migrations.DeleteModel(
1070
+ name="PersonPrefix",
1071
+ ),
1072
+ migrations.DeleteModel(
1073
+ name="Tag",
1074
+ ),
1075
+ migrations.DeleteModel(
1076
+ name="DynamicCharField",
1077
+ ),
1078
+ migrations.DeleteModel(
1079
+ name="DynamicChoiceField",
1080
+ ),
1081
+ migrations.DeleteModel(
1082
+ name="DynamicRangeField",
1083
+ ),
1084
+ migrations.AlterModelTable(
1085
+ name="addresscontact",
1086
+ table="crm_addresscontact",
1087
+ ),
1088
+ migrations.AlterModelTable(
1089
+ name="bankingcontact",
1090
+ table="crm_bankingcontact",
1091
+ ),
1092
+ migrations.AlterModelTable(
1093
+ name="company",
1094
+ table="crm_company",
1095
+ ),
1096
+ migrations.AlterModelTable(
1097
+ name="emailcontact",
1098
+ table="crm_emailcontact",
1099
+ ),
1100
+ migrations.AlterModelTable(
1101
+ name="entry",
1102
+ table="crm_entry",
1103
+ ),
1104
+ migrations.AlterModelTable(
1105
+ name="entryinchargerequest",
1106
+ table="crm_entryinchargerequest",
1107
+ ),
1108
+ migrations.AlterModelTable(
1109
+ name="person",
1110
+ table="crm_person",
1111
+ ),
1112
+ migrations.AlterModelTable(
1113
+ name="persongroup",
1114
+ table="crm_persongroup",
1115
+ ),
1116
+ migrations.AlterModelTable(
1117
+ name="telephonecontact",
1118
+ table="crm_telephonecontact",
1119
+ ),
1120
+ migrations.AlterModelTable(
1121
+ name="websitecontact",
1122
+ table="crm_websitecontact",
1123
+ ),
1124
+ migrations.AlterModelTable(
1125
+ name="activity",
1126
+ table="crm_activity",
1127
+ ),
1128
+ migrations.AlterModelTable(
1129
+ name="activityoccurrence",
1130
+ table="crm_activityoccurrence",
1131
+ ),
1132
+ migrations.AlterModelOptions(
1133
+ name="activityoccurrence",
1134
+ options={},
1135
+ ),
1136
+ migrations.AlterModelOptions(
1137
+ name="entryinchargerequest",
1138
+ options={"verbose_name": "In Charge Request", "verbose_name_plural": "In Charge Requests"},
1139
+ ),
1140
+ migrations.AlterField(
1141
+ model_name="entry",
1142
+ name="profile_image",
1143
+ field=models.ImageField(blank=True, null=True, upload_to="system/profile_images"),
1144
+ ),
1145
+ migrations.AlterField(
1146
+ model_name="entry",
1147
+ name="signature",
1148
+ field=models.ImageField(blank=True, null=True, upload_to="system/signatures"),
1149
+ ),
1150
+ migrations.AlterField(
1151
+ model_name="entry",
1152
+ name="entry_type",
1153
+ field=models.CharField(
1154
+ choices=[("PERSON", "Person"), ("COMPANY", "Company")], default="", max_length=255, verbose_name="Type"
1155
+ ),
1156
+ ),
1157
+ migrations.AlterField(
1158
+ model_name="activityoccurrence",
1159
+ name="end",
1160
+ field=models.DateTimeField(blank=True, db_index=True, null=True, verbose_name="end"),
1161
+ ),
1162
+ migrations.AlterField(
1163
+ model_name="activityoccurrence",
1164
+ name="repeat_until",
1165
+ field=models.DateField(blank=True, null=True, verbose_name="repeat_until"),
1166
+ ),
1167
+ migrations.AlterField(
1168
+ model_name="activityoccurrence",
1169
+ name="start",
1170
+ field=models.DateTimeField(db_index=True, verbose_name="start"),
1171
+ ),
1172
+ migrations.AlterField(
1173
+ model_name="addresscontact",
1174
+ name="entry",
1175
+ field=models.ForeignKey(
1176
+ blank=True,
1177
+ null=True,
1178
+ on_delete=django.db.models.deletion.CASCADE,
1179
+ related_name="addresses",
1180
+ to="wbcrm.entry",
1181
+ verbose_name="Entry",
1182
+ ),
1183
+ ),
1184
+ migrations.AlterField(
1185
+ model_name="bankingcontact",
1186
+ name="entry",
1187
+ field=models.ForeignKey(
1188
+ blank=True,
1189
+ null=True,
1190
+ on_delete=django.db.models.deletion.CASCADE,
1191
+ related_name="banking",
1192
+ to="wbcrm.entry",
1193
+ verbose_name="Entry",
1194
+ ),
1195
+ ),
1196
+ migrations.AlterField(
1197
+ model_name="emailcontact",
1198
+ name="entry",
1199
+ field=models.ForeignKey(
1200
+ blank=True,
1201
+ null=True,
1202
+ on_delete=django.db.models.deletion.CASCADE,
1203
+ related_name="emails",
1204
+ to="wbcrm.entry",
1205
+ verbose_name="Entry",
1206
+ ),
1207
+ ),
1208
+ migrations.AlterField(
1209
+ model_name="telephonecontact",
1210
+ name="entry",
1211
+ field=models.ForeignKey(
1212
+ blank=True,
1213
+ null=True,
1214
+ on_delete=django.db.models.deletion.CASCADE,
1215
+ related_name="telephones",
1216
+ to="wbcrm.entry",
1217
+ verbose_name="Entry",
1218
+ ),
1219
+ ),
1220
+ migrations.AlterField(
1221
+ model_name="websitecontact",
1222
+ name="entry",
1223
+ field=models.ForeignKey(
1224
+ blank=True,
1225
+ null=True,
1226
+ on_delete=django.db.models.deletion.CASCADE,
1227
+ related_name="websites",
1228
+ to="wbcrm.entry",
1229
+ verbose_name="Entry",
1230
+ ),
1231
+ ),
1232
+ migrations.AlterField(
1233
+ model_name="addresscontact",
1234
+ name="entry",
1235
+ field=models.ForeignKey(
1236
+ blank=True,
1237
+ null=True,
1238
+ on_delete=django.db.models.deletion.SET_NULL,
1239
+ related_name="addresses",
1240
+ to="wbcrm.entry",
1241
+ verbose_name="Entry",
1242
+ ),
1243
+ ),
1244
+ migrations.AlterField(
1245
+ model_name="bankingcontact",
1246
+ name="entry",
1247
+ field=models.ForeignKey(
1248
+ blank=True,
1249
+ null=True,
1250
+ on_delete=django.db.models.deletion.SET_NULL,
1251
+ related_name="banking",
1252
+ to="wbcrm.entry",
1253
+ verbose_name="Entry",
1254
+ ),
1255
+ ),
1256
+ migrations.AlterField(
1257
+ model_name="emailcontact",
1258
+ name="entry",
1259
+ field=models.ForeignKey(
1260
+ blank=True,
1261
+ null=True,
1262
+ on_delete=django.db.models.deletion.SET_NULL,
1263
+ related_name="emails",
1264
+ to="wbcrm.entry",
1265
+ verbose_name="Entry",
1266
+ ),
1267
+ ),
1268
+ migrations.AlterField(
1269
+ model_name="telephonecontact",
1270
+ name="entry",
1271
+ field=models.ForeignKey(
1272
+ blank=True,
1273
+ null=True,
1274
+ on_delete=django.db.models.deletion.SET_NULL,
1275
+ related_name="telephones",
1276
+ to="wbcrm.entry",
1277
+ verbose_name="Entry",
1278
+ ),
1279
+ ),
1280
+ migrations.AlterField(
1281
+ model_name="websitecontact",
1282
+ name="entry",
1283
+ field=models.ForeignKey(
1284
+ blank=True,
1285
+ null=True,
1286
+ on_delete=django.db.models.deletion.SET_NULL,
1287
+ related_name="websites",
1288
+ to="wbcrm.entry",
1289
+ verbose_name="Entry",
1290
+ ),
1291
+ ),
1292
+ migrations.AlterField(
1293
+ model_name="activity",
1294
+ name="all_team",
1295
+ field=models.BooleanField(
1296
+ default=False,
1297
+ help_text="Check this if the activity involves all employees",
1298
+ verbose_name="Team Meeting (all employees)",
1299
+ ),
1300
+ ),
1301
+ django.contrib.postgres.operations.UnaccentExtension(),
1302
+ migrations.AlterField(
1303
+ model_name="bankingcontact",
1304
+ name="iban",
1305
+ field=models.CharField(max_length=38, verbose_name="IBAN"),
1306
+ ),
1307
+ django.contrib.postgres.operations.TrigramExtension(),
1308
+ migrations.AlterField(
1309
+ model_name="activity",
1310
+ name="all_team",
1311
+ field=models.BooleanField(
1312
+ default=False,
1313
+ help_text="Check this if the activity involves all employees",
1314
+ verbose_name="Company Meeting (i.e. All employees)",
1315
+ ),
1316
+ ),
1317
+ migrations.AlterField(
1318
+ model_name="person",
1319
+ name="last_name",
1320
+ field=models.CharField(max_length=255, verbose_name="Last Name"),
1321
+ ),
1322
+ migrations.AlterField(
1323
+ model_name="activity",
1324
+ name="description",
1325
+ field=models.TextField(blank=True, default="", verbose_name="Description"),
1326
+ ),
1327
+ migrations.AlterField(
1328
+ model_name="activity",
1329
+ name="result",
1330
+ field=models.TextField(blank=True, default="", verbose_name="Review"),
1331
+ ),
1332
+ migrations.AlterField(
1333
+ model_name="company",
1334
+ name="asset_allocation",
1335
+ field=models.CharField(blank=True, default="", max_length=255, verbose_name="Asset Allocation"),
1336
+ ),
1337
+ migrations.AlterField(
1338
+ model_name="company",
1339
+ name="assets_under_management",
1340
+ field=models.CharField(blank=True, default="", max_length=255, verbose_name="AUM"),
1341
+ ),
1342
+ migrations.AlterField(
1343
+ model_name="company",
1344
+ name="description",
1345
+ field=models.TextField(blank=True, default="", verbose_name="Description"),
1346
+ ),
1347
+ migrations.AlterField(
1348
+ model_name="company",
1349
+ name="geographic_focus",
1350
+ field=models.CharField(blank=True, default="", max_length=255, verbose_name="Geographic Focus"),
1351
+ ),
1352
+ migrations.AlterField(
1353
+ model_name="company",
1354
+ name="headcount",
1355
+ field=models.CharField(blank=True, default="", max_length=32, verbose_name="Number of employees"),
1356
+ ),
1357
+ migrations.AddField(
1358
+ model_name="bankingcontact",
1359
+ name="additional_information",
1360
+ field=models.TextField(
1361
+ blank=True,
1362
+ help_text="Can be used in place of IBAN to communicate baking information",
1363
+ null=True,
1364
+ verbose_name="Additional Information",
1365
+ ),
1366
+ ),
1367
+ migrations.AddField(
1368
+ model_name="entry",
1369
+ name="slugify_search_name",
1370
+ field=models.CharField(blank=True, max_length=512, null=True, verbose_name="Slugified Search Name"),
1371
+ ),
1372
+ migrations.AlterField(
1373
+ model_name="activity",
1374
+ name="repeat_choice",
1375
+ field=models.CharField(
1376
+ choices=[
1377
+ ("NEVER", "Never"),
1378
+ ("RRULE:FREQ=DAILY", "Daily"),
1379
+ ("RRULE:FREQ=WEEKLY", "Weekly"),
1380
+ ("RRULE:FREQ=WEEKLY;INTERVAL=2", "Bi-Weekly"),
1381
+ ("RRULE:FREQ=MONTHLY", "Monthly (Every Same day)"),
1382
+ ("MONTHLY_WEEKDAY", "Monthly (Every Xth weekday of the month)"),
1383
+ ("MONTHLY_LASTWEEKDAY", "Monthly (Every Xth weekday before the end of the month)"),
1384
+ ("RRULE:FREQ=YEARLY", "Yearly"),
1385
+ ("CUSTOM", "Custom"),
1386
+ ],
1387
+ default="NEVER",
1388
+ help_text="Repeat activity at the specified frequency",
1389
+ max_length=32,
1390
+ verbose_name="Repeat In",
1391
+ ),
1392
+ ),
1393
+ migrations.AlterField(
1394
+ model_name="bankingcontact",
1395
+ name="iban",
1396
+ field=models.CharField(blank=True, max_length=38, null=True, verbose_name="IBAN"),
1397
+ ),
1398
+ migrations.AlterModelOptions(
1399
+ name="entryinchargerequest",
1400
+ options={
1401
+ "permissions": (("can_administer_entry_in_charge_request", "Can administer Entry In Charge Request"),),
1402
+ "verbose_name": "In Charge Request",
1403
+ "verbose_name_plural": "In Charge Requests",
1404
+ },
1405
+ ),
1406
+ migrations.CreateModel(
1407
+ name="EventType",
1408
+ fields=[
1409
+ ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
1410
+ ("title", models.CharField(max_length=256)),
1411
+ ],
1412
+ options={
1413
+ "verbose_name": "Event Type",
1414
+ "verbose_name_plural": "Event Types",
1415
+ },
1416
+ ),
1417
+ migrations.CreateModel(
1418
+ name="Event",
1419
+ fields=[
1420
+ ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
1421
+ ("description", models.TextField(blank=True, default="")),
1422
+ (
1423
+ "entry",
1424
+ models.ForeignKey(
1425
+ on_delete=django.db.models.deletion.CASCADE, related_name="events", to="wbcrm.entry"
1426
+ ),
1427
+ ),
1428
+ ("event_date", models.DateField(default=datetime.date.today, verbose_name="Date")),
1429
+ (
1430
+ "event_type",
1431
+ models.ForeignKey(
1432
+ on_delete=django.db.models.deletion.PROTECT,
1433
+ related_name="events",
1434
+ to="wbcrm.eventtype",
1435
+ verbose_name="Type",
1436
+ ),
1437
+ ),
1438
+ ],
1439
+ options={
1440
+ "verbose_name": "Event",
1441
+ "verbose_name_plural": "Events",
1442
+ },
1443
+ ),
1444
+ migrations.CreateModel(
1445
+ name="RelationshipType",
1446
+ fields=[
1447
+ ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
1448
+ ("title", models.CharField(max_length=256, unique=True, verbose_name="Relationship Type")),
1449
+ (
1450
+ "counter_relationship",
1451
+ models.OneToOneField(
1452
+ blank=True,
1453
+ null=True,
1454
+ on_delete=django.db.models.deletion.CASCADE,
1455
+ related_name="reverse_counter_relationship",
1456
+ to="wbcrm.relationshiptype",
1457
+ verbose_name="Counter Relationship",
1458
+ ),
1459
+ ),
1460
+ (
1461
+ "slugify_title",
1462
+ models.CharField(
1463
+ blank=True, max_length=256, null=True, unique=True, verbose_name="Slugified Title"
1464
+ ),
1465
+ ),
1466
+ ],
1467
+ options={
1468
+ "verbose_name": "Relationship Type",
1469
+ "verbose_name_plural": "Relationship Types",
1470
+ },
1471
+ ),
1472
+ migrations.CreateModel(
1473
+ name="Relationship",
1474
+ fields=[
1475
+ ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
1476
+ (
1477
+ "relationship_type",
1478
+ models.ForeignKey(
1479
+ on_delete=django.db.models.deletion.PROTECT, to="wbcrm.relationshiptype", verbose_name="Type"
1480
+ ),
1481
+ ),
1482
+ ],
1483
+ options={
1484
+ "verbose_name": "Relationship",
1485
+ "verbose_name_plural": "Relationships",
1486
+ },
1487
+ ),
1488
+ migrations.AddField(
1489
+ model_name="entry",
1490
+ name="activity_heat",
1491
+ field=models.FloatField(
1492
+ default=0,
1493
+ validators=[django.core.validators.MinValueValidator(0), django.core.validators.MaxValueValidator(1)],
1494
+ verbose_name="Activity Heat",
1495
+ ),
1496
+ ),
1497
+ migrations.AddField(
1498
+ model_name="entry",
1499
+ name="relationships",
1500
+ field=models.ManyToManyField(
1501
+ blank=True, through="wbcrm.Relationship", to="wbcrm.entry", verbose_name="The Entries Relationships"
1502
+ ),
1503
+ ),
1504
+ migrations.AddField(
1505
+ model_name="relationship",
1506
+ name="from_entry",
1507
+ field=models.ForeignKey(
1508
+ null=True,
1509
+ on_delete=django.db.models.deletion.CASCADE,
1510
+ related_name="from_entry",
1511
+ to="wbcrm.entry",
1512
+ verbose_name="Relationship From",
1513
+ ),
1514
+ ),
1515
+ migrations.AddField(
1516
+ model_name="relationship",
1517
+ name="to_entry",
1518
+ field=models.ForeignKey(
1519
+ null=True,
1520
+ on_delete=django.db.models.deletion.CASCADE,
1521
+ related_name="to_entry",
1522
+ to="wbcrm.entry",
1523
+ verbose_name="Relationship To",
1524
+ ),
1525
+ ),
1526
+ migrations.AlterField(
1527
+ model_name="activity",
1528
+ name="repeat_choice",
1529
+ field=models.CharField(
1530
+ choices=[
1531
+ ("NEVER", "Never"),
1532
+ ("RRULE:FREQ=DAILY", "Daily"),
1533
+ ("RRULE:FREQ=WEEKLY", "Weekly"),
1534
+ ("RRULE:FREQ=WEEKLY;INTERVAL=2", "Bi-Weekly"),
1535
+ ("RRULE:FREQ=MONTHLY", "Monthly (Every Same day)"),
1536
+ ("MONTHLY_WEEKDAY", "Monthly (Every Xth weekday of the month)"),
1537
+ ("MONTHLY_LASTWEEKDAY", "Monthly (Every Xth weekday before the end of the month)"),
1538
+ ("RRULE:FREQ=YEARLY", "Yearly"),
1539
+ ],
1540
+ default="NEVER",
1541
+ help_text="Repeat activity at the specified frequency",
1542
+ max_length=32,
1543
+ verbose_name="Repeat In",
1544
+ ),
1545
+ ),
1546
+ migrations.AddField(
1547
+ model_name="bankingcontact",
1548
+ name="status",
1549
+ field=django_fsm.FSMField(
1550
+ choices=[("PENDING", "Pending"), ("APPROVED", "Approved")],
1551
+ default="PENDING",
1552
+ max_length=50,
1553
+ verbose_name="Status",
1554
+ ),
1555
+ ),
1556
+ migrations.AlterModelOptions(
1557
+ name="bankingcontact",
1558
+ options={
1559
+ "permissions": (("can_approve_banking_contact", "Can approve Banking Contact"),),
1560
+ "verbose_name": "Banking Contact",
1561
+ "verbose_name_plural": "Banking Contacts",
1562
+ },
1563
+ ),
1564
+ migrations.AlterField(
1565
+ model_name="bankingcontact",
1566
+ name="status",
1567
+ field=django_fsm.FSMField(
1568
+ choices=[("PENDING", "Pending"), ("DRAFT", "Draft"), ("APPROVED", "Approved")],
1569
+ default="PENDING",
1570
+ max_length=50,
1571
+ verbose_name="Status",
1572
+ ),
1573
+ ),
1574
+ migrations.AlterField(
1575
+ model_name="bankingcontact",
1576
+ name="status",
1577
+ field=django_fsm.FSMField(
1578
+ choices=[("DRAFT", "Draft"), ("PENDING", "Pending"), ("APPROVED", "Approved")],
1579
+ default="DRAFT",
1580
+ max_length=50,
1581
+ verbose_name="Status",
1582
+ ),
1583
+ ),
1584
+ migrations.AlterModelOptions(
1585
+ name="bankingcontact",
1586
+ options={
1587
+ "permissions": (("can_approve_bankingcontact", "Can approve Banking Contact"),),
1588
+ "verbose_name": "Banking Contact",
1589
+ "verbose_name_plural": "Banking Contacts",
1590
+ },
1591
+ ),
1592
+ migrations.AlterField(
1593
+ model_name="bankingcontact",
1594
+ name="status",
1595
+ field=django_fsm.FSMField(
1596
+ choices=[("DRAFT", "Draft"), ("PENDING", "Pending"), ("APPROVED", "Approved")],
1597
+ default="PENDING",
1598
+ max_length=50,
1599
+ verbose_name="Status",
1600
+ ),
1601
+ ),
1602
+ migrations.AlterField(
1603
+ model_name="bankingcontact",
1604
+ name="status",
1605
+ field=django_fsm.FSMField(
1606
+ choices=[("DRAFT", "Draft"), ("PENDING", "Pending"), ("APPROVED", "Approved")],
1607
+ default="DRAFT",
1608
+ max_length=50,
1609
+ verbose_name="Status",
1610
+ ),
1611
+ ),
1612
+ migrations.AlterField(
1613
+ model_name="bankingcontact",
1614
+ name="status",
1615
+ field=django_fsm.FSMField(
1616
+ choices=[("DRAFT", "Draft"), ("PENDING", "Pending"), ("APPROVED", "Approved")],
1617
+ default="DRAFT",
1618
+ max_length=50,
1619
+ verbose_name="Status",
1620
+ ),
1621
+ ),
1622
+ migrations.AddField(
1623
+ model_name="activity",
1624
+ name="companies",
1625
+ field=models.ManyToManyField(
1626
+ blank=True,
1627
+ help_text="The list of companies participating",
1628
+ related_name="companies",
1629
+ to="wbcrm.company",
1630
+ verbose_name="Participating company",
1631
+ ),
1632
+ ),
1633
+ migrations.AddField(
1634
+ model_name="activity",
1635
+ name="disable_participant_check",
1636
+ field=models.BooleanField(default=False, verbose_name="Without participating company"),
1637
+ ),
1638
+ migrations.AlterField(
1639
+ model_name="bankingcontact",
1640
+ name="status",
1641
+ field=django_fsm.FSMField(
1642
+ choices=[("DRAFT", "Draft"), ("PENDING", "Pending"), ("APPROVED", "Approved")],
1643
+ default="DRAFT",
1644
+ max_length=50,
1645
+ verbose_name="Status",
1646
+ ),
1647
+ ),
1648
+ migrations.RemoveField(
1649
+ model_name="activity",
1650
+ name="participants",
1651
+ ),
1652
+ migrations.CreateModel(
1653
+ name="ClientManagerRelationship",
1654
+ fields=[
1655
+ ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
1656
+ ("primary", models.BooleanField(default=False, verbose_name="Primary")),
1657
+ (
1658
+ "client",
1659
+ models.ForeignKey(
1660
+ on_delete=django.db.models.deletion.CASCADE,
1661
+ related_name="client",
1662
+ to="wbcrm.entry",
1663
+ verbose_name="Client",
1664
+ ),
1665
+ ),
1666
+ (
1667
+ "relationship_manager",
1668
+ models.ForeignKey(
1669
+ on_delete=django.db.models.deletion.CASCADE,
1670
+ related_name="relationship_manager",
1671
+ to="wbcrm.person",
1672
+ verbose_name="Relationship Manager",
1673
+ ),
1674
+ ),
1675
+ ],
1676
+ options={
1677
+ "verbose_name": "Client Manager Relationship",
1678
+ "verbose_name_plural": "Client Manager Relationships",
1679
+ },
1680
+ bases=(wbcore.utils.models.PrimaryMixin, models.Model),
1681
+ ),
1682
+ migrations.RenameField(
1683
+ model_name="entry",
1684
+ old_name="in_charge",
1685
+ new_name="in_charge_old",
1686
+ ),
1687
+ migrations.RemoveField(
1688
+ model_name="entry",
1689
+ name="in_charge_old",
1690
+ ),
1691
+ migrations.AddField(
1692
+ model_name="entry",
1693
+ name="in_charge",
1694
+ field=models.ManyToManyField(
1695
+ blank=True,
1696
+ help_text="People in charge of this entry",
1697
+ related_name="in_charge_of",
1698
+ through="wbcrm.ClientManagerRelationship",
1699
+ to="wbcrm.person",
1700
+ verbose_name="In Charge s",
1701
+ ),
1702
+ ),
1703
+ migrations.AlterField(
1704
+ model_name="entryinchargerequest",
1705
+ name="entry",
1706
+ field=models.ForeignKey(
1707
+ help_text="The entry under supervision",
1708
+ on_delete=django.db.models.deletion.CASCADE,
1709
+ related_name="in_charge_source",
1710
+ to="wbcrm.entry",
1711
+ verbose_name="Client",
1712
+ ),
1713
+ ),
1714
+ migrations.AddField(
1715
+ model_name="entryinchargerequest",
1716
+ name="primary",
1717
+ field=models.BooleanField(default=False, verbose_name="Primary In Charge Person"),
1718
+ ),
1719
+ migrations.AlterField(
1720
+ model_name="activity",
1721
+ name="preceded_by",
1722
+ field=models.ForeignKey(
1723
+ blank=True,
1724
+ help_text="The preceding activity",
1725
+ null=True,
1726
+ on_delete=django.db.models.deletion.SET_NULL,
1727
+ related_name="followed_by",
1728
+ to="wbcrm.activity",
1729
+ verbose_name="Preceded by",
1730
+ ),
1731
+ ),
1732
+ migrations.RenameField(
1733
+ model_name="company",
1734
+ old_name="tiering",
1735
+ new_name="tier",
1736
+ ),
1737
+ migrations.AlterField(
1738
+ model_name="company",
1739
+ name="tier",
1740
+ field=models.CharField(
1741
+ choices=[("ONE", "1"), ("TWO", "2"), ("THREE", "3"), ("FOUR", "4"), ("FIVE", "5")],
1742
+ default="ONE",
1743
+ max_length=16,
1744
+ verbose_name="Tiering",
1745
+ ),
1746
+ ),
1747
+ migrations.CreateModel(
1748
+ name="EmployerEmployeeRelationship",
1749
+ fields=[
1750
+ ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
1751
+ ("primary", models.BooleanField(default=False, verbose_name="Primary")),
1752
+ (
1753
+ "employee",
1754
+ models.ForeignKey(
1755
+ on_delete=django.db.models.deletion.CASCADE,
1756
+ related_name="employer",
1757
+ to="wbcrm.person",
1758
+ verbose_name="Employee",
1759
+ ),
1760
+ ),
1761
+ (
1762
+ "employer",
1763
+ models.ForeignKey(
1764
+ on_delete=django.db.models.deletion.CASCADE,
1765
+ related_name="employee",
1766
+ to="wbcrm.company",
1767
+ verbose_name="Employer",
1768
+ ),
1769
+ ),
1770
+ ],
1771
+ options={
1772
+ "verbose_name": "Employer Employee Relationship",
1773
+ },
1774
+ bases=(wbcore.utils.models.PrimaryMixin, models.Model),
1775
+ ),
1776
+ migrations.RemoveField(
1777
+ model_name="person",
1778
+ name="employers",
1779
+ ),
1780
+ migrations.AddField(
1781
+ model_name="person",
1782
+ name="employers",
1783
+ field=models.ManyToManyField(
1784
+ blank=True,
1785
+ help_text="The person's employers",
1786
+ related_name="employees",
1787
+ through="wbcrm.EmployerEmployeeRelationship",
1788
+ to="wbcrm.company",
1789
+ verbose_name="Companies/Employers",
1790
+ ),
1791
+ ),
1792
+ migrations.CreateModel(
1793
+ name="Position",
1794
+ fields=[
1795
+ ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
1796
+ ("title", models.CharField(max_length=128, unique=True, verbose_name="Position Title")),
1797
+ (
1798
+ "slugify_title",
1799
+ models.CharField(
1800
+ blank=True, max_length=128, null=True, unique=True, verbose_name="Slugified Title"
1801
+ ),
1802
+ ),
1803
+ ],
1804
+ options={
1805
+ "verbose_name": "Position in Company",
1806
+ "verbose_name_plural": "Positions in Company",
1807
+ },
1808
+ ),
1809
+ migrations.AlterField(
1810
+ model_name="entry",
1811
+ name="in_charge",
1812
+ field=models.ManyToManyField(
1813
+ blank=True,
1814
+ help_text="People in charge of this entry",
1815
+ related_name="in_charge_of",
1816
+ through="wbcrm.ClientManagerRelationship",
1817
+ to="wbcrm.person",
1818
+ verbose_name="In Charge Person",
1819
+ ),
1820
+ ),
1821
+ migrations.AddField(
1822
+ model_name="employeremployeerelationship",
1823
+ name="position",
1824
+ field=models.ForeignKey(
1825
+ null=True,
1826
+ on_delete=django.db.models.deletion.SET_NULL,
1827
+ related_name="position_of_employee",
1828
+ to="wbcrm.position",
1829
+ verbose_name="Position",
1830
+ ),
1831
+ ),
1832
+ migrations.CreateModel(
1833
+ name="CustomerStatus",
1834
+ fields=[
1835
+ ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
1836
+ ("title", models.CharField(max_length=32, unique=True, verbose_name="Status Title")),
1837
+ (
1838
+ "slugify_title",
1839
+ models.CharField(
1840
+ blank=True, max_length=32, null=True, unique=True, verbose_name="Slugified Title"
1841
+ ),
1842
+ ),
1843
+ ],
1844
+ options={
1845
+ "verbose_name": "Customer Status",
1846
+ "verbose_name_plural": "Customer Statuses",
1847
+ },
1848
+ ),
1849
+ migrations.RenameField(
1850
+ model_name="entry",
1851
+ old_name="customer_status",
1852
+ new_name="old_customer_status",
1853
+ ),
1854
+ migrations.AddField(
1855
+ model_name="company",
1856
+ name="customer_status",
1857
+ field=models.ForeignKey(
1858
+ blank=True,
1859
+ null=True,
1860
+ on_delete=django.db.models.deletion.SET_NULL,
1861
+ related_name="company",
1862
+ to="wbcrm.customerstatus",
1863
+ verbose_name="Customer Status",
1864
+ ),
1865
+ ),
1866
+ migrations.RemoveField(
1867
+ model_name="entry",
1868
+ name="old_customer_status",
1869
+ ),
1870
+ migrations.RemoveField(
1871
+ model_name="person",
1872
+ name="position",
1873
+ ),
1874
+ migrations.CreateModel(
1875
+ name="CompanyType",
1876
+ fields=[
1877
+ ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
1878
+ ("title", models.CharField(max_length=128, unique=True, verbose_name="Company Type")),
1879
+ (
1880
+ "slugify_title",
1881
+ models.CharField(
1882
+ blank=True, max_length=128, null=True, unique=True, verbose_name="Slugified Title"
1883
+ ),
1884
+ ),
1885
+ ],
1886
+ options={
1887
+ "verbose_name": "Company Type",
1888
+ "verbose_name_plural": "Company Types",
1889
+ },
1890
+ ),
1891
+ migrations.RemoveField(
1892
+ model_name="company",
1893
+ name="type",
1894
+ ),
1895
+ migrations.AddField(
1896
+ model_name="company",
1897
+ name="type",
1898
+ field=models.ForeignKey(
1899
+ null=True,
1900
+ on_delete=django.db.models.deletion.SET_NULL,
1901
+ related_name="company",
1902
+ to="wbcrm.companytype",
1903
+ verbose_name="Type",
1904
+ ),
1905
+ ),
1906
+ migrations.AddField(
1907
+ model_name="entry",
1908
+ name="last_activity",
1909
+ field=models.ForeignKey(
1910
+ blank=True,
1911
+ help_text="The last activity of this entry",
1912
+ null=True,
1913
+ on_delete=django.db.models.deletion.SET_NULL,
1914
+ related_name="last_activity_of",
1915
+ to="wbcrm.activity",
1916
+ verbose_name="Last Activity",
1917
+ ),
1918
+ ),
1919
+ migrations.AlterField(
1920
+ model_name="activity",
1921
+ name="companies",
1922
+ field=models.ManyToManyField(
1923
+ blank=True,
1924
+ help_text="The list of companies participating",
1925
+ related_name="company_participates",
1926
+ to="wbcrm.company",
1927
+ verbose_name="Participating company",
1928
+ ),
1929
+ ),
1930
+ migrations.AlterField(
1931
+ model_name="clientmanagerrelationship",
1932
+ name="client",
1933
+ field=models.ForeignKey(
1934
+ on_delete=django.db.models.deletion.CASCADE,
1935
+ related_name="manager_of",
1936
+ to="wbcrm.entry",
1937
+ verbose_name="Client",
1938
+ ),
1939
+ ),
1940
+ migrations.AlterField(
1941
+ model_name="clientmanagerrelationship",
1942
+ name="relationship_manager",
1943
+ field=models.ForeignKey(
1944
+ on_delete=django.db.models.deletion.CASCADE,
1945
+ related_name="client_of",
1946
+ to="wbcrm.person",
1947
+ verbose_name="Relationship Manager",
1948
+ ),
1949
+ ),
1950
+ migrations.AlterField(
1951
+ model_name="clientmanagerrelationship",
1952
+ name="client",
1953
+ field=models.ForeignKey(
1954
+ on_delete=django.db.models.deletion.CASCADE,
1955
+ related_name="client_of",
1956
+ to="wbcrm.entry",
1957
+ verbose_name="Client",
1958
+ ),
1959
+ ),
1960
+ migrations.AlterField(
1961
+ model_name="clientmanagerrelationship",
1962
+ name="relationship_manager",
1963
+ field=models.ForeignKey(
1964
+ on_delete=django.db.models.deletion.CASCADE,
1965
+ related_name="manager_of",
1966
+ to="wbcrm.person",
1967
+ verbose_name="Relationship Manager",
1968
+ ),
1969
+ ),
1970
+ migrations.AlterField(
1971
+ model_name="entryinchargerequest",
1972
+ name="status",
1973
+ field=django_fsm.FSMField(
1974
+ choices=[("PENDING", "Pending"), ("DENIED", "Denied"), ("APPROVED", "Approved")],
1975
+ default="PENDING",
1976
+ max_length=50,
1977
+ verbose_name="Status",
1978
+ ),
1979
+ ),
1980
+ migrations.AddField(
1981
+ model_name="clientmanagerrelationship",
1982
+ name="created",
1983
+ field=models.DateTimeField(auto_now_add=True, default=django.utils.timezone.now, verbose_name="Created"),
1984
+ preserve_default=False,
1985
+ ),
1986
+ migrations.AddField(
1987
+ model_name="clientmanagerrelationship",
1988
+ name="status",
1989
+ field=django_fsm.FSMField(
1990
+ choices=[
1991
+ ("DRAFT", "Draft"),
1992
+ ("PENDINGADD", "Pending Add"),
1993
+ ("PENDINGREMOVE", "Pending Remove"),
1994
+ ("APPROVED", "Approved"),
1995
+ ("REMOVED", "Removed"),
1996
+ ],
1997
+ default="DRAFT",
1998
+ max_length=50,
1999
+ verbose_name="Status",
2000
+ ),
2001
+ ),
2002
+ migrations.DeleteModel(
2003
+ name="EntryInChargeRequest",
2004
+ ),
2005
+ migrations.AddField(
2006
+ model_name="activity",
2007
+ name="external_id",
2008
+ field=models.CharField(blank=True, max_length=1000, null=True, verbose_name="External ID"),
2009
+ ),
2010
+ migrations.AddField(
2011
+ model_name="activity",
2012
+ name="parent_activity",
2013
+ field=models.ForeignKey(
2014
+ blank=True,
2015
+ null=True,
2016
+ on_delete=django.db.models.deletion.DO_NOTHING,
2017
+ related_name="child_activities",
2018
+ to="wbcrm.activity",
2019
+ verbose_name="Parent Activity",
2020
+ ),
2021
+ ),
2022
+ migrations.AddField(
2023
+ model_name="activity",
2024
+ name="propagate_for_all_children",
2025
+ field=models.BooleanField(
2026
+ default=False,
2027
+ help_text="If this is checked, changes will be propagated to the following activities.",
2028
+ verbose_name="Propagate for all following activities?",
2029
+ ),
2030
+ ),
2031
+ migrations.AddField(
2032
+ model_name="activity",
2033
+ name="recurrence_count",
2034
+ field=models.IntegerField(
2035
+ blank=True,
2036
+ help_text="Specifies how often an activity should be repeated. Is mutually exclusive with the end date.",
2037
+ null=True,
2038
+ validators=[
2039
+ django.core.validators.MinValueValidator(1),
2040
+ django.core.validators.MaxValueValidator(365),
2041
+ ],
2042
+ verbose_name="Recurrence Count",
2043
+ ),
2044
+ ),
2045
+ migrations.AddField(
2046
+ model_name="activity",
2047
+ name="recurrence_end",
2048
+ field=models.DateField(
2049
+ blank=True,
2050
+ help_text="Specifies until when an event is to be repeated. Is mutually exclusive with the Recurrence Count.",
2051
+ null=True,
2052
+ verbose_name="Repeat Until Date",
2053
+ ),
2054
+ ),
2055
+ migrations.AlterField(
2056
+ model_name="activity",
2057
+ name="repeat_choice",
2058
+ field=models.CharField(
2059
+ choices=[
2060
+ ("NEVER", "Never"),
2061
+ ("RRULE:FREQ=DAILY;INTERVAL=1;WKST=MO;BYDAY=MO,TU,WE,TH,FR", "Buisness Daily"),
2062
+ ("RRULE:FREQ=DAILY", "Daily"),
2063
+ ("RRULE:FREQ=WEEKLY", "Weekly"),
2064
+ ("RRULE:FREQ=WEEKLY;INTERVAL=2", "Bi-Weekly"),
2065
+ ("RRULE:FREQ=MONTHLY", "Monthly (Every Same day)"),
2066
+ ("RRULE:FREQ=YEARLY", "Yearly"),
2067
+ ],
2068
+ default="NEVER",
2069
+ help_text="Repeat activity at the specified frequency",
2070
+ max_length=56,
2071
+ verbose_name="Repeat In",
2072
+ ),
2073
+ ),
2074
+ migrations.DeleteModel(
2075
+ name="ActivityOccurrence",
2076
+ ),
2077
+ migrations.AlterField(
2078
+ model_name="entry",
2079
+ name="last_activity",
2080
+ field=models.ForeignKey(
2081
+ blank=True,
2082
+ help_text="The last activity of this entry. Can be ordered by end date.",
2083
+ null=True,
2084
+ on_delete=django.db.models.deletion.SET_NULL,
2085
+ related_name="last_activity_of",
2086
+ to="wbcrm.activity",
2087
+ verbose_name="Last Activity",
2088
+ ),
2089
+ ),
2090
+ migrations.RemoveField(
2091
+ model_name="entry",
2092
+ name="rating",
2093
+ ),
2094
+ migrations.CreateModel(
2095
+ name="ActivityType",
2096
+ fields=[
2097
+ ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
2098
+ ("title", models.CharField(max_length=128, unique=True, verbose_name="Activity Type")),
2099
+ (
2100
+ "slugify_title",
2101
+ models.CharField(
2102
+ blank=True, max_length=128, null=True, unique=True, verbose_name="Slugified Title"
2103
+ ),
2104
+ ),
2105
+ (
2106
+ "icon",
2107
+ models.CharField(
2108
+ choices=[
2109
+ ("wb-icon-action", "wb-icon-action"),
2110
+ ("wb-icon-arrows-swap-1", "wb-icon-arrows-swap-1"),
2111
+ ("wb-icon-arrows-swap-2", "wb-icon-arrows-swap-2"),
2112
+ ("wb-icon-arrow-down", "wb-icon-arrow-down"),
2113
+ ("wb-icon-arrow-left", "wb-icon-arrow-left"),
2114
+ ("wb-icon-arrow-right", "wb-icon-arrow-right"),
2115
+ ("wb-icon-arrow-up", "wb-icon-arrow-up"),
2116
+ ("wb-icon-bank", "wb-icon-bank"),
2117
+ ("wb-icon-bell-inverted", "wb-icon-bell-inverted"),
2118
+ ("wb-icon-bell", "wb-icon-bell"),
2119
+ ("wb-icon-bold", "wb-icon-bold"),
2120
+ ("wb-icon-bookmark", "wb-icon-bookmark"),
2121
+ ("wb-icon-bookmark-inverted", "wb-icon-bookmark-inverted"),
2122
+ ("wb-icon-bulleted-list", "wb-icon-bulleted-list"),
2123
+ ("wb-icon-cake-1", "wb-icon-cake-1"),
2124
+ ("wb-icon-cake-2", "wb-icon-cake-2"),
2125
+ ("wb-icon-cake-3", "wb-icon-cake-3"),
2126
+ ("wb-icon-calendar-1", "wb-icon-calendar-1"),
2127
+ ("wb-icon-calendar-2", "wb-icon-calendar-2"),
2128
+ ("wb-icon-calendar-3", "wb-icon-calendar-3"),
2129
+ ("wb-icon-camera-1", "wb-icon-camera-1"),
2130
+ ("wb-icon-camera-2", "wb-icon-camera-2"),
2131
+ ("wb-icon-chart-bars-1", "wb-icon-chart-bars-1"),
2132
+ ("wb-icon-chart-bars-2", "wb-icon-chart-bars-2"),
2133
+ ("wb-icon-chart-bars-3", "wb-icon-chart-bars-3"),
2134
+ ("wb-icon-chart-bars-4", "wb-icon-chart-bars-4"),
2135
+ ("wb-icon-chart-line-2", "wb-icon-chart-line-2"),
2136
+ ("wb-icon-chart-pie", "wb-icon-chart-pie"),
2137
+ ("wb-icon-chart-piramid", "wb-icon-chart-piramid"),
2138
+ ("wb-icon-chart-switches", "wb-icon-chart-switches"),
2139
+ ("wb-icon-circle-check", "wb-icon-circle-check"),
2140
+ ("wb-icon-circle-exclamation", "wb-icon-circle-exclamation"),
2141
+ ("wb-icon-circle-exclamation-inverted", "wb-icon-circle-exclamation-inverted"),
2142
+ ("wb-icon-circle-x-inverted", "wb-icon-circle-x-inverted"),
2143
+ ("wb-icon-circle-question", "wb-icon-circle-question"),
2144
+ ("wb-icon-circle-question-inverted", "wb-icon-circle-question-inverted"),
2145
+ ("wb-icon-circle-x", "wb-icon-circle-x"),
2146
+ ("wb-icon-circle-check-inverted", "wb-icon-circle-check-inverted"),
2147
+ ("wb-icon-clipboard-1", "wb-icon-clipboard-1"),
2148
+ ("wb-icon-clipboard-2", "wb-icon-clipboard-2"),
2149
+ ("wb-icon-clipboard-3", "wb-icon-clipboard-3"),
2150
+ ("wb-icon-clipboard-4", "wb-icon-clipboard-4"),
2151
+ ("wb-icon-clipboard-checks-1", "wb-icon-clipboard-checks-1"),
2152
+ ("wb-icon-clipboard-checks-2", "wb-icon-clipboard-checks-2"),
2153
+ ("wb-icon-clock-2", "wb-icon-clock-2"),
2154
+ ("wb-icon-clock-1", "wb-icon-clock-1"),
2155
+ ("wb-icon-clock-3", "wb-icon-clock-3"),
2156
+ ("wb-icon-clock-alarm", "wb-icon-clock-alarm"),
2157
+ ("wb-icon-gear-6", "wb-icon-gear-6"),
2158
+ ("wb-icon-contact-book", "wb-icon-contact-book"),
2159
+ ("wb-icon-copy-1", "wb-icon-copy-1"),
2160
+ ("wb-icon-copy-2", "wb-icon-copy-2"),
2161
+ ("wb-icon-copy-3", "wb-icon-copy-3"),
2162
+ ("wb-icon-copy-4", "wb-icon-copy-4"),
2163
+ ("wb-icon-copy-5", "wb-icon-copy-5"),
2164
+ ("wb-icon-copy-6", "wb-icon-copy-6"),
2165
+ ("wb-icon-copy-7", "wb-icon-copy-7"),
2166
+ ("wb-icon-copy-fat-1", "wb-icon-copy-fat-1"),
2167
+ ("wb-icon-copy-fat-2", "wb-icon-copy-fat-2"),
2168
+ ("wb-icon-copy-fat-3", "wb-icon-copy-fat-3"),
2169
+ ("wb-icon-copy-fat-4", "wb-icon-copy-fat-4"),
2170
+ ("wb-icon-copy-fat-5", "wb-icon-copy-fat-5"),
2171
+ ("wb-icon-crosshair", "wb-icon-crosshair"),
2172
+ ("wb-icon-dashboard-2", "wb-icon-dashboard-2"),
2173
+ ("wb-icon-dashboard-1", "wb-icon-dashboard-1"),
2174
+ ("wb-icon-data-grid-3", "wb-icon-data-grid-3"),
2175
+ ("wb-icon-data-grid-1", "wb-icon-data-grid-1"),
2176
+ ("wb-icon-data-grid-2", "wb-icon-data-grid-2"),
2177
+ ("wb-icon-data-grid-4", "wb-icon-data-grid-4"),
2178
+ ("wb-icon-data-grid-5", "wb-icon-data-grid-5"),
2179
+ ("wb-icon-data-list-2", "wb-icon-data-list-2"),
2180
+ ("wb-icon-data-list-3", "wb-icon-data-list-3"),
2181
+ ("wb-icon-data-list-4", "wb-icon-data-list-4"),
2182
+ ("wb-icon-data-list-5", "wb-icon-data-list-5"),
2183
+ ("wb-icon-data-list-6", "wb-icon-data-list-6"),
2184
+ ("wb-icon-data-list-7", "wb-icon-data-list-7"),
2185
+ ("wb-icon-dedent", "wb-icon-dedent"),
2186
+ ("wb-icon-disabled", "wb-icon-disabled"),
2187
+ ("wb-icon-document-1", "wb-icon-document-1"),
2188
+ ("wb-icon-document-2", "wb-icon-document-2"),
2189
+ ("wb-icon-document-book", "wb-icon-document-book"),
2190
+ ("wb-icon-document-gear", "wb-icon-document-gear"),
2191
+ ("wb-icon-document-lock", "wb-icon-document-lock"),
2192
+ ("wb-icon-dollar", "wb-icon-dollar"),
2193
+ ("wb-icon-edit-2", "wb-icon-edit-2"),
2194
+ ("wb-icon-edit-3", "wb-icon-edit-3"),
2195
+ ("wb-icon-envelope", "wb-icon-envelope"),
2196
+ ("wb-icon-envelope-open-1", "wb-icon-envelope-open-1"),
2197
+ ("wb-icon-envelope-open-2", "wb-icon-envelope-open-2"),
2198
+ ("wb-icon-envelope-open-dollar", "wb-icon-envelope-open-dollar"),
2199
+ ("wb-icon-envelope-open-euro", "wb-icon-envelope-open-euro"),
2200
+ ("wb-icon-envelope-open-suitcase", "wb-icon-envelope-open-suitcase"),
2201
+ ("wb-icon-envelope-open-3", "wb-icon-envelope-open-3"),
2202
+ ("wb-icon-envelope-open-person", "wb-icon-envelope-open-person"),
2203
+ ("wb-icon-euro", "wb-icon-euro"),
2204
+ ("wb-icon-eye", "wb-icon-eye"),
2205
+ ("wb-icon-eye-crossed", "wb-icon-eye-crossed"),
2206
+ ("wb-icon-female", "wb-icon-female"),
2207
+ ("wb-icon-filters-1", "wb-icon-filters-1"),
2208
+ ("wb-icon-filters-2", "wb-icon-filters-2"),
2209
+ ("wb-icon-filters-off-1", "wb-icon-filters-off-1"),
2210
+ ("wb-icon-filters-off-2", "wb-icon-filters-off-2"),
2211
+ ("wb-icon-filters-off-3", "wb-icon-filters-off-3"),
2212
+ ("wb-icon-floppy-disk", "wb-icon-floppy-disk"),
2213
+ ("wb-icon-floppy-disk-check", "wb-icon-floppy-disk-check"),
2214
+ ("wb-icon-floppy-disk-x", "wb-icon-floppy-disk-x"),
2215
+ ("wb-icon-folder", "wb-icon-folder"),
2216
+ ("wb-icon-folders", "wb-icon-folders"),
2217
+ ("wb-icon-folder-euro", "wb-icon-folder-euro"),
2218
+ ("wb-icon-folder-inverted", "wb-icon-folder-inverted"),
2219
+ ("wb-icon-folder-plus", "wb-icon-folder-plus"),
2220
+ ("wb-icon-folder-plus-inverted", "wb-icon-folder-plus-inverted"),
2221
+ ("wb-icon-font-color", "wb-icon-font-color"),
2222
+ ("wb-icon-gear-1", "wb-icon-gear-1"),
2223
+ ("wb-icon-gear-2", "wb-icon-gear-2"),
2224
+ ("wb-icon-gear-3", "wb-icon-gear-3"),
2225
+ ("wb-icon-gear-4", "wb-icon-gear-4"),
2226
+ ("wb-icon-gear-5", "wb-icon-gear-5"),
2227
+ ("wb-icon-gear-7", "wb-icon-gear-7"),
2228
+ ("wb-icon-globe-1", "wb-icon-globe-1"),
2229
+ ("wb-icon-globe-2", "wb-icon-globe-2"),
2230
+ ("wb-icon-handshake", "wb-icon-handshake"),
2231
+ ("wb-icon-handshake-euro", "wb-icon-handshake-euro"),
2232
+ ("wb-icon-home", "wb-icon-home"),
2233
+ ("wb-icon-hourglass-empty", "wb-icon-hourglass-empty"),
2234
+ ("wb-icon-hourglass-full", "wb-icon-hourglass-full"),
2235
+ ("wb-icon-hourglass-middle", "wb-icon-hourglass-middle"),
2236
+ ("wb-icon-image", "wb-icon-image"),
2237
+ ("wb-icon-indent", "wb-icon-indent"),
2238
+ ("wb-icon-circle-info", "wb-icon-circle-info"),
2239
+ ("wb-icon-italic", "wb-icon-italic"),
2240
+ ("wb-icon-link", "wb-icon-link"),
2241
+ ("wb-icon-lock-closed-2", "wb-icon-lock-closed-2"),
2242
+ ("wb-icon-lock-closed-1", "wb-icon-lock-closed-1"),
2243
+ ("wb-icon-lock-closed-3", "wb-icon-lock-closed-3"),
2244
+ ("wb-icon-lock-open-2", "wb-icon-lock-open-2"),
2245
+ ("wb-icon-lock-open-1", "wb-icon-lock-open-1"),
2246
+ ("wb-icon-lock-open-3", "wb-icon-lock-open-3"),
2247
+ ("wb-icon-lunch", "wb-icon-lunch"),
2248
+ ("wb-icon-male", "wb-icon-male"),
2249
+ ("wb-icon-man-1", "wb-icon-man-1"),
2250
+ ("wb-icon-man-2", "wb-icon-man-2"),
2251
+ ("wb-icon-man-3", "wb-icon-man-3"),
2252
+ ("wb-icon-man-4", "wb-icon-man-4"),
2253
+ ("wb-icon-man-5", "wb-icon-man-5"),
2254
+ ("wb-icon-man-6", "wb-icon-man-6"),
2255
+ ("wb-icon-man-7", "wb-icon-man-7"),
2256
+ ("wb-icon-maximize-3", "wb-icon-maximize-3"),
2257
+ ("wb-icon-maximize-1", "wb-icon-maximize-1"),
2258
+ ("wb-icon-maximize-2", "wb-icon-maximize-2"),
2259
+ ("wb-icon-data-list-1", "wb-icon-data-list-1"),
2260
+ ("wb-icon-minimize-4", "wb-icon-minimize-4"),
2261
+ ("wb-icon-minimize-1", "wb-icon-minimize-1"),
2262
+ ("wb-icon-minimize-2", "wb-icon-minimize-2"),
2263
+ ("wb-icon-minimize-3", "wb-icon-minimize-3"),
2264
+ ("wb-icon-notebook", "wb-icon-notebook"),
2265
+ ("wb-icon-notebook-inverted", "wb-icon-notebook-inverted"),
2266
+ ("wb-icon-numbered-list", "wb-icon-numbered-list"),
2267
+ ("wb-icon-page-break", "wb-icon-page-break"),
2268
+ ("wb-icon-edit-1", "wb-icon-edit-1"),
2269
+ ("wb-icon-people", "wb-icon-people"),
2270
+ ("wb-icon-person", "wb-icon-person"),
2271
+ ("wb-icon-phone", "wb-icon-phone"),
2272
+ ("wb-icon-phone-call", "wb-icon-phone-call"),
2273
+ ("wb-icon-pin", "wb-icon-pin"),
2274
+ ("wb-icon-pipette-empty", "wb-icon-pipette-empty"),
2275
+ ("wb-icon-pipette-full", "wb-icon-pipette-full"),
2276
+ ("wb-icon-plus", "wb-icon-plus"),
2277
+ ("wb-icon-quote", "wb-icon-quote"),
2278
+ ("wb-icon-recorder", "wb-icon-recorder"),
2279
+ ("wb-icon-redo", "wb-icon-redo"),
2280
+ ("wb-icon-refresh-1", "wb-icon-refresh-1"),
2281
+ ("wb-icon-refresh-2", "wb-icon-refresh-2"),
2282
+ ("wb-icon-refresh-24-acw", "wb-icon-refresh-24-acw"),
2283
+ ("wb-icon-refresh-24-cw", "wb-icon-refresh-24-cw"),
2284
+ ("wb-icon-refresh-3-acw", "wb-icon-refresh-3-acw"),
2285
+ ("wb-icon-refresh-3-cw", "wb-icon-refresh-3-cw"),
2286
+ ("wb-icon-refresh-clock", "wb-icon-refresh-clock"),
2287
+ ("wb-icon-refresh-dots", "wb-icon-refresh-dots"),
2288
+ ("wb-icon-refresh-dots-24", "wb-icon-refresh-dots-24"),
2289
+ ("wb-icon-refresh-dots-gear", "wb-icon-refresh-dots-gear"),
2290
+ ("wb-icon-refresh-three", "wb-icon-refresh-three"),
2291
+ ("wb-icon-remove-formatting", "wb-icon-remove-formatting"),
2292
+ ("wb-icon-arrows-replace", "wb-icon-arrows-replace"),
2293
+ ("wb-icon-scissors", "wb-icon-scissors"),
2294
+ ("wb-icon-search", "wb-icon-search"),
2295
+ ("wb-icon-send", "wb-icon-send"),
2296
+ ("wb-icon-sick-leave-1", "wb-icon-sick-leave-1"),
2297
+ ("wb-icon-sick-leave-2", "wb-icon-sick-leave-2"),
2298
+ ("wb-icon-sick-leave-3", "wb-icon-sick-leave-3"),
2299
+ ("wb-icon-sick-leave-4", "wb-icon-sick-leave-4"),
2300
+ ("wb-icon-share-1", "wb-icon-share-1"),
2301
+ ("wb-icon-share-2", "wb-icon-share-2"),
2302
+ ("wb-icon-skype", "wb-icon-skype"),
2303
+ ("wb-icon-from-a-to-z", "wb-icon-from-a-to-z"),
2304
+ ("wb-icon-from-z-to-a", "wb-icon-from-z-to-a"),
2305
+ ("wb-icon-sound-off", "wb-icon-sound-off"),
2306
+ ("wb-icon-sound-on", "wb-icon-sound-on"),
2307
+ ("wb-icon-speech-bubble", "wb-icon-speech-bubble"),
2308
+ ("wb-icon-spell-check", "wb-icon-spell-check"),
2309
+ ("wb-icon-star", "wb-icon-star"),
2310
+ ("wb-icon-chart-line-1", "wb-icon-chart-line-1"),
2311
+ ("wb-icon-step-back-2", "wb-icon-step-back-2"),
2312
+ ("wb-icon-step-forward-2", "wb-icon-step-forward-2"),
2313
+ ("wb-icon-step-back-1", "wb-icon-step-back-1"),
2314
+ ("wb-icon-step-forward-1", "wb-icon-step-forward-1"),
2315
+ ("wb-icon-strikethrough", "wb-icon-strikethrough"),
2316
+ ("wb-icon-subscript", "wb-icon-subscript"),
2317
+ ("wb-icon-suitcase-1", "wb-icon-suitcase-1"),
2318
+ ("wb-icon-suitcase-2", "wb-icon-suitcase-2"),
2319
+ ("wb-icon-superscript", "wb-icon-superscript"),
2320
+ ("wb-icon-table", "wb-icon-table"),
2321
+ ("wb-icon-text-align-center", "wb-icon-text-align-center"),
2322
+ ("wb-icon-text-align-justify", "wb-icon-text-align-justify"),
2323
+ ("wb-icon-text-align-left", "wb-icon-text-align-left"),
2324
+ ("wb-icon-text-align-right", "wb-icon-text-align-right"),
2325
+ ("wb-icon-text-bg-color", "wb-icon-text-bg-color"),
2326
+ ("wb-icon-thumb-down", "wb-icon-thumb-down"),
2327
+ ("wb-icon-thumb-up", "wb-icon-thumb-up"),
2328
+ ("wb-icon-trade", "wb-icon-trade"),
2329
+ ("wb-icon-trashbin-2", "wb-icon-trashbin-2"),
2330
+ ("wb-icon-trashbin-1", "wb-icon-trashbin-1"),
2331
+ ("wb-icon-triangles-down", "wb-icon-triangles-down"),
2332
+ ("wb-icon-triangles-left", "wb-icon-triangles-left"),
2333
+ ("wb-icon-triangles-left-stop", "wb-icon-triangles-left-stop"),
2334
+ ("wb-icon-triangles-right", "wb-icon-triangles-right"),
2335
+ ("wb-icon-triangles-right-stop", "wb-icon-triangles-right-stop"),
2336
+ ("wb-icon-triangles-up", "wb-icon-triangles-up"),
2337
+ ("wb-icon-triangle-down", "wb-icon-triangle-down"),
2338
+ ("wb-icon-triangle-left", "wb-icon-triangle-left"),
2339
+ ("wb-icon-triangle-right", "wb-icon-triangle-right"),
2340
+ ("wb-icon-triangle-up", "wb-icon-triangle-up"),
2341
+ ("wb-icon-underline", "wb-icon-underline"),
2342
+ ("wb-icon-undo", "wb-icon-undo"),
2343
+ ("wb-icon-unlink", "wb-icon-unlink"),
2344
+ ("wb-icon-woman-1", "wb-icon-woman-1"),
2345
+ ("wb-icon-woman-2", "wb-icon-woman-2"),
2346
+ ("wb-icon-woman-3", "wb-icon-woman-3"),
2347
+ ("wb-icon-woman-4", "wb-icon-woman-4"),
2348
+ ("wb-icon-woman-5", "wb-icon-woman-5"),
2349
+ ("wb-icon-woman-6", "wb-icon-woman-6"),
2350
+ ("wb-icon-woman-7", "wb-icon-woman-7"),
2351
+ ("wb-icon-x", "wb-icon-x"),
2352
+ ],
2353
+ default="wb-icon-phone",
2354
+ max_length=128,
2355
+ verbose_name="Icon",
2356
+ ),
2357
+ ),
2358
+ ("color", models.CharField(default="#ffffff", max_length=7, verbose_name="Color")),
2359
+ (
2360
+ "score",
2361
+ models.CharField(
2362
+ choices=[("4.0", "High"), ("3.0", "Medium"), ("2.0", "Low"), ("0.0", "None")],
2363
+ default="2.0",
2364
+ help_text="Used for the activity heat calculation. Multipliers range from low (2, i.e. e-mail), medium (3, i.e. call) to high (4, i.e. meeting). None is used if this activity type is not used to create scores",
2365
+ max_length=8,
2366
+ verbose_name="Activity Heat Multiplier",
2367
+ ),
2368
+ ),
2369
+ ("default", models.BooleanField(default=False, verbose_name="Default")),
2370
+ ],
2371
+ options={
2372
+ "verbose_name": "Activity Type",
2373
+ "verbose_name_plural": "Activity Types",
2374
+ },
2375
+ ),
2376
+ migrations.RemoveField(
2377
+ model_name="activity",
2378
+ name="type",
2379
+ ),
2380
+ migrations.AlterField(
2381
+ model_name="bankingcontact",
2382
+ name="additional_information",
2383
+ field=models.TextField(
2384
+ blank=True,
2385
+ help_text="Can be used in place of IBAN to communicate banking information",
2386
+ null=True,
2387
+ verbose_name="Additional Information",
2388
+ ),
2389
+ ),
2390
+ migrations.AddField(
2391
+ model_name="activity",
2392
+ name="type",
2393
+ field=models.ForeignKey(
2394
+ on_delete=django.db.models.deletion.PROTECT,
2395
+ related_name="activity",
2396
+ to="wbcrm.activitytype",
2397
+ verbose_name="Type",
2398
+ ),
2399
+ ),
2400
+ migrations.AlterModelOptions(
2401
+ name="entry",
2402
+ options={"ordering": ("entry_type",), "verbose_name": "Entry", "verbose_name_plural": "Entries"},
2403
+ ),
2404
+ migrations.AlterField(
2405
+ model_name="addresscontact",
2406
+ name="city",
2407
+ field=models.CharField(blank=True, max_length=255, null=True, verbose_name="City"),
2408
+ ),
2409
+ migrations.RenameField(
2410
+ model_name="entry",
2411
+ old_name="in_charge",
2412
+ new_name="relationship_managers",
2413
+ ),
2414
+ migrations.AlterField(
2415
+ model_name="entry",
2416
+ name="relationship_managers",
2417
+ field=models.ManyToManyField(
2418
+ blank=True,
2419
+ help_text="People in charge of this entry",
2420
+ related_name="clients",
2421
+ through="wbcrm.ClientManagerRelationship",
2422
+ to="wbcrm.person",
2423
+ verbose_name="Relationship Managers",
2424
+ ),
2425
+ ),
2426
+ migrations.AlterField(
2427
+ model_name="activity",
2428
+ name="assigned_to",
2429
+ field=models.ForeignKey(
2430
+ blank=True,
2431
+ help_text="The person in charge of handling this activity",
2432
+ null=True,
2433
+ on_delete=django.db.models.deletion.SET_NULL,
2434
+ related_name="activities",
2435
+ to="wbcrm.person",
2436
+ verbose_name="Assigned to",
2437
+ ),
2438
+ ),
2439
+ migrations.AlterField(
2440
+ model_name="company",
2441
+ name="tier",
2442
+ field=models.CharField(
2443
+ blank=True,
2444
+ choices=[("ONE", "1"), ("TWO", "2"), ("THREE", "3"), ("FOUR", "4"), ("FIVE", "5")],
2445
+ max_length=16,
2446
+ null=True,
2447
+ verbose_name="Tiering",
2448
+ ),
2449
+ ),
2450
+ migrations.AlterField(
2451
+ model_name="company",
2452
+ name="tier",
2453
+ field=models.CharField(
2454
+ blank=True,
2455
+ choices=[("ONE", "1"), ("TWO", "2"), ("THREE", "3"), ("FOUR", "4"), ("FIVE", "5")],
2456
+ max_length=16,
2457
+ null=True,
2458
+ verbose_name="Tier",
2459
+ ),
2460
+ ),
2461
+ migrations.RenameField(
2462
+ model_name="company",
2463
+ old_name="title",
2464
+ new_name="name",
2465
+ ),
2466
+ migrations.AlterField(
2467
+ model_name="company",
2468
+ name="name",
2469
+ field=models.CharField(max_length=255, verbose_name="Name"),
2470
+ ),
2471
+ migrations.AlterField(
2472
+ model_name="person",
2473
+ name="formal",
2474
+ field=models.BooleanField(default=True, verbose_name="Formal"),
2475
+ ),
2476
+ migrations.CreateModel(
2477
+ name="ActivityParticipant",
2478
+ fields=[
2479
+ ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
2480
+ (
2481
+ "participation_status",
2482
+ models.CharField(
2483
+ blank=True,
2484
+ choices=[
2485
+ ("CANCELLED", "Cancelled"),
2486
+ ("MAYBE", "Maybe"),
2487
+ ("ATTENDS", "Attends"),
2488
+ ("ATTENDS_DIGITALLY", "Attends Digitally"),
2489
+ ],
2490
+ default=None,
2491
+ max_length=17,
2492
+ null=True,
2493
+ ),
2494
+ ),
2495
+ (
2496
+ "activity",
2497
+ models.ForeignKey(
2498
+ on_delete=django.db.models.deletion.CASCADE, to="wbcrm.activity", verbose_name="Activity"
2499
+ ),
2500
+ ),
2501
+ (
2502
+ "participant",
2503
+ models.ForeignKey(
2504
+ on_delete=django.db.models.deletion.CASCADE, to="wbcrm.person", verbose_name="Participant"
2505
+ ),
2506
+ ),
2507
+ ],
2508
+ options={
2509
+ "verbose_name": "Activity Participant",
2510
+ "verbose_name_plural": "Activities Participants",
2511
+ },
2512
+ ),
2513
+ migrations.AddField(
2514
+ model_name="activity",
2515
+ name="participants",
2516
+ field=models.ManyToManyField(
2517
+ blank=True,
2518
+ help_text="The list of participants",
2519
+ related_name="participates",
2520
+ through="wbcrm.ActivityParticipant",
2521
+ to="wbcrm.person",
2522
+ verbose_name="Activity Participants",
2523
+ ),
2524
+ ),
2525
+ migrations.AlterField(
2526
+ model_name="activityparticipant",
2527
+ name="activity",
2528
+ field=models.ForeignKey(
2529
+ on_delete=django.db.models.deletion.CASCADE,
2530
+ related_name="activity_participants",
2531
+ to="wbcrm.activity",
2532
+ verbose_name="Activity",
2533
+ ),
2534
+ ),
2535
+ migrations.AlterField(
2536
+ model_name="activityparticipant",
2537
+ name="participant",
2538
+ field=models.ForeignKey(
2539
+ on_delete=django.db.models.deletion.CASCADE,
2540
+ related_name="activity_participants",
2541
+ to="wbcrm.person",
2542
+ verbose_name="Participant",
2543
+ ),
2544
+ ),
2545
+ migrations.CreateModel(
2546
+ name="CalendarItem",
2547
+ fields=[
2548
+ ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
2549
+ ("color", models.CharField(blank=True, max_length=7, null=True)),
2550
+ ("endpoint", models.CharField(blank=True, max_length=255, null=True)),
2551
+ ("icon", models.CharField(blank=True, max_length=64, null=True)),
2552
+ (
2553
+ "is_private",
2554
+ models.BooleanField(
2555
+ default=False,
2556
+ help_text="If this is checked only the participants, the assignee and the creator of this item can see this item.",
2557
+ verbose_name="Private Mode",
2558
+ ),
2559
+ ),
2560
+ (
2561
+ "item_type",
2562
+ models.CharField(
2563
+ blank=True,
2564
+ choices=[("ABSENCE_REQUEST", "Absence Request"), ("ACTIVITY", "Activity"), ("TASK", "Task")],
2565
+ max_length=255,
2566
+ null=True,
2567
+ verbose_name="Type",
2568
+ ),
2569
+ ),
2570
+ (
2571
+ "period",
2572
+ django.contrib.postgres.fields.ranges.DateTimeRangeField(
2573
+ blank=True, null=True, verbose_name="Period"
2574
+ ),
2575
+ ),
2576
+ ("title", models.CharField(max_length=255, verbose_name="Title")),
2577
+ ("entities", models.ManyToManyField(to="wbcrm.entry", verbose_name="Entities")),
2578
+ (
2579
+ "conference_room",
2580
+ models.BooleanField(
2581
+ default=False,
2582
+ help_text="Check this if it takes place in the conference room",
2583
+ verbose_name="Conference Room",
2584
+ ),
2585
+ ),
2586
+ ],
2587
+ options={
2588
+ "verbose_name": "Calendar Item",
2589
+ "verbose_name_plural": "Calendar Items",
2590
+ },
2591
+ ),
2592
+ migrations.RemoveField(
2593
+ model_name="activity",
2594
+ name="id",
2595
+ ),
2596
+ migrations.AddField(
2597
+ model_name="activity",
2598
+ name="calendaritem_ptr",
2599
+ field=models.OneToOneField(
2600
+ auto_created=True,
2601
+ on_delete=django.db.models.deletion.CASCADE,
2602
+ parent_link=True,
2603
+ primary_key=True,
2604
+ serialize=False,
2605
+ to="wbcrm.calendaritem",
2606
+ ),
2607
+ ),
2608
+ migrations.RemoveField(
2609
+ model_name="activity",
2610
+ name="title",
2611
+ ),
2612
+ migrations.RemoveField(
2613
+ model_name="activity",
2614
+ name="conference_room",
2615
+ ),
2616
+ migrations.AddIndex(
2617
+ model_name="calendaritem",
2618
+ index=models.Index(fields=["period"], name="wbcrm_calen_period_0a0095_idx"),
2619
+ ),
2620
+ migrations.AlterField(
2621
+ model_name="calendaritem",
2622
+ name="conference_room",
2623
+ field=models.BooleanField(
2624
+ default=False,
2625
+ help_text="Check this if it takes place in the conference room",
2626
+ verbose_name="Conference Room",
2627
+ ),
2628
+ ),
2629
+ migrations.RunSQL(
2630
+ sql="SET CONSTRAINTS ALL IMMEDIATE;",
2631
+ ),
2632
+ migrations.AlterField(
2633
+ model_name="calendaritem",
2634
+ name="item_type",
2635
+ field=models.CharField(
2636
+ choices=[("ABSENCE_REQUEST", "Absence Request"), ("ACTIVITY", "Activity"), ("TASK", "Task")],
2637
+ default="ACTIVITY",
2638
+ max_length=255,
2639
+ verbose_name="Type",
2640
+ ),
2641
+ ),
2642
+ migrations.RenameModel(
2643
+ old_name="PersonGroup",
2644
+ new_name="Group",
2645
+ ),
2646
+ migrations.AlterModelOptions(
2647
+ name="group",
2648
+ options={"verbose_name": "Group", "verbose_name_plural": "Groups"},
2649
+ ),
2650
+ migrations.AddField(
2651
+ model_name="group",
2652
+ name="members",
2653
+ field=models.ManyToManyField(related_name="groups", to="wbcrm.entry", verbose_name="Members"),
2654
+ ),
2655
+ migrations.AlterField(
2656
+ model_name="group",
2657
+ name="title",
2658
+ field=models.CharField(max_length=255, unique=True),
2659
+ ),
2660
+ migrations.AlterModelTable(
2661
+ name="group",
2662
+ table="crm_group",
2663
+ ),
2664
+ migrations.AddField(
2665
+ model_name="activity",
2666
+ name="groups",
2667
+ field=models.ManyToManyField(blank=True, related_name="activities_for_group", to="wbcrm.group"),
2668
+ ),
2669
+ migrations.RemoveField(
2670
+ model_name="group",
2671
+ name="persons",
2672
+ ),
2673
+ migrations.RemoveField(
2674
+ model_name="activity",
2675
+ name="all_team",
2676
+ ),
2677
+ migrations.RemoveField(
2678
+ model_name="activitytype",
2679
+ name="color",
2680
+ ),
2681
+ migrations.AddField(
2682
+ model_name="activitytype",
2683
+ name="color",
2684
+ field=wbcore.contrib.color.fields.ColorField(default="#000000", verbose_name="Color"),
2685
+ ),
2686
+ migrations.RemoveField(
2687
+ model_name="calendaritem",
2688
+ name="color",
2689
+ ),
2690
+ migrations.AddField(
2691
+ model_name="calendaritem",
2692
+ name="color",
2693
+ field=wbcore.contrib.color.fields.ColorField(blank=True, null=True),
2694
+ ),
2695
+ migrations.AddField(
2696
+ model_name="calendaritem",
2697
+ name="all_day",
2698
+ field=models.BooleanField(
2699
+ default=False, help_text="Check this if the activity span throughout the day", verbose_name="All Day"
2700
+ ),
2701
+ ),
2702
+ migrations.AddField(
2703
+ model_name="activity",
2704
+ name="online_meeting",
2705
+ field=models.BooleanField(
2706
+ default=False, help_text="Check this if it happens online", verbose_name="Online Meeting"
2707
+ ),
2708
+ ),
2709
+ migrations.RemoveField(
2710
+ model_name="activity",
2711
+ name="all_day",
2712
+ ),
2713
+ migrations.AddConstraint(
2714
+ model_name="activityparticipant",
2715
+ constraint=models.UniqueConstraint(fields=("activity", "participant"), name="unique_participant"),
2716
+ ),
2717
+ migrations.AlterField(
2718
+ model_name="entry",
2719
+ name="profile_image",
2720
+ field=models.ImageField(blank=True, max_length=256, null=True, upload_to="crm/entry/profile_images"),
2721
+ ),
2722
+ migrations.AlterField(
2723
+ model_name="entry",
2724
+ name="signature",
2725
+ field=models.ImageField(blank=True, max_length=256, null=True, upload_to="crm/entry/signatures"),
2726
+ ),
2727
+ migrations.AddField(
2728
+ model_name="entry",
2729
+ name="uuid",
2730
+ field=models.UUIDField(default=uuid.uuid4, editable=False),
2731
+ ),
2732
+ migrations.AlterField(
2733
+ model_name="entry",
2734
+ name="profile_image",
2735
+ field=models.ImageField(
2736
+ blank=True,
2737
+ max_length=256,
2738
+ null=True,
2739
+ upload_to=wbcore.contrib.directory.models.entries.upload_to_profile_images,
2740
+ ),
2741
+ ),
2742
+ migrations.AlterField(
2743
+ model_name="entry",
2744
+ name="signature",
2745
+ field=models.ImageField(
2746
+ blank=True,
2747
+ max_length=256,
2748
+ null=True,
2749
+ upload_to=wbcore.contrib.directory.models.entries.upload_to_signatures,
2750
+ ),
2751
+ ),
2752
+ migrations.AlterField(
2753
+ model_name="entry",
2754
+ name="uuid",
2755
+ field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True),
2756
+ ),
2757
+ migrations.AlterField(
2758
+ model_name="activity",
2759
+ name="recurrence_count",
2760
+ field=models.IntegerField(
2761
+ blank=True,
2762
+ help_text="Specifies how often an activity should be repeated excluding the original activity. Is mutually exclusive with the end date. Limited to a maximum of 365 recurrences.",
2763
+ null=True,
2764
+ validators=[
2765
+ django.core.validators.MinValueValidator(1),
2766
+ django.core.validators.MaxValueValidator(365),
2767
+ ],
2768
+ verbose_name="Recurrence Count",
2769
+ ),
2770
+ ),
2771
+ migrations.AlterField(
2772
+ model_name="activity",
2773
+ name="repeat_choice",
2774
+ field=models.CharField(
2775
+ choices=[
2776
+ ("NEVER", "Never"),
2777
+ ("RRULE:FREQ=DAILY;INTERVAL=1;WKST=MO;BYDAY=MO,TU,WE,TH,FR", "Business Daily"),
2778
+ ("RRULE:FREQ=DAILY", "Daily"),
2779
+ ("RRULE:FREQ=WEEKLY", "Weekly"),
2780
+ ("RRULE:FREQ=WEEKLY;INTERVAL=2", "Bi-Weekly"),
2781
+ ("RRULE:FREQ=MONTHLY", "Monthly"),
2782
+ ("RRULE:FREQ=MONTHLY;INTERVAL=3", "Quarterly"),
2783
+ ("RRULE:FREQ=YEARLY", "Annually"),
2784
+ ],
2785
+ default="NEVER",
2786
+ help_text="Repeat activity at the specified frequency",
2787
+ max_length=56,
2788
+ verbose_name="Frequency",
2789
+ ),
2790
+ ),
2791
+ migrations.AlterField(
2792
+ model_name="calendaritem",
2793
+ name="entities",
2794
+ field=models.ManyToManyField(related_name="calendar_entities", to="wbcrm.entry", verbose_name="Entities"),
2795
+ ),
2796
+ migrations.AlterField(
2797
+ model_name="activity",
2798
+ name="companies",
2799
+ field=models.ManyToManyField(
2800
+ blank=True,
2801
+ help_text="The list of companies participating",
2802
+ related_name="company_participates",
2803
+ to="wbcrm.company",
2804
+ verbose_name="Participating Companies",
2805
+ ),
2806
+ ),
2807
+ migrations.AlterField(
2808
+ model_name="activity",
2809
+ name="disable_participant_check",
2810
+ field=models.BooleanField(default=False, verbose_name="Without Participating Company"),
2811
+ ),
2812
+ migrations.AlterField(
2813
+ model_name="activity",
2814
+ name="participants",
2815
+ field=models.ManyToManyField(
2816
+ blank=True,
2817
+ help_text="The list of participants",
2818
+ related_name="participates",
2819
+ through="wbcrm.ActivityParticipant",
2820
+ to="wbcrm.person",
2821
+ verbose_name="Participating Persons",
2822
+ ),
2823
+ ),
2824
+ migrations.CreateModel(
2825
+ name="Specialization",
2826
+ fields=[
2827
+ ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
2828
+ ("title", models.CharField(max_length=128, unique=True, verbose_name="Title")),
2829
+ (
2830
+ "slugify_title",
2831
+ models.CharField(
2832
+ blank=True, max_length=128, null=True, unique=True, verbose_name="Slugified Title"
2833
+ ),
2834
+ ),
2835
+ ],
2836
+ ),
2837
+ migrations.AddField(
2838
+ model_name="person",
2839
+ name="specializations",
2840
+ field=models.ManyToManyField(blank=True, to="wbcrm.specialization", verbose_name="Specializations"),
2841
+ ),
2842
+ migrations.AddField(
2843
+ model_name="entry",
2844
+ name="deletion_datetime",
2845
+ field=models.DateTimeField(blank=True, null=True),
2846
+ ),
2847
+ migrations.AddField(
2848
+ model_name="entry",
2849
+ name="is_active",
2850
+ field=models.BooleanField(default=True),
2851
+ ),
2852
+ migrations.RenameField(
2853
+ model_name="entry",
2854
+ old_name="slugify_search_name",
2855
+ new_name="slugify_computed_str",
2856
+ ),
2857
+ migrations.RenameField(
2858
+ model_name="entry",
2859
+ old_name="search_name",
2860
+ new_name="computed_str",
2861
+ ),
2862
+ migrations.AlterField(
2863
+ model_name="entry",
2864
+ name="computed_str",
2865
+ field=models.CharField(blank=True, max_length=512, null=True),
2866
+ ),
2867
+ migrations.AddField(
2868
+ model_name="person",
2869
+ name="initials",
2870
+ field=models.CharField(blank=True, max_length=4, null=True, verbose_name="Initials"),
2871
+ ),
2872
+ migrations.AddField(
2873
+ model_name="calendaritem",
2874
+ name="entity_list",
2875
+ field=models.JSONField(blank=True, null=True),
2876
+ ),
2877
+ migrations.AddField(
2878
+ model_name="calendaritem",
2879
+ name="visibility",
2880
+ field=models.CharField(
2881
+ choices=[("PUBLIC", "Public"), ("PRIVATE", "Private"), ("CONFIDENTIAL", "Confidential")],
2882
+ default="PUBLIC",
2883
+ help_text="Set to private for the activity to hide sensitive information from anyone but the assignee and participants. Set to confidential to hide from anyone but people with manager permissions.",
2884
+ max_length=255,
2885
+ verbose_name="Visibility",
2886
+ ),
2887
+ ),
2888
+ migrations.RemoveField(
2889
+ model_name="calendaritem",
2890
+ name="is_private",
2891
+ ),
2892
+ migrations.AlterField(
2893
+ model_name="activitytype",
2894
+ name="icon",
2895
+ field=models.CharField(
2896
+ choices=[
2897
+ ("wb-icon-action", "wb-icon-action"),
2898
+ ("wb-icon-arrows-swap-1", "wb-icon-arrows-swap-1"),
2899
+ ("wb-icon-arrows-swap-2", "wb-icon-arrows-swap-2"),
2900
+ ("wb-icon-arrow-down", "wb-icon-arrow-down"),
2901
+ ("wb-icon-arrow-left", "wb-icon-arrow-left"),
2902
+ ("wb-icon-arrow-right", "wb-icon-arrow-right"),
2903
+ ("wb-icon-arrow-up", "wb-icon-arrow-up"),
2904
+ ("wb-icon-bank", "wb-icon-bank"),
2905
+ ("wb-icon-bell-inverted", "wb-icon-bell-inverted"),
2906
+ ("wb-icon-bell", "wb-icon-bell"),
2907
+ ("wb-icon-bold", "wb-icon-bold"),
2908
+ ("wb-icon-bookmark", "wb-icon-bookmark"),
2909
+ ("wb-icon-bookmark-inverted", "wb-icon-bookmark-inverted"),
2910
+ ("wb-icon-bulleted-list", "wb-icon-bulleted-list"),
2911
+ ("wb-icon-cake-1", "wb-icon-cake-1"),
2912
+ ("wb-icon-cake-2", "wb-icon-cake-2"),
2913
+ ("wb-icon-cake-3", "wb-icon-cake-3"),
2914
+ ("wb-icon-calendar-1", "wb-icon-calendar-1"),
2915
+ ("wb-icon-calendar-2", "wb-icon-calendar-2"),
2916
+ ("wb-icon-calendar-3", "wb-icon-calendar-3"),
2917
+ ("wb-icon-camera-1", "wb-icon-camera-1"),
2918
+ ("wb-icon-camera-2", "wb-icon-camera-2"),
2919
+ ("wb-icon-chart-bars-1", "wb-icon-chart-bars-1"),
2920
+ ("wb-icon-chart-bars-2", "wb-icon-chart-bars-2"),
2921
+ ("wb-icon-chart-bars-3", "wb-icon-chart-bars-3"),
2922
+ ("wb-icon-chart-bars-4", "wb-icon-chart-bars-4"),
2923
+ ("wb-icon-chart-line-2", "wb-icon-chart-line-2"),
2924
+ ("wb-icon-chart-pie", "wb-icon-chart-pie"),
2925
+ ("wb-icon-chart-piramid", "wb-icon-chart-piramid"),
2926
+ ("wb-icon-chart-switches", "wb-icon-chart-switches"),
2927
+ ("wb-icon-circle-check", "wb-icon-circle-check"),
2928
+ ("wb-icon-circle-exclamation", "wb-icon-circle-exclamation"),
2929
+ ("wb-icon-circle-exclamation-inverted", "wb-icon-circle-exclamation-inverted"),
2930
+ ("wb-icon-circle-x-inverted", "wb-icon-circle-x-inverted"),
2931
+ ("wb-icon-circle-question", "wb-icon-circle-question"),
2932
+ ("wb-icon-circle-question-inverted", "wb-icon-circle-question-inverted"),
2933
+ ("wb-icon-circle-x", "wb-icon-circle-x"),
2934
+ ("wb-icon-circle-check-inverted", "wb-icon-circle-check-inverted"),
2935
+ ("wb-icon-clipboard-1", "wb-icon-clipboard-1"),
2936
+ ("wb-icon-clipboard-2", "wb-icon-clipboard-2"),
2937
+ ("wb-icon-clipboard-3", "wb-icon-clipboard-3"),
2938
+ ("wb-icon-clipboard-4", "wb-icon-clipboard-4"),
2939
+ ("wb-icon-clipboard-checks-1", "wb-icon-clipboard-checks-1"),
2940
+ ("wb-icon-clipboard-checks-2", "wb-icon-clipboard-checks-2"),
2941
+ ("wb-icon-clock-2", "wb-icon-clock-2"),
2942
+ ("wb-icon-clock-1", "wb-icon-clock-1"),
2943
+ ("wb-icon-clock-3", "wb-icon-clock-3"),
2944
+ ("wb-icon-clock-alarm", "wb-icon-clock-alarm"),
2945
+ ("wb-icon-gear-6", "wb-icon-gear-6"),
2946
+ ("wb-icon-contact-book", "wb-icon-contact-book"),
2947
+ ("wb-icon-copy-1", "wb-icon-copy-1"),
2948
+ ("wb-icon-copy-2", "wb-icon-copy-2"),
2949
+ ("wb-icon-copy-3", "wb-icon-copy-3"),
2950
+ ("wb-icon-copy-4", "wb-icon-copy-4"),
2951
+ ("wb-icon-copy-5", "wb-icon-copy-5"),
2952
+ ("wb-icon-copy-6", "wb-icon-copy-6"),
2953
+ ("wb-icon-copy-7", "wb-icon-copy-7"),
2954
+ ("wb-icon-copy-fat-1", "wb-icon-copy-fat-1"),
2955
+ ("wb-icon-copy-fat-2", "wb-icon-copy-fat-2"),
2956
+ ("wb-icon-copy-fat-3", "wb-icon-copy-fat-3"),
2957
+ ("wb-icon-copy-fat-4", "wb-icon-copy-fat-4"),
2958
+ ("wb-icon-copy-fat-5", "wb-icon-copy-fat-5"),
2959
+ ("wb-icon-crosshair", "wb-icon-crosshair"),
2960
+ ("wb-icon-dashboard-2", "wb-icon-dashboard-2"),
2961
+ ("wb-icon-dashboard-1", "wb-icon-dashboard-1"),
2962
+ ("wb-icon-data-grid-3", "wb-icon-data-grid-3"),
2963
+ ("wb-icon-data-grid-1", "wb-icon-data-grid-1"),
2964
+ ("wb-icon-data-grid-2", "wb-icon-data-grid-2"),
2965
+ ("wb-icon-data-grid-4", "wb-icon-data-grid-4"),
2966
+ ("wb-icon-data-grid-5", "wb-icon-data-grid-5"),
2967
+ ("wb-icon-data-list-2", "wb-icon-data-list-2"),
2968
+ ("wb-icon-data-list-3", "wb-icon-data-list-3"),
2969
+ ("wb-icon-data-list-4", "wb-icon-data-list-4"),
2970
+ ("wb-icon-data-list-5", "wb-icon-data-list-5"),
2971
+ ("wb-icon-data-list-6", "wb-icon-data-list-6"),
2972
+ ("wb-icon-data-list-7", "wb-icon-data-list-7"),
2973
+ ("wb-icon-dedent", "wb-icon-dedent"),
2974
+ ("wb-icon-disabled", "wb-icon-disabled"),
2975
+ ("wb-icon-document-1", "wb-icon-document-1"),
2976
+ ("wb-icon-document-2", "wb-icon-document-2"),
2977
+ ("wb-icon-document-book", "wb-icon-document-book"),
2978
+ ("wb-icon-document-gear", "wb-icon-document-gear"),
2979
+ ("wb-icon-document-lock", "wb-icon-document-lock"),
2980
+ ("wb-icon-dollar", "wb-icon-dollar"),
2981
+ ("wb-icon-edit-2", "wb-icon-edit-2"),
2982
+ ("wb-icon-edit-3", "wb-icon-edit-3"),
2983
+ ("wb-icon-envelope", "wb-icon-envelope"),
2984
+ ("wb-icon-envelope-open-1", "wb-icon-envelope-open-1"),
2985
+ ("wb-icon-envelope-open-2", "wb-icon-envelope-open-2"),
2986
+ ("wb-icon-envelope-open-dollar", "wb-icon-envelope-open-dollar"),
2987
+ ("wb-icon-envelope-open-euro", "wb-icon-envelope-open-euro"),
2988
+ ("wb-icon-envelope-open-suitcase", "wb-icon-envelope-open-suitcase"),
2989
+ ("wb-icon-envelope-open-3", "wb-icon-envelope-open-3"),
2990
+ ("wb-icon-envelope-open-person", "wb-icon-envelope-open-person"),
2991
+ ("wb-icon-euro", "wb-icon-euro"),
2992
+ ("wb-icon-eye", "wb-icon-eye"),
2993
+ ("wb-icon-eye-crossed", "wb-icon-eye-crossed"),
2994
+ ("wb-icon-female", "wb-icon-female"),
2995
+ ("wb-icon-filters-1", "wb-icon-filters-1"),
2996
+ ("wb-icon-filters-2", "wb-icon-filters-2"),
2997
+ ("wb-icon-filters-off-1", "wb-icon-filters-off-1"),
2998
+ ("wb-icon-filters-off-2", "wb-icon-filters-off-2"),
2999
+ ("wb-icon-filters-off-3", "wb-icon-filters-off-3"),
3000
+ ("wb-icon-floppy-disk", "wb-icon-floppy-disk"),
3001
+ ("wb-icon-floppy-disk-check", "wb-icon-floppy-disk-check"),
3002
+ ("wb-icon-floppy-disk-x", "wb-icon-floppy-disk-x"),
3003
+ ("wb-icon-folder", "wb-icon-folder"),
3004
+ ("wb-icon-folders", "wb-icon-folders"),
3005
+ ("wb-icon-folder-euro", "wb-icon-folder-euro"),
3006
+ ("wb-icon-folder-inverted", "wb-icon-folder-inverted"),
3007
+ ("wb-icon-folder-plus", "wb-icon-folder-plus"),
3008
+ ("wb-icon-folder-plus-inverted", "wb-icon-folder-plus-inverted"),
3009
+ ("wb-icon-font-color", "wb-icon-font-color"),
3010
+ ("wb-icon-gear-1", "wb-icon-gear-1"),
3011
+ ("wb-icon-gear-2", "wb-icon-gear-2"),
3012
+ ("wb-icon-gear-3", "wb-icon-gear-3"),
3013
+ ("wb-icon-gear-4", "wb-icon-gear-4"),
3014
+ ("wb-icon-gear-5", "wb-icon-gear-5"),
3015
+ ("wb-icon-gear-7", "wb-icon-gear-7"),
3016
+ ("wb-icon-globe-1", "wb-icon-globe-1"),
3017
+ ("wb-icon-globe-2", "wb-icon-globe-2"),
3018
+ ("wb-icon-handshake", "wb-icon-handshake"),
3019
+ ("wb-icon-handshake-euro", "wb-icon-handshake-euro"),
3020
+ ("wb-icon-home", "wb-icon-home"),
3021
+ ("wb-icon-hourglass-empty", "wb-icon-hourglass-empty"),
3022
+ ("wb-icon-hourglass-full", "wb-icon-hourglass-full"),
3023
+ ("wb-icon-hourglass-middle", "wb-icon-hourglass-middle"),
3024
+ ("wb-icon-image", "wb-icon-image"),
3025
+ ("wb-icon-indent", "wb-icon-indent"),
3026
+ ("wb-icon-circle-info", "wb-icon-circle-info"),
3027
+ ("wb-icon-italic", "wb-icon-italic"),
3028
+ ("wb-icon-link", "wb-icon-link"),
3029
+ ("wb-icon-lock-closed-2", "wb-icon-lock-closed-2"),
3030
+ ("wb-icon-lock-closed-1", "wb-icon-lock-closed-1"),
3031
+ ("wb-icon-lock-closed-3", "wb-icon-lock-closed-3"),
3032
+ ("wb-icon-lock-open-2", "wb-icon-lock-open-2"),
3033
+ ("wb-icon-lock-open-1", "wb-icon-lock-open-1"),
3034
+ ("wb-icon-lock-open-3", "wb-icon-lock-open-3"),
3035
+ ("wb-icon-lunch", "wb-icon-lunch"),
3036
+ ("wb-icon-male", "wb-icon-male"),
3037
+ ("wb-icon-man-1", "wb-icon-man-1"),
3038
+ ("wb-icon-man-2", "wb-icon-man-2"),
3039
+ ("wb-icon-man-3", "wb-icon-man-3"),
3040
+ ("wb-icon-man-4", "wb-icon-man-4"),
3041
+ ("wb-icon-man-5", "wb-icon-man-5"),
3042
+ ("wb-icon-man-6", "wb-icon-man-6"),
3043
+ ("wb-icon-man-7", "wb-icon-man-7"),
3044
+ ("wb-icon-maximize-3", "wb-icon-maximize-3"),
3045
+ ("wb-icon-maximize-1", "wb-icon-maximize-1"),
3046
+ ("wb-icon-maximize-2", "wb-icon-maximize-2"),
3047
+ ("wb-icon-data-list-1", "wb-icon-data-list-1"),
3048
+ ("wb-icon-minimize-4", "wb-icon-minimize-4"),
3049
+ ("wb-icon-minimize-1", "wb-icon-minimize-1"),
3050
+ ("wb-icon-minimize-2", "wb-icon-minimize-2"),
3051
+ ("wb-icon-minimize-3", "wb-icon-minimize-3"),
3052
+ ("wb-icon-notebook", "wb-icon-notebook"),
3053
+ ("wb-icon-notebook-inverted", "wb-icon-notebook-inverted"),
3054
+ ("wb-icon-numbered-list", "wb-icon-numbered-list"),
3055
+ ("wb-icon-page-break", "wb-icon-page-break"),
3056
+ ("wb-icon-edit-1", "wb-icon-edit-1"),
3057
+ ("wb-icon-people", "wb-icon-people"),
3058
+ ("wb-icon-person", "wb-icon-person"),
3059
+ ("wb-icon-phone", "wb-icon-phone"),
3060
+ ("wb-icon-phone-call", "wb-icon-phone-call"),
3061
+ ("wb-icon-pin", "wb-icon-pin"),
3062
+ ("wb-icon-pipette-empty", "wb-icon-pipette-empty"),
3063
+ ("wb-icon-pipette-full", "wb-icon-pipette-full"),
3064
+ ("wb-icon-plus", "wb-icon-plus"),
3065
+ ("wb-icon-quote", "wb-icon-quote"),
3066
+ ("wb-icon-recorder", "wb-icon-recorder"),
3067
+ ("wb-icon-redo", "wb-icon-redo"),
3068
+ ("wb-icon-refresh-1", "wb-icon-refresh-1"),
3069
+ ("wb-icon-refresh-2", "wb-icon-refresh-2"),
3070
+ ("wb-icon-refresh-24-acw", "wb-icon-refresh-24-acw"),
3071
+ ("wb-icon-refresh-24-cw", "wb-icon-refresh-24-cw"),
3072
+ ("wb-icon-refresh-3-acw", "wb-icon-refresh-3-acw"),
3073
+ ("wb-icon-refresh-3-cw", "wb-icon-refresh-3-cw"),
3074
+ ("wb-icon-refresh-clock", "wb-icon-refresh-clock"),
3075
+ ("wb-icon-refresh-dots", "wb-icon-refresh-dots"),
3076
+ ("wb-icon-refresh-dots-24", "wb-icon-refresh-dots-24"),
3077
+ ("wb-icon-refresh-dots-gear", "wb-icon-refresh-dots-gear"),
3078
+ ("wb-icon-refresh-three", "wb-icon-refresh-three"),
3079
+ ("wb-icon-remove-formatting", "wb-icon-remove-formatting"),
3080
+ ("wb-icon-arrows-replace", "wb-icon-arrows-replace"),
3081
+ ("wb-icon-scissors", "wb-icon-scissors"),
3082
+ ("wb-icon-search", "wb-icon-search"),
3083
+ ("wb-icon-send", "wb-icon-send"),
3084
+ ("wb-icon-sick-leave-1", "wb-icon-sick-leave-1"),
3085
+ ("wb-icon-sick-leave-2", "wb-icon-sick-leave-2"),
3086
+ ("wb-icon-sick-leave-3", "wb-icon-sick-leave-3"),
3087
+ ("wb-icon-sick-leave-4", "wb-icon-sick-leave-4"),
3088
+ ("wb-icon-share-1", "wb-icon-share-1"),
3089
+ ("wb-icon-share-2", "wb-icon-share-2"),
3090
+ ("wb-icon-skype", "wb-icon-skype"),
3091
+ ("wb-icon-from-a-to-z", "wb-icon-from-a-to-z"),
3092
+ ("wb-icon-from-z-to-a", "wb-icon-from-z-to-a"),
3093
+ ("wb-icon-sound-off", "wb-icon-sound-off"),
3094
+ ("wb-icon-sound-on", "wb-icon-sound-on"),
3095
+ ("wb-icon-speech-bubble", "wb-icon-speech-bubble"),
3096
+ ("wb-icon-spell-check", "wb-icon-spell-check"),
3097
+ ("wb-icon-star", "wb-icon-star"),
3098
+ ("wb-icon-chart-line-1", "wb-icon-chart-line-1"),
3099
+ ("wb-icon-step-back-2", "wb-icon-step-back-2"),
3100
+ ("wb-icon-step-forward-2", "wb-icon-step-forward-2"),
3101
+ ("wb-icon-step-back-1", "wb-icon-step-back-1"),
3102
+ ("wb-icon-step-forward-1", "wb-icon-step-forward-1"),
3103
+ ("wb-icon-strikethrough", "wb-icon-strikethrough"),
3104
+ ("wb-icon-subscript", "wb-icon-subscript"),
3105
+ ("wb-icon-suitcase-1", "wb-icon-suitcase-1"),
3106
+ ("wb-icon-suitcase-2", "wb-icon-suitcase-2"),
3107
+ ("wb-icon-superscript", "wb-icon-superscript"),
3108
+ ("wb-icon-table", "wb-icon-table"),
3109
+ ("wb-icon-text-align-center", "wb-icon-text-align-center"),
3110
+ ("wb-icon-text-align-justify", "wb-icon-text-align-justify"),
3111
+ ("wb-icon-text-align-left", "wb-icon-text-align-left"),
3112
+ ("wb-icon-text-align-right", "wb-icon-text-align-right"),
3113
+ ("wb-icon-text-bg-color", "wb-icon-text-bg-color"),
3114
+ ("wb-icon-thumb-down", "wb-icon-thumb-down"),
3115
+ ("wb-icon-thumb-up", "wb-icon-thumb-up"),
3116
+ ("wb-icon-trade", "wb-icon-trade"),
3117
+ ("wb-icon-trashbin-2", "wb-icon-trashbin-2"),
3118
+ ("wb-icon-trashbin-1", "wb-icon-trashbin-1"),
3119
+ ("wb-icon-triangles-down", "wb-icon-triangles-down"),
3120
+ ("wb-icon-triangles-left", "wb-icon-triangles-left"),
3121
+ ("wb-icon-triangles-left-stop", "wb-icon-triangles-left-stop"),
3122
+ ("wb-icon-triangles-right", "wb-icon-triangles-right"),
3123
+ ("wb-icon-triangles-right-stop", "wb-icon-triangles-right-stop"),
3124
+ ("wb-icon-triangles-up", "wb-icon-triangles-up"),
3125
+ ("wb-icon-triangle-down", "wb-icon-triangle-down"),
3126
+ ("wb-icon-triangle-left", "wb-icon-triangle-left"),
3127
+ ("wb-icon-triangle-right", "wb-icon-triangle-right"),
3128
+ ("wb-icon-triangle-up", "wb-icon-triangle-up"),
3129
+ ("wb-icon-underline", "wb-icon-underline"),
3130
+ ("wb-icon-undo", "wb-icon-undo"),
3131
+ ("wb-icon-unlink", "wb-icon-unlink"),
3132
+ ("wb-icon-woman-1", "wb-icon-woman-1"),
3133
+ ("wb-icon-woman-2", "wb-icon-woman-2"),
3134
+ ("wb-icon-woman-3", "wb-icon-woman-3"),
3135
+ ("wb-icon-woman-4", "wb-icon-woman-4"),
3136
+ ("wb-icon-woman-5", "wb-icon-woman-5"),
3137
+ ("wb-icon-woman-6", "wb-icon-woman-6"),
3138
+ ("wb-icon-woman-7", "wb-icon-woman-7"),
3139
+ ("wb-icon-x", "wb-icon-x"),
3140
+ ],
3141
+ default="wb-icon-gear-1",
3142
+ max_length=128,
3143
+ verbose_name="Icon",
3144
+ ),
3145
+ ),
3146
+ migrations.AlterModelOptions(
3147
+ name="calendaritem",
3148
+ options={
3149
+ "permissions": [("administrate_confidential_items", "Can see confidential calendar items")],
3150
+ "verbose_name": "Calendar Item",
3151
+ "verbose_name_plural": "Calendar Items",
3152
+ },
3153
+ ),
3154
+ migrations.AlterModelOptions(
3155
+ name="activityparticipant",
3156
+ options={"verbose_name": "Activity's Participant", "verbose_name_plural": "Activities' Participants"},
3157
+ ),
3158
+ migrations.AlterModelOptions(
3159
+ name="position",
3160
+ options={"verbose_name": "Position", "verbose_name_plural": "Positions"},
3161
+ ),
3162
+ migrations.AlterModelOptions(
3163
+ name="specialization",
3164
+ options={"verbose_name": "Specialization", "verbose_name_plural": "Specializations"},
3165
+ ),
3166
+ migrations.AlterField(
3167
+ model_name="activity",
3168
+ name="groups",
3169
+ field=models.ManyToManyField(
3170
+ blank=True, related_name="activities_for_group", to="wbcrm.group", verbose_name="Groups"
3171
+ ),
3172
+ ),
3173
+ migrations.AlterField(
3174
+ model_name="activitytype",
3175
+ name="score",
3176
+ field=models.CharField(
3177
+ choices=[("4.0", "High"), ("3.0", "Medium"), ("2.0", "Low"), ("0.0", "None")],
3178
+ default="2.0",
3179
+ help_text="Used for the activity heat calculation. Multipliers range from low (i.e. e-mail) to medium (i.e. call) and high (i.e. meeting).",
3180
+ max_length=8,
3181
+ verbose_name="Activity Heat Multiplier",
3182
+ ),
3183
+ ),
3184
+ migrations.AlterField(
3185
+ model_name="activitytype",
3186
+ name="title",
3187
+ field=models.CharField(max_length=128, unique=True, verbose_name="Title"),
3188
+ ),
3189
+ migrations.AlterField(
3190
+ model_name="addresscontact",
3191
+ name="street_additional",
3192
+ field=models.CharField(blank=True, max_length=255, null=True, verbose_name="Street (Additional)"),
3193
+ ),
3194
+ migrations.AlterField(
3195
+ model_name="calendaritem",
3196
+ name="all_day",
3197
+ field=models.BooleanField(
3198
+ default=False, help_text="Check this if the activity spans throughout the day", verbose_name="All Day"
3199
+ ),
3200
+ ),
3201
+ migrations.AlterField(
3202
+ model_name="company",
3203
+ name="discretionairy_advisory",
3204
+ field=models.FloatField(default=0.0, verbose_name="Discretionary Advisory"),
3205
+ ),
3206
+ migrations.AlterField(
3207
+ model_name="companytype",
3208
+ name="title",
3209
+ field=models.CharField(max_length=128, unique=True, verbose_name="Title"),
3210
+ ),
3211
+ migrations.AlterField(
3212
+ model_name="customerstatus",
3213
+ name="title",
3214
+ field=models.CharField(max_length=32, unique=True, verbose_name="Title"),
3215
+ ),
3216
+ migrations.AlterField(
3217
+ model_name="entry",
3218
+ name="relationships",
3219
+ field=models.ManyToManyField(
3220
+ blank=True, through="wbcrm.Relationship", to="wbcrm.entry", verbose_name="The Entry's Relationships"
3221
+ ),
3222
+ ),
3223
+ migrations.AlterField(
3224
+ model_name="person",
3225
+ name="employers",
3226
+ field=models.ManyToManyField(
3227
+ blank=True,
3228
+ help_text="The person's employers",
3229
+ related_name="employees",
3230
+ through="wbcrm.EmployerEmployeeRelationship",
3231
+ to="wbcrm.company",
3232
+ verbose_name="Employers",
3233
+ ),
3234
+ ),
3235
+ migrations.AlterField(
3236
+ model_name="person",
3237
+ name="personality_profile_blue",
3238
+ field=models.FloatField(
3239
+ default=0,
3240
+ validators=[django.core.validators.MinValueValidator(0), django.core.validators.MaxValueValidator(1)],
3241
+ ),
3242
+ ),
3243
+ migrations.AlterField(
3244
+ model_name="person",
3245
+ name="personality_profile_green",
3246
+ field=models.FloatField(
3247
+ default=0,
3248
+ validators=[django.core.validators.MinValueValidator(0), django.core.validators.MaxValueValidator(1)],
3249
+ ),
3250
+ ),
3251
+ migrations.AlterField(
3252
+ model_name="person",
3253
+ name="personality_profile_red",
3254
+ field=models.FloatField(
3255
+ default=0,
3256
+ validators=[django.core.validators.MinValueValidator(0), django.core.validators.MaxValueValidator(1)],
3257
+ ),
3258
+ ),
3259
+ migrations.AlterField(
3260
+ model_name="person",
3261
+ name="prefix",
3262
+ field=models.CharField(
3263
+ choices=[
3264
+ ("MR", "Mr."),
3265
+ ("MRS", "Mrs."),
3266
+ ("PROF", "Prof."),
3267
+ ("DR", "Dr."),
3268
+ ("MED", "Med."),
3269
+ ("ME", "Me."),
3270
+ ],
3271
+ max_length=4,
3272
+ verbose_name="Prefix",
3273
+ ),
3274
+ ),
3275
+ migrations.AlterField(
3276
+ model_name="position",
3277
+ name="title",
3278
+ field=models.CharField(max_length=128, unique=True, verbose_name="Title"),
3279
+ ),
3280
+ migrations.AlterField(
3281
+ model_name="calendaritem",
3282
+ name="visibility",
3283
+ field=models.CharField(
3284
+ choices=[("PUBLIC", "Public"), ("PRIVATE", "Private"), ("CONFIDENTIAL", "Confidential")],
3285
+ default="PUBLIC",
3286
+ max_length=255,
3287
+ verbose_name="Visibility",
3288
+ ),
3289
+ ),
3290
+ migrations.AlterField(
3291
+ model_name="activitytype",
3292
+ name="icon",
3293
+ field=wbcore.contrib.icons.models.IconField(default="wb-icon-gear-1", max_length=128, verbose_name="Icon"),
3294
+ ),
3295
+ migrations.AddField(
3296
+ model_name="activityparticipant",
3297
+ name="status_changed",
3298
+ field=models.DateTimeField(auto_now=True),
3299
+ ),
3300
+ migrations.AlterField(
3301
+ model_name="activityparticipant",
3302
+ name="participation_status",
3303
+ field=django_fsm.FSMField(
3304
+ choices=[
3305
+ ("CANCELLED", "Cancelled"),
3306
+ ("MAYBE", "Maybe"),
3307
+ ("ATTENDS", "Attends"),
3308
+ ("NOTRESPONDED", "Not Responded"),
3309
+ ],
3310
+ default="NOTRESPONDED",
3311
+ max_length=50,
3312
+ ),
3313
+ ),
3314
+ migrations.AlterField(
3315
+ model_name="activityparticipant",
3316
+ name="participation_status",
3317
+ field=django_fsm.FSMField(
3318
+ choices=[
3319
+ ("CANCELLED", "Cancelled"),
3320
+ ("MAYBE", "Maybe"),
3321
+ ("ATTENDS", "Attends"),
3322
+ ("NOTRESPONDED", "Not Responded"),
3323
+ ],
3324
+ default="NOTRESPONDED",
3325
+ max_length=50,
3326
+ verbose_name="Participation Status",
3327
+ ),
3328
+ ),
3329
+ migrations.AlterField(
3330
+ model_name="group",
3331
+ name="title",
3332
+ field=models.CharField(max_length=255, unique=True, verbose_name="Title"),
3333
+ ),
3334
+ migrations.AlterField(
3335
+ model_name="entry",
3336
+ name="computed_str",
3337
+ field=models.CharField(blank=True, max_length=512, null=True, verbose_name="Name"),
3338
+ ),
3339
+ migrations.AddField(
3340
+ model_name="calendaritem",
3341
+ name="deletion_datetime",
3342
+ field=models.DateTimeField(blank=True, null=True),
3343
+ ),
3344
+ migrations.AddField(
3345
+ model_name="calendaritem",
3346
+ name="is_active",
3347
+ field=models.BooleanField(default=True),
3348
+ ),
3349
+ migrations.AddField(
3350
+ model_name="calendaritem",
3351
+ name="is_cancelled",
3352
+ field=models.BooleanField(default=False, verbose_name="Is Cancelled"),
3353
+ ),
3354
+ migrations.RemoveField(
3355
+ model_name="activity",
3356
+ name="unplanned_day",
3357
+ ),
3358
+ migrations.RemoveField(
3359
+ model_name="activity",
3360
+ name="unplanned_month",
3361
+ ),
3362
+ migrations.RemoveField(
3363
+ model_name="activity",
3364
+ name="unplanned_quarter",
3365
+ ),
3366
+ migrations.RemoveField(
3367
+ model_name="activity",
3368
+ name="unplanned_week",
3369
+ ),
3370
+ migrations.RemoveField(
3371
+ model_name="activity",
3372
+ name="unplanned_week_day",
3373
+ ),
3374
+ migrations.RemoveField(
3375
+ model_name="activity",
3376
+ name="unplanned_year",
3377
+ ),
3378
+ migrations.AlterField(
3379
+ model_name="calendaritem",
3380
+ name="item_type",
3381
+ field=models.CharField(
3382
+ choices=[
3383
+ ("ABSENCE_REQUEST", "Absence Request"),
3384
+ ("HOLIDAY", "Holiday"),
3385
+ ("ACTIVITY", "Activity"),
3386
+ ("TASK", "Task"),
3387
+ ],
3388
+ default="ACTIVITY",
3389
+ max_length=255,
3390
+ verbose_name="Type",
3391
+ ),
3392
+ ),
3393
+ migrations.AddField(
3394
+ model_name="bankingcontact",
3395
+ name="edited",
3396
+ field=models.DateTimeField(auto_now=True, verbose_name="Edited"),
3397
+ ),
3398
+ migrations.AlterField(
3399
+ model_name="activitytype",
3400
+ name="icon",
3401
+ field=wbcore.contrib.icons.models.IconField(default="EVENT", max_length=128, verbose_name="Icon"),
3402
+ ),
3403
+ migrations.AddField(
3404
+ model_name="entry",
3405
+ name="external_identfier",
3406
+ field=models.CharField(blank=True, max_length=128, null=True),
3407
+ ),
3408
+ migrations.CreateModel(
3409
+ name="SocialMediaContact",
3410
+ fields=[
3411
+ ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
3412
+ (
3413
+ "location",
3414
+ models.CharField(
3415
+ choices=[("WORK", "Work"), ("PRIVATE", "Private"), ("HOME", "Home"), ("OTHER", "Other")],
3416
+ default="WORK",
3417
+ max_length=32,
3418
+ verbose_name="Location",
3419
+ ),
3420
+ ),
3421
+ ("primary", models.BooleanField(default=False, verbose_name="Primary")),
3422
+ (
3423
+ "platform",
3424
+ models.CharField(
3425
+ choices=[
3426
+ ("FACEBOOK", "Facebook"),
3427
+ ("INSTAGRAM", "Instagram"),
3428
+ ("LINKEDIN", "LinkedIn"),
3429
+ ("REDDIT", "Reddit"),
3430
+ ("TIKTOK", "TikTok"),
3431
+ ("TUMBLR", "Tumblr"),
3432
+ ("TWITTER", "Twitter"),
3433
+ ("XING", "Xing"),
3434
+ ],
3435
+ help_text="The social media platform for this contact",
3436
+ max_length=32,
3437
+ verbose_name="Platform",
3438
+ ),
3439
+ ),
3440
+ ("url", models.URLField(verbose_name="URL")),
3441
+ (
3442
+ "entry",
3443
+ models.ForeignKey(
3444
+ blank=True,
3445
+ null=True,
3446
+ on_delete=django.db.models.deletion.CASCADE,
3447
+ related_name="social_media",
3448
+ to="wbcrm.entry",
3449
+ verbose_name="Entry",
3450
+ ),
3451
+ ),
3452
+ ],
3453
+ options={
3454
+ "verbose_name": "Social Media Contact",
3455
+ "verbose_name_plural": "Social Media Contacts",
3456
+ "db_table": "crm_socialmedia",
3457
+ },
3458
+ ),
3459
+ migrations.DeleteModel(
3460
+ name="Event",
3461
+ ),
3462
+ migrations.DeleteModel(
3463
+ name="EventType",
3464
+ ),
3465
+ migrations.AlterField(
3466
+ model_name="activity",
3467
+ name="groups",
3468
+ field=models.ManyToManyField(
3469
+ blank=True,
3470
+ help_text="Each member of the group will be added to the list of participants and companies automatically.",
3471
+ related_name="activities_for_group",
3472
+ to="wbcrm.group",
3473
+ verbose_name="Groups",
3474
+ ),
3475
+ ),
3476
+ migrations.AlterField(
3477
+ model_name="activity",
3478
+ name="reminder_choice",
3479
+ field=models.CharField(
3480
+ choices=[
3481
+ ("NEVER", "Never"),
3482
+ ("EVENT_TIME", "At time of event"),
3483
+ ("MINUTES_5", "5 minutes before"),
3484
+ ("MINUTES_15", "15 minutes before"),
3485
+ ("MINUTES_30", "30 minutes before"),
3486
+ ("HOURS_1", "1 hour before"),
3487
+ ("HOURS_2", "2 hour before"),
3488
+ ("HOURS_12", "12 hour before"),
3489
+ ("WEEKS_1", "1 week before"),
3490
+ ],
3491
+ default="MINUTES_15",
3492
+ help_text="Sends a mail and system notification to all participating internal employees before the start of the activity.",
3493
+ max_length=16,
3494
+ verbose_name="Reminder",
3495
+ ),
3496
+ ),
3497
+ migrations.AddField(
3498
+ model_name="relationship",
3499
+ name="computed_str",
3500
+ field=models.CharField(blank=True, max_length=512, null=True, verbose_name="Name"),
3501
+ ),
3502
+ migrations.AddField(
3503
+ model_name="clientmanagerrelationship",
3504
+ name="computed_str",
3505
+ field=models.CharField(blank=True, max_length=512, null=True, verbose_name="Name"),
3506
+ ),
3507
+ migrations.AlterField(
3508
+ model_name="activity",
3509
+ name="recurrence_count",
3510
+ field=models.IntegerField(
3511
+ blank=True,
3512
+ help_text="Specifies how often an activity should be repeated excluding the original activity. Is mutually exclusive with the end date. Limited to a maximum of 365 recurrences.",
3513
+ null=True,
3514
+ validators=[
3515
+ django.core.validators.MinValueValidator(1),
3516
+ django.core.validators.MaxValueValidator(365),
3517
+ ],
3518
+ verbose_name="Count",
3519
+ ),
3520
+ ),
3521
+ migrations.AlterField(
3522
+ model_name="activity",
3523
+ name="recurrence_end",
3524
+ field=models.DateField(
3525
+ blank=True,
3526
+ help_text="Specifies until when an event is to be repeated. Is mutually exclusive with the Recurrence Count.",
3527
+ null=True,
3528
+ verbose_name="Date",
3529
+ ),
3530
+ ),
3531
+ migrations.AddField(
3532
+ model_name="emailcontact",
3533
+ name="computed_str",
3534
+ field=models.CharField(blank=True, max_length=512, null=True, verbose_name="Name"),
3535
+ ),
3536
+ migrations.CreateModel(
3537
+ name="Product",
3538
+ fields=[
3539
+ ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
3540
+ ("title", models.CharField(max_length=128, verbose_name="Title")),
3541
+ (
3542
+ "slugify_title",
3543
+ models.CharField(blank=True, max_length=128, null=True, verbose_name="Slugified Title"),
3544
+ ),
3545
+ (
3546
+ "is_competitor",
3547
+ models.BooleanField(
3548
+ default=False,
3549
+ help_text="Indicates wether this is a competitor's product",
3550
+ verbose_name="Is Competitor",
3551
+ ),
3552
+ ),
3553
+ ],
3554
+ options={
3555
+ "verbose_name": "Product",
3556
+ "verbose_name_plural": "Products",
3557
+ "unique_together": {("slugify_title", "is_competitor")},
3558
+ },
3559
+ ),
3560
+ migrations.AddField(
3561
+ model_name="company",
3562
+ name="interested_competitors_products",
3563
+ field=models.ManyToManyField(
3564
+ blank=True,
3565
+ limit_choices_to={"is_competitor": True},
3566
+ related_name="competitor_prospects",
3567
+ to="wbcrm.product",
3568
+ verbose_name="Interested Competitors' Products",
3569
+ ),
3570
+ ),
3571
+ migrations.AddField(
3572
+ model_name="company",
3573
+ name="interested_products",
3574
+ field=models.ManyToManyField(
3575
+ blank=True,
3576
+ limit_choices_to={"is_competitor": False},
3577
+ related_name="prospects",
3578
+ to="wbcrm.product",
3579
+ verbose_name="Interested Products",
3580
+ ),
3581
+ ),
3582
+ migrations.AlterModelTable(
3583
+ name="activity",
3584
+ table=None,
3585
+ ),
3586
+ migrations.AlterModelTable(
3587
+ name="addresscontact",
3588
+ table=None,
3589
+ ),
3590
+ migrations.AlterModelTable(
3591
+ name="bankingcontact",
3592
+ table=None,
3593
+ ),
3594
+ migrations.AlterModelTable(
3595
+ name="company",
3596
+ table=None,
3597
+ ),
3598
+ migrations.AlterModelTable(
3599
+ name="emailcontact",
3600
+ table=None,
3601
+ ),
3602
+ migrations.AlterModelTable(
3603
+ name="entry",
3604
+ table=None,
3605
+ ),
3606
+ migrations.AlterModelTable(
3607
+ name="group",
3608
+ table=None,
3609
+ ),
3610
+ migrations.AlterModelTable(
3611
+ name="person",
3612
+ table=None,
3613
+ ),
3614
+ migrations.AlterModelTable(
3615
+ name="socialmediacontact",
3616
+ table=None,
3617
+ ),
3618
+ migrations.AlterModelTable(
3619
+ name="telephonecontact",
3620
+ table=None,
3621
+ ),
3622
+ migrations.AlterModelTable(
3623
+ name="websitecontact",
3624
+ table=None,
3625
+ ),
3626
+ migrations.AddField(
3627
+ model_name="addresscontact",
3628
+ name="geography_city",
3629
+ field=models.ForeignKey(
3630
+ blank=True,
3631
+ limit_choices_to={"level": 3},
3632
+ null=True,
3633
+ on_delete=django.db.models.deletion.PROTECT,
3634
+ related_name="contact_city",
3635
+ to="geography.geography",
3636
+ verbose_name="City",
3637
+ ),
3638
+ ),
3639
+ migrations.RemoveField(
3640
+ model_name="company",
3641
+ name="interested_competitors_products",
3642
+ ),
3643
+ migrations.RemoveField(
3644
+ model_name="company",
3645
+ name="interested_products",
3646
+ ),
3647
+ migrations.RemoveField(
3648
+ model_name="bankingcontact",
3649
+ name="entry",
3650
+ ),
3651
+ migrations.RemoveField(
3652
+ model_name="calendaritem",
3653
+ name="entities",
3654
+ ),
3655
+ migrations.RemoveField(
3656
+ model_name="clientmanagerrelationship",
3657
+ name="client",
3658
+ ),
3659
+ migrations.RemoveField(
3660
+ model_name="clientmanagerrelationship",
3661
+ name="relationship_manager",
3662
+ ),
3663
+ migrations.RemoveField(
3664
+ model_name="company",
3665
+ name="customer_status",
3666
+ ),
3667
+ migrations.RemoveField(
3668
+ model_name="company",
3669
+ name="entry_ptr",
3670
+ ),
3671
+ migrations.RemoveField(
3672
+ model_name="company",
3673
+ name="type",
3674
+ ),
3675
+ migrations.RemoveField(
3676
+ model_name="emailcontact",
3677
+ name="entry",
3678
+ ),
3679
+ migrations.RemoveField(
3680
+ model_name="employeremployeerelationship",
3681
+ name="employee",
3682
+ ),
3683
+ migrations.RemoveField(
3684
+ model_name="employeremployeerelationship",
3685
+ name="employer",
3686
+ ),
3687
+ migrations.RemoveField(
3688
+ model_name="employeremployeerelationship",
3689
+ name="position",
3690
+ ),
3691
+ migrations.RemoveField(
3692
+ model_name="entry",
3693
+ name="last_activity",
3694
+ ),
3695
+ migrations.RemoveField(
3696
+ model_name="entry",
3697
+ name="relationship_managers",
3698
+ ),
3699
+ migrations.RemoveField(
3700
+ model_name="entry",
3701
+ name="relationships",
3702
+ ),
3703
+ migrations.RemoveField(
3704
+ model_name="person",
3705
+ name="employers",
3706
+ ),
3707
+ migrations.RemoveField(
3708
+ model_name="person",
3709
+ name="entry_ptr",
3710
+ ),
3711
+ migrations.RemoveField(
3712
+ model_name="person",
3713
+ name="specializations",
3714
+ ),
3715
+ migrations.RemoveField(
3716
+ model_name="relationship",
3717
+ name="from_entry",
3718
+ ),
3719
+ migrations.RemoveField(
3720
+ model_name="relationship",
3721
+ name="relationship_type",
3722
+ ),
3723
+ migrations.RemoveField(
3724
+ model_name="relationship",
3725
+ name="to_entry",
3726
+ ),
3727
+ migrations.RemoveField(
3728
+ model_name="relationshiptype",
3729
+ name="counter_relationship",
3730
+ ),
3731
+ migrations.RemoveField(
3732
+ model_name="socialmediacontact",
3733
+ name="entry",
3734
+ ),
3735
+ migrations.RemoveField(
3736
+ model_name="telephonecontact",
3737
+ name="entry",
3738
+ ),
3739
+ migrations.RemoveField(
3740
+ model_name="websitecontact",
3741
+ name="entry",
3742
+ ),
3743
+ migrations.AlterField(
3744
+ model_name="activity",
3745
+ name="assigned_to",
3746
+ field=models.ForeignKey(
3747
+ blank=True,
3748
+ help_text="The person in charge of handling this activity",
3749
+ null=True,
3750
+ on_delete=django.db.models.deletion.SET_NULL,
3751
+ related_name="activities",
3752
+ to="directory.person",
3753
+ verbose_name="Assigned to",
3754
+ ),
3755
+ ),
3756
+ migrations.AlterField(
3757
+ model_name="activity",
3758
+ name="calendaritem_ptr",
3759
+ field=models.OneToOneField(
3760
+ auto_created=True,
3761
+ on_delete=django.db.models.deletion.CASCADE,
3762
+ parent_link=True,
3763
+ primary_key=True,
3764
+ serialize=False,
3765
+ to="agenda.calendaritem",
3766
+ ),
3767
+ ),
3768
+ migrations.AlterField(
3769
+ model_name="activity",
3770
+ name="companies",
3771
+ field=models.ManyToManyField(
3772
+ blank=True,
3773
+ help_text="The list of companies participating",
3774
+ related_name="company_participates",
3775
+ to="directory.company",
3776
+ verbose_name="Participating Companies",
3777
+ ),
3778
+ ),
3779
+ migrations.AlterField(
3780
+ model_name="activity",
3781
+ name="creator",
3782
+ field=models.ForeignKey(
3783
+ blank=True,
3784
+ help_text="The creator of this activity",
3785
+ null=True,
3786
+ on_delete=django.db.models.deletion.SET_NULL,
3787
+ related_name="activities_owned",
3788
+ to="directory.person",
3789
+ verbose_name="Creator",
3790
+ ),
3791
+ ),
3792
+ migrations.AlterField(
3793
+ model_name="activity",
3794
+ name="latest_reviewer",
3795
+ field=models.ForeignKey(
3796
+ blank=True,
3797
+ help_text="The latest person to review the activity",
3798
+ null=True,
3799
+ on_delete=django.db.models.deletion.SET_NULL,
3800
+ related_name="activities_reviewed",
3801
+ to="directory.person",
3802
+ verbose_name="Latest Reviewer",
3803
+ ),
3804
+ ),
3805
+ migrations.AlterField(
3806
+ model_name="activity",
3807
+ name="participants",
3808
+ field=models.ManyToManyField(
3809
+ blank=True,
3810
+ help_text="The list of participants",
3811
+ related_name="participates",
3812
+ through="wbcrm.ActivityParticipant",
3813
+ to="directory.person",
3814
+ verbose_name="Participating Persons",
3815
+ ),
3816
+ ),
3817
+ migrations.AlterField(
3818
+ model_name="activity",
3819
+ name="type",
3820
+ field=models.ForeignKey(
3821
+ default=wbcrm.models.activities.ActivityType.get_default_activity_type,
3822
+ on_delete=django.db.models.deletion.PROTECT,
3823
+ related_name="activity",
3824
+ to="wbcrm.activitytype",
3825
+ verbose_name="Type",
3826
+ ),
3827
+ ),
3828
+ migrations.AlterField(
3829
+ model_name="activityparticipant",
3830
+ name="participant",
3831
+ field=models.ForeignKey(
3832
+ on_delete=django.db.models.deletion.CASCADE,
3833
+ related_name="activity_participants",
3834
+ to="directory.person",
3835
+ verbose_name="Participant",
3836
+ ),
3837
+ ),
3838
+ migrations.AlterField(
3839
+ model_name="group",
3840
+ name="members",
3841
+ field=models.ManyToManyField(related_name="groups", to="directory.entry", verbose_name="Members"),
3842
+ ),
3843
+ migrations.DeleteModel(
3844
+ name="AddressContact",
3845
+ ),
3846
+ migrations.DeleteModel(
3847
+ name="BankingContact",
3848
+ ),
3849
+ migrations.DeleteModel(
3850
+ name="CalendarItem",
3851
+ ),
3852
+ migrations.DeleteModel(
3853
+ name="ClientManagerRelationship",
3854
+ ),
3855
+ migrations.DeleteModel(
3856
+ name="Company",
3857
+ ),
3858
+ migrations.DeleteModel(
3859
+ name="CompanyType",
3860
+ ),
3861
+ migrations.DeleteModel(
3862
+ name="CustomerStatus",
3863
+ ),
3864
+ migrations.DeleteModel(
3865
+ name="EmailContact",
3866
+ ),
3867
+ migrations.DeleteModel(
3868
+ name="EmployerEmployeeRelationship",
3869
+ ),
3870
+ migrations.DeleteModel(
3871
+ name="Position",
3872
+ ),
3873
+ migrations.DeleteModel(
3874
+ name="Relationship",
3875
+ ),
3876
+ migrations.DeleteModel(
3877
+ name="RelationshipType",
3878
+ ),
3879
+ migrations.DeleteModel(
3880
+ name="SocialMediaContact",
3881
+ ),
3882
+ migrations.DeleteModel(
3883
+ name="Specialization",
3884
+ ),
3885
+ migrations.DeleteModel(
3886
+ name="TelephoneContact",
3887
+ ),
3888
+ migrations.DeleteModel(
3889
+ name="WebsiteContact",
3890
+ ),
3891
+ migrations.DeleteModel(
3892
+ name="Person",
3893
+ ),
3894
+ migrations.DeleteModel(
3895
+ name="Entry",
3896
+ ),
3897
+ migrations.CreateModel(
3898
+ name="ProductCompanyRelationship",
3899
+ fields=[
3900
+ ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
3901
+ (
3902
+ "company",
3903
+ models.ForeignKey(
3904
+ on_delete=django.db.models.deletion.CASCADE,
3905
+ related_name="product_company_relationships",
3906
+ to="directory.company",
3907
+ verbose_name="Company",
3908
+ ),
3909
+ ),
3910
+ (
3911
+ "product",
3912
+ models.ForeignKey(
3913
+ on_delete=django.db.models.deletion.CASCADE,
3914
+ related_name="product_company_relationships",
3915
+ to="wbcrm.product",
3916
+ verbose_name="Product",
3917
+ ),
3918
+ ),
3919
+ ],
3920
+ options={
3921
+ "verbose_name": "Company-Product Relationship",
3922
+ "verbose_name_plural": "Company-Product Relationships",
3923
+ },
3924
+ ),
3925
+ migrations.AddField(
3926
+ model_name="product",
3927
+ name="prospects",
3928
+ field=models.ManyToManyField(
3929
+ blank=True,
3930
+ help_text="The list of prospects",
3931
+ related_name="interested_products",
3932
+ through="wbcrm.ProductCompanyRelationship",
3933
+ to="directory.company",
3934
+ verbose_name="Prospects",
3935
+ ),
3936
+ ),
3937
+ migrations.AddConstraint(
3938
+ model_name="productcompanyrelationship",
3939
+ constraint=models.UniqueConstraint(
3940
+ fields=("product", "company"), name="unique_company_product_relationship"
3941
+ ),
3942
+ ),
3943
+ migrations.AddField(
3944
+ model_name="product",
3945
+ name="computed_str",
3946
+ field=models.CharField(blank=True, max_length=512, null=True, verbose_name="Name"),
3947
+ ),
3948
+ ]