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

[STTNHUB-207] fix(agenda): Use versioncreated for displaying updated datetime #934

Merged
merged 1 commit into from
Jun 6, 2024
Merged
Show file tree
Hide file tree
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
61 changes: 31 additions & 30 deletions assets/agenda/components/AgendaItemTimeUpdater.tsx
Original file line number Diff line number Diff line change
@@ -1,18 +1,24 @@
import React from 'react';
import PropTypes from 'prop-types';
import moment from 'moment';
import {get} from 'lodash';
import classNames from 'classnames';

import {IAgendaItem} from 'interfaces';
import {bem} from 'ui/utils';
import {gettext} from 'utils';

class AgendaItemTimeUpdater extends React.Component<any, any> {
static propTypes: any;
static defaultProps: any;
interface IProps {
item: IAgendaItem;
borderRight?: boolean;
alignCenter?: boolean;
}

interface IState {
timeText: string;
}

class AgendaItemTimeUpdater extends React.Component<IProps, IState> {
interval: number;
timerIntervalId: any;
timerIntervalId: number;

constructor(props: any) {
super(props);
Expand All @@ -24,22 +30,24 @@ class AgendaItemTimeUpdater extends React.Component<any, any> {
this.updateState = this.updateState.bind(this);
}

componentWillMount() {
componentDidMount() {
this.activateTimer(this.props.item);
}

componentWillReceiveProps(nextProps: any) {
if (get(this.props, 'item._created') !== get(nextProps, 'item._created') ||
get(this.props, 'item._updated') !== get(nextProps, 'item._updated')) {
this.activateTimer(nextProps.item);
componentDidUpdate(prevProps: Readonly<IProps>) {
if (
this.props.item._created !== prevProps.item._created ||
this.props.item._updated !== prevProps.item._updated
) {
this.activateTimer(this.props.item);
}
}

componentWillUnmount() {
this.deactivateTimer();
}

activateTimer(item: any) {
activateTimer(item: IAgendaItem) {
// Deactivate if a timer already exits
this.deactivateTimer();

Expand All @@ -51,7 +59,7 @@ class AgendaItemTimeUpdater extends React.Component<any, any> {
this.updateState(item, false);

// timer set for minute interval
this.timerIntervalId = setInterval(this.updateState, 60000, item);
this.timerIntervalId = window.setInterval(this.updateState, 60000, item);
}

deactivateTimer() {
Expand All @@ -67,14 +75,14 @@ class AgendaItemTimeUpdater extends React.Component<any, any> {
moment().diff(moment(item._updated), 'minutes') >= this.interval);
}

updateState(item: any, checkPastTime: any = true) {
updateState(item: IAgendaItem, checkPastTime = true) {
if (checkPastTime && this.isItemPastTime(item)) {
this.deactivateTimer();
return;
}

const created = moment(item._created);
const updated = moment(item._updated);
const created = moment(item.firstcreated);
const updated = moment(item.versioncreated);
const createdDiff = moment().diff(created, 'minutes');
const updatedDiff = moment().diff(updated, 'minutes');

Expand All @@ -97,13 +105,17 @@ class AgendaItemTimeUpdater extends React.Component<any, any> {
}

render() {
if (get(this.state.timeText, 'length', 0) <= 0) {
if (this.state.timeText.length === 0) {
return null;
}

const className = classNames(
bem('wire-articles__item', 'meta-time', {'border-right': this.props.borderRight}),
{'align-self-center': this.props.alignCenter}
bem(
'wire-articles__item',
'meta-time',
{'border-right': this.props.borderRight === true}
),
{'align-self-center': this.props.alignCenter === true}
);

return(
Expand All @@ -114,15 +126,4 @@ class AgendaItemTimeUpdater extends React.Component<any, any> {
}
}

AgendaItemTimeUpdater.propTypes = {
item: PropTypes.object,
borderRight: PropTypes.bool,
alignCenter: PropTypes.bool,
};

AgendaItemTimeUpdater.defaultProps = {
alignCenter: false,
borderRight: false,
};

export default AgendaItemTimeUpdater;
13 changes: 13 additions & 0 deletions assets/agenda/tests/utils.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ const createEvent = (id: string, dates: IAgendaItem['dates']): IAgendaItem => ({
state: 'scheduled',
_created: '2023-11-16T04:00:00+0000',
_updated: '2023-11-16T04:00:00+0000',
firstcreated: '2023-11-16T04:00:00+0000',
versioncreated: '2023-11-16T04:00:00+0000',
_etag: 'etag',
event: {_id: id},
Expand All @@ -35,6 +36,7 @@ describe('utils', () => {
state: 'scheduled',
_created: '2023-11-16T04:00:00+0000',
_updated: '2023-11-16T04:00:00+0000',
firstcreated: '2023-11-16T04:00:00+0000',
versioncreated: '2023-11-16T04:00:00+0000',
_etag: 'etag123',
dates: {start: '2018-10-15T04:00:00+0000', end: '2018-10-15T05:00:00+0000', tz: 'Australia/Sydney'},
Expand All @@ -48,6 +50,7 @@ describe('utils', () => {
state: 'scheduled',
_created: '2023-11-16T04:00:00+0000',
_updated: '2023-11-16T04:00:00+0000',
firstcreated: '2023-11-16T04:00:00+0000',
versioncreated: '2023-11-16T04:00:00+0000',
_etag: 'etag123',
dates: {start: '2018-10-18T06:00:00+0000', end: '2018-10-18T09:00:00+0000', tz: 'Australia/Sydney'},
Expand Down Expand Up @@ -75,6 +78,7 @@ describe('utils', () => {
state: 'scheduled',
_created: '2023-11-16T04:00:00+0000',
_updated: '2023-11-16T04:00:00+0000',
firstcreated: '2023-11-16T04:00:00+0000',
versioncreated: '2023-11-16T04:00:00+0000',
_etag: 'etag123',
dates: {start: '2018-10-15T04:00:00+0000', end: '2018-10-17T05:00:00+0000', tz: 'Australia/Sydney'},
Expand All @@ -88,6 +92,7 @@ describe('utils', () => {
state: 'scheduled',
_created: '2023-11-16T04:00:00+0000',
_updated: '2023-11-16T04:00:00+0000',
firstcreated: '2023-11-16T04:00:00+0000',
versioncreated: '2023-11-16T04:00:00+0000',
_etag: 'etag123',
dates: {start: '2018-10-17T06:00:00+0000', end: '2018-10-18T09:00:00+0000', tz: 'Australia/Sydney'},
Expand Down Expand Up @@ -115,6 +120,7 @@ describe('utils', () => {
state: 'scheduled',
_created: '2023-11-16T04:00:00+0000',
_updated: '2023-11-16T04:00:00+0000',
firstcreated: '2023-11-16T04:00:00+0000',
versioncreated: '2023-11-16T04:00:00+0000',
_etag: 'etag123',
dates: {start: '2018-10-15T04:00:00+0000', end: '2018-10-17T05:00:00+0000', tz: 'Australia/Sydney'},
Expand Down Expand Up @@ -144,6 +150,7 @@ describe('utils', () => {
state: 'scheduled',
_created: '2023-11-16T04:00:00+0000',
_updated: '2023-11-16T04:00:00+0000',
firstcreated: '2023-11-16T04:00:00+0000',
versioncreated: '2023-11-16T04:00:00+0000',
_etag: 'etag123',
dates: {start: '2018-10-17T04:00:00+0000', end: '2018-10-17T04:00:00+0000'},
Expand Down Expand Up @@ -175,6 +182,7 @@ describe('utils', () => {
state: 'scheduled',
_created: '2023-11-16T04:00:00+0000',
_updated: '2023-11-16T04:00:00+0000',
firstcreated: '2023-11-16T04:00:00+0000',
versioncreated: '2023-11-16T04:00:00+0000',
_etag: 'etag123',
dates: {start: '2018-10-17T04:00:00+0000', end: '2018-10-17T04:00:00+0000'},
Expand Down Expand Up @@ -202,6 +210,7 @@ describe('utils', () => {
state: 'scheduled',
_created: '2023-11-16T04:00:00+0000',
_updated: '2023-11-16T04:00:00+0000',
firstcreated: '2023-11-16T04:00:00+0000',
versioncreated: '2023-11-16T04:00:00+0000',
_etag: 'etag123',
dates: {start: '2018-10-15T04:00:00+0000', end: '2018-10-15T05:00:00+0000', tz: 'Australia/Sydney'},
Expand Down Expand Up @@ -245,6 +254,7 @@ describe('utils', () => {
state: 'scheduled',
_created: '2023-11-16T04:00:00+0000',
_updated: '2023-11-16T04:00:00+0000',
firstcreated: '2023-11-16T04:00:00+0000',
versioncreated: '2023-11-16T04:00:00+0000',
_etag: 'etag123',
'planning_date': '2018-10-15T04:30:00+0000',
Expand Down Expand Up @@ -278,6 +288,7 @@ describe('utils', () => {
state: 'scheduled',
_created: '2023-11-16T04:00:00+0000',
_updated: '2023-11-16T04:00:00+0000',
firstcreated: '2023-11-16T04:00:00+0000',
versioncreated: '2023-11-16T04:00:00+0000',
_etag: 'etag123',
'planning_date': '2018-10-15T04:30:00+0000',
Expand Down Expand Up @@ -329,6 +340,7 @@ describe('utils', () => {
state: 'scheduled',
_created: '2023-11-16T04:00:00+0000',
_updated: '2023-11-16T04:00:00+0000',
firstcreated: '2023-11-16T04:00:00+0000',
versioncreated: '2023-11-16T04:00:00+0000',
_etag: 'etag123',
dates: {start: '2018-10-15T04:00:00+0000', end: '2018-10-15T05:00:00+0000', tz: 'Australia/Sydney'},
Expand All @@ -346,6 +358,7 @@ describe('utils', () => {
state: 'scheduled',
_created: '2023-11-16T04:00:00+0000',
_updated: '2023-11-16T04:00:00+0000',
firstcreated: '2023-11-16T04:00:00+0000',
versioncreated: '2023-11-16T04:00:00+0000',
_etag: 'etag123',
}
Expand Down
1 change: 1 addition & 0 deletions assets/interfaces/agenda.ts
Original file line number Diff line number Diff line change
Expand Up @@ -221,6 +221,7 @@ export interface IAgendaItem extends IResourceItem {
subject?: Array<ISubject>;
ednote?: string;
state_reason?: string;
firstcreated: string;
versioncreated: string;
internal_note?: string;
}
Expand Down
14 changes: 12 additions & 2 deletions newsroom/push.py
Original file line number Diff line number Diff line change
Expand Up @@ -505,6 +505,9 @@ def set_agenda_metadata_from_planning(agenda, planning_item, force_adhoc=False):
if not plan:
new_plan = True

agenda_versioncreated: datetime = agenda["versioncreated"]
plan_versioncreated: datetime = parse_date_str(planning_item.get("versioncreated")) or agenda_versioncreated

plan["_id"] = planning_item.get("_id") or planning_item.get("guid")
plan["guid"] = planning_item.get("guid")
plan["slugline"] = planning_item.get("slugline")
Expand All @@ -520,8 +523,8 @@ def set_agenda_metadata_from_planning(agenda, planning_item, force_adhoc=False):
plan["coverages"] = planning_item.get("coverages") or []
plan["ednote"] = planning_item.get("ednote")
plan["internal_note"] = planning_item.get("internal_note")
plan["versioncreated"] = parse_date_str(planning_item.get("versioncreated"))
plan["firstcreated"] = parse_date_str(planning_item.get("firstcreated"))
plan["versioncreated"] = plan_versioncreated
plan["firstcreated"] = parse_date_str(planning_item.get("firstcreated")) or agenda["firstcreated"]
plan["state"] = planning_item.get("state")
plan["state_reason"] = planning_item.get("state_reason")
plan["products"] = planning_item.get("products")
Expand All @@ -533,6 +536,13 @@ def set_agenda_metadata_from_planning(agenda, planning_item, force_adhoc=False):
if new_plan:
agenda["planning_items"].append(plan)

# Update the versioncreated datetime from Planning item if it's newer than the parent item
try:
if plan_versioncreated > agenda_versioncreated:
agenda["versioncreated"] = plan_versioncreated
except (KeyError, TypeError):
pass

return new_plan


Expand Down
11 changes: 5 additions & 6 deletions newsroom/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -150,16 +150,15 @@ def get_type(type: Optional[str] = None) -> str:
return types[item_type]


def parse_date_str(date):
if date and isinstance(date, str):
return parse_date(date)
return date
def parse_date_str(date: Union[str, datetime]) -> datetime:
return parse_date(date) if isinstance(date, str) else date


def parse_dates(item):
for field in ["firstcreated", "versioncreated", "embargoed"]:
if parse_date_str(item.get(field)):
item[field] = parse_date_str(item[field])
datetime_value = parse_date_str(item.get(field))
if datetime_value is not None:
item[field] = datetime_value


def get_entity_dict(items, str_id=False):
Expand Down
Loading