Skip to content
Merged
Show file tree
Hide file tree
Changes from 6 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
21 changes: 21 additions & 0 deletions CHANGELOG.MD
Original file line number Diff line number Diff line change
@@ -1,3 +1,24 @@
## May 25, 2026

- **Feature** Added start/end time to engagement period in engagement configuration. [🎟️ DEP-272](https://citz-gdx.atlassian.net/browse/DEP-272)
- Added time input components to existing date picker component
- Added accurate times to form state where start/end dates are not modifiable
- Updated single engagement config view component to show correct date/time
- Modified revalidation perameters to show up to date information directly after updating engagement
- Made sure dates are stored in UTC but displayed in local pacific time
- Modified API logic for Engagement.submissionStatus so that it sets to open/closed at expected times
- Aligned all dates that were previously being stored as pacific to UTC
- Updated common time conversion functions for readability
- Made some small visual updates
- Updated some CSS for our "under construction" component
- Updated auto breadcrumbs component for increased visual stability (less flickering)
- Updated authoring section for greater visual stability (less flickering)
- Moved header items (badge and breadcrumbs) out of AuthoringTemplate component, which is forced to re-render because it's keyed
- Utilized useDefferedValue in bottom nav component for language list

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Suggested change
- Utilized useDefferedValue in bottom nav component for language list
- Utilized useDeferredValue in bottom nav component for language list

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Good catch! I always mix up the double consonant in this word.

- Removed several async/await components that were causing flickering
- Utilized useParams instead of waiting on engagement values in some cases
- Allowed modifying of engagement config while it's scheduled but not published

## May 7, 2026

- **Feature** Updated/added links to BC Gov logo in header/footer. [🎟️ DEP-271](https://citz-gdx.atlassian.net/browse/DEP-271)
Expand Down
97 changes: 49 additions & 48 deletions api/migrations/versions/37176ea4708d_data_until_feb_09_2024.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,10 @@
import sqlalchemy as sa
from sqlalchemy.sql import table, column
from sqlalchemy import String, Integer, DateTime, Boolean, Text
from datetime import datetime
from flask import current_app

from api.utils.datetime import utc_now

# revision identifiers, used by Alembic.
revision = '37176ea4708d'
down_revision = 'ec0128056a33'
Expand Down Expand Up @@ -49,7 +50,7 @@ def upgrade():
'description': current_app.config.get(
'DEFAULT_TENANT_DESCRIPTION'
),
'created_date': datetime.utcnow(),
'created_date': utc_now(),
}
]

Expand All @@ -74,15 +75,15 @@ def upgrade():
'id': 1,
'status_name': 'ACTIVE',
'description': 'Active User',
'created_date': datetime.utcnow(),
'updated_date': datetime.utcnow(),
'created_date': utc_now(),
'updated_date': utc_now(),
},
{
'id': 2,
'status_name': 'INACTIVE',
'description': 'Inactive User',
'created_date': datetime.utcnow(),
'updated_date': datetime.utcnow(),
'created_date': utc_now(),
'updated_date': utc_now(),
},
]

Expand Down Expand Up @@ -117,8 +118,8 @@ def upgrade():
'status_id': 1,
'contact_number': '1',
'tenant_id': tenant_id,
'created_date': datetime.utcnow(),
'updated_date': datetime.utcnow(),
'created_date': utc_now(),
'updated_date': utc_now(),
}

# Perform insert with sample data
Expand Down Expand Up @@ -191,8 +192,8 @@ def upgrade():
]

for widget in widget_data:
widget['created_date'] = datetime.utcnow()
widget['updated_date'] = datetime.utcnow()
widget['created_date'] = utc_now()
widget['updated_date'] = utc_now()

# Perform bulk insert in a single operation
op.bulk_insert(widget_type_table, widget_data)
Expand Down Expand Up @@ -296,8 +297,8 @@ def upgrade():
]

for taxa in taxa_data:
taxa['created_date'] = datetime.utcnow()
taxa['updated_date'] = datetime.utcnow()
taxa['created_date'] = utc_now()
taxa['updated_date'] = utc_now()

# Perform bulk insert
op.bulk_insert(engagement_metadata_taxa_table, taxa_data)
Expand All @@ -320,22 +321,22 @@ def upgrade():
'id': 1,
'name': 'comment_sheet',
'description': 'Comments export for staff',
'created_date': datetime.utcnow(),
'updated_date': datetime.utcnow(),
'created_date': utc_now(),
'updated_date': utc_now(),
},
{
'id': 2,
'name': 'cac_form_sheet',
'description': 'cac form submission export for staff',
'created_date': datetime.utcnow(),
'updated_date': datetime.utcnow(),
'created_date': utc_now(),
'updated_date': utc_now(),
},
{
'id': 3,
'name': 'proponent_comments_sheet',
'description': 'Comments export for proponent',
'created_date': datetime.utcnow(),
'updated_date': datetime.utcnow(),
'created_date': utc_now(),
'updated_date': utc_now(),
},
]

Expand All @@ -362,24 +363,24 @@ def upgrade():
'type_id': 1,
'hash_code': None,
'extension': 'xlsx',
'created_date': datetime.utcnow(),
'updated_date': datetime.utcnow(),
'created_date': utc_now(),
'updated_date': utc_now(),
},
{
'id': 2,
'type_id': 2,
'hash_code': None,
'extension': 'xlsx',
'created_date': datetime.utcnow(),
'updated_date': datetime.utcnow(),
'created_date': utc_now(),
'updated_date': utc_now(),
},
{
'id': 3,
'type_id': 3,
'hash_code': None,
'extension': 'xlsx',
'created_date': datetime.utcnow(),
'updated_date': datetime.utcnow(),
'created_date': utc_now(),
'updated_date': utc_now(),
},
]

Expand All @@ -404,36 +405,36 @@ def upgrade():
'id': 1,
'status_name': 'Draft',
'description': 'Not ready to the public',
'created_date': datetime.utcnow(),
'updated_date': datetime.utcnow(),
'created_date': utc_now(),
'updated_date': utc_now(),
},
{
'id': 2,
'status_name': 'Published',
'description': 'Visible to the public',
'created_date': datetime.utcnow(),
'updated_date': datetime.utcnow(),
'created_date': utc_now(),
'updated_date': utc_now(),
},
{
'id': 3,
'status_name': 'Closed',
'description': 'The engagement period is over',
'created_date': datetime.utcnow(),
'updated_date': datetime.utcnow(),
'created_date': utc_now(),
'updated_date': utc_now(),
},
{
'id': 4,
'status_name': 'Scheduled',
'description': 'Scheduled to be published',
'created_date': datetime.utcnow(),
'updated_date': datetime.utcnow(),
'created_date': utc_now(),
'updated_date': utc_now(),
},
{
'id': 5,
'status_name': 'Unpublished',
'description': 'Unpublished and hidden',
'created_date': datetime.utcnow(),
'updated_date': datetime.utcnow(),
'created_date': utc_now(),
'updated_date': utc_now(),
},
]

Expand All @@ -458,29 +459,29 @@ def upgrade():
'id': 1,
'status_name': 'Pending',
'description': 'Comment is pending review',
'created_date': datetime.utcnow(),
'updated_date': datetime.utcnow(),
'created_date': utc_now(),
'updated_date': utc_now(),
},
{
'id': 2,
'status_name': 'Approved',
'description': 'Comment is accepted for public view',
'created_date': datetime.utcnow(),
'updated_date': datetime.utcnow(),
'created_date': utc_now(),
'updated_date': utc_now(),
},
{
'id': 3,
'status_name': 'Rejected',
'description': 'Comment is rejected and not shown',
'created_date': datetime.utcnow(),
'updated_date': datetime.utcnow(),
'created_date': utc_now(),
'updated_date': utc_now(),
},
{
'id': 4,
'status_name': 'Needs further review',
'description': 'Comment needs further review',
'created_date': datetime.utcnow(),
'updated_date': datetime.utcnow(),
'created_date': utc_now(),
'updated_date': utc_now(),
},
]

Expand All @@ -505,22 +506,22 @@ def upgrade():
'id': 1,
'status_name': 'ACTIVE',
'description': 'Active Membership',
'created_date': datetime.utcnow(),
'updated_date': datetime.utcnow(),
'created_date': utc_now(),
'updated_date': utc_now(),
},
{
'id': 2,
'status_name': 'INACTIVE',
'description': 'Inactive Membership',
'created_date': datetime.utcnow(),
'updated_date': datetime.utcnow(),
'created_date': utc_now(),
'updated_date': utc_now(),
},
{
'id': 3,
'status_name': 'REVOKED',
'description': 'Revoked Membership',
'created_date': datetime.utcnow(),
'updated_date': datetime.utcnow(),
'created_date': utc_now(),
'updated_date': utc_now(),
},
]

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@
from sqlalchemy import String, Integer, DateTime
from datetime import datetime

from api.utils.datetime import utc_now


# revision identifiers, used by Alembic.
revision = '614b5376f19c'
Expand Down Expand Up @@ -86,8 +88,8 @@ def upgrade():
{'id': 4, 'name': 'VIEWER'},
]
for group in group_data:
group['created_date'] = datetime.utcnow()
group['updated_date'] = datetime.utcnow()
group['created_date'] = utc_now()
group['updated_date'] = utc_now()
# Perform bulk insert in a single operation
op.bulk_insert(group_table, group_data)

Expand Down Expand Up @@ -291,8 +293,8 @@ def upgrade():
},
]
for role in role_data:
role['created_date'] = datetime.utcnow()
role['updated_date'] = datetime.utcnow()
role['created_date'] = utc_now()
role['updated_date'] = utc_now()
# Perform bulk insert in a single operation
op.bulk_insert(role_table, role_data)

Expand Down Expand Up @@ -370,8 +372,8 @@ def upgrade():
{'id': 59, 'role_id': 37, 'group_id': 4},
]
for group_role_mapping in group_role_mapping_data:
group_role_mapping['created_date'] = datetime.utcnow()
group_role_mapping['updated_date'] = datetime.utcnow()
group_role_mapping['created_date'] = utc_now()
group_role_mapping['updated_date'] = utc_now()
# Perform bulk insert in a single operation
op.bulk_insert(group_role_mapping_table, group_role_mapping_data)

Expand Down
8 changes: 5 additions & 3 deletions api/src/api/models/base_model.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,13 +12,15 @@
# See the License for the specific language governing permissions and
# limitations under the License.
"""Super class to handle all operations related to base model."""
from datetime import datetime

from flask import g
from sqlalchemy import Column
from sqlalchemy.ext.declarative import declared_attr

from api.utils.datetime import utc_datetime

from .db import db

TENANT_ID = 'tenant_id'


Expand All @@ -27,8 +29,8 @@ class BaseModel(db.Model):

__abstract__ = True

created_date = db.Column(db.DateTime, default=datetime.utcnow, nullable=False)
updated_date = db.Column(db.DateTime, default=datetime.utcnow, onupdate=datetime.utcnow, nullable=True)
created_date = db.Column(db.DateTime, default=utc_datetime, nullable=False)
updated_date = db.Column(db.DateTime, default=utc_datetime, onupdate=utc_datetime, nullable=True)

@declared_attr
def created_by(cls): # pylint:disable=no-self-argument, # noqa: N805
Expand Down
8 changes: 4 additions & 4 deletions api/src/api/models/comment.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
Manages the comment
"""
from __future__ import annotations
from datetime import datetime
from operator import or_

from sqlalchemy import and_, asc, desc
Expand All @@ -12,6 +11,7 @@
from sqlalchemy.sql.schema import ForeignKey
from sqlalchemy.ext.hybrid import hybrid_property

from api.utils.datetime import utc_now
from api.constants.comment_status import Status as CommentStatus
from api.constants.engagement_status import Status as EngagementStatus
from api.models.pagination_options import PaginationOptions
Expand Down Expand Up @@ -163,8 +163,8 @@ def __create_new_comment_entity(comment: CommentSchema):
"""Create new comment entity."""
return Comment(
text=comment.get('text', None),
submission_date=datetime.utcnow(),
created_date=datetime.utcnow(),
submission_date=utc_now(),
created_date=utc_now(),
created_by=comment.get('participant_id', None),
survey_id=comment.get('survey_id', None),
participant_id=comment.get('participant_id', None),
Expand Down Expand Up @@ -211,7 +211,7 @@ def update(cls, submission_id, comment: CommentSchema, session=None) -> Comment:
update_fields = {
'text': comment.get('text', None),
'updated_by': comment.get('participant_id', None),
'updated_date': datetime.utcnow(),
'updated_date': utc_now(),
}

query.update(update_fields)
Expand Down
Loading