@planning-inspectorate/data-model 1.16.1 → 1.17.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.
- package/docs/README.md +2 -2
- package/docs/appeal-has.md +764 -86
- package/docs/appeal-s78.md +55 -133
- package/package.json +1 -1
- package/pins_data_model/models/model_appeal_has.py +647 -8
- package/pins_data_model/models/model_appeal_s78.py +604 -10
- package/schemas/appeal-has.schema.json +161 -9
- package/schemas/appeal-s78.schema.json +81 -125
- package/src/lib/gen-docs.js +4 -2
- package/src/schemas.d.ts +165 -18
- package/tests/appeals/appeal-has.test.js +243 -0
- package/tests/appeals/appeal-s78.test.js +227 -0
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
# generated by datamodel-codegen:
|
|
2
2
|
# filename: appeal-has.schema.json
|
|
3
|
-
# timestamp: 2025-
|
|
3
|
+
# timestamp: 2025-09-09T11:38:23+00:00
|
|
4
4
|
|
|
5
5
|
from __future__ import annotations
|
|
6
6
|
|
|
7
7
|
from enum import Enum
|
|
8
8
|
from uuid import UUID
|
|
9
9
|
|
|
10
|
-
from pydantic import AwareDatetime, BaseModel, ConfigDict, Field, RootModel
|
|
10
|
+
from pydantic import AwareDatetime, BaseModel, ConfigDict, Field, RootModel, constr
|
|
11
11
|
|
|
12
12
|
|
|
13
13
|
class CaseStatus(Enum):
|
|
@@ -142,6 +142,17 @@ class ApplicationDecision(Enum):
|
|
|
142
142
|
not_received = "not_received"
|
|
143
143
|
|
|
144
144
|
|
|
145
|
+
class LpaProcedurePreference(Enum):
|
|
146
|
+
"""
|
|
147
|
+
The procedure preference indicated by the LPA
|
|
148
|
+
"""
|
|
149
|
+
|
|
150
|
+
written = "written"
|
|
151
|
+
hearing = "hearing"
|
|
152
|
+
inquiry = "inquiry"
|
|
153
|
+
NoneType_None = None
|
|
154
|
+
|
|
155
|
+
|
|
145
156
|
class KnowsOtherOwners(Enum):
|
|
146
157
|
"""
|
|
147
158
|
Indicates if the appellant knows other owners of the site
|
|
@@ -225,9 +236,9 @@ class TypeOfPlanningApplication(Enum):
|
|
|
225
236
|
NoneType_None = None
|
|
226
237
|
|
|
227
238
|
|
|
228
|
-
class
|
|
239
|
+
class AppealHasCase1(BaseModel):
|
|
229
240
|
"""
|
|
230
|
-
Schema defining the metadata for an appeal
|
|
241
|
+
Group A - Schema defining the metadata for an appeal
|
|
231
242
|
"""
|
|
232
243
|
|
|
233
244
|
model_config = ConfigDict(
|
|
@@ -466,7 +477,7 @@ class AppealHasCase(BaseModel):
|
|
|
466
477
|
"""
|
|
467
478
|
The statutory deadline for submitting an appeal from the original LPA decision date
|
|
468
479
|
"""
|
|
469
|
-
siteAddressLine1: str = Field(
|
|
480
|
+
siteAddressLine1: str | None = Field(None, examples=["96 The Avenue"])
|
|
470
481
|
"""
|
|
471
482
|
First line of address for the appeal site
|
|
472
483
|
"""
|
|
@@ -474,15 +485,15 @@ class AppealHasCase(BaseModel):
|
|
|
474
485
|
"""
|
|
475
486
|
Second line of address for the appeal site
|
|
476
487
|
"""
|
|
477
|
-
siteAddressTown: str = Field(
|
|
488
|
+
siteAddressTown: str | None = Field(None, examples=["Maidstone"])
|
|
478
489
|
"""
|
|
479
490
|
Town / City of the site address
|
|
480
491
|
"""
|
|
481
|
-
siteAddressCounty: str | None = Field(
|
|
492
|
+
siteAddressCounty: str | None = Field(None, examples=["Kent"])
|
|
482
493
|
"""
|
|
483
494
|
County of the site address
|
|
484
495
|
"""
|
|
485
|
-
siteAddressPostcode: str = Field(
|
|
496
|
+
siteAddressPostcode: str | None = Field(None, examples=["MD21 5XY"])
|
|
486
497
|
"""
|
|
487
498
|
Postal code of the site address
|
|
488
499
|
"""
|
|
@@ -514,6 +525,104 @@ class AppealHasCase(BaseModel):
|
|
|
514
525
|
"""
|
|
515
526
|
Indicates if the site is in a conservation area
|
|
516
527
|
"""
|
|
528
|
+
affectsScheduledMonument: bool | None = None
|
|
529
|
+
"""
|
|
530
|
+
Indicates if the development affects a scheduled monument
|
|
531
|
+
"""
|
|
532
|
+
hasProtectedSpecies: bool | None = None
|
|
533
|
+
"""
|
|
534
|
+
Indicates if the site hosts protected species
|
|
535
|
+
"""
|
|
536
|
+
isAonbNationalLandscape: bool | None = None
|
|
537
|
+
"""
|
|
538
|
+
Indicates an area of outstanding beauty (National Landscape)
|
|
539
|
+
"""
|
|
540
|
+
isSiteOnHighwayLand: bool | None = None
|
|
541
|
+
"""
|
|
542
|
+
Indicates if site is on highway land
|
|
543
|
+
"""
|
|
544
|
+
designatedSitesNames: list[str] | None = None
|
|
545
|
+
"""
|
|
546
|
+
The designated site names
|
|
547
|
+
"""
|
|
548
|
+
hasInfrastructureLevy: bool | None = None
|
|
549
|
+
"""
|
|
550
|
+
Indicates the existence of an infrastructure levy
|
|
551
|
+
"""
|
|
552
|
+
isInfrastructureLevyFormallyAdopted: bool | None = None
|
|
553
|
+
"""
|
|
554
|
+
Indicates if the infrastructure levy is formally adopted
|
|
555
|
+
"""
|
|
556
|
+
infrastructureLevyAdoptedDate: AwareDatetime | None = Field(
|
|
557
|
+
None, examples=["2023-07-27T20:30:00.000Z"]
|
|
558
|
+
)
|
|
559
|
+
"""
|
|
560
|
+
The date of the infrastructure levy adoption
|
|
561
|
+
"""
|
|
562
|
+
infrastructureLevyExpectedDate: AwareDatetime | None = Field(
|
|
563
|
+
None, examples=["2023-07-27T20:30:00.000Z"]
|
|
564
|
+
)
|
|
565
|
+
"""
|
|
566
|
+
The expected date of the infrastructure levy
|
|
567
|
+
"""
|
|
568
|
+
lpaProcedurePreference: LpaProcedurePreference | None = None
|
|
569
|
+
"""
|
|
570
|
+
The procedure preference indicated by the LPA
|
|
571
|
+
"""
|
|
572
|
+
lpaProcedurePreferenceDetails: str | None = None
|
|
573
|
+
"""
|
|
574
|
+
The procedure details preference indicated by the LPA
|
|
575
|
+
"""
|
|
576
|
+
lpaProcedurePreferenceDuration: float | None = None
|
|
577
|
+
"""
|
|
578
|
+
The duration of enquiry indicated by the LPA
|
|
579
|
+
"""
|
|
580
|
+
caseworkReason: str | None = None
|
|
581
|
+
"""
|
|
582
|
+
TBC
|
|
583
|
+
"""
|
|
584
|
+
importantInformation: str | None = None
|
|
585
|
+
"""
|
|
586
|
+
Information relevant to case...
|
|
587
|
+
"""
|
|
588
|
+
jurisdiction: str | None = None
|
|
589
|
+
"""
|
|
590
|
+
Under whose jurisdiction the decision falls
|
|
591
|
+
"""
|
|
592
|
+
redeterminedIndicator: bool | None = None
|
|
593
|
+
"""
|
|
594
|
+
Has the case been selected for redetermination
|
|
595
|
+
"""
|
|
596
|
+
dateCostsReportDespatched: AwareDatetime | None = Field(
|
|
597
|
+
None, examples=["2023-07-27T20:30:00.000Z"]
|
|
598
|
+
)
|
|
599
|
+
"""
|
|
600
|
+
The date that the costs report was sent
|
|
601
|
+
"""
|
|
602
|
+
dateNotRecoveredOrDerecovered: AwareDatetime | None = Field(
|
|
603
|
+
None, examples=["2023-07-27T20:30:00.000Z"]
|
|
604
|
+
)
|
|
605
|
+
"""
|
|
606
|
+
The date that is TBC
|
|
607
|
+
"""
|
|
608
|
+
dateRecovered: AwareDatetime | None = Field(
|
|
609
|
+
None, examples=["2023-07-27T20:30:00.000Z"]
|
|
610
|
+
)
|
|
611
|
+
"""
|
|
612
|
+
The date that case was recovered
|
|
613
|
+
"""
|
|
614
|
+
originalCaseDecisionDate: AwareDatetime | None = Field(
|
|
615
|
+
None, examples=["2023-07-27T20:30:00.000Z"]
|
|
616
|
+
)
|
|
617
|
+
"""
|
|
618
|
+
The original case decision date
|
|
619
|
+
"""
|
|
620
|
+
targetDate: AwareDatetime | None = Field(
|
|
621
|
+
None, examples=["2023-07-27T20:30:00.000Z"]
|
|
622
|
+
)
|
|
623
|
+
"""
|
|
624
|
+
The target date for case completion
|
|
625
|
+
"""
|
|
517
626
|
ownsAllLand: bool | None = None
|
|
518
627
|
"""
|
|
519
628
|
Indicates if the appellant has complete ownership of the site
|
|
@@ -584,3 +693,533 @@ class AppealHasCase(BaseModel):
|
|
|
584
693
|
Indicates if the appellant has applied for costs
|
|
585
694
|
"""
|
|
586
695
|
typeOfPlanningApplication: TypeOfPlanningApplication | None = None
|
|
696
|
+
siteGridReferenceEasting: constr(pattern=r"^\d{6}$") | None = Field(
|
|
697
|
+
..., examples=["357144"]
|
|
698
|
+
)
|
|
699
|
+
siteGridReferenceNorthing: constr(pattern=r"^\d{6}$") | None = Field(
|
|
700
|
+
..., examples=["400534"]
|
|
701
|
+
)
|
|
702
|
+
hasLandownersPermission: bool | None = None
|
|
703
|
+
"""
|
|
704
|
+
Indicates if the appellant has land owners permission
|
|
705
|
+
"""
|
|
706
|
+
isAdvertInPosition: bool | None = None
|
|
707
|
+
"""
|
|
708
|
+
Indicates if the advert is already in position
|
|
709
|
+
"""
|
|
710
|
+
isSiteInAreaOfSpecialControlAdverts: bool | None = None
|
|
711
|
+
"""
|
|
712
|
+
Indicates if the site is in an area of special control for adverts
|
|
713
|
+
"""
|
|
714
|
+
wasApplicationRefusedDueToHighwayOrTraffic: bool | None = None
|
|
715
|
+
"""
|
|
716
|
+
Indicates if the application was refused because of highway or traffic public safety?
|
|
717
|
+
"""
|
|
718
|
+
didAppellantSubmitCompletePhotosAndPlans: bool | None = None
|
|
719
|
+
"""
|
|
720
|
+
Indicates if the appellant submitted complete and accurate photographs and plans
|
|
721
|
+
"""
|
|
722
|
+
advertType: str | None = None
|
|
723
|
+
|
|
724
|
+
|
|
725
|
+
class NotificationMethodEnum1EnumEnum(Enum):
|
|
726
|
+
notice = "notice"
|
|
727
|
+
letter = "letter"
|
|
728
|
+
advert = "advert"
|
|
729
|
+
|
|
730
|
+
|
|
731
|
+
class NotificationMethodEnum1(RootModel[NotificationMethodEnum1EnumEnum | None]):
|
|
732
|
+
root: NotificationMethodEnum1EnumEnum | None = None
|
|
733
|
+
|
|
734
|
+
|
|
735
|
+
class AppealHasCase2(BaseModel):
|
|
736
|
+
"""
|
|
737
|
+
Group A - Schema defining the metadata for an appeal
|
|
738
|
+
"""
|
|
739
|
+
|
|
740
|
+
model_config = ConfigDict(
|
|
741
|
+
extra="allow",
|
|
742
|
+
)
|
|
743
|
+
caseId: int | None = Field(..., examples=[1200])
|
|
744
|
+
"""
|
|
745
|
+
Internal case identifier
|
|
746
|
+
"""
|
|
747
|
+
caseReference: str = Field(..., examples=["7002471"])
|
|
748
|
+
"""
|
|
749
|
+
External case identifier
|
|
750
|
+
"""
|
|
751
|
+
submissionId: UUID | None = Field(
|
|
752
|
+
None, examples=["7f45748c-2342-4b59-b934-ad6183e8d834"]
|
|
753
|
+
)
|
|
754
|
+
"""
|
|
755
|
+
Case submission id - link to draft submission created by appellant
|
|
756
|
+
"""
|
|
757
|
+
caseStatus: CaseStatus
|
|
758
|
+
"""
|
|
759
|
+
The processing status for the appeal
|
|
760
|
+
"""
|
|
761
|
+
caseType: CaseType
|
|
762
|
+
"""
|
|
763
|
+
The internal code for an appeal type, e.g. D (Householder)
|
|
764
|
+
"""
|
|
765
|
+
caseProcedure: CaseProcedure
|
|
766
|
+
"""
|
|
767
|
+
The type of procedure for the appeal
|
|
768
|
+
"""
|
|
769
|
+
lpaCode: str = Field(..., examples=["Q9999"])
|
|
770
|
+
"""
|
|
771
|
+
A unique identifier for the Local Planning Authority
|
|
772
|
+
"""
|
|
773
|
+
caseOfficerId: str | None = None
|
|
774
|
+
"""
|
|
775
|
+
Unique identifier for the case officer assigned to the case
|
|
776
|
+
"""
|
|
777
|
+
inspectorId: str | None = None
|
|
778
|
+
"""
|
|
779
|
+
Unique identifier for the inspector assigned to the case
|
|
780
|
+
"""
|
|
781
|
+
allocationLevel: AllocationLevel
|
|
782
|
+
"""
|
|
783
|
+
A level used for allocation purposes
|
|
784
|
+
"""
|
|
785
|
+
allocationBand: AllocationBand
|
|
786
|
+
"""
|
|
787
|
+
A band used for allocation purposes
|
|
788
|
+
"""
|
|
789
|
+
caseSpecialisms: list[str] = Field(
|
|
790
|
+
...,
|
|
791
|
+
examples=[
|
|
792
|
+
"Access",
|
|
793
|
+
"Listed building and enforcement",
|
|
794
|
+
"Roads and traffics",
|
|
795
|
+
"Natural heritage",
|
|
796
|
+
"Schedule 1",
|
|
797
|
+
],
|
|
798
|
+
)
|
|
799
|
+
"""
|
|
800
|
+
A list of specialisms for allocation purposes
|
|
801
|
+
"""
|
|
802
|
+
caseSubmittedDate: AwareDatetime = Field(..., examples=["2023-07-27T20:30:00.000Z"])
|
|
803
|
+
"""
|
|
804
|
+
The date the appeal was submitted by the appellant
|
|
805
|
+
"""
|
|
806
|
+
caseCreatedDate: AwareDatetime = Field(..., examples=["2023-07-27T20:30:00.000Z"])
|
|
807
|
+
"""
|
|
808
|
+
The date the appeal was received
|
|
809
|
+
"""
|
|
810
|
+
caseUpdatedDate: AwareDatetime = Field(..., examples=["2023-07-27T20:30:00.000Z"])
|
|
811
|
+
"""
|
|
812
|
+
The date the appeal was last updated in the back-office
|
|
813
|
+
"""
|
|
814
|
+
caseValidDate: AwareDatetime | None = Field(
|
|
815
|
+
..., examples=["2023-07-27T20:30:00.000Z"]
|
|
816
|
+
)
|
|
817
|
+
"""
|
|
818
|
+
The date since when the appeal was considered valid
|
|
819
|
+
"""
|
|
820
|
+
caseValidationDate: AwareDatetime | None = Field(
|
|
821
|
+
..., examples=["2023-07-27T20:30:00.000Z"]
|
|
822
|
+
)
|
|
823
|
+
"""
|
|
824
|
+
The date the appeal was validated in the back-office
|
|
825
|
+
"""
|
|
826
|
+
caseValidationOutcome: CaseValidationOutcome
|
|
827
|
+
"""
|
|
828
|
+
The outcome of the validation action
|
|
829
|
+
"""
|
|
830
|
+
caseValidationInvalidDetails: list[str]
|
|
831
|
+
"""
|
|
832
|
+
A list of reasons why the appeal is invalid
|
|
833
|
+
"""
|
|
834
|
+
caseValidationIncompleteDetails: list[str]
|
|
835
|
+
"""
|
|
836
|
+
A list of reasons why the appeal is incomplete
|
|
837
|
+
"""
|
|
838
|
+
caseExtensionDate: AwareDatetime | None = Field(
|
|
839
|
+
..., examples=["2023-07-27T20:30:00.000Z"]
|
|
840
|
+
)
|
|
841
|
+
"""
|
|
842
|
+
When the validation outcome is incomplete, an extension may be granted to provide missing information
|
|
843
|
+
"""
|
|
844
|
+
caseStartedDate: AwareDatetime | None = Field(
|
|
845
|
+
..., examples=["2023-07-27T20:30:00.000Z"]
|
|
846
|
+
)
|
|
847
|
+
"""
|
|
848
|
+
A date indicating when the case was started, resulting in the creation of a timetable
|
|
849
|
+
"""
|
|
850
|
+
casePublishedDate: AwareDatetime | None = Field(
|
|
851
|
+
..., examples=["2023-07-27T20:30:00.000Z"]
|
|
852
|
+
)
|
|
853
|
+
"""
|
|
854
|
+
A date indicating when the case was published
|
|
855
|
+
"""
|
|
856
|
+
linkedCaseStatus: LinkedCaseStatus
|
|
857
|
+
"""
|
|
858
|
+
Indicates if the case is linked, and the type of relationship
|
|
859
|
+
"""
|
|
860
|
+
leadCaseReference: str | None = Field(..., examples=["7002471"])
|
|
861
|
+
"""
|
|
862
|
+
The reference of the lead case, if the case is a child case
|
|
863
|
+
"""
|
|
864
|
+
lpaQuestionnaireDueDate: AwareDatetime | None = Field(
|
|
865
|
+
..., examples=["2023-07-27T20:30:00.000Z"]
|
|
866
|
+
)
|
|
867
|
+
"""
|
|
868
|
+
If the case is started and has a timetable, a deadline for the LPA to provide a response
|
|
869
|
+
"""
|
|
870
|
+
lpaQuestionnaireSubmittedDate: AwareDatetime | None = Field(
|
|
871
|
+
..., examples=["2023-07-27T20:30:00.000Z"]
|
|
872
|
+
)
|
|
873
|
+
"""
|
|
874
|
+
The date the LPA provided a response to the case
|
|
875
|
+
"""
|
|
876
|
+
lpaQuestionnaireCreatedDate: AwareDatetime | None = Field(
|
|
877
|
+
..., examples=["2023-07-27T20:30:00.000Z"]
|
|
878
|
+
)
|
|
879
|
+
"""
|
|
880
|
+
The date the LPA response was receeived
|
|
881
|
+
"""
|
|
882
|
+
lpaQuestionnairePublishedDate: AwareDatetime | None = Field(
|
|
883
|
+
..., examples=["2023-07-27T20:30:00.000Z"]
|
|
884
|
+
)
|
|
885
|
+
"""
|
|
886
|
+
The date indicating when the questionnaire review was completed and the questionnaire published
|
|
887
|
+
"""
|
|
888
|
+
lpaQuestionnaireValidationOutcome: LpaQuestionnaireValidationOutcome
|
|
889
|
+
"""
|
|
890
|
+
The outcome of the validation action
|
|
891
|
+
"""
|
|
892
|
+
lpaQuestionnaireValidationOutcomeDate: AwareDatetime | None = Field(
|
|
893
|
+
..., examples=["2023-07-27T20:30:00.000Z"]
|
|
894
|
+
)
|
|
895
|
+
"""
|
|
896
|
+
The date the LPA response was validated
|
|
897
|
+
"""
|
|
898
|
+
lpaQuestionnaireValidationDetails: list[str]
|
|
899
|
+
"""
|
|
900
|
+
A list of reasons why the questionnaire is incomplete
|
|
901
|
+
"""
|
|
902
|
+
lpaStatement: str | None = Field(
|
|
903
|
+
..., examples=["We refused the application because of ..."]
|
|
904
|
+
)
|
|
905
|
+
"""
|
|
906
|
+
A statement provided by the LPA
|
|
907
|
+
"""
|
|
908
|
+
caseWithdrawnDate: AwareDatetime | None = Field(
|
|
909
|
+
..., examples=["2023-07-27T20:30:00.000Z"]
|
|
910
|
+
)
|
|
911
|
+
"""
|
|
912
|
+
The date the appeal was withdrawn by the appellant
|
|
913
|
+
"""
|
|
914
|
+
caseTransferredDate: AwareDatetime | None = Field(
|
|
915
|
+
..., examples=["2023-07-27T20:30:00.000Z"]
|
|
916
|
+
)
|
|
917
|
+
"""
|
|
918
|
+
The date the appeal was transferred to a new case of a different type
|
|
919
|
+
"""
|
|
920
|
+
transferredCaseClosedDate: AwareDatetime | None = Field(
|
|
921
|
+
..., examples=["2023-07-27T20:30:00.000Z"]
|
|
922
|
+
)
|
|
923
|
+
"""
|
|
924
|
+
The date the appeal was closed and the appellant requested to resubmit
|
|
925
|
+
"""
|
|
926
|
+
caseDecisionOutcomeDate: AwareDatetime | None = Field(
|
|
927
|
+
..., examples=["2023-07-27T20:30:00.000Z"]
|
|
928
|
+
)
|
|
929
|
+
"""
|
|
930
|
+
The date of the appeal decision
|
|
931
|
+
"""
|
|
932
|
+
caseDecisionPublishedDate: AwareDatetime | None = Field(
|
|
933
|
+
..., examples=["2023-07-27T20:30:00.000Z"]
|
|
934
|
+
)
|
|
935
|
+
"""
|
|
936
|
+
The date the appeal decision was published
|
|
937
|
+
"""
|
|
938
|
+
caseDecisionOutcome: CaseDecisionOutcome
|
|
939
|
+
"""
|
|
940
|
+
The final outcome for the decision
|
|
941
|
+
"""
|
|
942
|
+
caseCompletedDate: AwareDatetime | None = Field(
|
|
943
|
+
..., examples=["2023-07-27T20:30:00.000Z"]
|
|
944
|
+
)
|
|
945
|
+
"""
|
|
946
|
+
The date the appeal decision letter
|
|
947
|
+
"""
|
|
948
|
+
enforcementNotice: bool | None = None
|
|
949
|
+
"""
|
|
950
|
+
Indicates if an enforcement notice is the reason for the appeal
|
|
951
|
+
"""
|
|
952
|
+
applicationReference: str = Field(..., examples=["43010/APP/1/290572"])
|
|
953
|
+
"""
|
|
954
|
+
The unique identifier of the LPA application
|
|
955
|
+
"""
|
|
956
|
+
applicationDate: AwareDatetime = Field(..., examples=["2023-07-27T20:30:00.000Z"])
|
|
957
|
+
"""
|
|
958
|
+
The date of the original LPA application
|
|
959
|
+
"""
|
|
960
|
+
applicationDecision: ApplicationDecision
|
|
961
|
+
"""
|
|
962
|
+
The outcome of the original LPA decision
|
|
963
|
+
"""
|
|
964
|
+
applicationDecisionDate: AwareDatetime | None = Field(
|
|
965
|
+
..., examples=["2023-07-27T20:30:00.000Z"]
|
|
966
|
+
)
|
|
967
|
+
"""
|
|
968
|
+
The date of the original LPA decision
|
|
969
|
+
"""
|
|
970
|
+
caseSubmissionDueDate: AwareDatetime | None = Field(
|
|
971
|
+
..., examples=["2023-07-27T20:30:00.000Z"]
|
|
972
|
+
)
|
|
973
|
+
"""
|
|
974
|
+
The statutory deadline for submitting an appeal from the original LPA decision date
|
|
975
|
+
"""
|
|
976
|
+
siteAddressLine1: str | None = Field(..., examples=["96 The Avenue"])
|
|
977
|
+
"""
|
|
978
|
+
First line of address for the appeal site
|
|
979
|
+
"""
|
|
980
|
+
siteAddressLine2: str | None = None
|
|
981
|
+
"""
|
|
982
|
+
Second line of address for the appeal site
|
|
983
|
+
"""
|
|
984
|
+
siteAddressTown: str | None = Field(..., examples=["Maidstone"])
|
|
985
|
+
"""
|
|
986
|
+
Town / City of the site address
|
|
987
|
+
"""
|
|
988
|
+
siteAddressCounty: str | None = Field(None, examples=["Kent"])
|
|
989
|
+
"""
|
|
990
|
+
County of the site address
|
|
991
|
+
"""
|
|
992
|
+
siteAddressPostcode: str | None = Field(..., examples=["MD21 5XY"])
|
|
993
|
+
"""
|
|
994
|
+
Postal code of the site address
|
|
995
|
+
"""
|
|
996
|
+
siteAccessDetails: list[str]
|
|
997
|
+
"""
|
|
998
|
+
Provided information on site accessibility
|
|
999
|
+
"""
|
|
1000
|
+
siteSafetyDetails: list[str]
|
|
1001
|
+
"""
|
|
1002
|
+
Provided information on site health and safety
|
|
1003
|
+
"""
|
|
1004
|
+
siteAreaSquareMetres: float | None = Field(..., examples=[45.7])
|
|
1005
|
+
"""
|
|
1006
|
+
The site area, in square meters
|
|
1007
|
+
"""
|
|
1008
|
+
floorSpaceSquareMetres: float | None = Field(..., examples=[3.5])
|
|
1009
|
+
"""
|
|
1010
|
+
The floor space, in square meters
|
|
1011
|
+
"""
|
|
1012
|
+
isCorrectAppealType: bool | None = None
|
|
1013
|
+
"""
|
|
1014
|
+
Indicates if the LPA considers the appeal type appropriate
|
|
1015
|
+
"""
|
|
1016
|
+
isGreenBelt: bool | None = None
|
|
1017
|
+
"""
|
|
1018
|
+
Indicates if the site is in a green belt
|
|
1019
|
+
"""
|
|
1020
|
+
inConservationArea: bool | None = None
|
|
1021
|
+
"""
|
|
1022
|
+
Indicates if the site is in a conservation area
|
|
1023
|
+
"""
|
|
1024
|
+
affectsScheduledMonument: bool | None = None
|
|
1025
|
+
"""
|
|
1026
|
+
Indicates if the development affects a scheduled monument
|
|
1027
|
+
"""
|
|
1028
|
+
hasProtectedSpecies: bool | None = None
|
|
1029
|
+
"""
|
|
1030
|
+
Indicates if the site hosts protected species
|
|
1031
|
+
"""
|
|
1032
|
+
isAonbNationalLandscape: bool | None = None
|
|
1033
|
+
"""
|
|
1034
|
+
Indicates an area of outstanding beauty (National Landscape)
|
|
1035
|
+
"""
|
|
1036
|
+
isSiteOnHighwayLand: bool | None = None
|
|
1037
|
+
"""
|
|
1038
|
+
Indicates if site is on highway land
|
|
1039
|
+
"""
|
|
1040
|
+
designatedSitesNames: list[str] | None = None
|
|
1041
|
+
"""
|
|
1042
|
+
The designated site names
|
|
1043
|
+
"""
|
|
1044
|
+
hasInfrastructureLevy: bool | None = None
|
|
1045
|
+
"""
|
|
1046
|
+
Indicates the existence of an infrastructure levy
|
|
1047
|
+
"""
|
|
1048
|
+
isInfrastructureLevyFormallyAdopted: bool | None = None
|
|
1049
|
+
"""
|
|
1050
|
+
Indicates if the infrastructure levy is formally adopted
|
|
1051
|
+
"""
|
|
1052
|
+
infrastructureLevyAdoptedDate: AwareDatetime | None = Field(
|
|
1053
|
+
None, examples=["2023-07-27T20:30:00.000Z"]
|
|
1054
|
+
)
|
|
1055
|
+
"""
|
|
1056
|
+
The date of the infrastructure levy adoption
|
|
1057
|
+
"""
|
|
1058
|
+
infrastructureLevyExpectedDate: AwareDatetime | None = Field(
|
|
1059
|
+
None, examples=["2023-07-27T20:30:00.000Z"]
|
|
1060
|
+
)
|
|
1061
|
+
"""
|
|
1062
|
+
The expected date of the infrastructure levy
|
|
1063
|
+
"""
|
|
1064
|
+
lpaProcedurePreference: LpaProcedurePreference | None = None
|
|
1065
|
+
"""
|
|
1066
|
+
The procedure preference indicated by the LPA
|
|
1067
|
+
"""
|
|
1068
|
+
lpaProcedurePreferenceDetails: str | None = None
|
|
1069
|
+
"""
|
|
1070
|
+
The procedure details preference indicated by the LPA
|
|
1071
|
+
"""
|
|
1072
|
+
lpaProcedurePreferenceDuration: float | None = None
|
|
1073
|
+
"""
|
|
1074
|
+
The duration of enquiry indicated by the LPA
|
|
1075
|
+
"""
|
|
1076
|
+
caseworkReason: str | None = None
|
|
1077
|
+
"""
|
|
1078
|
+
TBC
|
|
1079
|
+
"""
|
|
1080
|
+
importantInformation: str | None = None
|
|
1081
|
+
"""
|
|
1082
|
+
Information relevant to case...
|
|
1083
|
+
"""
|
|
1084
|
+
jurisdiction: str | None = None
|
|
1085
|
+
"""
|
|
1086
|
+
Under whose jurisdiction the decision falls
|
|
1087
|
+
"""
|
|
1088
|
+
redeterminedIndicator: bool | None = None
|
|
1089
|
+
"""
|
|
1090
|
+
Has the case been selected for redetermination
|
|
1091
|
+
"""
|
|
1092
|
+
dateCostsReportDespatched: AwareDatetime | None = Field(
|
|
1093
|
+
None, examples=["2023-07-27T20:30:00.000Z"]
|
|
1094
|
+
)
|
|
1095
|
+
"""
|
|
1096
|
+
The date that the costs report was sent
|
|
1097
|
+
"""
|
|
1098
|
+
dateNotRecoveredOrDerecovered: AwareDatetime | None = Field(
|
|
1099
|
+
None, examples=["2023-07-27T20:30:00.000Z"]
|
|
1100
|
+
)
|
|
1101
|
+
"""
|
|
1102
|
+
The date that is TBC
|
|
1103
|
+
"""
|
|
1104
|
+
dateRecovered: AwareDatetime | None = Field(
|
|
1105
|
+
None, examples=["2023-07-27T20:30:00.000Z"]
|
|
1106
|
+
)
|
|
1107
|
+
"""
|
|
1108
|
+
The date that case was recovered
|
|
1109
|
+
"""
|
|
1110
|
+
originalCaseDecisionDate: AwareDatetime | None = Field(
|
|
1111
|
+
None, examples=["2023-07-27T20:30:00.000Z"]
|
|
1112
|
+
)
|
|
1113
|
+
"""
|
|
1114
|
+
The original case decision date
|
|
1115
|
+
"""
|
|
1116
|
+
targetDate: AwareDatetime | None = Field(
|
|
1117
|
+
None, examples=["2023-07-27T20:30:00.000Z"]
|
|
1118
|
+
)
|
|
1119
|
+
"""
|
|
1120
|
+
The target date for case completion
|
|
1121
|
+
"""
|
|
1122
|
+
ownsAllLand: bool | None = None
|
|
1123
|
+
"""
|
|
1124
|
+
Indicates if the appellant has complete ownership of the site
|
|
1125
|
+
"""
|
|
1126
|
+
ownsSomeLand: bool | None = None
|
|
1127
|
+
"""
|
|
1128
|
+
Indicates if the appellant has partial ownership of the site
|
|
1129
|
+
"""
|
|
1130
|
+
knowsOtherOwners: KnowsOtherOwners
|
|
1131
|
+
"""
|
|
1132
|
+
Indicates if the appellant knows other owners of the site
|
|
1133
|
+
"""
|
|
1134
|
+
knowsAllOwners: KnowsAllOwners
|
|
1135
|
+
"""
|
|
1136
|
+
Indicates if the appellant knows all owners of the site
|
|
1137
|
+
"""
|
|
1138
|
+
advertisedAppeal: bool | None = None
|
|
1139
|
+
"""
|
|
1140
|
+
Indicates if the appellant has advertised the appeal to the LPA decision
|
|
1141
|
+
"""
|
|
1142
|
+
notificationMethod: list[NotificationMethodEnum1]
|
|
1143
|
+
"""
|
|
1144
|
+
The methods used to notify relevant parties
|
|
1145
|
+
"""
|
|
1146
|
+
ownersInformed: bool | None = None
|
|
1147
|
+
"""
|
|
1148
|
+
Indicates if the appellant has informed other owners of the site
|
|
1149
|
+
"""
|
|
1150
|
+
originalDevelopmentDescription: str | None = Field(
|
|
1151
|
+
..., examples=["Replacement of an existing gate to access the property"]
|
|
1152
|
+
)
|
|
1153
|
+
"""
|
|
1154
|
+
The original description of the development, as provided by the appellant
|
|
1155
|
+
"""
|
|
1156
|
+
changedDevelopmentDescription: bool | None = None
|
|
1157
|
+
"""
|
|
1158
|
+
Indicates that the LPA has changed the development description
|
|
1159
|
+
"""
|
|
1160
|
+
newConditionDetails: str | None = Field(
|
|
1161
|
+
...,
|
|
1162
|
+
examples=["Since the original application, a number of things have changed..."],
|
|
1163
|
+
)
|
|
1164
|
+
"""
|
|
1165
|
+
New conditions details provided by the LPA
|
|
1166
|
+
"""
|
|
1167
|
+
nearbyCaseReferences: list[str]
|
|
1168
|
+
"""
|
|
1169
|
+
A list of related case references known to the appellant and the LPA
|
|
1170
|
+
"""
|
|
1171
|
+
neighbouringSiteAddresses: list[NeighbouringSiteAddress]
|
|
1172
|
+
"""
|
|
1173
|
+
A list of neighbouring site addresses
|
|
1174
|
+
"""
|
|
1175
|
+
reasonForNeighbourVisits: str | None = None
|
|
1176
|
+
"""
|
|
1177
|
+
A general reason given for the need to visit any neighbours
|
|
1178
|
+
"""
|
|
1179
|
+
affectedListedBuildingNumbers: list[str]
|
|
1180
|
+
"""
|
|
1181
|
+
A list of affected listed building IDs from Historic England
|
|
1182
|
+
"""
|
|
1183
|
+
appellantCostsAppliedFor: bool | None = None
|
|
1184
|
+
"""
|
|
1185
|
+
Indicates if the appellant has applied for costs
|
|
1186
|
+
"""
|
|
1187
|
+
lpaCostsAppliedFor: bool | None = None
|
|
1188
|
+
"""
|
|
1189
|
+
Indicates if the appellant has applied for costs
|
|
1190
|
+
"""
|
|
1191
|
+
typeOfPlanningApplication: TypeOfPlanningApplication | None = None
|
|
1192
|
+
siteGridReferenceEasting: constr(pattern=r"^\d{6}$") | None = Field(
|
|
1193
|
+
None, examples=["357144"]
|
|
1194
|
+
)
|
|
1195
|
+
siteGridReferenceNorthing: constr(pattern=r"^\d{6}$") | None = Field(
|
|
1196
|
+
None, examples=["400534"]
|
|
1197
|
+
)
|
|
1198
|
+
hasLandownersPermission: bool | None = None
|
|
1199
|
+
"""
|
|
1200
|
+
Indicates if the appellant has land owners permission
|
|
1201
|
+
"""
|
|
1202
|
+
isAdvertInPosition: bool | None = None
|
|
1203
|
+
"""
|
|
1204
|
+
Indicates if the advert is already in position
|
|
1205
|
+
"""
|
|
1206
|
+
isSiteInAreaOfSpecialControlAdverts: bool | None = None
|
|
1207
|
+
"""
|
|
1208
|
+
Indicates if the site is in an area of special control for adverts
|
|
1209
|
+
"""
|
|
1210
|
+
wasApplicationRefusedDueToHighwayOrTraffic: bool | None = None
|
|
1211
|
+
"""
|
|
1212
|
+
Indicates if the application was refused because of highway or traffic public safety?
|
|
1213
|
+
"""
|
|
1214
|
+
didAppellantSubmitCompletePhotosAndPlans: bool | None = None
|
|
1215
|
+
"""
|
|
1216
|
+
Indicates if the appellant submitted complete and accurate photographs and plans
|
|
1217
|
+
"""
|
|
1218
|
+
advertType: str | None = None
|
|
1219
|
+
|
|
1220
|
+
|
|
1221
|
+
class AppealHasCase(RootModel[AppealHasCase1 | AppealHasCase2]):
|
|
1222
|
+
root: AppealHasCase1 | AppealHasCase2 = Field(..., title="Appeal HAS Case")
|
|
1223
|
+
"""
|
|
1224
|
+
Group A - Schema defining the metadata for an appeal
|
|
1225
|
+
"""
|