def publish_item(doc): """Duplicating the logic from content_api.publish service.""" now = utcnow() parse_dates(doc) doc.setdefault('firstcreated', now) doc.setdefault('versioncreated', now) doc.setdefault(app.config['VERSION'], 1) doc.setdefault('wordcount', get_word_count(doc.get('body_html', ''))) service = superdesk.get_resource_service('content_api') if 'evolvedfrom' in doc: parent_item = service.find_one(req=None, _id=doc['evolvedfrom']) if parent_item: doc['ancestors'] = copy(parent_item.get('ancestors', [])) doc['ancestors'].append(doc['evolvedfrom']) doc['bookmarks'] = parent_item.get('bookmarks', []) else: logger.warning("Failed to find evolvedfrom item %s for %s", doc['evolvedfrom'], doc['guid']) fix_hrefs(doc) logger.info('publishing %s', doc['guid']) for assoc in doc.get('associations', {}).values(): if assoc: assoc.setdefault('subscribers', []) if doc.get('associations', {}).get('featuremedia'): generate_thumbnails(doc) _id = service.create([doc])[0] if 'evolvedfrom' in doc and parent_item: service.system_update(parent_item['_id'], {'nextversion': _id}, parent_item) return _id
def set_dates(doc): now = utcnow() parse_dates(doc) doc.setdefault('firstcreated', now) doc.setdefault('versioncreated', now) doc.setdefault('version', 1) doc.setdefault(app.config['VERSION'], 1)
def set_agenda_metadata_from_event(agenda, event): """ Sets agenda metadata from a given event """ parse_dates(event) # setting _id of agenda to be equal to event agenda.setdefault('_id', event['guid']) agenda['guid'] = event['guid'] agenda['event_id'] = event['guid'] agenda['recurrence_id'] = event.get('recurrence_id') agenda['name'] = event.get('name') agenda['slugline'] = event.get('slugline', agenda.get('slugline')) agenda['definition_short'] = event.get('definition_short') agenda['definition_long'] = event.get('definition_long') agenda['version'] = event.get('version') agenda['calendars'] = event.get('calendars') agenda['location'] = event.get('location') agenda['ednote'] = event.get('ednote', agenda.get('ednote')) agenda['state'] = event.get('state') agenda['place'] = event.get('place') agenda['subject'] = event.get('subject') agenda['products'] = event.get('products') # only set service if available service = format_qcode_items(event.get('anpa_category')) if service: agenda['service'] = service agenda['event'] = event set_dates(agenda)
def download(_ids): user = get_user(required=True) _format = flask.request.args.get('format', 'text') item_type = get_type() items = [get_entity_or_404(_id, item_type) for _id in _ids.split(',')] _file = io.BytesIO() formatter = app.download_formatters[_format]['formatter'] mimetype = None attachment_filename = '%s-newsroom.zip' % utcnow().strftime('%Y%m%d%H%M') if len(items) == 1: item = items[0] parse_dates(item) # fix for old items _file.write(formatter.format_item(item, item_type=item_type)) _file.seek(0) mimetype = formatter.get_mimetype(item) attachment_filename = secure_filename(formatter.format_filename(item)) else: with zipfile.ZipFile(_file, mode='w') as zf: for item in items: parse_dates(item) # fix for old items zf.writestr(secure_filename(formatter.format_filename(item)), formatter.format_item(item, item_type=item_type)) _file.seek(0) update_action_list(_ids.split(','), 'downloads', force_insert=True) app.data.insert('history', items, action='download', user=user, section=request.args.get('type', 'wire')) return flask.send_file(_file, mimetype=mimetype, attachment_filename=attachment_filename, as_attachment=True)
def set_agenda_metadata_from_planning(agenda, planning_item): """Sets agenda metadata from a given planning""" parse_dates(planning_item) set_dates(agenda) if not planning_item.get('event_item'): # adhoc planning item agenda['name'] = planning_item.get('name') agenda['headline'] = planning_item.get('headline') agenda['slugline'] = planning_item.get('slugline') agenda['ednote'] = planning_item.get('ednote') agenda['place'] = planning_item.get('place') agenda['subject'] = format_qcode_items(planning_item.get('subject')) agenda['products'] = planning_item.get('products') agenda['urgency'] = planning_item.get('urgency') agenda['definition_short'] = planning_item.get('description_text') or agenda.get('definition_short') agenda['definition_long'] = planning_item.get('abstract') or agenda.get('definition_long') agenda['service'] = format_qcode_items(planning_item.get('anpa_category')) agenda['state'] = planning_item.get('state') agenda['state_reason'] = planning_item.get('state_reason') if not agenda.get('planning_items'): agenda['planning_items'] = [] new_plan = False plan = next( (p for p in (agenda.get('planning_items')) if p.get('guid') == planning_item.get('guid')), {} ) if not plan: new_plan = True plan['_id'] = planning_item.get('_id') plan['guid'] = planning_item.get('guid') plan['slugline'] = planning_item.get('slugline') plan['description_text'] = planning_item.get('description_text') plan['headline'] = planning_item.get('headline') plan['abstract'] = planning_item.get('abstract') plan['place'] = planning_item.get('place') plan['subject'] = format_qcode_items(planning_item.get('subject')) plan['service'] = format_qcode_items(planning_item.get('anpa_category')) plan['urgency'] = planning_item.get('urgency') plan['planning_date'] = planning_item.get('planning_date') plan['coverages'] = planning_item.get('coverages') 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['state'] = planning_item.get('state') plan['state_reason'] = planning_item.get('state_reason') plan['products'] = planning_item.get('products') plan['agendas'] = planning_item.get('agendas') if new_plan: agenda['planning_items'].append(plan) return new_plan
def download(_ids): user = get_user(required=True) _format = flask.request.args.get('format', 'text') item_type = get_type() items = get_items_for_user_action(_ids.split(','), item_type) _file = io.BytesIO() formatter = app.download_formatters[_format]['formatter'] mimetype = None attachment_filename = '%s-newsroom.zip' % utcnow().strftime('%Y%m%d%H%M') if formatter.get_mediatype() == 'picture': if len(items) == 1: try: picture = formatter.format_item(items[0], item_type=item_type) return flask.redirect( url_for('upload.get_upload', media_id=picture['media'], filename='baseimage%s' % picture['file_extension'])) except ValueError: return flask.abort(404) else: with zipfile.ZipFile(_file, mode='w') as zf: for item in items: try: picture = formatter.format_item(item, item_type=item_type) file = flask.current_app.media.get( picture['media'], ASSETS_RESOURCE) zf.writestr('baseimage%s' % picture['file_extension'], file.read()) except ValueError: pass _file.seek(0) elif len(items) == 1 or _format == 'monitoring': item = items[0] args_item = item if _format != 'monitoring' else items parse_dates(item) # fix for old items _file.write(formatter.format_item(args_item, item_type=item_type)) _file.seek(0) mimetype = formatter.get_mimetype(item) attachment_filename = secure_filename(formatter.format_filename(item)) else: with zipfile.ZipFile(_file, mode='w') as zf: for item in items: parse_dates(item) # fix for old items zf.writestr(secure_filename(formatter.format_filename(item)), formatter.format_item(item, item_type=item_type)) _file.seek(0) update_action_list(_ids.split(','), 'downloads', force_insert=True) get_resource_service('history').create_history_record( items, 'download', user, request.args.get('type', 'wire')) return flask.send_file(_file, mimetype=mimetype, attachment_filename=attachment_filename, as_attachment=True)
def download(_ids): user = get_user(required=True) items = [get_entity_or_404(_id, 'items') for _id in _ids.split(',')] _file = io.BytesIO() _format = flask.request.args.get('format', 'text') formatter = app.download_formatters[_format]['formatter'] with zipfile.ZipFile(_file, mode='w') as zf: for item in items: parse_dates(item) # fix for old items zf.writestr(secure_filename(formatter.format_filename(item)), formatter.format_item(item)) _file.seek(0) update_action_list(_ids.split(','), 'downloads', force_insert=True) app.data.insert('history', items, action='download', user=user) return flask.send_file(_file, attachment_filename='newsroom.zip', as_attachment=True)
def set_agenda_metadata_from_planning(agenda, planning_item): """Sets agenda metadata from a given planning. Event data has priority, so don't override it, only add planning if it's missing. """ event = agenda.get('event', {}) parse_dates(planning_item) set_dates(agenda) def get(key): return event.get(key) or planning_item.get(key) or agenda.get(key) agenda['name'] = get('name') agenda['headline'] = get('headline') agenda['slugline'] = get('slugline') agenda['abstract'] = get('abstract') agenda['ednote'] = get('ednote') agenda['place'] = get('place') agenda['subject'] = get('subject') agenda['products'] = get('products') agenda['genre'] = planning_item.get('genre') or agenda.get('genre') agenda['priority'] = planning_item.get('priority') or agenda.get( 'priority') agenda['urgency'] = planning_item.get('urgency') or agenda.get('urgency') agenda['definition_short'] = event.get('definition_short') \ or planning_item.get('description_text') \ or agenda.get('definition_short') agenda['definition_long'] = event.get('definition_long') \ or planning_item.get('abstract') \ or agenda.get('definition_long') service = unique_codes( format_qcode_items(planning_item.get('anpa_category')), format_qcode_items(event.get('anpa_category')), format_qcode_items(agenda.get('service'))) if service: agenda['service'] = service