diff --git a/pybossa/themes/default b/pybossa/themes/default index 0c97b8f3d..bd0fcb541 160000 --- a/pybossa/themes/default +++ b/pybossa/themes/default @@ -1 +1 @@ -Subproject commit 0c97b8f3d9d292e0c32eeded80974515ac2556c8 +Subproject commit bd0fcb541647cd3eff625a82dd3db534fb55f1e6 diff --git a/pybossa/view/account.py b/pybossa/view/account.py index 8c5fb657d..89230ca7c 100644 --- a/pybossa/view/account.py +++ b/pybossa/view/account.py @@ -1156,30 +1156,32 @@ def add_metadata(name): return redirect(url_for('account.profile', name=name)) -def bookmarks_dict_to_array(bookmarks_dict): - bookmarks_array = [] - for name, meta in bookmarks_dict.items(): - b = {'name': name} - b.update(meta) - bookmarks_array.append(b) +def bookmarks_dict_to_array(bookmarks_dict, order_by, desc): + order_by = order_by or "name" + desc = desc or False + + bookmarks_array = [{'name': name, **meta} for name, meta in bookmarks_dict.items()] + bookmarks_array.sort(key=lambda b: b[order_by], reverse=desc) return bookmarks_array -def get_bookmarks(user_name, short_name): +def get_bookmarks(user_name, short_name, order_by, desc): taskbrowse_bookmarks = cached_users.get_taskbrowse_bookmarks(user_name) proj_bookmarks = taskbrowse_bookmarks.get(short_name, {}) - return bookmarks_dict_to_array(proj_bookmarks) + return bookmarks_dict_to_array(proj_bookmarks, order_by, desc) -def add_bookmark(user_name, short_name, bookmark_name, bookmark_url): - user = user_repo.get_by_name(name=user_name) - taskbrowse_bookmarks = user.info.get('taskbrowse_bookmarks', {}) - proj_bookmarks = taskbrowse_bookmarks.get(short_name, {}) +def add_bookmark(user_name, short_name, bookmark_name, bookmark_url, order_by, desc): if bookmark_name is None or len(bookmark_name) > MAX_BOOKMARK_NAME_LEN: raise ValueError(f'Bookmark name must be between 1-{MAX_BOOKMARK_NAME_LEN} characters.') if bookmark_url is None or len(bookmark_url) > MAX_BOOKMARK_URL_LEN: raise ValueError('Bookmark URL must be between 1-100 characters.') + bookmark_name = str(bookmark_name) + + user = user_repo.get_by_name(name=user_name) + taskbrowse_bookmarks = user.info.get('taskbrowse_bookmarks', {}) + proj_bookmarks = taskbrowse_bookmarks.get(short_name, {}) old_bookmark = proj_bookmarks.get(bookmark_name, None) if old_bookmark is not None: @@ -1198,10 +1200,12 @@ def add_bookmark(user_name, short_name, bookmark_name, bookmark_url): user_repo.update(user) cached_users.delete_taskbrowse_bookmarks(user) - return bookmarks_dict_to_array(proj_bookmarks) + return bookmarks_dict_to_array(proj_bookmarks, order_by, desc) -def delete_bookmark(user_name, short_name, bookmark_name): +def delete_bookmark(user_name, short_name, bookmark_name, order_by, desc): + bookmark_name = str(bookmark_name) + user = user_repo.get_by_name(name=user_name) taskbrowse_bookmarks = user.info.get('taskbrowse_bookmarks', {}) proj_bookmarks = taskbrowse_bookmarks.get(short_name, {}) @@ -1218,7 +1222,7 @@ def delete_bookmark(user_name, short_name, bookmark_name): user.info['taskbrowse_bookmarks'] = taskbrowse_bookmarks user_repo.update(user) cached_users.delete_taskbrowse_bookmarks(user) - return bookmarks_dict_to_array(proj_bookmarks) + return bookmarks_dict_to_array(proj_bookmarks, order_by, desc) @blueprint.route('//taskbrowse_bookmarks/', methods=['GET', 'POST', 'DELETE']) @@ -1228,16 +1232,20 @@ def taskbrowse_bookmarks(user_name, short_name): if current_user.name != user_name: return abort(404) + order_by = request.args.get('order_by', None, type=str) + desc_str = request.args.get('desc', None) + desc = {'true': True, 'false': False}.get(desc_str) + # get bookmarks for project from cache if request.method == 'GET': - res_bookmarks = get_bookmarks(user_name, short_name) + res_bookmarks = get_bookmarks(user_name, short_name, order_by, desc) # add a bookmark elif request.method == 'POST': bookmark_name = request.json.get('name', None) bookmark_url = request.json.get('url', None) try: - res_bookmarks = add_bookmark(user_name, short_name, bookmark_name, bookmark_url) + res_bookmarks = add_bookmark(user_name, short_name, bookmark_name, bookmark_url, order_by, desc) except ValueError as e: error_msg = str(e) current_app.logger.exception(f'Bad request: {error_msg}, project: {short_name}, bookmark_name:{bookmark_name}') @@ -1247,7 +1255,7 @@ def taskbrowse_bookmarks(user_name, short_name): elif request.method == 'DELETE': bookmark_name = request.json.get('name', None) try: - res_bookmarks = delete_bookmark(user_name, short_name, bookmark_name) + res_bookmarks = delete_bookmark(user_name, short_name, bookmark_name, order_by, desc) except ValueError as e: error_msg = str(e) current_app.logger.exception(f'Bad request: {error_msg}, project: {short_name}, bookmark_name:{bookmark_name}') diff --git a/pybossa/view/projects.py b/pybossa/view/projects.py index 67bc7b0ec..ba469993c 100644 --- a/pybossa/view/projects.py +++ b/pybossa/view/projects.py @@ -49,6 +49,7 @@ from pybossa.model.project_stats import ProjectStats from pybossa.model.webhook import Webhook from pybossa.model.blogpost import Blogpost +from pybossa.view.account import get_bookmarks from pybossa.util import (Pagination, admin_required, get_user_id_or_ip, rank, handle_content_type, redirect_content_type, get_avatar_url, admin_or_subadmin_required, @@ -1781,6 +1782,8 @@ def get_users_completed(task): # Populate list of user names for "Completed By" column. get_users_fullname(page_tasks, lambda task: get_users_completed(task), 'completed_users') + taskbrowse_bookmarks = get_bookmarks(current_user.name, short_name, None, None) + valid_user_preferences = app_settings.upref_mdata.get_valid_user_preferences() \ if app_settings.upref_mdata else {} language_options = valid_user_preferences.get('languages') @@ -1812,7 +1815,8 @@ def get_users_completed(task): can_know_task_is_gold=can_know_task_is_gold, allow_taskrun_edit=allow_taskrun_edit, regular_user=regular_user, - admin_subadmin_coowner=admin_subadmin_coowner) + admin_subadmin_coowner=admin_subadmin_coowner, + taskbrowse_bookmarks=taskbrowse_bookmarks) return handle_content_type(data) diff --git a/test/test_coowners.py b/test/test_coowners.py index eb0290444..e4c64e8e7 100644 --- a/test/test_coowners.py +++ b/test/test_coowners.py @@ -161,7 +161,7 @@ def test_coowner_can(self): # coowner can browse tasks in a draft project res = self.app.get('/project/sampleapp/tasks/browse') - assert 'Browse tasks' in str(res.data), res.data + assert 'Browse Tasks' in str(res.data), res.data # coowner can modify task presenter res = self.app.get('/project/sampleapp/tasks/taskpresentereditor') assert 'Task Presenter Editor' in str(res.data), res.data