Ejemplo n.º 1
0
def item(_id):
    items = get_items_for_user_action([_id], 'items')
    if not items:
        return

    item = items[0]
    set_permissions(item, 'wire', False if flask.request.args.get('ignoreLatest') == 'false' else True)
    display_char_count = get_resource_service('ui_config').getSectionConfig('wire').get('char_count', False)
    if is_json_request(flask.request):
        return flask.jsonify(item)
    if not item.get('_access'):
        return flask.render_template('wire_item_access_restricted.html', item=item)
    previous_versions = get_previous_versions(item)
    template = 'wire_item.html'
    data = {'item': item}
    if 'print' in flask.request.args:
        if flask.request.args.get('monitoring_profile'):
            data.update(flask.request.view_args)
            template = 'monitoring_export.html'
        else:
            template = 'wire_item_print.html'

        update_action_list([_id], 'prints', force_insert=True)
        get_resource_service('history').create_history_record([item], 'print', get_user(),
                                                              request.args.get('type', 'wire'))

    return flask.render_template(
        template,
        **data,
        previous_versions=previous_versions,
        display_char_count=display_char_count)
Ejemplo n.º 2
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)
Ejemplo n.º 3
0
def export(_ids):
    user = get_user(required=True)
    _format = flask.request.args.get('format')
    if not _format:
        return jsonify({'message': 'No format specified.'}), 400

    layout_format = flask.request.args.get('secondary_format')
    formatter = app.download_formatters[_format]['formatter']
    monitoring_profile = get_entity_or_404(
        flask.request.args.get('monitoring_profile'), 'monitoring')
    monitoring_profile['format_type'] = _format
    monitoring_profile['alert_type'] = layout_format
    items = get_items_for_monitoring_report([_id for _id in _ids.split(',')],
                                            monitoring_profile)

    if len(items) > 0:
        try:
            _file = get_monitoring_file(monitoring_profile, items)
        except Exception as e:
            logger.exception(e)
            return jsonify({'message': 'Error exporting items to file'}), 400

        if _file:
            update_action_list(_ids.split(','), 'export', force_insert=True)
            get_resource_service('history').create_history_record(
                items, 'export', user, 'monitoring')

            return send_file(
                _file,
                mimetype=formatter.get_mimetype(None),
                attachment_filename=formatter.format_filename(None),
                as_attachment=True)

    return jsonify({'message': 'No files to export.'}), 400
Ejemplo n.º 4
0
def bookmark():
    data = get_json_or_400()
    assert data.get('items')
    update_action_list(data.get('items'), 'bookmarks', item_type='agenda')
    push_user_notification(
        'saved_items',
        count=get_resource_service('agenda').get_saved_items_count())
    return flask.jsonify(), 200
Ejemplo n.º 5
0
def copy(_id):
    item_type = get_type()
    item = get_entity_or_404(_id, item_type)
    update_action_list([_id], 'copies', item_type=item_type)
    get_resource_service('history').create_history_record([item], 'copy',
                                                          get_user(),
                                                          request.args.get(
                                                              'type', 'wire'))
    return flask.jsonify(), 200
Ejemplo n.º 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)
Ejemplo n.º 7
0
def bookmark():
    """Bookmark an item.

    Stores user id into item.bookmarks array.
    Uses mongodb to update the array and then pushes updated array to elastic.
    """
    data = get_json_or_400()
    assert data.get('items')
    update_action_list(data.get('items'), 'bookmarks', item_type='items')
    user_id = get_user_id()
    push_user_notification('saved_items', count=get_bookmarks_count(user_id, 'wire'))
    return flask.jsonify(), 200
Ejemplo n.º 8
0
def share():
    current_user = get_user(required=True)
    item_type = get_type()
    data = get_json_or_400()
    assert data.get('users')
    assert data.get('items')
    items = get_items_for_user_action(data.get('items'), item_type)
    for user_id in data['users']:
        user = superdesk.get_resource_service('users').find_one(req=None,
                                                                _id=user_id)
        subject = items[0].get('headline')

        # If it's an event, 'name' is the subject
        if items[0].get('event'):
            subject = items[0]['name']

        if not user or not user.get('email'):
            continue
        template_kwargs = {
            'recipient': user,
            'sender': current_user,
            'items': items,
            'message': data.get('message'),
            'section': request.args.get('type', 'wire')
        }
        if item_type == 'agenda':
            template_kwargs['maps'] = data.get('maps')
            template_kwargs['dateStrings'] = [
                get_agenda_dates(item) for item in items
            ]
            template_kwargs['locations'] = [
                get_location_string(item) for item in items
            ]
            template_kwargs['contactList'] = [
                get_public_contacts(item) for item in items
            ]
            template_kwargs['linkList'] = [get_links(item) for item in items]
            template_kwargs['is_admin'] = is_admin_or_internal(user)

        send_email(
            [user['email']],
            gettext('From %s: %s' % (app.config['SITE_NAME'], subject)),
            text_body=flask.render_template('share_{}.txt'.format(item_type),
                                            **template_kwargs),
            html_body=flask.render_template('share_{}.html'.format(item_type),
                                            **template_kwargs),
        )
    update_action_list(data.get('items'), 'shares', item_type=item_type)
    get_resource_service('history').create_history_record(
        items, 'share', current_user, request.args.get('type', 'wire'))
    return flask.jsonify(), 201
Ejemplo n.º 9
0
def share():
    data = get_json_or_400()
    assert data.get('users')
    assert data.get('items')
    assert data.get('monitoring_profile')
    current_user = get_user(required=True)
    monitoring_profile = get_entity_or_404(data.get('monitoring_profile'),
                                           'monitoring')
    items = get_items_for_monitoring_report(data.get('items'),
                                            monitoring_profile)

    for user_id in data['users']:
        user = get_resource_service('users').find_one(req=None, _id=user_id)
        template_kwargs = {
            'recipient': user,
            'sender': current_user,
            'message': data.get('message'),
            'item_name': 'Monitoring Report',
        }
        formatter = app.download_formatters['monitoring_pdf']['formatter']
        monitoring_profile['format_type'] = 'monitoring_pdf'
        _file = get_monitoring_file(monitoring_profile, items)
        attachment = base64.b64encode(_file.read())

        send_email(
            [user['email']],
            gettext(
                'From %s: %s' % (app.config['SITE_NAME'],
                                 monitoring_profile.get(
                                     'subject', monitoring_profile['name']))),
            text_body=flask.render_template('share_items.txt',
                                            **template_kwargs),
            html_body=flask.render_template('share_items.html',
                                            **template_kwargs),
            attachments_info=[{
                'file':
                attachment,
                'file_name':
                formatter.format_filename(None),
                'content_type':
                'application/{}'.format(formatter.FILE_EXTENSION),
                'file_desc':
                'Monitoring Report'
            }],
        )

    update_action_list(data.get('items'), 'shares')
    get_resource_service('history').create_history_record(
        items, 'share', current_user, 'monitoring')
    return jsonify({'success': True}), 200
Ejemplo n.º 10
0
def item(_id):
    item = get_entity_or_404(_id, 'agenda')

    user = get_user()
    company = get_user_company(user)
    if not is_admin_or_internal(user):
        item.get('event', {}).pop('files', None)
        planning_items = item.get('planning_items', [])
        [item.pop('internal_note', None) for item in planning_items]
        coverages = item.get('coverages', [])
        [c.get('planning', {}).pop('internal_note', None) for c in coverages]
        item.get('event', {}).pop('internal_note', None)

    if company and not is_admin(user) and company.get('events_only', False):
        # if the company has permission events only permission then
        # remove planning items and coverages.
        if not item.get('event'):
            # for adhoc planning items abort the request
            flask.abort(403)

        item.pop('planning_items', None)
        item.pop('coverages', None)

    if is_json_request(flask.request):
        return flask.jsonify(item)

    if 'print' in flask.request.args:
        map = flask.request.args.get('map')
        template = 'agenda_item_print.html'
        update_action_list([_id], 'prints', force_insert=True)
        return flask.render_template(
            template,
            item=item,
            map=map,
            dateString=get_agenda_dates(item),
            location=get_location_string(item),
            contacts=get_public_contacts(item),
            links=get_links(item),
            is_admin=is_admin_or_internal(user)
        )

    data = get_view_data()
    data['item'] = item
    return flask.render_template('agenda_index.html', data=data, title=item.get('name', item.get('headline')))
Ejemplo n.º 11
0
def item(_id):
    item = get_entity_or_404(_id, 'items')
    set_permissions(item, 'wire')
    display_char_count = get_resource_service('ui_config').getSectionConfig(
        'wire').get('char_count', False)
    if is_json_request(flask.request):
        return flask.jsonify(item)
    if not item.get('_access'):
        return flask.render_template('wire_item_access_restricted.html',
                                     item=item)
    previous_versions = get_previous_versions(item)
    if 'print' in flask.request.args:
        template = 'wire_item_print.html'
        update_action_list([_id], 'prints', force_insert=True)
    else:
        template = 'wire_item.html'
    return flask.render_template(template,
                                 item=item,
                                 previous_versions=previous_versions,
                                 display_char_count=display_char_count)
Ejemplo n.º 12
0
def follow():
    data = get_json_or_400()
    assert data.get('items')
    for item_id in data.get('items'):
        user_id = get_user_id()
        item = get_entity_or_404(item_id, 'agenda')
        coverage_updates = {'coverages': item.get('coverages') or []}
        for c in coverage_updates['coverages']:
            if c.get('watches') and user_id in c['watches']:
                c['watches'].remove(user_id)

        if request.method == 'POST':
            updates = {
                'watches': list(set((item.get('watches') or []) + [user_id]))
            }
            if item.get('coverages'):
                updates.update(coverage_updates)

            get_resource_service('agenda').patch(item_id, updates)
        else:
            if request.args.get('bookmarks'):
                user_item_watches = [
                    u for u in (item.get('watches') or [])
                    if str(u) == str(user_id)
                ]
                if not user_item_watches:
                    # delete user watches of all coverages
                    get_resource_service('agenda').patch(
                        item_id, coverage_updates)
                    return flask.jsonify(), 200

            update_action_list(data.get('items'),
                               'watches',
                               item_type='agenda')

    push_user_notification(
        'saved_items',
        count=get_resource_service('agenda').get_saved_items_count())
    return flask.jsonify(), 200
Ejemplo n.º 13
0
def copy(_id):
    item_type = get_type()
    get_entity_or_404(_id, item_type)
    update_action_list([_id], 'copies', item_type=item_type)
    return flask.jsonify(), 200