Skip to content

Commit

Permalink
Merge pull request #2688 from bcgov/chore-456-operation-representative
Browse files Browse the repository at this point in the history
Chore 456 operation representative
  • Loading branch information
ayeshmcg authored Jan 16, 2025
2 parents 8eb0663 + 319edcd commit abc0ed9
Show file tree
Hide file tree
Showing 20 changed files with 505 additions and 278 deletions.
3 changes: 3 additions & 0 deletions bc_obps/registration/tests/models/test_user.py
Original file line number Diff line number Diff line change
Expand Up @@ -152,6 +152,9 @@ def setUpTestData(cls):
("reportproductemissionallocation_created", "report product emission allocation", None, None),
("reportproductemissionallocation_updated", "report product emission allocation", None, None),
("reportproductemissionallocation_archived", "report product emission allocation", None, None),
("reportoperationrepresentative_created", "report operation representative", None, None),
("reportoperationrepresentative_updated", "report operation representative", None, None),
("reportoperationrepresentative_archived", "report operation representative", None, None),
]

def test_unique_user_guid_and_business_guid_constraint(self):
Expand Down
16 changes: 9 additions & 7 deletions bc_obps/reporting/api/reports.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,11 +12,11 @@
from service.report_service import ReportService
from service.reporting_year_service import ReportingYearService
from service.error_service.custom_codes_4xx import custom_codes_4xx
from reporting.schema.report_operation import ReportOperationOut, ReportOperationIn
from reporting.schema.report_operation import ReportOperationIn, ReportOperationSchemaOut, ReportOperationOut
from reporting.schema.reporting_year import ReportingYearOut
from .router import router
from ..schema.report_regulated_products import RegulatedProductOut
from ..models import ReportingYear, ReportVersion
from ..models import ReportingYear, ReportVersion, ReportOperationRepresentative
from ..schema.report_version import ReportingVersionOut


Expand All @@ -37,17 +37,19 @@ def start_report(request: HttpRequest, payload: StartReportIn) -> Tuple[Literal[

@router.get(
"/report-version/{version_id}/report-operation",
response={200: ReportOperationOut, custom_codes_4xx: Message},
response={200: ReportOperationSchemaOut, custom_codes_4xx: Message},
tags=EMISSIONS_REPORT_TAGS,
description="""Takes version_id (primary key of Report_Version model) and returns its report_operation object.""",
auth=authorize("approved_authorized_roles"),
)
@handle_http_errors()
def get_report_operation_by_version_id(
request: HttpRequest, version_id: int
) -> Tuple[Literal[200], ReportOperationOut]:
def get_report_operation_by_version_id(request: HttpRequest, version_id: int) -> tuple[Literal[200], dict]:
report_operation_representative = ReportOperationRepresentative.objects.filter(report_version__id=version_id)
report_operation = ReportService.get_report_operation_by_version_id(version_id)
return 200, report_operation # type: ignore
return 200, {
"report_operation": report_operation,
"report_operation_representatives": report_operation_representative,
}


@router.post(
Expand Down
77 changes: 77 additions & 0 deletions bc_obps/reporting/migrations/0044_reportoperationrepresentative.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
# Generated by Django 5.0.9 on 2025-01-14 16:21

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


class Migration(migrations.Migration):

dependencies = [
('registration', '0067_alter_facility_latitude_of_largest_emissions_and_more'),
('reporting', '0043_alter_reportversion_status'),
]

operations = [
migrations.CreateModel(
name='ReportOperationRepresentative',
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)),
(
'representative_name',
models.CharField(db_comment='The name of the operation representative.', max_length=1000),
),
(
'selected_for_report',
models.BooleanField(
db_comment='Indicates whether this representative is selected for reporting.', 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_version',
models.ForeignKey(
db_comment='The report version associated with this operation representative.',
on_delete=django.db.models.deletion.CASCADE,
related_name='report_operation_representatives',
to='reporting.reportversion',
),
),
(
'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"."report_operation_representative',
'db_table_comment': 'Stores information about operation representatives linked to report versions, including their selection status for reports.',
},
),
]
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# Generated by Django 5.0.9 on 2025-01-14 17:46

from django.db import migrations


class Migration(migrations.Migration):

dependencies = [
('reporting', '0044_reportoperationrepresentative'),
]

operations = [
migrations.RemoveField(
model_name='reportoperation',
name='operation_representative_name',
),
]
2 changes: 2 additions & 0 deletions bc_obps/reporting/models/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@
from .naics_regulatory_value import NaicsRegulatoryValue
from .product_emission_intensity import ProductEmissionIntensity
from .report_product_emission_allocation import ReportProductEmissionAllocation
from .report_operation_representative import ReportOperationRepresentative

__all__ = [
"ReportDataBaseModel",
Expand Down Expand Up @@ -77,4 +78,5 @@
"NaicsRegulatoryValue",
"ProductEmissionIntensity",
"ReportProductEmissionAllocation",
"ReportOperationRepresentative",
]
3 changes: 0 additions & 3 deletions bc_obps/reporting/models/report_operation.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,9 +40,6 @@ class ReportOperation(TimeStampedModel):
blank=True,
null=True,
)
operation_representative_name = models.CharField(
max_length=10000, db_comment="The full name of the operation representative"
)

# We don't create a backwards relation since this is a registration model
activities = models.ManyToManyField(Activity, related_name="+")
Expand Down
32 changes: 32 additions & 0 deletions bc_obps/reporting/models/report_operation_representative.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
from django.db import models
from registration.models.time_stamped_model import TimeStampedModel
from reporting.models.report_version import ReportVersion


class ReportOperationRepresentative(TimeStampedModel):
"""
Represents an operation representative associated with a specific report version.
"""

report_version = models.ForeignKey(
ReportVersion,
on_delete=models.CASCADE,
related_name="report_operation_representatives",
db_comment="The report version associated with this operation representative.",
)
representative_name = models.CharField(
max_length=1000,
db_comment="The name of the operation representative.",
)
selected_for_report = models.BooleanField(
default=False,
db_comment="Indicates whether this representative is selected for reporting.",
)

class Meta:
db_table = 'erc"."report_operation_representative'
app_label = 'reporting'
db_table_comment = (
"Stores information about operation representatives linked to report versions, "
"including their selection status for reports."
)
22 changes: 20 additions & 2 deletions bc_obps/reporting/schema/report_operation.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
from ninja import ModelSchema, Schema

from reporting.models import ReportOperationRepresentative
from reporting.models.report_operation import ReportOperation
from pydantic import alias_generators

from typing import List


Expand Down Expand Up @@ -29,8 +32,23 @@ class Meta:
'bc_obps_regulated_operation_id',
'activities',
'regulated_products',
'operation_representative_name',
]
orm_mode = True


class ReportOperationRepresentativeSchema(ModelSchema):
class Meta:
model = ReportOperationRepresentative
fields = ["id", "representative_name", "selected_for_report"]


class ReportOperationSchemaOut(Schema):
"""
Schema for the report operation with representative details.
"""

report_operation: ReportOperationOut
report_operation_representatives: List[ReportOperationRepresentativeSchema]


class ReportOperationIn(Schema):
Expand All @@ -46,8 +64,8 @@ class ReportOperationIn(Schema):
bc_obps_regulated_operation_id: str
activities: List[str]
regulated_products: List[str]
operation_representative_name: str
operation_report_type: str
operation_representative_name: List[int]

class Meta:
alias_generator = to_snake
Expand Down
8 changes: 4 additions & 4 deletions bc_obps/reporting/tests/api/test_report_version_endpoint.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,9 @@ def test_authorized_users_can_get_report_version(self):
assert response.status_code == 200
# Test that the endpoint returns the correct data
response_json = response.json()
assert response_json['operator_legal_name'] == str(report_version.report_operation.operator_legal_name)
assert response_json['report_operation']['operator_legal_name'] == str(
report_version.report_operation.operator_legal_name
)

# POST report-operation
def test_authorized_users_can_post_updates_to_report_version(self):
Expand All @@ -35,15 +37,14 @@ def test_authorized_users_can_post_updates_to_report_version(self):
"bc_obps_regulated_operation_id": "new bc obps regulated operation id",
"activities": [],
"regulated_products": [],
"operation_representative_name": "new operation representative name",
"operation_report_type": "Annual Report",
"operation_representative_name": [1, 2],
}
assert report_version.report_operation.operator_legal_name != data['operator_legal_name']
assert report_version.report_operation.operator_trade_name != data['operator_trade_name']
assert report_version.report_operation.operation_name != data['operation_name']
assert report_version.report_operation.operation_bcghgid != data['operation_bcghgid']
assert report_version.report_operation.bc_obps_regulated_operation_id != data['bc_obps_regulated_operation_id']
assert report_version.report_operation.operation_representative_name != data['operation_representative_name']
assert report_version.report_type != data['operation_report_type']

response = TestUtils.mock_post_with_auth_role(
Expand All @@ -57,4 +58,3 @@ def test_authorized_users_can_post_updates_to_report_version(self):
assert response_json['operation_name'] == data['operation_name']
assert response_json['operation_bcghgid'] == data['operation_bcghgid']
assert response_json['bc_obps_regulated_operation_id'] == data['bc_obps_regulated_operation_id']
assert response_json['operation_representative_name'] == data['operation_representative_name']
2 changes: 0 additions & 2 deletions bc_obps/reporting/tests/models/test_report_operation.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@ def setUpTestData(cls):
operation_type="sfo",
operation_bcghgid="A fake BC GHG ID",
bc_obps_regulated_operation_id="123456789",
operation_representative_name="Kar Bonn",
report_version=report_version_baker(report_operation=None),
)
cls.test_object.activities.add(Activity.objects.first())
Expand All @@ -31,7 +30,6 @@ def setUpTestData(cls):
("operation_type", "operation type", 1000, None),
("operation_bcghgid", "operation bcghgid", 1000, None),
("bc_obps_regulated_operation_id", "bc obps regulated operation id", 255, None),
("operation_representative_name", "operation representative name", 10000, None),
("activities", "activities", None, 1),
("regulated_products", "regulated products", None, 1),
]
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
from common.tests.utils.helpers import BaseTestCase
from registration.tests.constants import TIMESTAMP_COMMON_FIELDS
from model_bakery.baker import make_recipe


class ReportOperationRepresentativeModelTest(BaseTestCase):
@classmethod
def setUpTestData(cls):
cls.test_object = make_recipe('reporting.tests.utils.report_operation_representative')
cls.field_data = [
*TIMESTAMP_COMMON_FIELDS,
("id", "ID", None, None),
("report_version", "report version", None, None),
("representative_name", "representative name", None, None),
("selected_for_report", "selected for report", None, None),
]
1 change: 1 addition & 0 deletions bc_obps/reporting/tests/models/test_report_version.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,4 +30,5 @@ def setUpTestData(cls):
("report_new_entrant", "report new entrant", None, None),
("report_attachments", "report attachment", None, 0),
("reportproductemissionallocation_records", "report product emission allocation", None, 0),
('report_operation_representatives', 'report operation representative', None, None),
]
15 changes: 13 additions & 2 deletions bc_obps/reporting/tests/utils/baker_recipes.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,12 @@

from registration.models import NaicsCode
from registration.models.activity import Activity
from reporting.models import ReportNewEntrant, ReportNewEntrantEmission, ReportNewEntrantProduction
from reporting.models import (
ReportNewEntrant,
ReportNewEntrantEmission,
ReportNewEntrantProduction,
ReportOperationRepresentative,
)
from reporting.models import ReportAdditionalData
from reporting.models.activity_json_schema import ActivityJsonSchema
from reporting.models.activity_source_type_json_schema import ActivitySourceTypeJsonSchema
Expand Down Expand Up @@ -149,7 +154,6 @@ def json_seq(json_key="generated_json", json_value="test json value", seq_value:
gas_type=[foreign_key(gas_type)],
)


report_verification = Recipe(
ReportVerification,
report_version=foreign_key(report_version),
Expand Down Expand Up @@ -199,3 +203,10 @@ def json_seq(json_key="generated_json", json_value="test json value", seq_value:
NaicsCode,
naics_code='12345',
)

report_operation_representative = Recipe(
ReportOperationRepresentative,
report_version=foreign_key(report_version),
representative_name="Test Report",
selected_for_report=True,
)
Loading

0 comments on commit abc0ed9

Please sign in to comment.