@planning-inspectorate/data-model 2.53.0 → 2.55.0

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.
@@ -55,6 +55,7 @@ Preferred contact method
55
55
  | :-------- | :---------- |
56
56
  | `"email"` | |
57
57
  | `"post"` | |
58
+ | `null` | |
58
59
 
59
60
  ## writtenRepOrgName
60
61
 
@@ -420,6 +420,7 @@ Preferred contact method
420
420
  | :-------- | :---------- |
421
421
  | `"email"` | |
422
422
  | `"post"` | |
423
+ | `null` | |
423
424
 
424
425
  ### writtenRepOrgName
425
426
 
@@ -55,6 +55,7 @@ Source PK for Contact
55
55
  | :-------- | :---------- |
56
56
  | `"email"` | |
57
57
  | `"post"` | |
58
+ | `null` | |
58
59
 
59
60
  ## writtenRepOrgName
60
61
 
@@ -285,6 +285,7 @@ How we received the representation
285
285
  | `"Email"` | |
286
286
  | `"Post"` | |
287
287
  | `"In person"` | |
288
+ | `null` | |
288
289
 
289
290
  ## submissionMethodReason
290
291
 
@@ -367,6 +368,7 @@ When representation is on behalf of a person/org/group
367
368
  | `"A person"` | |
368
369
  | `"An organisation or charity I work or volunteer for"` | |
369
370
  | `"An organisation or charity I do not work or volunteer for"` | |
371
+ | `null` | |
370
372
 
371
373
  ## representedContact
372
374
 
@@ -412,6 +414,7 @@ When representation is on behalf of a person/org/group
412
414
  | :------------------- | :---------- |
413
415
  | `"Consultees"` | |
414
416
  | `"Interested party"` | |
417
+ | `null` | |
415
418
 
416
419
  ## wantsToBeHeard
417
420
 
@@ -535,6 +538,7 @@ Reason for the withdrawal
535
538
  | `"Mistaken Submission"` | |
536
539
  | `"Misunderstanding"` | |
537
540
  | `"Personal Reasons"` | |
541
+ | `null` | |
538
542
 
539
543
  ## dateWithdrawn
540
544
 
@@ -641,6 +645,7 @@ Source PK for Contact
641
645
  | :-------- | :---------- |
642
646
  | `"email"` | |
643
647
  | `"post"` | |
648
+ | `null` | |
644
649
 
645
650
  ### writtenRepOrgName
646
651
 
@@ -13,6 +13,7 @@
13
13
  | [projectDescription](#projectdescription) | `string` | Required | can be null | [NSIP Project](nsip-project-properties-projectdescription.md "nsip-project.schema.json#/properties/projectDescription") |
14
14
  | [projectDescriptionWelsh](#projectdescriptionwelsh) | `string` | Optional | can be null | [NSIP Project](nsip-project-properties-projectdescriptionwelsh.md "nsip-project.schema.json#/properties/projectDescriptionWelsh") |
15
15
  | [decision](#decision) | `string` | Required | can be null | [NSIP Project](nsip-project-properties-decision.md "nsip-project.schema.json#/properties/decision") |
16
+ | [dcoStatus](#dcostatus) | `string` | Optional | can be null | [NSIP Project](nsip-project-properties-dcostatus.md "nsip-project.schema.json#/properties/dcoStatus") |
16
17
  | [publishStatus](#publishstatus) | `string` | Required | can be null | [NSIP Project](nsip-project-properties-publishstatus.md "nsip-project.schema.json#/properties/publishStatus") |
17
18
  | [sector](#sector) | `string` | Required | can be null | [NSIP Project](nsip-project-properties-sector.md "nsip-project.schema.json#/properties/sector") |
18
19
  | [projectType](#projecttype) | `string` | Required | can be null | [NSIP Project](nsip-project-properties-projecttype.md "nsip-project.schema.json#/properties/projectType") |
@@ -305,6 +306,41 @@ Decision outcome: approved/refused/split-decision/granted/partially\_consented/q
305
306
  | `"withdrawn"` | |
306
307
  | `null` | |
307
308
 
309
+ ## dcoStatus
310
+
311
+ Decision outcome: approved/refused/split-decision/granted/partially\_consented/quashed/redetermination/withdrawn/revoked
312
+
313
+ `dcoStatus`
314
+
315
+ * is optional
316
+
317
+ * Type: `string`
318
+
319
+ * can be null
320
+
321
+ * defined in: [NSIP Project](nsip-project-properties-dcostatus.md "nsip-project.schema.json#/properties/dcoStatus")
322
+
323
+ ### dcoStatus Type
324
+
325
+ `string`
326
+
327
+ ### dcoStatus Constraints
328
+
329
+ **enum**: the value of this property must be equal to one of the following values:
330
+
331
+ | Value | Explanation |
332
+ | :---------------------- | :---------- |
333
+ | `"approved"` | |
334
+ | `"refused"` | |
335
+ | `"split-decision"` | |
336
+ | `"granted"` | |
337
+ | `"partially_consented"` | |
338
+ | `"quashed"` | |
339
+ | `"redetermination"` | |
340
+ | `"withdrawn"` | |
341
+ | `"revoked"` | |
342
+ | `null` | |
343
+
308
344
  ## publishStatus
309
345
 
310
346
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@planning-inspectorate/data-model",
3
- "version": "2.53.0",
3
+ "version": "2.55.0",
4
4
  "description": "JSON Schemas for the Planning Inspectorate's Data Model",
5
5
  "main": "src/index.js",
6
6
  "type": "module",
@@ -0,0 +1,525 @@
1
+ # generated by datamodel-codegen:
2
+ # filename: applications-crowndev-application.schema.json
3
+
4
+ from __future__ import annotations
5
+
6
+ from enum import Enum, StrEnum
7
+
8
+ from pydantic import AwareDatetime, BaseModel, ConfigDict, Field
9
+
10
+
11
+ class Type(StrEnum):
12
+ """
13
+ Type of application. Name displayed to users
14
+ """
15
+
16
+ Planning_permission = "Planning permission"
17
+ Outline_planning_permission_with_some_matters_reserved = (
18
+ "Outline planning permission with some matters reserved"
19
+ )
20
+ Outline_planning_permission_with_all_matters_reserved = (
21
+ "Outline planning permission with all matters reserved"
22
+ )
23
+ Approval_of_reserved_matters_following_outline_approval = (
24
+ "Approval of reserved matters following outline approval"
25
+ )
26
+ Planning_permission_and_listed_building_consent__LBC__for_alterations__extension_or_demolition_of_a_listed_building = "Planning permission and listed building consent (LBC) for alterations, extension or demolition of a listed building"
27
+
28
+
29
+ class SubType(Enum):
30
+ """
31
+ SubType applies to Planning permissions and LBC
32
+ """
33
+
34
+ Planning_permission = "Planning permission"
35
+ Listed_building_consent__LBC_ = "Listed building consent (LBC)"
36
+ NoneType_None = None
37
+
38
+
39
+ class ApplicationStatus(StrEnum):
40
+ """
41
+ Current status of the case (enum)
42
+ """
43
+
44
+ New = "New"
45
+ Accepted = "Accepted"
46
+ Invalid = "Invalid"
47
+ Consultation_period_open = "Consultation period open"
48
+ Hearing_Inquiry_date_set = "Hearing/Inquiry date set"
49
+ Application_on_hold_awaiting_further_information = (
50
+ "Application on hold awaiting further information"
51
+ )
52
+ Report_awaited = "Report awaited"
53
+ Report_sent_to_Decision_Branch = "Report sent to Decision Branch"
54
+ Decision_awaited = "Decision awaited"
55
+ Decided = "Decided"
56
+ Withdrawn = "Withdrawn"
57
+ Declined_to_determine = "Declined to determine"
58
+ Closed___invalid = "Closed - invalid"
59
+ Closed___opened_in_error = "Closed - opened in error"
60
+
61
+
62
+ class ApplicationStage(Enum):
63
+ """
64
+ Current stage of the case (enum)
65
+ """
66
+
67
+ Accepted = "Accepted"
68
+ Consultation = "Consultation"
69
+ Procedure_choice = "Procedure choice"
70
+ Written_representations = "Written representations"
71
+ Inquiry = "Inquiry"
72
+ Hearing_Inquiry_date_set = "Hearing/Inquiry date set"
73
+ Final_decision = "Final decision"
74
+ NoneType_None = None
75
+
76
+
77
+ class Category(Enum):
78
+ """
79
+ Application category (enum)
80
+ """
81
+
82
+ Major_Development = "Major Development"
83
+ Buildings_over_1000_square_metres = "Buildings over 1000 square metres"
84
+ Development_of_a_site_above_1_hectare = "Development of a site above 1 hectare"
85
+ Dwellings_numbering_10_or_more = "Dwellings numbering 10 or more"
86
+ Dwellings_of_0_5_hectare_or_more = "Dwellings of 0.5 hectare or more"
87
+ Minerals = "Minerals"
88
+ Waste = "Waste"
89
+ Non_Major_Development = "Non-Major Development"
90
+ Buildings_less_than_1000_square_metres = "Buildings less than 1000 square metres"
91
+ Development_of_a_site_less_than_1_hectare = (
92
+ "Development of a site less than 1 hectare"
93
+ )
94
+ Dwellings_numbering_between_1_and_9 = "Dwellings numbering between 1 and 9"
95
+ Dwellings_of_less_than_0_5_hectare = "Dwellings of less than 0.5 hectare"
96
+ Change_of_use = "Change of use"
97
+ Relevant_demolition = "Relevant demolition"
98
+ Other = "Other"
99
+ Listed_building_consent_to_alter_extend = "Listed building consent to alter/extend"
100
+ Listed_building_consent_to_demolish = "Listed building consent to demolish"
101
+ NoneType_None = None
102
+
103
+
104
+ class DecisionOutcome(Enum):
105
+ """
106
+ As displayed to users
107
+ """
108
+
109
+ Approved = "Approved"
110
+ Approved_with_conditions = "Approved with conditions"
111
+ Refused = "Refused"
112
+ Withdrawn = "Withdrawn"
113
+ NoneType_None = None
114
+
115
+
116
+ class EiaScreeningOutcome(Enum):
117
+ """
118
+ What was the outcome of the Environmental Impact Assessment
119
+ """
120
+
121
+ required = "required"
122
+ not_required = "not required"
123
+ NoneType_None = None
124
+
125
+
126
+ class Procedure(Enum):
127
+ """
128
+ Name displayed to users
129
+ """
130
+
131
+ Written_Representations = "Written Representations"
132
+ Hearing = "Hearing"
133
+ Inquiry = "Inquiry"
134
+ NoneType_None = None
135
+
136
+
137
+ class ContactRoleType(StrEnum):
138
+ """
139
+ Agent or Applicant details
140
+ """
141
+
142
+ agent = "agent"
143
+ applicant = "applicant"
144
+
145
+
146
+ class ContactPreference(Enum):
147
+ email = "email"
148
+ post = "post"
149
+ NoneType_None = None
150
+
151
+
152
+ class Contact(BaseModel):
153
+ model_config = ConfigDict(
154
+ extra="allow",
155
+ )
156
+ contactId: str = Field(..., examples=["AAAAAAAA-1234-1234-1234-AAAAAAAAAAAA"])
157
+ """
158
+ Source PK for Contact
159
+ """
160
+ contactPreference: ContactPreference | None = Field(None, examples=["email"])
161
+ writtenRepOrgName: str | None = None
162
+ """
163
+ Organisation Name used for written-representation on behalf of an organisation
164
+ """
165
+ writtenRepJobTitleorRole: str | None = None
166
+ """
167
+ Job Title or Role used for written-representation on behalf of an organisation
168
+ """
169
+
170
+
171
+ class Address(BaseModel):
172
+ model_config = ConfigDict(
173
+ extra="allow",
174
+ )
175
+ line1: str | None = None
176
+ line2: str | None = None
177
+ townCity: str | None = None
178
+ county: str | None = None
179
+ postcode: str
180
+
181
+
182
+ class Organisation(BaseModel):
183
+ model_config = ConfigDict(
184
+ extra="allow",
185
+ )
186
+ contactRoleType: ContactRoleType = Field(..., examples=["agent"])
187
+ """
188
+ Agent or Applicant details
189
+ """
190
+ organisationId: str = Field(..., examples=["AAAAAAAA-1234-1234-1234-AAAAAAAAAAAA"])
191
+ """
192
+ Source PK for Organisation
193
+ """
194
+ organisationName: str | None = None
195
+ organisationAddress: list[Address] | None = None
196
+ contacts: list[Contact] | None = None
197
+ """
198
+ An Organisation may be linked to one or more Contacts
199
+ """
200
+
201
+
202
+ class CrownDevelopmentApplication(BaseModel):
203
+ """
204
+ Main application details for Crown Development Project
205
+ """
206
+
207
+ model_config = ConfigDict(
208
+ extra="allow",
209
+ )
210
+ id: str = Field(..., examples=["AAAAAAAA-1234-1234-1234-AAAAAAAAAAAA"])
211
+ """
212
+ Internal Identifier UUID
213
+ """
214
+ reference: str = Field(..., examples=["CROWN/2025/12345"])
215
+ """
216
+ External Identifier: CROWN/YYYY/XXXXXXX
217
+ """
218
+ createdDate: AwareDatetime
219
+ """
220
+ Date the case was created
221
+ """
222
+ updatedDate: AwareDatetime | None = None
223
+ """
224
+ Date the case was updated
225
+ """
226
+ type: Type = Field(
227
+ ..., examples=["Outline planning permission with some matters reserved"]
228
+ )
229
+ """
230
+ Type of application. Name displayed to users
231
+ """
232
+ subType: SubType | None = Field(None, examples=["Listed building consent (LBC)"])
233
+ """
234
+ SubType applies to Planning permissions and LBC
235
+ """
236
+ linkedParentId: str | None = Field(
237
+ None, examples=["AAAAAAAA-1234-1234-1234-AAAAAAAAAAAA"]
238
+ )
239
+ """
240
+ Self-referencial for parent to children relationship
241
+ """
242
+ description: str | None = None
243
+ """
244
+ Description of the project
245
+ """
246
+ primaryLPACode: str | None = Field(None, examples=["Z0116"])
247
+ """
248
+ Primary Planning Body code
249
+ """
250
+ secondaryLPACode: str | None = Field(None, examples=["Z0116"])
251
+ """
252
+ Secondary LPAs when project overlaps authorities
253
+ """
254
+ hasAgent: bool
255
+ """
256
+ Is an agent assigned to the case on behalf of the applicant
257
+ """
258
+ organisations: list[Organisation] | None = None
259
+ """
260
+ Applications can have one or more organisaitons associated with them.
261
+ """
262
+ siteAddress: list[Address] | None = None
263
+ """
264
+ Site Address details
265
+ """
266
+ siteEasting: str | None = Field(None, examples=["216600"])
267
+ """
268
+ Easting of the site, if known
269
+ """
270
+ siteNorthing: str | None = Field(None, examples=["771200"])
271
+ """
272
+ Northing of the site, if known
273
+ """
274
+ siteArea: float | None = Field(None, examples=[4.44])
275
+ """
276
+ Site area in hectares
277
+ """
278
+ expectedDateOfSubmission: AwareDatetime | None = None
279
+ """
280
+ Date case officer expects the application to be submitted (NB: cases are created before document submissions as applicants upload directly)
281
+ """
282
+ applicationStatus: ApplicationStatus | None = None
283
+ """
284
+ Current status of the case (enum)
285
+ """
286
+ applicationStage: ApplicationStage | None = None
287
+ """
288
+ Current stage of the case (enum)
289
+ """
290
+ nationallyImportant: bool | None = None
291
+ """
292
+ Site is nationally important (Yes/No)
293
+ """
294
+ nationallyImportantConfirmationDate: AwareDatetime | None = None
295
+ """
296
+ Date the application's national importance was confirmed
297
+ """
298
+ notNationallyImportantEmailSent: bool | None = None
299
+ """
300
+ Flags if a notNationallyImportant email has been sent
301
+ """
302
+ containsDistressingContent: bool | None = None
303
+ """
304
+ Highlights the cases as containing distressing content
305
+ """
306
+ lpaReference: str | None = None
307
+ """
308
+ LPA cross reference. Reference number for the case as known by the Local Planning Authority (LPA)
309
+ """
310
+ category: Category | None = None
311
+ """
312
+ Application category (enum)
313
+ """
314
+ isGreenBelt: bool | None = None
315
+ """
316
+ Is the site in green belt land
317
+ """
318
+ healthAndSafetyIssue: bool | None = None
319
+ """
320
+ Does the Site has H&S Issue
321
+ """
322
+ applicationReceivedDate: AwareDatetime | None = None
323
+ """
324
+ Date the application was received
325
+ """
326
+ applicationReceivedDateEmailSent: bool | None = None
327
+ """
328
+ Flags if an applicationReceived email has been sent
329
+ """
330
+ applicationAcceptedDate: AwareDatetime | None = None
331
+ """
332
+ Date the application was accepted
333
+ """
334
+ lpaQuestionnaireSentDate: AwareDatetime | None = None
335
+ """
336
+ Date the lpa questionnaire was sent
337
+ """
338
+ lpaQuestionnaireReceivedDate: AwareDatetime | None = None
339
+ """
340
+ Date the lpa questionnaire was received
341
+ """
342
+ lpaQuestionnaireReceivedEmailSent: bool | None = None
343
+ """
344
+ Flags if an lpaQuestionnaireReceived email has been sent
345
+ """
346
+ publishDate: AwareDatetime | None = None
347
+ """
348
+ Date the application was published to the portal
349
+ """
350
+ pressNoticeDate: AwareDatetime | None = None
351
+ """
352
+ Date the press notice was published
353
+ """
354
+ neighboursNotifiedByLpaDate: AwareDatetime | None = None
355
+ """
356
+ Date the neighbours were notified by the LPA
357
+ """
358
+ siteNoticeByLpaDate: AwareDatetime | None = None
359
+ """
360
+ Date the site notice was erected by the LPA
361
+ """
362
+ targetDecisionDate: AwareDatetime | None = None
363
+ """
364
+ Date the application should be decided by
365
+ """
366
+ extendedTargetDecisionDate: AwareDatetime | None = None
367
+ """
368
+ Extended date by which the application should be decided
369
+ """
370
+ recoveredDate: AwareDatetime | None = None
371
+ """
372
+ Date the application was recovered by the Secretary of State
373
+ """
374
+ recoveredReportSentDate: AwareDatetime | None = None
375
+ """
376
+ Date the Inspector's report was sent to the Secretary of State
377
+ """
378
+ withdrawnDate: AwareDatetime | None = None
379
+ """
380
+ Date application was withdrawn
381
+ """
382
+ decisionDate: AwareDatetime | None = None
383
+ """
384
+ Date the application was decided on
385
+ """
386
+ originalDecisionDate: AwareDatetime | None = None
387
+ """
388
+ Date of the original decision if later quashed
389
+ """
390
+ decisionOutcome: DecisionOutcome | None = None
391
+ """
392
+ As displayed to users
393
+ """
394
+ turnedAwayDate: AwareDatetime | None = None
395
+ """
396
+ Date application was turned away
397
+ """
398
+ representationsPublishDate: AwareDatetime | None = None
399
+ """
400
+ Date the representations was publish
401
+ """
402
+ representationsPeriodStartDate: AwareDatetime | None = None
403
+ """
404
+ Start date of the representation period (starts at 00:00)
405
+ """
406
+ representationsPeriodEndDate: AwareDatetime | None = None
407
+ """
408
+ End date of the representation period (ends at 23:59)
409
+ """
410
+ inspector1Id: str | None = None
411
+ """
412
+ EntraID for Inspector
413
+ """
414
+ inspector2Id: str | None = None
415
+ """
416
+ EntraID for Inspector
417
+ """
418
+ inspector3Id: str | None = None
419
+ """
420
+ EntraID for Inspector
421
+ """
422
+ assessorInspectorId: str | None = None
423
+ """
424
+ EntraID for Assessor
425
+ """
426
+ caseOfficerId: str | None = None
427
+ """
428
+ EntraID for Case Officer
429
+ """
430
+ planningOfficerId: str | None = None
431
+ """
432
+ EntraID for Planning Officer
433
+ """
434
+ eiaScreening: bool | None = None
435
+ """
436
+ Does the application need an Environmental Impact Assessment
437
+ """
438
+ eiaScreeningOutcome: EiaScreeningOutcome | None = None
439
+ """
440
+ What was the outcome of the Environmental Impact Assessment
441
+ """
442
+ environmentalStatementReceivedDate: AwareDatetime | None = None
443
+ """
444
+ Date the environmental statement was received
445
+ """
446
+ siteIsVisibleFromPublicLand: bool | None = None
447
+ """
448
+ Site is visible from public land (Yes/No or TRUE/FALSE tbc)
449
+ """
450
+ procedure: Procedure | None = None
451
+ """
452
+ Name displayed to users
453
+ """
454
+ procedureNotificationDate: AwareDatetime | None = None
455
+ eventDate: AwareDatetime | None = None
456
+ eventPrepDuration: float | None = Field(None, examples=[1234.56])
457
+ eventSittingDuration: float | None = Field(None, examples=[1234.56])
458
+ eventReportingDuration: float | None = Field(None, examples=[1234.56])
459
+ eventVenue: str | None = None
460
+ eventNotificationDate: AwareDatetime | None = None
461
+ eventIssuesReportPublishedDate: AwareDatetime | None = None
462
+ eventStatementsDate: AwareDatetime | None = None
463
+ eventCaseManagementConferenceDate: AwareDatetime | None = None
464
+ eventPreMeetingDate: AwareDatetime | None = None
465
+ eventProofsOfEvidenceDate: AwareDatetime | None = None
466
+ hasApplicationFee: bool | None = None
467
+ """
468
+ Application has associated Fee (Yes/No or TRUE/FALSE tbc)
469
+ """
470
+ applicationFee: float | None = None
471
+ """
472
+ The amount to be payed by the Applicant
473
+ """
474
+ applicationFeeReceivedDate: AwareDatetime | None = None
475
+ """
476
+ Date the application fee was received
477
+ """
478
+ eligibleForFeeRefund: bool | None = None
479
+ """
480
+ Is the applicant eligible for a refund on the fee
481
+ """
482
+ applicationFeeRefundAmount: float | None = None
483
+ """
484
+ The amount to be refunded to the Applicant
485
+ """
486
+ applicationFeeRefundDate: AwareDatetime | None = None
487
+ """
488
+ Date the application fee was refunded
489
+ """
490
+ siteVisitDate: AwareDatetime | None = None
491
+ """
492
+ Date the site was/is going to be visited by the inspector
493
+ """
494
+ cilLiable: bool | None = None
495
+ """
496
+ Is the application liable for a community infrastructure levy
497
+ """
498
+ cilAmount: float | None = None
499
+ """
500
+ The amount for the community infrastructure levy
501
+ """
502
+ bngExempt: bool | None = None
503
+ """
504
+ Is the site exempt from the Biodiversity Net Gain
505
+ """
506
+ hasCostsApplications: bool | None = None
507
+ """
508
+ If a party is making a cost claim against another for unreasonable behaviour
509
+ """
510
+ costsApplicationsComment: str | None = None
511
+ """
512
+ Details about the cost application
513
+ """
514
+ environmentalImpactAssessment: bool | None = None
515
+ """
516
+ Does the application have an Environmental Impact Assessment - used for context in emails to LPAs
517
+ """
518
+ developmentPlan: bool | None = None
519
+ """
520
+ Is the application a standard development plan - used for context in emails to LPAs
521
+ """
522
+ rightOfWay: bool | None = None
523
+ """
524
+ Does the application apply to rights of way - used for context in emails to LPAs
525
+ """
@@ -27,6 +27,7 @@ class ContactPreference(Enum):
27
27
 
28
28
  email = "email"
29
29
  post = "post"
30
+ NoneType_None = None
30
31
 
31
32
 
32
33
  class Contact(BaseModel):
@@ -32,6 +32,7 @@ class SubmittedReceivedMethod(Enum):
32
32
  Email = "Email"
33
33
  Post = "Post"
34
34
  In_person = "In person"
35
+ NoneType_None = None
35
36
 
36
37
 
37
38
  class RepresentedType(Enum):
@@ -46,11 +47,13 @@ class RepresentedType(Enum):
46
47
  An_organisation_or_charity_I_do_not_work_or_volunteer_for = (
47
48
  "An organisation or charity I do not work or volunteer for"
48
49
  )
50
+ NoneType_None = None
49
51
 
50
52
 
51
53
  class RepresentedCategory(Enum):
52
54
  Consultees = "Consultees"
53
55
  Interested_party = "Interested party"
56
+ NoneType_None = None
54
57
 
55
58
 
56
59
  class WithdrawalReason(Enum):
@@ -62,11 +65,13 @@ class WithdrawalReason(Enum):
62
65
  Mistaken_Submission = "Mistaken Submission"
63
66
  Misunderstanding = "Misunderstanding"
64
67
  Personal_Reasons = "Personal Reasons"
68
+ NoneType_None = None
65
69
 
66
70
 
67
71
  class ContactPreference(Enum):
68
72
  email = "email"
69
73
  post = "post"
74
+ NoneType_None = None
70
75
 
71
76
 
72
77
  class Contact(BaseModel):