Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

RDISCROWD-5742 sorting saved filters list #843

Merged
merged 4 commits into from
May 10, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
44 changes: 26 additions & 18 deletions pybossa/view/account.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)
n00rsy marked this conversation as resolved.
Show resolved Hide resolved
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:
Expand All @@ -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, {})
Expand All @@ -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('/<user_name>/taskbrowse_bookmarks/<short_name>', methods=['GET', 'POST', 'DELETE'])
Expand All @@ -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}')
Expand All @@ -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}')
Expand Down
6 changes: 5 additions & 1 deletion pybossa/view/projects.py
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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')
Expand Down Expand Up @@ -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)
Expand Down
2 changes: 1 addition & 1 deletion test/test_coowners.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Loading