def index(): api = system_util.pillar_api() # Get all projects, except the home project. projects_user = Project.all({ 'where': {'user': current_user.objectid, 'category': {'$ne': 'home'}}, 'sort': '-_created' }, api=api) projects_shared = Project.all({ 'where': {'user': {'$ne': current_user.objectid}, 'permissions.groups.group': {'$in': current_user.groups}, 'is_private': True}, 'sort': '-_created', 'embedded': {'user': 1}, }, api=api) # Attach project images for project in projects_user['_items']: utils.attach_project_pictures(project, api) for project in projects_shared['_items']: utils.attach_project_pictures(project, api) return render_template( 'projects/index_dashboard.html', gravatar=utils.gravatar(current_user.email, size=128), projects_user=projects_user['_items'], projects_shared=projects_shared['_items'], api=api)
def sharing(project_url): api = system_util.pillar_api() # Fetch the project or 404 try: project = Project.find_one({ 'where': '{"url" : "%s"}' % (project_url)}, api=api) except ResourceNotFound: return abort(404) # Fetch users that are part of the admin group users = project.get_users(api=api) for user in users['_items']: user['avatar'] = utils.gravatar(user['email']) if request.method == 'POST': user_id = request.form['user_id'] action = request.form['action'] try: if action == 'add': user = project.add_user(user_id, api=api) elif action == 'remove': user = project.remove_user(user_id, api=api) except ResourceNotFound: log.info('/p/%s/edit/sharing: User %s not found', project_url, user_id) return jsonify({'_status': 'ERROR', 'message': 'User %s not found' % user_id}), 404 # Add gravatar to user user['avatar'] = utils.gravatar(user['email']) return jsonify(user) utils.attach_project_pictures(project, api) return render_template('projects/sharing.html', api=api, project=project, ext_pages=find_extension_pages(), users=users['_items'])
def index(): api = system_util.pillar_api() # Get all projects, except the home project. projects_user = Project.all({ 'where': {'user': current_user.objectid, 'category': {'$ne': 'home'}}, 'sort': '-_created' }, api=api) show_deleted_projects = request.args.get('deleted') is not None if show_deleted_projects: timeframe = utcnow() - datetime.timedelta(days=31) projects_deleted = Project.all({ 'where': {'user': current_user.objectid, 'category': {'$ne': 'home'}, '_deleted': True, '_updated': {'$gt': timeframe}}, 'sort': '-_created' }, api=api) else: projects_deleted = {'_items': []} projects_shared = Project.all({ 'where': {'user': {'$ne': current_user.objectid}, 'permissions.groups.group': {'$in': current_user.groups}, 'is_private': True}, 'sort': '-_created', 'embedded': {'user': 1}, }, api=api) # Attach project images for project_list in (projects_user, projects_deleted, projects_shared): utils.mass_attach_project_pictures(project_list['_items'], api=api, header=False) return render_template( 'projects/index_dashboard.html', gravatar=utils.gravatar(current_user.email, size=128), projects_user=projects_user['_items'], projects_deleted=projects_deleted['_items'], projects_shared=projects_shared['_items'], show_deleted_projects=show_deleted_projects, api=api)
def format_comment(comment, is_reply=False, is_team=False, replies=None): """Format a comment node into a simpler dictionary. :param comment: the comment object :param is_reply: True if the comment is a reply to another comment :param is_team: True if the author belongs to the group that owns the node :param replies: list of replies (formatted with this function) """ try: is_own = (current_user.objectid == comment.user._id) \ if current_user.is_authenticated else False except AttributeError: current_app.bugsnag.notify( Exception('Missing user for embedded user ObjectId'), meta_data={'nodes_info': { 'node_id': comment['_id'] }}) return is_rated = False is_rated_positive = None if comment.properties.ratings: for rating in comment.properties.ratings: if current_user.is_authenticated and rating.user == current_user.objectid: is_rated = True is_rated_positive = rating.is_positive break return dict(_id=comment._id, gravatar=gravatar(comment.user.email, size=32), time_published=pretty_date(comment._created or datetime_now(), detail=True), rating=comment.properties.rating_positive - comment.properties.rating_negative, author=comment.user.full_name, author_username=comment.user.username, content=comment.properties.content, is_reply=is_reply, is_own=is_own, is_rated=is_rated, is_rated_positive=is_rated_positive, is_team=is_team, replies=replies)
def render_project(project, api, extra_context=None, template_name=None): project.picture_square = utils.get_file(project.picture_square, api=api) project.picture_header = utils.get_file(project.picture_header, api=api) def load_latest(list_of_ids, node_type=None): """Loads a list of IDs in reversed order.""" if not list_of_ids: return [] # Construct query parameters outside the loop. projection = {'name': 1, 'user': 1, 'node_type': 1, 'project': 1, 'properties.url': 1, 'properties.content_type': 1, 'picture': 1} params = {'projection': projection, 'embedded': {'user': 1}} if node_type == 'post': projection['properties.content'] = 1 elif node_type == 'asset': projection['description'] = 1 list_latest = [] for node_id in reversed(list_of_ids or ()): try: node_item = Node.find(node_id, params, api=api) node_item.picture = utils.get_file(node_item.picture, api=api) list_latest.append(node_item) except ForbiddenAccess: pass except ResourceNotFound: log.warning('Project %s refers to removed node %s!', project._id, node_id) return list_latest project.nodes_featured = load_latest(project.nodes_featured, node_type='asset') project.nodes_blog = load_latest(project.nodes_blog, node_type='post') # Merge featured assets and blog posts into one activity stream def sort_key(item): return item._created activities = itertools.chain(project.nodes_featured, project.nodes_blog) activity_stream = sorted(activities, key=sort_key, reverse=True) if extra_context is None: extra_context = {} if project.category == 'home' and not current_app.config['RENDER_HOME_AS_REGULAR_PROJECT']: template_name = template_name or 'projects/home_index.html' return render_template( template_name, gravatar=utils.gravatar(current_user.email, size=128), project=project, api=system_util.pillar_api(), **extra_context) if template_name is None: if request.args.get('embed'): embed_string = '_embed' else: embed_string = '' template_name = "projects/view{0}.html".format(embed_string) extension_sidebar_links = current_app.extension_sidebar_links(project) return render_template(template_name, api=api, project=project, node=None, show_node=False, show_project=True, og_picture=project.picture_header, activity_stream=activity_stream, extension_sidebar_links=extension_sidebar_links, **extra_context)