Example #1
0
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
Example #2
0
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)
Example #3
0
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)
Example #4
0
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)
Example #5
0
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
Example #6
0
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)
Example #7
0
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)
Example #8
0
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