Skip to content

Commit 3c8e752

Browse files
committed
Merge branch 'release/19.30.0'
2 parents d22b269 + 5804d52 commit 3c8e752

File tree

186 files changed

+1606
-441
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

186 files changed

+1606
-441
lines changed

CHANGELOG

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,13 @@
22

33
We follow the CalVer (https://calver.org/) versioning scheme: YY.MINOR.MICRO.
44

5+
19.30.0 (2019-10-16)
6+
===================
7+
- Fix weirdness around deleted nodes by not deleing OSF Storage
8+
- Make deleted fields on models and addons into date fields
9+
- API v2: Chronos users can have more name options
10+
- Python 3 backwards compatibility changes
11+
512
19.29.0 (2019-10-02)
613
===================
714
- Use new pagecounter fields for increased query efficiency

PULL_REQUEST_TEMPLATE.md

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,14 @@
1515

1616
## QA Notes
1717

18-
<!-- Does this change need QA? If so, this section is required.
19-
- Is cross-browser testing required/recommended?
20-
- Is API testing required/recommended?
21-
- What pages on the OSF should be tested?
22-
- What edge cases should QA be aware of?
18+
- Does this change require a data migration? If so, what data will we migrate?
19+
- What is the level of risk?
20+
- Any permissions code touched?
21+
- Is this an additive or subtractive change, other?
22+
- How can QA verify? (Through UI, API, AdminApp or AdminAdminApp?)
23+
- If verifying through API, what's the new version? Please include the endpoints in PR notes or Dev docs.
24+
- What features or workflows might this change impact?
25+
- How will this impact performance?
2326
-->
2427

2528
## Documentation

addons/base/logger.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ def addon_short_name(self):
1313
pass
1414

1515
def _log_params(self):
16-
node_settings = self.node.get_addon(self.addon_short_name, deleted=True)
16+
node_settings = self.node.get_addon(self.addon_short_name, is_deleted=True)
1717
return {
1818
'project': self.node.parent_id,
1919
'node': self.node._primary_key,

addons/base/models.py

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import markupsafe
66
import requests
77
from django.db import models
8+
from django.utils import timezone
89
from framework.auth import Auth
910
from framework.auth.decorators import must_be_logged_in
1011
from framework.exceptions import HTTPError, PermissionsError
@@ -14,6 +15,7 @@
1415
from osf.models.node import AbstractNode
1516
from osf.models.user import OSFUser
1617
from osf.utils.datetime_aware_jsonfield import DateTimeAwareJSONField
18+
from osf.utils.fields import NonNaiveDateTimeField
1719
from website import settings
1820
from addons.base import logger, serializer
1921
from website.oauth.signals import oauth_complete
@@ -38,7 +40,8 @@
3840

3941

4042
class BaseAddonSettings(ObjectIDMixin, BaseModel):
41-
deleted = models.BooleanField(default=False)
43+
is_deleted = models.BooleanField(default=False)
44+
deleted = NonNaiveDateTimeField(null=True, blank=True)
4245

4346
class Meta:
4447
abstract = True
@@ -52,13 +55,15 @@ def short_name(self):
5255
return self.config.short_name
5356

5457
def delete(self, save=True):
55-
self.deleted = True
58+
self.is_deleted = True
59+
self.deleted = timezone.now()
5660
self.on_delete()
5761
if save:
5862
self.save()
5963

6064
def undelete(self, save=True):
61-
self.deleted = False
65+
self.is_deleted = False
66+
self.deleted = None
6267
self.on_add()
6368
if save:
6469
self.save()
@@ -215,7 +220,7 @@ def revoke_oauth_access(self, external_account, auth, save=True):
215220
"""
216221
for node in self.get_nodes_with_oauth_grants(external_account):
217222
try:
218-
node.get_addon(external_account.provider, deleted=True).deauthorize(auth=auth)
223+
node.get_addon(external_account.provider, is_deleted=True).deauthorize(auth=auth)
219224
except AttributeError:
220225
# No associated addon settings despite oauth grant
221226
pass

addons/base/tests/models.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
import mock
44
import pytest
5+
import pytz
6+
import datetime
57
from addons.base.tests.utils import MockFolder
68
from django.utils import timezone
79
from framework.auth import Auth
@@ -304,11 +306,14 @@ def test_delete(self):
304306
assert_true(self.node_settings.user_settings)
305307
assert_true(self.node_settings.folder_id)
306308
old_logs = list(self.node.logs.all())
307-
self.node_settings.delete()
309+
mock_now = datetime.datetime(2017, 3, 16, 11, 00, tzinfo=pytz.utc)
310+
with mock.patch.object(timezone, 'now', return_value=mock_now):
311+
self.node_settings.delete()
308312
self.node_settings.save()
309313
assert_is(self.node_settings.user_settings, None)
310314
assert_is(self.node_settings.folder_id, None)
311-
assert_true(self.node_settings.deleted)
315+
assert_true(self.node_settings.is_deleted)
316+
assert_equal(self.node_settings.deleted, mock_now)
312317
assert_equal(list(self.node.logs.all()), list(old_logs))
313318

314319
def test_on_delete(self):

addons/base/views.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -293,7 +293,9 @@ def get_auth(auth, **kwargs):
293293
raise HTTPError(http_status.HTTP_400_BAD_REQUEST)
294294

295295
node = AbstractNode.load(node_id) or Preprint.load(node_id)
296-
if not node:
296+
if node and node.is_deleted:
297+
raise HTTPError(http_status.HTTP_410_GONE)
298+
elif not node:
297299
raise HTTPError(http_status.HTTP_404_NOT_FOUND)
298300

299301
check_access(node, auth, action, cas_resp)
@@ -603,11 +605,12 @@ def addon_deleted_file(auth, target, error_type='BLAME_PROVIDER', **kwargs):
603605
# Allow file_node to be passed in so other views can delegate to this one
604606
file_node = kwargs.get('file_node') or TrashedFileNode.load(kwargs.get('trashed_id'))
605607

606-
deleted_by, deleted_on = None, None
608+
deleted_by, deleted_on, deleted = None, None, None
607609
if isinstance(file_node, TrashedFileNode):
608610
deleted_by = file_node.deleted_by
609611
deleted_by_guid = file_node.deleted_by._id if deleted_by else None
610612
deleted_on = file_node.deleted_on.strftime('%c') + ' UTC'
613+
deleted = deleted_on
611614
if getattr(file_node, 'suspended', False):
612615
error_type = 'FILE_SUSPENDED'
613616
elif file_node.deleted_by is None or (auth.private_key and auth.private_link.anonymous):
@@ -633,7 +636,8 @@ def addon_deleted_file(auth, target, error_type='BLAME_PROVIDER', **kwargs):
633636
file_name=markupsafe.escape(file_name),
634637
deleted_by=markupsafe.escape(getattr(deleted_by, 'fullname', None)),
635638
deleted_on=markupsafe.escape(deleted_on),
636-
provider=markupsafe.escape(provider_full)
639+
provider=markupsafe.escape(provider_full),
640+
deleted=markupsafe.escape(deleted)
637641
)
638642
if deleted_by:
639643
format_params['deleted_by_guid'] = markupsafe.escape(deleted_by_guid)
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
# -*- coding: utf-8 -*-
2+
# Generated by Django 1.11.15 on 2019-06-27 20:29
3+
from __future__ import unicode_literals
4+
5+
from django.db import migrations
6+
import osf.utils.fields
7+
8+
9+
class Migration(migrations.Migration):
10+
11+
dependencies = [
12+
('addons_bitbucket', '0002_auto_20170808_1140'),
13+
]
14+
15+
operations = [
16+
migrations.RenameField(
17+
model_name='nodesettings',
18+
new_name='is_deleted',
19+
old_name='deleted',
20+
),
21+
migrations.RenameField(
22+
model_name='usersettings',
23+
new_name='is_deleted',
24+
old_name='deleted',
25+
),
26+
migrations.AddField(
27+
model_name='nodesettings',
28+
name='deleted',
29+
field=osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True),
30+
),
31+
migrations.AddField(
32+
model_name='usersettings',
33+
name='deleted',
34+
field=osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True),
35+
),
36+
]

addons/bitbucket/settings/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,5 +6,5 @@
66

77
try:
88
from .local import * # noqa
9-
except ImportError as error:
9+
except ImportError:
1010
logger.warn('No local.py settings file found')
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
# -*- coding: utf-8 -*-
2+
# Generated by Django 1.11.15 on 2019-06-27 20:29
3+
from __future__ import unicode_literals
4+
5+
from django.db import migrations
6+
import osf.utils.fields
7+
8+
9+
class Migration(migrations.Migration):
10+
11+
dependencies = [
12+
('addons_box', '0003_auto_20170713_1125'),
13+
]
14+
15+
operations = [
16+
migrations.RenameField(
17+
model_name='nodesettings',
18+
new_name='is_deleted',
19+
old_name='deleted',
20+
),
21+
migrations.RenameField(
22+
model_name='usersettings',
23+
new_name='is_deleted',
24+
old_name='deleted',
25+
),
26+
migrations.AddField(
27+
model_name='nodesettings',
28+
name='deleted',
29+
field=osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True),
30+
),
31+
migrations.AddField(
32+
model_name='usersettings',
33+
name='deleted',
34+
field=osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True),
35+
),
36+
]

addons/box/settings/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,5 @@
55

66
try:
77
from .local import * # noqa
8-
except ImportError as error:
8+
except ImportError:
99
logger.warn('No local.py settings file found')
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
# -*- coding: utf-8 -*-
2+
# Generated by Django 1.11.15 on 2019-06-27 20:29
3+
from __future__ import unicode_literals
4+
5+
from django.db import migrations
6+
import osf.utils.fields
7+
8+
9+
class Migration(migrations.Migration):
10+
11+
dependencies = [
12+
('addons_dataverse', '0003_auto_20170713_1125'),
13+
]
14+
15+
operations = [
16+
migrations.RenameField(
17+
model_name='nodesettings',
18+
new_name='is_deleted',
19+
old_name='deleted',
20+
),
21+
migrations.RenameField(
22+
model_name='usersettings',
23+
new_name='is_deleted',
24+
old_name='deleted',
25+
),
26+
migrations.AddField(
27+
model_name='nodesettings',
28+
name='deleted',
29+
field=osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True),
30+
),
31+
migrations.AddField(
32+
model_name='usersettings',
33+
name='deleted',
34+
field=osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True),
35+
),
36+
]

addons/dataverse/settings/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,5 @@
55

66
try:
77
from .local import * # noqa
8-
except ImportError as error:
8+
except ImportError:
99
logger.warn('No local.py settings file found')

addons/dataverse/tests/test_client.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -180,7 +180,7 @@ def test_get_dataset_calls_patched_timeout_method(self, mock_requests):
180180
with assert_raises(Exception) as e:
181181
get_dataset(dataverse, 'My hdl')
182182
assert_is(mock_requests.get.assert_called_once_with('123', auth='me', timeout=settings.REQUEST_TIMEOUT), None)
183-
assert_equal(e.exception.message, 'Done Testing')
183+
assert_equal(str(e.exception), 'Done Testing')
184184

185185
def test_get_deaccessioned_dataset(self):
186186
self.mock_dataset.get_state.return_value = 'DEACCESSIONED'
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
# -*- coding: utf-8 -*-
2+
# Generated by Django 1.11.15 on 2019-06-27 20:29
3+
from __future__ import unicode_literals
4+
5+
from django.db import migrations
6+
import osf.utils.fields
7+
8+
9+
class Migration(migrations.Migration):
10+
11+
dependencies = [
12+
('addons_dropbox', '0003_auto_20170713_1125'),
13+
]
14+
15+
operations = [
16+
migrations.RenameField(
17+
model_name='nodesettings',
18+
new_name='is_deleted',
19+
old_name='deleted',
20+
),
21+
migrations.RenameField(
22+
model_name='usersettings',
23+
new_name='is_deleted',
24+
old_name='deleted',
25+
),
26+
migrations.AddField(
27+
model_name='nodesettings',
28+
name='deleted',
29+
field=osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True),
30+
),
31+
migrations.AddField(
32+
model_name='usersettings',
33+
name='deleted',
34+
field=osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True),
35+
),
36+
]

addons/dropbox/settings/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,5 @@
55

66
try:
77
from .local import * # noqa
8-
except ImportError as error:
8+
except ImportError:
99
logger.warn('No local.py settings file found')
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
# -*- coding: utf-8 -*-
2+
# Generated by Django 1.11.15 on 2019-06-27 20:29
3+
from __future__ import unicode_literals
4+
5+
from django.db import migrations
6+
import osf.utils.fields
7+
8+
9+
class Migration(migrations.Migration):
10+
11+
dependencies = [
12+
('addons_figshare', '0003_auto_20170713_1125'),
13+
]
14+
15+
operations = [
16+
migrations.RenameField(
17+
model_name='nodesettings',
18+
new_name='is_deleted',
19+
old_name='deleted',
20+
),
21+
migrations.RenameField(
22+
model_name='usersettings',
23+
new_name='is_deleted',
24+
old_name='deleted',
25+
),
26+
migrations.AddField(
27+
model_name='nodesettings',
28+
name='deleted',
29+
field=osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True),
30+
),
31+
migrations.AddField(
32+
model_name='usersettings',
33+
name='deleted',
34+
field=osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True),
35+
),
36+
]

addons/figshare/settings/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,5 @@
55

66
try:
77
from .local import * # noqa
8-
except ImportError as error:
8+
except ImportError:
99
logger.warn('No local.py settings file found')

0 commit comments

Comments
 (0)