Ejemplo n.º 1
0
def get_home_data():
    cards = list(superdesk.get_resource_service('cards').get(None, None))
    user = get_user()
    company_id = str(user['company']) if user and user.get('company') else None

    itemsByCard = {}
    for card in cards:
        itemsByCard[card['label']] = superdesk.get_resource_service('wire_search').\
            get_product_items(ObjectId(card['config']['product']), card['config']['size'])

    return {
        'cards':
        cards,
        'itemsByCard':
        itemsByCard,
        'products':
        get_products_by_company(company_id),
        'user':
        str(user['_id']) if user else None,
        'company':
        company_id,
        'formats': [{
            'format': f['format'],
            'name': f['name']
        } for f in app.download_formatters.values()],
    }
Ejemplo n.º 2
0
def get_view_data():
    user = get_user()
    topics = get_user_topics(user['_id']) if user else []
    return {
        'user':
        str(user['_id']) if user else None,
        'user_type': (user or {}).get('user_type') or 'public',
        'company':
        str(user['company']) if user and user.get('company') else None,
        'topics': [t for t in topics if t.get('topic_type') == 'wire'],
        'formats': [{
            'format': f['format'],
            'name': f['name'],
            'assets': f['assets']
        } for f in app.download_formatters.values() if 'wire' in f['types']],
        'navigations':
        get_navigations_by_company(
            str(user['company']) if user and user.get('company') else None,
            product_type='wire'),
        'saved_items':
        get_bookmarks_count(user['_id'], 'wire'),
        'context':
        'wire',
        'ui_config':
        get_resource_service('ui_config').getSectionConfig('wire'),
        'groups':
        app.config.get('WIRE_GROUPS', []),
    }
Ejemplo n.º 3
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.º 4
0
def get_home_data():
    user = get_user()
    cards = list(query_resource('cards', lookup={'dashboard': 'newsroom'}))
    company_id = str(user['company']) if user and user.get('company') else None
    items_by_card = get_items_by_card(cards)

    return {
        'cards':
        cards,
        'itemsByCard':
        items_by_card,
        'products':
        get_products_by_company(company_id),
        'user':
        str(user['_id']) if user else None,
        'userType':
        user.get('user_type'),
        'company':
        company_id,
        'formats': [{
            'format': f['format'],
            'name': f['name'],
            'types': f['types'],
            'assets': f['assets']
        } for f in app.download_formatters.values()],
        'context':
        'wire',
    }
Ejemplo n.º 5
0
def get_view_data():
    user = get_user()
    return {
        'user':
        str(user['_id']) if user else None,
        'company':
        str(user['company']) if user and user.get('company') else None,
        'navigations':
        get_monitoring_for_company(user),
        'context':
        'monitoring',
        'groups':
        app.config.get('MONITORING_GROUPS')
        or app.config.get('WIRE_GROUPS', []),
        'ui_config':
        get_resource_service('ui_config').getSectionConfig('monitoring'),
        'saved_items':
        get_bookmarks_count(user['_id'], 'monitoring'),
        'formats': [{
            'format': f['format'],
            'name': f['name']
        } for f in app.download_formatters.values()
                    if 'monitoring' in f['types']],
        'secondary_formats': [{
            'format': f[0],
            'name': f[1]
        } for f in alert_types]
    }
Ejemplo n.º 6
0
 def decorated_function(*args, **kwargs):
     user = get_user()
     company = get_user_company(user)
     if company and company.get(
             'sections') and not company['sections'].get(_id):
         abort(403)
     return f(*args, **kwargs)
Ejemplo n.º 7
0
def get_user_company_name(user=None):
    if not user:
        user = get_user()
    company = get_user_company(user)
    if company:
        return company['name']
    return ''
Ejemplo n.º 8
0
def share():
    current_user = get_user(required=True)
    data = get_json_or_400()
    assert data.get('users')
    assert data.get('items')
    topic = get_entity_or_404(data.get('items')[0]['_id'], 'topics')
    with app.mail.connect() as connection:
        for user_id in data['users']:
            user = get_resource_service('users').find_one(req=None, _id=user_id)
            if not user or not user.get('email'):
                continue
            template_kwargs = {
                'recipient': user,
                'sender': current_user,
                'topic': topic,
                'url': '{}/?q={}'.format(app.config['CLIENT_URL'], parse.quote(topic['query'])),
                'message': data.get('message'),
                'app_name': app.config['SITE_NAME'],
            }
            send_email(
                [user['email']],
                gettext('From %s: %s' % (app.config['SITE_NAME'], topic['label'])),
                render_template('share_topic.txt', **template_kwargs),
                sender=current_user['email'],
                connection=connection
            )
    return jsonify(), 201
Ejemplo n.º 9
0
def get_company_sidenavs(blueprint=None):
    user = get_user()
    company = get_user_company(user)
    navs = sidenavs(blueprint)
    if company and company.get('sections'):
        return [nav for nav in navs if section_allowed(nav, company['sections'])]
    return navs
Ejemplo n.º 10
0
def share():
    current_user = get_user(required=True)
    data = get_json_or_400()
    assert data.get('users')
    assert data.get('items')
    topic = get_entity_or_404(data.get('items')['_id'], 'topics')
    for user_id in data['users']:
        user = get_resource_service('users').find_one(req=None, _id=user_id)
        if not user or not user.get('email'):
            continue

        template_kwargs = {
            'recipient': user,
            'sender': current_user,
            'topic': topic,
            'url': get_topic_url(topic),
            'message': data.get('message'),
            'app_name': app.config['SITE_NAME'],
        }
        send_email(
            [user['email']],
            gettext('From %s: %s' % (app.config['SITE_NAME'], topic['label'])),
            render_template('share_topic.txt', **template_kwargs),
        )
    return jsonify(), 201
Ejemplo n.º 11
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.º 12
0
def share():
    current_user = get_user(required=True)
    data = get_json_or_400()
    assert data.get('users')
    assert data.get('items')
    items = [get_entity_or_404(_id, 'items') for _id in data.get('items')]
    with app.mail.connect() as connection:
        for user_id in data['users']:
            user = superdesk.get_resource_service('users').find_one(
                req=None, _id=user_id)
            if not user or not user.get('email'):
                continue
            template_kwargs = {
                'recipient': user,
                'sender': current_user,
                'items': items,
                'message': data.get('message'),
            }
            send_email(
                [user['email']],
                gettext('From %s: %s' %
                        (app.config['SITE_NAME'], items[0]['headline'])),
                flask.render_template('share_item.txt', **template_kwargs),
                sender=current_user['email'],
                connection=connection)
    update_action_list(data.get('items'), 'shares')
    return flask.jsonify(), 201
Ejemplo n.º 13
0
def get_view_data():
    user = get_user()
    topics = get_user_topics(user['_id']) if user else []
    company = get_user_company(user) or {}
    return {
        'user':
        str(user['_id']) if user else None,
        'company':
        str(user['company']) if user and user.get('company') else None,
        'topics': [t for t in topics if t.get('topic_type') == 'agenda'],
        'formats': [{
            'format': f['format'],
            'name': f['name']
        } for f in app.download_formatters.values() if 'agenda' in f['types']],
        'navigations':
        get_navigations_by_company(
            str(user['company']) if user and user.get('company') else None,
            product_type='agenda',
            events_only=company.get('events_only', False)),
        'saved_items':
        get_resource_service('agenda').get_saved_items_count(),
        'events_only':
        company.get('events_only', False),
        'locators':
        get_vocabulary('locators'),
        'ui_config':
        get_resource_service('ui_config').getSectionConfig('agenda')
    }
Ejemplo n.º 14
0
def get_view_data():
    """Get the view data"""
    user = get_user()
    topics = get_user_topics(user['_id']) if user else []
    navigations = get_navigations_by_company(
        str(user['company']) if user and user.get('company') else None,
        product_type=SECTION_ID)
    get_story_count(navigations, user)
    return {
        'user':
        str(user['_id']) if user else None,
        'user_type': (user or {}).get('user_type') or 'public',
        'company':
        str(user['company']) if user and user.get('company') else None,
        'topics': [t for t in topics if t.get('topic_type') == SECTION_ID],
        'navigations':
        navigations,
        'formats': [{
            'format': f['format'],
            'name': f['name']
        } for f in app.download_formatters.values() if 'wire' in f['types']],
        'saved_items':
        get_bookmarks_count(user['_id'], SECTION_ID),
        'context':
        SECTION_ID,
        'ui_config':
        get_resource_service('ui_config').getSectionConfig(SECTION_ID),
        'home_page':
        False,
        'title':
        SECTION_NAME
    }
Ejemplo n.º 15
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.º 16
0
    def get(self, req, lookup, size=25, aggs=True):
        query = _items_query()
        user = get_user()
        company = get_user_company(user)
        set_product_query(query,
                          company,
                          navigation_id=req.args.get('navigation'),
                          product_type=req.args.get('section')
                          if req.args.get('bookmarks') else None)

        if req.args.get('q'):
            query['bool']['must'].append(query_string(req.args['q']))

        if req.args.get('newsOnly') and not (req.args.get('navigation')
                                             or req.args.get('product_type')):
            for f in app.config.get('NEWS_ONLY_FILTERS', []):
                query['bool']['must_not'].append(f)

        if req.args.get('bookmarks'):
            set_bookmarks_query(query, req.args['bookmarks'])

        filters = None

        if req.args.get('filter'):
            filters = json.loads(req.args['filter'])

        if not app.config.get('FILTER_BY_POST_FILTER', False):
            if filters:
                query['bool']['must'] += _filter_terms(filters)

            if req.args.get('created_from') or req.args.get('created_to'):
                query['bool']['must'].append(versioncreated_range(req.args))

        source = {'query': query}
        source['sort'] = [{'versioncreated': 'desc'}]
        source['size'] = size
        source['from'] = int(req.args.get('from', 0))

        if app.config.get('FILTER_BY_POST_FILTER', False):
            if filters or req.args.get('created_from') or req.args.get(
                    'created_to'):
                source['post_filter'] = {'bool': {'must': []}}
            if filters:
                source['post_filter']['bool']['must'] += _filter_terms(filters)
            if req.args.get('created_from') or req.args.get('created_to'):
                source['post_filter']['bool']['must'].append(
                    versioncreated_range(req.args))

        if source['from'] >= 1000:
            # https://www.elastic.co/guide/en/elasticsearch/guide/current/pagination.html#pagination
            return abort(400)

        if not source[
                'from'] and aggs:  # avoid aggregations when handling pagination
            source['aggs'] = aggregations

        internal_req = ParsedRequest()
        internal_req.args = {'source': json.dumps(source)}
        return super().get(internal_req, lookup)
Ejemplo n.º 17
0
def request_coverage():
    user = get_user(required=True)
    data = get_json_or_400()
    assert data.get('item')
    assert data.get('message')
    item = get_entity_or_404(data.get('item'), 'agenda')
    send_coverage_request_email(user, data.get('message'), item['_id'])
    return flask.jsonify(), 201
Ejemplo n.º 18
0
 def get_saved_items_count(self):
     query = _agenda_query()
     user = get_user()
     company = get_user_company(user)
     set_product_query(query, company)
     set_saved_items_query(query, str(user['_id']))
     cursor = self.get_items_by_query(query, size=0)
     return cursor.count()
Ejemplo n.º 19
0
def get_view_data():
    user = get_user()
    return {
        'user': user if user else None,
        'company':
        str(user['company']) if user and user.get('company') else None,
        'topics': get_user_topics(user['_id']) if user else [],
    }
Ejemplo n.º 20
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.º 21
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.º 22
0
def get_view_data():
    user = get_user()
    return {
        'user': user if user else None,
        'company': str(user['company']) if user and user.get('company') else None,
        'topics': get_user_topics(user['_id']) if user else [],
        'companyName': get_user_company_name(user),
        'userSections': get_company_sections(user['company'] if user and user.get('company') else None)
    }
Ejemplo n.º 23
0
 def get_saved_items_count(self):
     query = _agenda_query()
     get_resource_service('section_filters').apply_section_filter(query, self.section)
     user = get_user()
     company = get_user_company(user)
     set_product_query(query, company, self.section)
     set_saved_items_query(query, str(user['_id']))
     cursor = self.get_items_by_query(query, size=0)
     return cursor.count()
Ejemplo n.º 24
0
def get_company_sidenavs(blueprint=None):
    user = get_user()
    company = None
    if user and user.get('company'):
        company = get_resource_service('companies').find_one(req=None, _id=user['company'])
    navs = sidenavs(blueprint)
    if company and company.get('sections'):
        return [nav for nav in navs if section_allowed(nav, company['sections'])]
    return navs
Ejemplo n.º 25
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):
        remove_fields_for_public_user(item)

    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)
        get_resource_service('history').create_history_record([item], 'print',
                                                              get_user(),
                                                              request.args.get(
                                                                  'type',
                                                                  'agenda'))
        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.º 26
0
 def get_locale():
     try:
         user = get_user()
         if user and user.get('locale'):
             return user['locale']
     except RuntimeError:
         pass
     if request:
         return request.accept_languages.best_match(app.config['LANGUAGES'])
     return app.config['DEFAULT_LANGUAGE']
Ejemplo n.º 27
0
 def get_bookmarks_count(self, user_id):
     query = _items_query()
     user = get_user()
     company = get_user_company(user)
     set_product_query(query, company)
     _set_bookmarks_query(query, user_id)
     source = {'query': query, 'size': 0}
     internal_req = ParsedRequest()
     internal_req.args = {'source': json.dumps(source)}
     return super().get(internal_req, None).count()
Ejemplo n.º 28
0
def create():
    params = get_json_or_400()
    if not params.get('item') or not params.get('action') or not params.get(
            'section'):
        return "", gettext('Activity History: Inavlid request')

    get_resource_service('history').create_history_record([params['item']],
                                                          params['action'],
                                                          get_user(),
                                                          params['section'])
    return jsonify({'success': True}), 201
Ejemplo n.º 29
0
def edit(_id):
    if flask.request.args.get('context', '') == 'wire':
        items = get_items_for_user_action([_id], 'items')
        if not items:
            return

        item = items[0]
        if is_json_request(flask.request):
            return flask.jsonify(item)

    if 'print' in flask.request.args:
        assert flask.request.args.get('monitoring_profile')
        monitoring_profile = get_entity_or_404(
            flask.request.args.get('monitoring_profile'), 'monitoring')
        items = get_items_for_monitoring_report([_id],
                                                monitoring_profile,
                                                full_text=True)
        flask.request.view_args['date_items_dict'] = get_date_items_dict(items)
        flask.request.view_args['monitoring_profile'] = monitoring_profile
        flask.request.view_args['monitoring_report_name'] = app.config.get(
            'MONITORING_REPORT_NAME', 'Newsroom')
        flask.request.view_args['print'] = True
        return wire_print(_id)

    profile = find_one('monitoring', _id=ObjectId(_id))
    if not profile:
        return NotFound(gettext('monitoring Profile not found'))

    if flask.request.method == 'POST':
        form = MonitoringForm(monitoring=profile)
        if form.validate_on_submit():
            updates = form.data
            request_updates = flask.request.get_json()

            # If the updates have anything other than 'users', only admin or monitoring_admin can update
            if len(request_updates.keys()
                   ) == 1 and 'users' not in request_updates:
                user = get_user()
                if not is_admin(user):
                    return jsonify({'error': 'Bad request'}), 400

                company = get_entity_or_404(profile['company'], 'companies')
                if str(user['_id']) != str(
                        company.get('monitoring_administrator')):
                    return jsonify({'error': 'Bad request'}), 400

            process_form_request(updates, request_updates, form)
            set_version_creator(updates)
            get_resource_service('monitoring').patch(ObjectId(_id),
                                                     updates=updates)
            return jsonify({'success': True}), 200
        return jsonify(form.errors), 400
    return jsonify(profile), 200
Ejemplo n.º 30
0
def get_view_data():
    """Get the view data"""
    user = get_user()
    return {
        'user': str(user['_id']) if user else None,
        'company': str(user['company']) if user and user.get('company') else None,
        'navigations': [],
        'formats': [{'format': f['format'], 'name': f['name']} for f in app.download_formatters.values()
                    if 'wire' in f['types']],
        'saved_items': get_bookmarks_count(user['_id'], 'media_releases'),
        'context': 'media_releases',
        'ui_config': get_resource_service('ui_config').getSectionConfig('media_releases')
    }