Skip to content

Commit

Permalink
fix error when ingesting cancelled event with assignments (#2093)
Browse files Browse the repository at this point in the history
it was checking session data which failed during ingest

STTNHUB-361
  • Loading branch information
petrjasek authored Sep 19, 2024
1 parent a7d1a96 commit 587f5af
Show file tree
Hide file tree
Showing 8 changed files with 67 additions and 23 deletions.
2 changes: 1 addition & 1 deletion server/planning/assignments/assignments.py
Original file line number Diff line number Diff line change
Expand Up @@ -1195,7 +1195,7 @@ def on_delete(self, doc):
"""
Validate that we have a lock on the Assignment and it's associated Planning item
"""
if doc.get("_to_delete") is True:
if doc.get("_to_delete") is True or not request:
# Already marked for delete - no validation needed (could be the background job)
return

Expand Down
2 changes: 1 addition & 1 deletion server/planning/commands/populate_planning_types_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
import os
import json

from superdesk.tests import TestCase
from planning.tests import TestCase
from superdesk import get_resource_service
from apps.prepopulate.app_populate import AppPopulateCommand

Expand Down
35 changes: 18 additions & 17 deletions server/planning/planning/planning.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
import logging
from datetime import datetime

from flask import json, current_app as app
from flask import json, current_app as app, request
from eve.methods.common import resolve_document_etag

import superdesk
Expand Down Expand Up @@ -1274,23 +1274,24 @@ def delete_assignments_for_coverages(self, coverages, notify=True):
if original_assigment:
assignment_service.system_update(ObjectId(assign_id), {"_to_delete": True}, original_assigment)

session_id = get_auth().get("_id")
user_id = get_user().get(config.ID_FIELD)
if len(deleted_assignments) > 0:
push_notification(
"assignments:delete",
items=deleted_assignments,
session=session_id,
user=user_id,
)
if request:
session_id = get_auth().get("_id")
user_id = get_user().get(config.ID_FIELD)
if len(deleted_assignments) > 0:
push_notification(
"assignments:delete",
items=deleted_assignments,
session=session_id,
user=user_id,
)

if len(failed_assignments) > 0 and notify:
push_notification(
"assignments:delete:fail",
items=failed_assignments,
session=session_id,
user=user_id,
)
if len(failed_assignments) > 0 and notify:
push_notification(
"assignments:delete:fail",
items=failed_assignments,
session=session_id,
user=user_id,
)

def get_expired_items(self, expiry_datetime, spiked_planning_only=False):
"""Get the expired items
Expand Down
2 changes: 2 additions & 0 deletions server/planning/tests/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@


class TestCase(_TestCase):
test_context = None # avoid using test_request_context

def setUp(self):
config = {"INSTALLED_APPS": ["planning"]}
update_config(config)
Expand Down
36 changes: 36 additions & 0 deletions server/planning/tests/ingest_cancelled_test.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
from flask import request
from planning.tests import TestCase
from planning.common import update_post_item


class IngestCancelledTestCase(TestCase):
def test_ingest_cancelled_event(self):
assert not request, request

assignments = [
{"planning_item": "p1", "coverage_item": "c1"},
]

self.app.data.insert("assignments", assignments)
planning = {
"_id": "p1",
"name": "planning item",
"type": "planning",
"coverages": [
{
"coverage_id": "c1",
"planning": {},
"assigned_to": {
"assignment_id": assignments[0]["_id"],
},
},
],
}

self.app.data.insert("planning", [planning])

with self.app.app_context():
update_post_item({"pubstatus": "cancelled"}, planning)

cursor, count = self.app.data.find("assignments", req=None, lookup={})
assert count == 0
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
from unittest import mock
import hmac

from superdesk.tests import TestCase
from planning.tests import TestCase
from superdesk.publish import TransmitterFileEntry
from superdesk.publish.transmitters.ftp import FTPPublishService
from superdesk.publish.transmitters.http_push import HTTPPushService
Expand Down
2 changes: 1 addition & 1 deletion server/planning/tests/output_formatters/json_event_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
import tempfile

from unittest import mock
from superdesk.tests import TestCase
from planning.tests import TestCase
from planning.output_formatters.json_event import JsonEventFormatter
from planning.events import init_app
from eve.methods.common import store_media_files
Expand Down
9 changes: 7 additions & 2 deletions server/planning/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
from datetime import datetime
from flask_babel import lazy_gettext
from eve.utils import str_to_date
from superdesk.utc import utc_to_local
import arrow
from flask import current_app as app
import pytz
Expand Down Expand Up @@ -67,14 +68,18 @@ def parse_date(datetime: Union[str, datetime]) -> datetime:
return datetime


def local_date(datetime: datetime, tz: pytz.BaseTzInfo) -> datetime:
return tz.normalize(parse_date(datetime).replace(tzinfo=pytz.utc).astimezone(tz))


def time_short(datetime: datetime, tz: pytz.BaseTzInfo):
if datetime:
return parse_date(datetime).astimezone(tz).strftime(app.config.get("TIME_FORMAT_SHORT", "%H:%M"))
return local_date(datetime, tz).strftime(app.config.get("TIME_FORMAT_SHORT", "%H:%M"))


def date_short(datetime: datetime, tz: pytz.BaseTzInfo):
if datetime:
return parse_date(datetime).astimezone(tz).strftime(app.config.get("DATE_FORMAT_SHORT", "%d/%m/%Y"))
return local_date(datetime, tz).strftime(app.config.get("DATE_FORMAT_SHORT", "%d/%m/%Y"))


def get_event_formatted_dates(event: Dict[str, Any]) -> str:
Expand Down

0 comments on commit 587f5af

Please sign in to comment.