Skip to content

Commit

Permalink
chore: merge release
Browse files Browse the repository at this point in the history
  • Loading branch information
Alex Zorkin committed Jan 16, 2025
2 parents e2cdc37 + f786ea2 commit 0ddfee4
Show file tree
Hide file tree
Showing 33 changed files with 1,030 additions and 109 deletions.
1 change: 1 addition & 0 deletions backend/lcfs/db/migrations/env.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
"mv_org_compliance_report_count",
"transaction_status_view",
"mv_compliance_report_count",
"mv_fuel_code_count",
]


Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
"""Update other_uses_fossil_derived in fuel_type
Revision ID: fe03799b4018
Revises: fa98709e7952
Create Date: 2025-01-14 18:12:43.683691
"""

import sqlalchemy as sa
from alembic import op

# revision identifiers, used by Alembic.
revision = "fe03799b4018"
down_revision = "5163af6ba4a4"
branch_labels = None
depends_on = None


def upgrade() -> None:
# Set other_uses_fossil_derived to false
op.execute("""
UPDATE fuel_type
SET other_uses_fossil_derived = false
WHERE fuel_type IN (
'CNG', 'Electricity', 'Hydrogen', 'LNG', 'Propane',
'Natural gas-based gasoline', 'Petroleum-based diesel',
'Petroleum-based gasoline'
)
""")

# Set other_uses_fossil_derived to true
op.execute("""
UPDATE fuel_type
SET other_uses_fossil_derived = true
WHERE fuel_type IN (
'Alternative jet fuel', 'Biodiesel', 'Ethanol', 'HDRD',
'Other diesel fuel', 'Renewable gasoline', 'Renewable naphtha'
)
""")

def downgrade() -> None:
# Revert `other_uses_fossil_derived` to original values for false
op.execute("""
UPDATE fuel_type
SET other_uses_fossil_derived = true
WHERE fuel_type IN (
'CNG', 'Electricity', 'Hydrogen', 'LNG', 'Propane',
'Natural gas-based gasoline', 'Petroleum-based diesel',
'Petroleum-based gasoline'
)
""")

# Revert `other_uses_fossil_derived` to original values for true
op.execute("""
UPDATE fuel_type
SET other_uses_fossil_derived = false
WHERE fuel_type IN (
'Alternative jet fuel', 'Biodiesel', 'Ethanol', 'HDRD',
'Other diesel fuel', 'Renewable gasoline', 'Renewable naphtha'
)
""")
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
"""mv for fuel code count
Revision ID: 8119d12538df
Revises: d25e7c47659e
Create Date: 2025-01-14 23:47:28.504150
"""

import sqlalchemy as sa
from alembic import op

# revision identifiers, used by Alembic.
revision = "8119d12538df"
down_revision = "fe03799b4018"
branch_labels = None
depends_on = None


def upgrade() -> None:
# ### commands auto generated by Alembic - please adjust! ###
op.execute(
"""
CREATE MATERIALIZED VIEW mv_fuel_code_count AS
SELECT
CASE fuel_status_id
WHEN 1 THEN 'Draft'
END as status,
COUNT(*) as count
FROM fuel_code
WHERE fuel_status_id = 1
GROUP BY fuel_status_id;
"""
)

op.execute(
"""
CREATE UNIQUE INDEX mv_fuel_code_count_idx
ON mv_fuel_code_count (status);
"""
)

op.execute(
"""
CREATE OR REPLACE FUNCTION refresh_mv_fuel_code_count()
RETURNS TRIGGER AS $$
BEGIN
REFRESH MATERIALIZED VIEW CONCURRENTLY mv_fuel_code_count;
RETURN NULL;
END;
$$ LANGUAGE plpgsql;
"""
)

op.execute(
"""
CREATE TRIGGER refresh_mv_fuel_code_count_after_change
AFTER INSERT OR UPDATE OR DELETE ON fuel_code
FOR EACH STATEMENT EXECUTE FUNCTION refresh_mv_fuel_code_count();
"""
)

# Refresh the materialized view to include existing fuel codes
op.execute(
"REFRESH MATERIALIZED VIEW CONCURRENTLY mv_fuel_code_count;"
)
# ### end Alembic commands ###


def downgrade() -> None:
# ### commands auto generated by Alembic - please adjust! ###
op.execute(
"DROP TRIGGER IF EXISTS refresh_mv_fuel_code_count_after_change ON fuel_code;")
op.execute("DROP FUNCTION IF EXISTS refresh_mv_fuel_code_count();")
op.execute("DROP MATERIALIZED VIEW IF EXISTS mv_fuel_code_count;")
# ### end Alembic commands ###
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
"""add truck and marine transport mode
Revision ID: 5bc0ef48739a
Revises: f78e53370ed2
Create Date: 2025-01-15 22:48:43.582069
"""

import sqlalchemy as sa
from alembic import op
from datetime import datetime

# revision identifiers, used by Alembic.
revision = "5bc0ef48739a"
down_revision = "8119d12538df"
branch_labels = None
depends_on = None


def upgrade() -> None:
current_time = datetime.now()

# Insert Truck and Marine transport modes
op.execute(
"""
INSERT INTO transport_mode (transport_mode, create_date, update_date, create_user, update_user)
VALUES
('Truck', '{}', '{}', 'no_user', 'no_user'),
('Marine', '{}', '{}', 'no_user', 'no_user')
""".format(
current_time, current_time, current_time, current_time
)
)


def downgrade() -> None:
# Remove Truck and Marine transport modes
op.execute(
"""
DELETE FROM transport_mode
WHERE transport_mode IN ('Truck', 'Marine')
"""
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
"""add marine end use
Revision ID: 998929392c8b
Revises: 5bc0ef48739a
Create Date: 2025-01-07 19:35:00.064999
"""

import sqlalchemy as sa
from alembic import op

# revision identifiers, used by Alembic.
revision = "998929392c8b"
down_revision = "5bc0ef48739a"
branch_labels = None
depends_on = None


def upgrade() -> None:
op.execute(
"""
INSERT INTO end_use_type (end_use_type_id, type, intended_use)
VALUES (25, 'Marine', TRUE)
ON CONFLICT (end_use_type_id) DO NOTHING;
"""
)
# Energy Effectiveness Ratios
op.execute(
"""
INSERT INTO energy_effectiveness_ratio (
eer_id, fuel_category_id, fuel_type_id, end_use_type_id, ratio, effective_status
)
VALUES (44, 2, 3, 25, 2.5, TRUE)
ON CONFLICT (eer_id) DO NOTHING;
"""
)


def downgrade() -> None:
op.execute(
"""
DELETE FROM energy_effectiveness_ratio
WHERE eer_id = 44;
"""
)
op.execute(
"""
DELETE FROM end_use_type
WHERE end_use_type_id = 25;
"""
)
20 changes: 20 additions & 0 deletions backend/lcfs/db/models/fuel/FuelCodeCountView.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
from sqlalchemy import Column, Integer, String
from lcfs.db.base import BaseModel


class FuelCodeCountView(BaseModel):
__tablename__ = "mv_fuel_code_count"
__table_args__ = {
"extend_existing": True,
"comment": "Materialized view for counting fuel code by status",
}

status = Column(
String,
primary_key=True,
comment="Status name (e.g. draft, approved, deleted)"
)
count = Column(
Integer,
comment="Count of fuel code for this status"
)
8 changes: 8 additions & 0 deletions backend/lcfs/db/seeders/dev/fuel_code_seeder.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,9 +34,11 @@ def create_fuel_entry(
effective_date,
expiration_date,
fuel_type_id,
fuel_status_id=2,
):
return {
**base_fuel_data, # Extend with the base fields
"fuel_status_id": fuel_status_id,
"fuel_suffix": fuel_suffix,
"company": company,
"carbon_intensity": carbon_intensity,
Expand All @@ -49,6 +51,7 @@ def create_fuel_entry(
async def seed_fuel_codes(session):
fuel_codes_to_seed = [
create_fuel_entry(
fuel_status_id=1,
fuel_suffix="102.5",
company="Neste Oil Singapore",
carbon_intensity=37.21,
Expand All @@ -57,6 +60,7 @@ async def seed_fuel_codes(session):
fuel_type_id=5,
),
create_fuel_entry(
fuel_status_id=1,
fuel_suffix="124.4",
company="Ag Processing Inc.",
carbon_intensity=3.62,
Expand All @@ -65,6 +69,7 @@ async def seed_fuel_codes(session):
fuel_type_id=1,
),
create_fuel_entry(
fuel_status_id=1,
fuel_suffix="125.4",
company="Archer Daniels Midland",
carbon_intensity=-2.14,
Expand All @@ -73,6 +78,7 @@ async def seed_fuel_codes(session):
fuel_type_id=1,
),
create_fuel_entry(
fuel_status_id=3,
fuel_suffix="138.5",
company="ADM Agri-Industries Company",
carbon_intensity=4.26,
Expand All @@ -81,6 +87,7 @@ async def seed_fuel_codes(session):
fuel_type_id=1,
),
create_fuel_entry(
fuel_status_id=3,
fuel_suffix="143.4",
company="Green Plains Otter Tail LLC",
carbon_intensity=44.06,
Expand All @@ -89,6 +96,7 @@ async def seed_fuel_codes(session):
fuel_type_id=4,
),
create_fuel_entry(
fuel_status_id=3,
fuel_suffix="251.2",
company="Incobrasa Industries, Ltd.",
carbon_intensity=0.35,
Expand Down
4 changes: 2 additions & 2 deletions backend/lcfs/services/keycloak/authentication.py
Original file line number Diff line number Diff line change
Expand Up @@ -160,7 +160,7 @@ async def authenticate(self, request):
await self.create_login_history(
user_token, False, error_text
)
raise HTTPException(status_code=401, detail=error_text)
raise HTTPException(status_code=403, detail=error_text)
else:
# Already found by keycloak_user_id => return
return AuthCredentials(["authenticated"]), user
Expand Down Expand Up @@ -204,7 +204,7 @@ async def authenticate(self, request):
if not user.is_active:
error_text = "The account is currently inactive."
await self.create_login_history(user_token, False, error_text)
raise HTTPException(status_code=401, detail=error_text)
raise HTTPException(status_code=403, detail=error_text)
else:
error_text = "preferred_username or email is required in JWT payload."
raise HTTPException(status_code=401, detail=error_text)
Expand Down
14 changes: 14 additions & 0 deletions backend/lcfs/web/api/dashboard/repo.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
from lcfs.db.models.compliance.ComplianceReportCountView import (
ComplianceReportCountView,
)
from lcfs.db.models.fuel.FuelCodeCountView import FuelCodeCountView

logger = structlog.get_logger(__name__)

Expand Down Expand Up @@ -89,3 +90,16 @@ async def get_compliance_report_counts(self):
return {
"pending_reviews": row.pending_reviews
}

@repo_handler
async def get_fuel_code_counts(self):
query = select(
FuelCodeCountView.count
).where(FuelCodeCountView.status == "Draft")

result = await self.db.execute(query)
row = result.fetchone()

return {
"draft_fuel_codes": getattr(row, "count", 0)
}
4 changes: 4 additions & 0 deletions backend/lcfs/web/api/dashboard/schema.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,3 +26,7 @@ class OrgComplianceReportCountsSchema(BaseSchema):

class ComplianceReportCountsSchema(BaseSchema):
pending_reviews: int = Field(default=0)


class FuelCodeCountsSchema(BaseSchema):
draft_fuel_codes: int = Field(default=0)
13 changes: 12 additions & 1 deletion backend/lcfs/web/api/dashboard/services.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,8 @@
TransactionCountsSchema,
OrganizarionTransactionCountsSchema,
OrgComplianceReportCountsSchema,
ComplianceReportCountsSchema
ComplianceReportCountsSchema,
FuelCodeCountsSchema
)

logger = structlog.get_logger(__name__)
Expand Down Expand Up @@ -66,3 +67,13 @@ async def get_compliance_report_counts(
return ComplianceReportCountsSchema(
pending_reviews=counts.get("pending_reviews", 0)
)

@service_handler
async def get_fuel_code_counts(
self
) -> FuelCodeCountsSchema:
counts = await self.repo.get_fuel_code_counts()

return FuelCodeCountsSchema(
draft_fuel_codes=counts.get("draft_fuel_codes", 0)
)
Loading

0 comments on commit 0ddfee4

Please sign in to comment.