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 5851 taskbrowse bookmarks dates #837

Merged
merged 16 commits into from
Apr 26, 2023
19 changes: 18 additions & 1 deletion pybossa/view/account.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@
from flask_login import login_required, login_user, logout_user, \
current_user
from rq import Queue
from datetime import datetime

import pybossa.model as model
from flask_babel import gettext
Expand Down Expand Up @@ -1154,6 +1155,11 @@ def add_metadata(name):
return redirect(url_for('account.profile', name=name))


def make_timestamp():
now = datetime.now()
return now.isoformat()


def _get_bookmarks(user_name, short_name):
taskbrowse_bookmarks = cached_users.get_taskbrowse_bookmarks(user_name)
proj_bookmarks = taskbrowse_bookmarks.get(short_name, {})
Expand All @@ -1170,7 +1176,18 @@ def _add_bookmark(user_name, short_name, bookmark_name, bookmark_url):
if bookmark_url is None or len(bookmark_url) > MAX_BOOKMARK_URL_LEN:
raise ValueError('Bookmark URL must be between 1-100 characters.')

proj_bookmarks[bookmark_name] = bookmark_url
old_bookmark = proj_bookmarks.get(bookmark_name, None)
if old_bookmark is not None:
created_date = old_bookmark['created']
else:
created_date = make_timestamp()
updated_date = make_timestamp()
bookmark_data = {
'url': bookmark_url,
'created': created_date,
'updated': updated_date
}
proj_bookmarks[bookmark_name] = bookmark_data
taskbrowse_bookmarks[short_name] = proj_bookmarks
user.info['taskbrowse_bookmarks'] = taskbrowse_bookmarks

Expand Down
146 changes: 87 additions & 59 deletions test/test_web.py
Original file line number Diff line number Diff line change
Expand Up @@ -10612,33 +10612,58 @@ def test_user_has_partial_answer_without_auth(self):
resp = self.app_get_json(url)
assert resp.status_code == 401, resp

def generate_sample_bookmarks(self, target_project="project1"):
bookmark_1_data = {
"created": "2019-01-01T14:37:30.642119",
"updated": "2019-01-01T14:37:30.642119",
"url": "https://gigwork.net/project/testproject66/tasks/browse/1/10?changed=true&display_columns=%5B%22task_id%22%2C%22priority%22%2C%22pcomplete%22%2C%22created%22%2C%22finish_time%22%2C%22gold_task%22%2C%22actions%22%2C%22lock_status%22%5D&order_by=task_id+asc&pcomplete_from=46&pcomplete_to=100&priority_from=0.45&priority_to=1.00&display_info_columns=%5B%5D"
}
bookmark_2_data = {
"created": "2019-01-01T14:37:30.642119",
"updated": "2023-01-01T14:37:30.642119",
"url": "https://gigwork.net/project/testproject66/tasks/browse"
}
bookmark_3_data = {
"created": "2022-01-01T14:37:30.642119",
"updated": "2022-01-01T14:37:30.642119",
"url": "https://gigwork.net/project/project2/tasks/browse"
}
bookmarks = {
target_project : {
"bookmark 1" : bookmark_1_data,
"bookmark 2" : bookmark_2_data
},
"project2" : {
"bookmark 3" : bookmark_3_data
}
}
return (bookmark_1_data, bookmark_2_data, bookmark_3_data, bookmarks)


@with_context
def test_get_taskbrowse_bookmarks(self):
"""Test get taskbrowse_bookmark works"""
data = self.original
target_project = "project1"
bookmarks = {
target_project : {
"bookmark 1" : "https://gigwork.net/project/testproject66/tasks/browse/1/10?changed=true&display_columns=%5B%22task_id%22%2C%22priority%22%2C%22pcomplete%22%2C%22created%22%2C%22finish_time%22%2C%22gold_task%22%2C%22actions%22%2C%22lock_status%22%5D&order_by=task_id+asc&pcomplete_from=46&pcomplete_to=100&priority_from=0.45&priority_to=1.00&display_info_columns=%5B%5D",
"bookmark 2" : "https://gigwork.net/project/testproject66/tasks/browse"
},
"project2" : {
"bookmark 3" : "https://gigwork.net/project/project2/tasks/browse"
}

}
bookmark_1_data, bookmark_2_data, bookmark_3_data, bookmarks = self.generate_sample_bookmarks(target_project)
info = {
'taskbrowse_bookmarks' : bookmarks
}
}
user = UserFactory.create(info=info)
self.signin_user(user)
url = f"/account/{user.name}/taskbrowse_bookmarks/{target_project}"
res = self.app.get(url)

assert res.status_code == 200, res.status_code
data = json.loads(res.data)
assert str(data) == str(bookmarks[target_project])

assert data['bookmark 1']['url'] == bookmark_1_data['url']
assert data['bookmark 1']['created'] == bookmark_1_data['created']
assert data['bookmark 1']['updated'] == bookmark_1_data['updated']

assert data['bookmark 2']['url'] == bookmark_2_data['url']
assert data['bookmark 2']['created'] == bookmark_2_data['created']
assert data['bookmark 2']['updated'] == bookmark_2_data['updated']


@with_context
Expand All @@ -10661,17 +10686,8 @@ def test_get_taskbrowse_bookmarks_no_bookmarks(self):
def test_get_taskbrowse_bookmarks_no_saved_bookmarks_for_project(self):
"""Test get taskbrowse_bookmark works when no saved bookmarks for project"""
data = self.original
target_project = "project1"
bookmarks = {
"project600" : {
"bookmark 1" : "https://gigwork.net/project/testproject66/tasks/browse/1/10?changed=true&display_columns=%5B%22task_id%22%2C%22priority%22%2C%22pcomplete%22%2C%22created%22%2C%22finish_time%22%2C%22gold_task%22%2C%22actions%22%2C%22lock_status%22%5D&order_by=task_id+asc&pcomplete_from=46&pcomplete_to=100&priority_from=0.45&priority_to=1.00&display_info_columns=%5B%5D",
"bookmark 2" : "https://gigwork.net/project/testproject66/tasks/browse"
},
"project2" : {
"bookmark 3" : "https://gigwork.net/project/project2/tasks/browse"
}

}
target_project = "project_with_no_bookmarks"
_, _, _, bookmarks = self.generate_sample_bookmarks()
info = {
'taskbrowse_bookmarks' : bookmarks
}
Expand All @@ -10692,9 +10708,9 @@ def test_post_taskbrowse_bookmarks(self):
target_project = "project1"

url1 = "https://gigwork.net/project/testproject66/tasks/browse"
url2 = "https://gigwork.net/project/testproject66/tasks/browse/1/10?changed=true&display_columns=%5B%22task_id%22%2C%22priority%22%2C%22pcomplete%22%2C%22created%22%2C%22finish_time%22%2C%22gold_task%22%2C%22actions%22%2C%22lock_status%22%5D&order_by=task_id+asc&pcomplete_from=46&pcomplete_to=100&priority_from=0.45&priority_to=1.00&display_info_columns=%5B%5D"
name1 = "bookmark1"
name2 = "bookmark2"
url2 = "https://gigwork.net/project/testproject66/tasks/browse/1/10?changed=true&display_columns=%5B%22task_id%22%2C%22priority%22%2C%22pcomplete%22%2C%22created%22%2C%22finish_time&order_by=task_id"
name1 = "bookmark 1"
name2 = "bookmark 2"

user = UserFactory.create()
self.signin_user(user)
Expand All @@ -10704,32 +10720,59 @@ def test_post_taskbrowse_bookmarks(self):
res = self.app.post(url, json={"name":name1, "url":url1})
assert res.status_code == 200, res.status_code
data = json.loads(res.data)
assert str(data) == str({name1:url1})
assert data[name1]['url'] == url1
assert 'created' in data[name1]
assert 'updated' in data[name1]

# test if new url is appended correctly
res = self.app.post(url, json={"name":name2, "url":url2})
assert res.status_code == 200, res.status_code
data = json.loads(res.data)
assert str(data) == str({name1:url1, name2:url2})
assert data[name1]['url'] == url1
assert data[name2]['url'] == url2

# test if data is saved in db
res = self.app.get(url)
assert res.status_code == 200, res.status_code
data = json.loads(res.data)
assert str(data) == str({name1:url1, name2:url2})
assert data[name1]['url'] == url1
assert data[name2]['url'] == url2

# test adding bookmark for a different project
new_url = f"/account/{user.name}/taskbrowse_bookmarks/project2"
res = self.app.post(new_url, json={"name":name2, "url":url2})
res = self.app.post(new_url, json={"name":name2, "url":url1})
assert res.status_code == 200, res.status_code
data = json.loads(res.data)
assert str(data) == str({name2:url2})
assert data[name2]['url'] == url1

# test new post does not affect old data
res = self.app.get(url)
assert res.status_code == 200, res.status_code
data = json.loads(res.data)
assert str(data) == str({name1:url1, name2:url2})
assert data[name1]['url'] == url1
assert data[name2]['url'] == url2

@with_context
def test_update_taskbrowse_bookmark(self):
"""Test update taskbrowse_bookmark via POST works"""
data = self.original
target_project = "project1"
bookmark_1_data, _, _, bookmarks = self.generate_sample_bookmarks(target_project)
info = {
'taskbrowse_bookmarks' : bookmarks
}
user = UserFactory.create(info=info)
self.signin_user(user)
url = f"/account/{user.name}/taskbrowse_bookmarks/{target_project}"

# update a bookmark that already exists
res = self.app.post(url, json={"name":"bookmark 1", "url":"www.google.com"})
assert res.status_code == 200, res.status_code
data = json.loads(res.data)
assert data["bookmark 1"]["updated"] != bookmark_1_data["updated"]
assert data["bookmark 1"]["created"] == bookmark_1_data["created"]
assert data["bookmark 1"]["url"] == "www.google.com"


@with_context
def test_post_taskbrowse_bookmarks_missing_arguments(self):
Expand Down Expand Up @@ -10758,56 +10801,41 @@ def test_delete_taskbrowse_bookmarks(self):
"""Test deleting taskbrowse bookmarks"""
data = self.original
target_project = "project1"
bookmarks = {
target_project : {
"bookmark1" : "https://gigwork.net/project/testproject66/tasks/browse/1/10?changed=true&display_columns=%5B%22task_id%22%2C%22priority%22%2C%22pcomplete%22%2C%22created%22%2C%22finish_time%22%2C%22gold_task%22%2C%22actions%22%2C%22lock_status%22%5D&order_by=task_id+asc&pcomplete_from=46&pcomplete_to=100&priority_from=0.45&priority_to=1.00&display_info_columns=%5B%5D",
"bookmark2" : "https://gigwork.net/project/testproject66/tasks/browse"
},
"project2" : {
"bookmark3" : "https://gigwork.net/project/project2/tasks/browse"
}

}
bookmark_1_data, bookmark_2_data ,_, bookmarks = self.generate_sample_bookmarks(target_project)
info = {
'taskbrowse_bookmarks' : bookmarks
}

user = UserFactory.create(info=info)
self.signin_user(user)
url = f"/account/{user.name}/taskbrowse_bookmarks/{target_project}"
data = {"name": "bookmark1"}
data = {"name": "bookmark 1"}
res = self.app.delete(url, json=data)

expected_res = {"bookmark2" : "https://gigwork.net/project/testproject66/tasks/browse"}
expected_res = {"bookmark 2" : "https://gigwork.net/project/testproject66/tasks/browse"}
assert res.status_code == 200, res.status_code
data = json.loads(res.data)
assert str(data) == str(expected_res)
assert len(data) == 1
assert data['bookmark 2']['url'] == bookmark_2_data['url']
assert data['bookmark 2']['created'] == bookmark_2_data['created']
assert data['bookmark 2']['updated'] == bookmark_2_data['updated']

# ensure deleting last bookmark does not result in error
url = f"/account/{user.name}/taskbrowse_bookmarks/{target_project}"
data = {"name" : "bookmark2"}
data = {"name" : "bookmark 2"}
res = self.app.delete(url, json=data)

expected_res = {}
assert res.status_code == 200, res.status_code
data = json.loads(res.data)
assert str(data) == str(expected_res)
assert len(data) == 0

@with_context
def test_delete_taskbrowse_bookmarks_invalid_bookmark_name(self):
def test_delete_taskbrowse_bookmarks_bookmark_not_found(self):
"""Test calling delete taskbrowse bookmarks with an invalid bookmark name"""
data = self.original
target_project = "project1"
bookmarks = {
target_project : {
"bookmark1" : "https://gigwork.net/project/testproject66/tasks/browse/1/10?changed=true&display_columns=%5B%22task_id%22%2C%22priority%22%2C%22pcomplete%22%2C%22created%22%2C%22finish_time%22%2C%22gold_task%22%2C%22actions%22%2C%22lock_status%22%5D&order_by=task_id+asc&pcomplete_from=46&pcomplete_to=100&priority_from=0.45&priority_to=1.00&display_info_columns=%5B%5D",
"bookmark2" : "https://gigwork.net/project/testproject66/tasks/browse"
},
"project2" : {
"bookmark3" : "https://gigwork.net/project/project2/tasks/browse"
}

}
_,_,_, bookmarks = self.generate_sample_bookmarks(target_project)
info = {
'taskbrowse_bookmarks' : bookmarks
}
Expand All @@ -10820,7 +10848,7 @@ def test_delete_taskbrowse_bookmarks_invalid_bookmark_name(self):


@with_context
def test_get_taskbrowse_bookmarks_user_errors(self):
def test_get_taskbrowse_bookmarks_user_auth_errors(self):
"""Test retrive taskbrowse bookmarks returns errors"""
data = self.original
target_project = "project1"
Expand Down