Skip to content

Commit

Permalink
Merge 2a7a346 into 81e312c
Browse files Browse the repository at this point in the history
  • Loading branch information
n00rsy committed May 10, 2023
2 parents 81e312c + 2a7a346 commit 3667d99
Show file tree
Hide file tree
Showing 4 changed files with 33 additions and 21 deletions.
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)
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

0 comments on commit 3667d99

Please sign in to comment.