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()], }
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', []), }
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 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', }
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] }
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)
def get_user_company_name(user=None): if not user: user = get_user() company = get_user_company(user) if company: return company['name'] return ''
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
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
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
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)
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
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') }
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 }
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
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)
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
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()
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 [], }
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
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 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) }
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()
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
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')))
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']
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()
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
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
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') }