in gnm_deliverables/views/metadata_views.py [0:0]
def post(self, request, project_id, asset_id, platform:str):
"""
receives a log update and saves it.
expects a JSON body in the format { "sender": "sender-name",
"log": "log-line",
"completed":true/false/absent,
"failed":true/false/absent,
"uploadedUrl":"url" [optional, ignored unless completed=true and failed=false/absent]
}.
logs are timestamped as they arrive
:param request:
:param project_id:
:param asset_id:
:param platform:
:return:
"""
try:
asset = DeliverableAsset.objects.get(pk=asset_id)
newentry = LogEntry(
timestamp=get_current_time(),
sender=request.data["sender"],
log_line=request.data["log"]
)
did_fail = False
did_succeed = False
asset_needs_save = False
logger.debug("Received CDS update: {0}".format(request.data))
if "completed" in request.data and request.data["completed"]:
if "failed" in request.data and request.data["failed"]:
did_fail = True
else:
did_succeed = True
lcplatform = platform.lower()
if lcplatform=="dailymotion":
if asset.DailyMotion_master is None:
logger.error("Received daily motion syndication progress for {0} but no DN record exists on this asset".format(asset_id))
return Response({"status": "invalid_target","detail":"no daily motion metadata to update"}, status=404)
related_id = asset.DailyMotion_master_id
newentry.related_daily_motion = asset.DailyMotion_master
if not did_fail and not did_succeed:
if asset.DailyMotion_master.upload_status!='Uploading':
asset.DailyMotion_master.upload_status = 'Uploading'
asset.DailyMotion_master.save()
elif did_fail:
asset.DailyMotion_master.upload_status='Upload Failed'
asset.DailyMotion_master.save()
elif did_succeed:
asset.DailyMotion_master.upload_status='Upload Complete'
asset.DailyMotion_master.publication_date = get_current_time()
if "uploadedUrl" in request.data:
asset.DailyMotion_master.daily_motion_url = request.data["uploadedUrl"]
asset.DailyMotion_master.save()
elif lcplatform=="mainstream":
if asset.mainstream_master is None:
logger.error("Received Mainstream syndication progress for {0} but no MS record exists on this asset".format(asset_id))
return Response({"status": "invalid_target","detail":"no MS metadata to update"}, status=404)
related_id = asset.mainstream_master_id
newentry.related_mainstream = asset.mainstream_master
if not did_fail and not did_succeed:
if asset.mainstream_master.upload_status!='Uploading':
asset.mainstream_master.upload_status = 'Uploading'
asset.mainstream_master.save()
elif did_fail:
asset.mainstream_master.upload_status='Upload Failed'
asset.mainstream_master.save()
elif did_succeed:
asset.mainstream_master.upload_status='Upload Complete'
asset.mainstream_master.publication_date = get_current_time()
asset.mainstream_master.save()
else:
return Response({"status":"bad_request","detail":"platform not recognised or does not support log entries"}, status=400)
if related_id is None:
return Response({"status":"bad_request","detail":"no syndication data for this platform on this id"}, status=400)
else:
newentry.save()
return Response({"status":"ok"},status=200)
except KeyError as e:
logger.error("Invalid log updated for {0} {1}: missing key {2}".format(platform, asset_id, str(e)))
return Response({"status":"bad_request","detail":"{0}: field missing".format(e)},status=400)
except DeliverableAsset.DoesNotExist:
return Response({"status":"notfound","detail":"no deliverable asset matching id"},status=404)