Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feat: 410 Report Verification - LFO #2714

Merged
merged 7 commits into from
Feb 4, 2025
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 6 additions & 3 deletions bc_obps/registration/tests/models/test_user.py
Original file line number Diff line number Diff line change
@@ -140,9 +140,12 @@ def setUpTestData(cls):
("reportnewentrant_created", "report new entrant", None, None),
("reportnewentrant_updated", "report new entrant", None, None),
("reportnewentrant_archived", "report new entrant", None, None),
("reportversion_created", "report version", None, None),
("reportversion_updated", "report version", None, None),
("reportversion_archived", "report version", None, None),
("reportverification_created", "report verification", None, None),
("reportverification_updated", "report verification", None, None),
("reportverification_archived", "report verification", None, None),
("reportverificationvisit_created", "report verification visit", None, None),
("reportverificationvisit_updated", "report verification visit", None, None),
("reportverificationvisit_archived", "report verification visit", None, None),
("reportattachment_created", "report attachment", None, None),
("reportattachment_updated", "report attachment", None, None),
("reportattachment_archived", "report attachment", None, None),
5 changes: 2 additions & 3 deletions bc_obps/reporting/api/report_verification.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
from typing import Literal
from reporting.models.report_verification import ReportVerification
from common.permissions import authorize
from django.http import HttpRequest
from registration.decorators import handle_http_errors
@@ -8,7 +9,6 @@
from .router import router
from reporting.schema.report_verification import ReportVerificationIn, ReportVerificationOut
from reporting.service.report_verification_service import ReportVerificationService
from reporting.models import ReportVerification


@router.get(
@@ -22,8 +22,7 @@
def get_report_verification_by_version_id(
request: HttpRequest, report_version_id: int
) -> tuple[Literal[200], ReportVerification]:
report_verification = ReportVerificationService.get_report_verification_by_version_id(report_version_id)
return 200, report_verification
return 200, ReportVerificationService.get_report_verification_by_version_id(report_version_id)


@router.get(
Original file line number Diff line number Diff line change
@@ -0,0 +1,125 @@
# Generated by Django 5.0.10 on 2025-02-03 23:56

import django.db.models.deletion
from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
(
'registration',
'0072_alter_historicaloptedinoperationdetail_meets_producing_gger_schedule_a1_regulated_product_and_more',
),
('reporting', '0049_alter_gcs_add_CEMS'),
]

operations = [
migrations.RemoveField(
model_name='reportverification',
name='other_facility_coordinates',
),
migrations.RemoveField(
model_name='reportverification',
name='other_facility_name',
),
migrations.RemoveField(
model_name='reportverification',
name='visit_name',
),
migrations.RemoveField(
model_name='reportverification',
name='visit_type',
),
migrations.CreateModel(
name='ReportVerificationVisit',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('created_at', models.DateTimeField(auto_now_add=True, null=True)),
('updated_at', models.DateTimeField(blank=True, null=True)),
('archived_at', models.DateTimeField(blank=True, null=True)),
(
'visit_name',
models.CharField(
db_comment='The name of the site visited (Facility X, Other, or None)', max_length=100
),
),
(
'visit_type',
models.CharField(
blank=True,
choices=[('In person', 'In Person'), ('Virtual', 'Virtual')],
db_comment='The type of visit conducted (Virtual or In Person)',
max_length=10,
null=True,
),
),
(
'visit_coordinates',
models.CharField(
blank=True,
db_comment='Geographic location of an other facility visited',
max_length=100,
null=True,
),
),
(
'is_other_visit',
models.BooleanField(
db_comment='Flag to indicate the visit is an other facility visited', default=False
),
),
(
'archived_by',
models.ForeignKey(
blank=True,
null=True,
on_delete=django.db.models.deletion.PROTECT,
related_name='%(class)s_archived',
to='registration.user',
),
),
(
'created_by',
models.ForeignKey(
blank=True,
null=True,
on_delete=django.db.models.deletion.PROTECT,
related_name='%(class)s_created',
to='registration.user',
),
),
(
'report_verification',
models.ForeignKey(
db_comment='The report verification associated with this visit',
on_delete=django.db.models.deletion.CASCADE,
related_name='report_verification_visits',
to='reporting.reportverification',
),
),
(
'updated_by',
models.ForeignKey(
blank=True,
null=True,
on_delete=django.db.models.deletion.PROTECT,
related_name='%(class)s_updated',
to='registration.user',
),
),
],
options={
'db_table': 'erc"."verification_visit',
'db_table_comment': 'Table to store individual verification visit information',
},
),
migrations.AddConstraint(
model_name='reportverificationvisit',
constraint=models.CheckConstraint(
check=models.Q(('is_other_visit', False), ('visit_coordinates__isnull', False), _connector='OR'),
name='other_facility_must_have_coordinates',
violation_error_message='Coordinates must be provided for an other facility visit',
),
),
]
2 changes: 2 additions & 0 deletions bc_obps/reporting/models/__init__.py
Original file line number Diff line number Diff line change
@@ -34,6 +34,7 @@
from .report_non_attributable_emissions import ReportNonAttributableEmissions
from .report_product import ReportProduct
from .report_verification import ReportVerification
from .report_verification_visit import ReportVerificationVisit
from .report_attachment import ReportAttachment
from .naics_regulatory_value import NaicsRegulatoryValue
from .product_emission_intensity import ProductEmissionIntensity
@@ -74,6 +75,7 @@
"ReportNewEntrantProduction",
"ReportNewEntrantEmission",
"ReportVerification",
"ReportVerificationVisit",
"ReportAttachment",
"NaicsRegulatoryValue",
"ProductEmissionIntensity",
30 changes: 0 additions & 30 deletions bc_obps/reporting/models/report_verification.py
Original file line number Diff line number Diff line change
@@ -52,36 +52,6 @@ class VerificationConclusion(models.TextChoices):
db_comment="The conclusion of the verification",
)

visit_name = models.CharField(
max_length=100, db_comment="The name of the site visited (Facility X, Other, or None)"
)

class VisitType(models.TextChoices):
IN_PERSON = "In person"
VIRTUAL = "Virtual"

visit_type = models.CharField(
max_length=10,
choices=VisitType.choices,
null=True,
blank=True,
db_comment="The type of visit conducted (Virtual or In Person)",
)

other_facility_name = models.CharField(
max_length=100,
null=True,
blank=True,
db_comment="Name of the other facility visited if 'Other' is selected",
)

other_facility_coordinates = models.CharField(
max_length=100,
null=True,
blank=True,
db_comment="Geographic location of the other facility visited",
)

class Meta:
db_table = 'erc"."report_verification'
db_table_comment = "Table to store verification information associated with a report version"
57 changes: 57 additions & 0 deletions bc_obps/reporting/models/report_verification_visit.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
from django.db import models
from django.db.models import Q
from registration.models.time_stamped_model import TimeStampedModel
from reporting.models.report_verification import ReportVerification


class ReportVerificationVisit(TimeStampedModel):
"""
Model to store information about a verification visit for a report verification.
"""

report_verification = models.ForeignKey(
ReportVerification,
on_delete=models.CASCADE,
related_name="report_verification_visits",
db_comment="The report verification associated with this visit",
)

visit_name = models.CharField(
max_length=100, db_comment="The name of the site visited (Facility X, Other, or None)"
)

class VisitType(models.TextChoices):
IN_PERSON = "In person"
VIRTUAL = "Virtual"

visit_type = models.CharField(
max_length=10,
choices=VisitType.choices,
null=True,
blank=True,
db_comment="The type of visit conducted (Virtual or In Person)",
)

visit_coordinates = models.CharField(
max_length=100,
null=True,
blank=True,
db_comment="Geographic location of an other facility visited",
)

is_other_visit = models.BooleanField(
db_comment="Flag to indicate the visit is an other facility visited",
default=False,
)

class Meta:
db_table = 'erc"."verification_visit'
db_table_comment = "Table to store individual verification visit information"
app_label = 'reporting'
constraints = [
models.CheckConstraint(
name="other_facility_must_have_coordinates",
check=Q(is_other_visit=False) | Q(visit_coordinates__isnull=False),
violation_error_message="Coordinates must be provided for an other facility visit",
),
]
1 change: 0 additions & 1 deletion bc_obps/reporting/schema/facility_report.py
Original file line number Diff line number Diff line change
@@ -20,7 +20,6 @@ class FacilityReportOut(ModelSchema):

@staticmethod
def resolve_facility(obj: FacilityReport) -> str:
print(obj.facility)
return str(obj.facility)

class Meta:
50 changes: 34 additions & 16 deletions bc_obps/reporting/schema/report_verification.py
Original file line number Diff line number Diff line change
@@ -1,21 +1,18 @@
from typing import Optional
from typing import List, Optional
from ninja import ModelSchema
from pydantic import Field
from reporting.models import ReportVerification

from reporting.models import ReportVerification, ReportVerificationVisit

class BaseReportVerificationSchema(ModelSchema):

class ReportVerificationBase(ModelSchema):
"""
Base schema for shared fields in ReportVerification schemas
"""

verification_body_name: str
accredited_by: str
scope_of_verification: str
visit_name: str
visit_type: Optional[str] = Field(None)
other_facility_name: Optional[str] = Field(None)
other_facility_coordinates: Optional[str] = Field(None)
threats_to_independence: bool
verification_conclusion: str

@@ -25,27 +22,48 @@ class Meta:
'verification_body_name',
'accredited_by',
'scope_of_verification',
'visit_name',
'visit_type',
'other_facility_name',
'other_facility_coordinates',
'threats_to_independence',
'verification_conclusion',
]


class ReportVerificationIn(BaseReportVerificationSchema):
class ReportVerificationVisitSchema(ModelSchema):
"""
Schema for ReportVerificationVisit model
"""

visit_name: str
visit_type: Optional[str] = Field(None)
is_other_visit: bool
visit_coordinates: str
Comment on lines +35 to +38
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These are inferred from the django model, they're redundant with the Meta fields = [...] declaration. We can just remove those lines

Copy link
Contributor Author

@shon-button shon-button Feb 3, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@pbastia
FYI: when I remove the "redundant fields" I get MyPy failed

Mypy.....................................................................Failed
reporting/service/report_verification_service.py:67:31: error: "ReportVerificationVisitSchema" has no attribute "visit_type"  [attr-defined]
reporting/service/report_verification_service.py:68:35: error: "ReportVerificationVisitSchema" has no attribute "is_other_visit"  [attr-defined]
reporting/service/report_verification_service.py:69:38: error: "ReportVerificationVisitSchema" has no attribute "visit_coordinates"  [attr-defined]
reporting/service/report_verification_service.py:74:28: error: "ReportVerificationVisitSchema" has no attribute "visit_name"  [attr-defined]


class Meta:
model = ReportVerificationVisit
fields = [
'visit_name',
'visit_type',
'is_other_visit',
'visit_coordinates',
]


class ReportVerificationIn(ReportVerificationBase):
"""
Schema for the input of report verification data
"""

pass
report_verification_visits: List[ReportVerificationVisitSchema] = Field(default_factory=list)

class Meta(ReportVerificationBase.Meta):
fields = ReportVerificationBase.Meta.fields

class ReportVerificationOut(BaseReportVerificationSchema):

class ReportVerificationOut(ReportVerificationBase):
"""
Schema for the output of report verification data
"""

class Meta(BaseReportVerificationSchema.Meta):
fields = BaseReportVerificationSchema.Meta.fields + ['report_version']
report_verification_visits: List[ReportVerificationVisitSchema] = Field(default_factory=list)

class Meta(ReportVerificationBase.Meta):
fields = ReportVerificationBase.Meta.fields + ['report_version']
Loading