From 7c3b9adefb0434b2967fd0fc0d94bb2828b84767 Mon Sep 17 00:00:00 2001 From: John Tordoff Date: Fri, 24 Jun 2022 11:20:47 -0400 Subject: [PATCH 01/72] remove post-migrate signals from migration stream (#9964) Co-authored-by: John Tordoff <> --- osf/migrations/0136_preprint_node_divorce.py | 1 - .../0137_transfer_preprint_service_permissions.py | 6 ------ osf/migrations/0162_post_migrate.py | 1 - osf/migrations/0199_draft_node_permissions.py | 1 - 4 files changed, 9 deletions(-) diff --git a/osf/migrations/0136_preprint_node_divorce.py b/osf/migrations/0136_preprint_node_divorce.py index 439192a1d36..870bacdd470 100644 --- a/osf/migrations/0136_preprint_node_divorce.py +++ b/osf/migrations/0136_preprint_node_divorce.py @@ -102,7 +102,6 @@ class Migration(migrations.Migration): ] operations = [ - migrations.RunPython(emit_signals, reverse_func), migrations.RunSQL( [ """ diff --git a/osf/migrations/0137_transfer_preprint_service_permissions.py b/osf/migrations/0137_transfer_preprint_service_permissions.py index 3d80de1bbf4..bdcca0eb2c9 100644 --- a/osf/migrations/0137_transfer_preprint_service_permissions.py +++ b/osf/migrations/0137_transfer_preprint_service_permissions.py @@ -3,12 +3,9 @@ from __future__ import unicode_literals from django.db import migrations -from django.core.management.sql import emit_post_migrate_signal def unmigrate_preprint_service_permissions(state, schema): - emit_post_migrate_signal(2, False, 'default') - Permission = state.get_model('auth', 'permission') # New permission groups @@ -21,9 +18,6 @@ def migrate_preprint_service_permissions(state, schema): """ Django permissions on the preprint model have new names. """ - # this is to make sure that the permissions created earlier exist! - emit_post_migrate_signal(2, False, 'default') - Permission = state.get_model('auth', 'permission') Permission.objects.filter(codename='add_preprint').delete() diff --git a/osf/migrations/0162_post_migrate.py b/osf/migrations/0162_post_migrate.py index 8486061a642..e0b7b5dd57c 100644 --- a/osf/migrations/0162_post_migrate.py +++ b/osf/migrations/0162_post_migrate.py @@ -21,5 +21,4 @@ class Migration(migrations.Migration): ] operations = [ - migrations.RunPython(post_migrate_signal, migrations.RunPython.noop), ] diff --git a/osf/migrations/0199_draft_node_permissions.py b/osf/migrations/0199_draft_node_permissions.py index 1d6a34e6c66..d319df22e3d 100644 --- a/osf/migrations/0199_draft_node_permissions.py +++ b/osf/migrations/0199_draft_node_permissions.py @@ -25,7 +25,6 @@ class Migration(migrations.Migration): ] operations = [ - migrations.RunPython(post_migrate_signal, migrations.RunPython.noop), migrations.RunSQL(add_draft_read_write_admin_auth_groups, remove_draft_auth_groups), migrations.RunSQL(add_permissions_to_draft_registration_groups, drop_draft_reg_group_object_permission_table), ] From 4a8bd614f2c79c390c5acece38a24de2fd196653 Mon Sep 17 00:00:00 2001 From: John Tordoff Date: Mon, 27 Jun 2022 14:38:55 -0400 Subject: [PATCH 02/72] move createcachetable to post migrate signal (#9944) Use management command in post-migrate signal to create cache table instead of in Raw SQL in migrations Co-authored-by: John Tordoff <> --- osf/apps.py | 6 +++++- osf/migrations/0156_create_cache_table.py | 12 ------------ osf/migrations/__init__.py | 7 +++++++ 3 files changed, 12 insertions(+), 13 deletions(-) diff --git a/osf/apps.py b/osf/apps.py index 63a7f9bedc4..aaeba15c9ec 100644 --- a/osf/apps.py +++ b/osf/apps.py @@ -2,7 +2,7 @@ from django.apps import AppConfig as BaseAppConfig from django.db.models.signals import post_migrate -from osf.migrations import update_permission_groups +from osf.migrations import update_permission_groups, create_cache_table class AppConfig(BaseAppConfig): @@ -16,3 +16,7 @@ def ready(self): update_permission_groups, dispatch_uid='osf.apps.update_permissions_groups' ) + post_migrate.connect( + create_cache_table, + dispatch_uid='osf.apps.create_cache_table' + ) diff --git a/osf/migrations/0156_create_cache_table.py b/osf/migrations/0156_create_cache_table.py index 8a4246592ff..e3cb3126d11 100644 --- a/osf/migrations/0156_create_cache_table.py +++ b/osf/migrations/0156_create_cache_table.py @@ -1,7 +1,6 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals from django.db import migrations -from django.conf import settings class Migration(migrations.Migration): @@ -9,15 +8,4 @@ class Migration(migrations.Migration): ('osf', '0155_merge_20190115_1437'), ] operations = [ - migrations.RunSQL([ - """ - CREATE TABLE "{}" ( - "cache_key" varchar(255) NOT NULL PRIMARY KEY, - "value" text NOT NULL, - "expires" timestamp with time zone NOT NULL - ); - """.format(settings.CACHES[settings.STORAGE_USAGE_CACHE_NAME]['LOCATION']) - ], [ - """DROP TABLE "{}"; """.format(settings.CACHES[settings.STORAGE_USAGE_CACHE_NAME]['LOCATION']) - ]) ] diff --git a/osf/migrations/__init__.py b/osf/migrations/__init__.py index 9b856bd1306..69f8c29269b 100644 --- a/osf/migrations/__init__.py +++ b/osf/migrations/__init__.py @@ -1,6 +1,8 @@ # -*- coding: utf-8 -*- import logging from django.db.utils import ProgrammingError +from django.core.management import call_command +from api.base import settings logger = logging.getLogger(__file__) @@ -119,3 +121,8 @@ def update_permission_groups(sender, verbosity=0, **kwargs): if getattr(sender, 'label', None) == 'osf': update_admin_permissions(verbosity) update_provider_auth_groups(verbosity) + + +def create_cache_table(sender, verbosity=0, **kwargs): + if getattr(sender, 'label', None) == 'osf': + call_command('createcachetable', tablename=settings.CACHES[settings.STORAGE_USAGE_CACHE_NAME]['LOCATION']) From bf7eb210c4860a3522e8ed92ff0a3202cafac3a2 Mon Sep 17 00:00:00 2001 From: John Tordoff Date: Fri, 1 Jul 2022 11:06:07 -0400 Subject: [PATCH 03/72] [ENG-3836] Investigate waffle flags (#9950) * Create Waffle Flags and Switches as post_migrate_signal (with configurable values) Co-authored-by: John Tordoff <> --- .../test_registration_provider_schemas.py | 2 +- .../views/test_registration_schemas_list.py | 2 +- osf/apps.py | 15 +- osf/features.py | 56 +---- osf/features.yaml | 216 ++++++++++++++++++ .../commands/manage_switch_flags.py | 52 ++--- osf/migrations/0083_add_ember_waffle_flags.py | 1 - .../0121_remove_support_page_waffle_flag.py | 1 - osf/migrations/0121_remove_waffle_flags.py | 1 - osf/migrations/0135_user_settings_waffles.py | 2 - ...136_add_ember_auth_register_waffle_flag.py | 3 - osf/migrations/0142_remove_forks_flag.py | 3 - .../0142_remove_waffle_analytics_flags.py | 3 - .../0144_add_prereg_winddown_switches.py | 4 - .../0149_add_datacite_doi_switch.py | 3 - ...remove_ember_project_registrations_flag.py | 4 +- osf/migrations/0157_add_storage_usage_flag.py | 4 - osf/migrations/0167_auto_20190506_1556.py | 4 - ...add_ab_testing_home_page_version_b_flag.py | 3 - .../0195_add_enable_chronos_waffle_flag.py | 3 - ...ting_home_page_hero_text_version_b_flag.py | 4 - osf/migrations/0199_draft_node_permissions.py | 5 - osf/migrations/0201_add_egap_flag.py | 3 - osf/migrations/__init__.py | 10 + .../test_manage_switch_flags.py | 57 ++--- website/settings/defaults.py | 1 + 26 files changed, 306 insertions(+), 156 deletions(-) create mode 100644 osf/features.yaml diff --git a/api_tests/providers/registrations/views/test_registration_provider_schemas.py b/api_tests/providers/registrations/views/test_registration_provider_schemas.py index e68db401204..fb2db1e0184 100644 --- a/api_tests/providers/registrations/views/test_registration_provider_schemas.py +++ b/api_tests/providers/registrations/views/test_registration_provider_schemas.py @@ -106,7 +106,7 @@ def provider_with_reg(self, osf_reg_schema, egap_schema, schema, out_dated_schem def egap_admin(self): user = AuthUserFactory() user.save() - flag = Flag.objects.get(name=EGAP_ADMINS) + flag = Flag.objects.create(name=EGAP_ADMINS) group = Group.objects.create(name=EGAP_ADMINS) # Just using the same name for convenience flag.groups.add(group) group.user_set.add(user) diff --git a/api_tests/schemas/views/test_registration_schemas_list.py b/api_tests/schemas/views/test_registration_schemas_list.py index c2ddede0f7a..4e34f0a93a1 100644 --- a/api_tests/schemas/views/test_registration_schemas_list.py +++ b/api_tests/schemas/views/test_registration_schemas_list.py @@ -31,7 +31,7 @@ def url(self): def egap_admin(self): user = AuthUserFactory() user.save() - flag = Flag.objects.get(name=features.EGAP_ADMINS) + flag = Flag.objects.create(name=features.EGAP_ADMINS) group = Group.objects.create(name=features.EGAP_ADMINS) # Just using the same name for convenience flag.groups.add(group) group.user_set.add(user) diff --git a/osf/apps.py b/osf/apps.py index aaeba15c9ec..f32ed14ef46 100644 --- a/osf/apps.py +++ b/osf/apps.py @@ -1,8 +1,13 @@ -from __future__ import unicode_literals - +import logging from django.apps import AppConfig as BaseAppConfig from django.db.models.signals import post_migrate -from osf.migrations import update_permission_groups, create_cache_table +from osf.migrations import ( + update_permission_groups, + update_waffle_flags, + create_cache_table +) + +logger = logging.getLogger(__file__) class AppConfig(BaseAppConfig): @@ -16,6 +21,10 @@ def ready(self): update_permission_groups, dispatch_uid='osf.apps.update_permissions_groups' ) + post_migrate.connect( + update_waffle_flags, + dispatch_uid='osf.apps.update_waffle_flags' + ) post_migrate.connect( create_cache_table, dispatch_uid='osf.apps.create_cache_table' diff --git a/osf/features.py b/osf/features.py index 1fa02508b6a..64f6750caa7 100644 --- a/osf/features.py +++ b/osf/features.py @@ -1,49 +1,11 @@ -flags = { - 'STORAGE_USAGE': 'storage_usage', - 'INSTITUTIONAL_LANDING_FLAG': 'institutions_nav_bar', - 'STORAGE_I18N': 'storage_i18n', - 'OSF_GROUPS': 'osf_groups', - 'ENABLE_CHRONOS': 'enable_chronos', - 'EGAP_ADMINS': 'egap_admins', - 'EMBER_AB_TESTING_HOME_PAGE_VERSION_B': 'ab_testing_home_page_version_b', - 'EMBER_AB_TESTING_HOME_PAGE_HERO_TEXT_VERSION_B': 'ab_testing_home_page_hero_text_version_b', - 'EMBER_AUTH_REGISTER': 'ember_auth_register', - 'EMBER_CREATE_DRAFT_REGISTRATION': 'ember_create_draft_registration_page', - 'EMBER_EDIT_DRAFT_REGISTRATION': 'ember_edit_draft_registration_page', - 'EMBER_FILE_REGISTRATION_DETAIL': 'ember_file_registration_detail_page', - 'EMBER_FILE_PROJECT_DETAIL': 'ember_file_project_detail_page', - 'EMBER_MEETINGS': 'ember_meetings_page', - 'EMBER_MEETING_DETAIL': 'ember_meeting_detail_page', - 'EMBER_MY_PROJECTS': 'ember_my_projects_page', - 'EMBER_PROJECT_ANALYTICS': 'ember_project_analytics_page', - 'EMBER_PROJECT_CONTRIBUTORS': 'ember_project_contributors_page', - 'EMBER_PROJECT_DETAIL': 'ember_project_detail_page', - 'EMBER_REGISTRATION_FILES': 'ember_registration_files_page', - 'EMBER_PROJECT_FILES': 'ember_project_files_page', - 'EMBER_PROJECT_FORKS': 'ember_project_forks_page', - 'EMBER_PROJECT_REGISTRATIONS': 'ember_project_registrations_page', - 'EMBER_PROJECT_SETTINGS': 'ember_project_settings_page', - 'EMBER_PROJECT_WIKI': 'ember_project_wiki_page', - 'EMBER_REGISTRATION_FORM_DETAIL': 'ember_registration_form_detail_page', - 'EMBER_REGISTRIES_DETAIL_PAGE': 'ember_registries_detail_page', - 'EMBER_SEARCH_PAGE': 'ember_search_page', - 'EMBER_USER_PROFILE': 'ember_user_profile_page', - 'EMBER_USER_SETTINGS': 'ember_user_settings_page', - 'EMBER_USER_SETTINGS_ACCOUNTS': 'ember_user_settings_account_page', - 'EMBER_USER_SETTINGS_ADDONS': 'ember_user_settings_addons_page', - 'EMBER_USER_SETTINGS_APPS': 'ember_user_settings_apps_page', - 'EMBER_USER_SETTINGS_NOTIFICATIONS': 'ember_user_settings_notifications_page', - 'EMBER_USER_SETTINGS_TOKENS': 'ember_user_settings_tokens_page', -} +import yaml +from website import settings -switches = { - 'ENABLE_INACTIVE_SCHEMAS': 'enable_inactive_schemas', - 'OSF_PREREGISTRATION': 'osf_preregistration', - 'DISABLE_ENGAGEMENT_EMAILS': 'disable_engagement_emails', - 'ELASTICSEARCH_METRICS': 'elasticsearch_metrics', - 'ENFORCE_CSRF': 'enforce_csrf', - 'ENABLE_RAW_METRICS': 'enable_raw_metrics', -} +with open(settings.WAFFLE_VALUES_YAML, 'r') as stream: + features = yaml.safe_load(stream) -locals().update(flags) -locals().update(switches) +for flag in features['flags']: + locals()[flag.pop('flag_name')] = flag['name'] + +for switch in features['switches']: + locals()[switch.pop('flag_name')] = switch['name'] diff --git a/osf/features.yaml b/osf/features.yaml new file mode 100644 index 00000000000..07181d9cca4 --- /dev/null +++ b/osf/features.yaml @@ -0,0 +1,216 @@ +# This file contains the default configuration for our feature flipping using waffle flags and switches, this represents +# the intended configuration of flags at the time of release, if you plan to switch the activity status of a feature in +# after release (during normal operation) please make sure that is reflected in this document by not explicitly setting +# it here. However features not intended to be after a release flipped should explicitly stated. + +# Workflow: +# 1. Add a flag/switch with a name and value to this document +# 2. Run `manage_waffle` to create the flag(s) +# 3. Use the admin app to enable/disable the flag/switch at your convenience +# 4. When feature is complete add the activity status (active or everyone) to the value it will have in production until +# the old flipping code can be removed. +# 5. When a flag name is no longer referenced anywhere in this repo or in the Ember app remove it from this list. +flags: + - flag_name: EMBER_FILE_PROJECT_DETAIL + name: ember_file_project_detail_page + note: This is part of the upcoming files page redesign + everyone: true + + - flag_name: EMBER_PROJECT_FILES + name: ember_project_files_page + note: This is part of the upcoming files page redesign + everyone: true + + - flag_name: STORAGE_USAGE + name: storage_usage + note: Indicates whether we display the file storage usage for each node on the project overview page. + everyone: true + + - flag_name: INSTITUTIONAL_LANDING_FLAG + name: institutions_nav_bar + note: Indicates whether we display the institutions navbar. + everyone: true + + - flag_name: STORAGE_I18N + name: storage_i18n + note: Indicates whether region based storage is enabled. + everyone: true + + - flag_name: OSF_GROUPS + name: osf_groups + note: Indicates whether certain parts of the OSF groups feature are enabled. + everyone: true + + - flag_name: EGAP_ADMINS + name: egap_admins + note: Indicates whether EGAP admins have special access to custom schemas + everyone: true + + - flag_name: EMBER_AUTH_REGISTER + name: ember_auth_register + note: This indicates whether this view is routed for OSF register, redirect or go to `auth_logout` + everyone: true + + - flag_name: EMBER_PROJECT_DETAIL + name: ember_project_detail_page + note: This flag controls wheter the project overview page is routed to the ember app + everyone: false + + - flag_name: EMBER_CREATE_DRAFT_REGISTRATION + name: ember_create_draft_registration_page + note: This flag controls wheter POST requests to /project//registrations/ and + /project//node//registrations/ are routed to the ember app + everyone: false + + - flag_name: EMBER_MEETING_DETAIL + name: ember_meeting_detail_page + note: This flag controls wheter the `conference_results` view routes to the Ember app + everyone: true + + - flag_name: EMBER_MY_PROJECTS + name: ember_my_projects_page + note: This flag controls wheter the `My Projects Page` view routes to the Ember app + everyone: false + + - flag_name: EMBER_PROJECT_CONTRIBUTORS + name: ember_project_contributors_page + note: This flag controls wheter the `Node Contributor Page` view routes to the Ember app + everyone: false + + - flag_name: EMBER_PROJECT_SETTINGS + name: ember_project_settings_page + note: This flag controls wheter the `Node Settings Page` view routes to the Ember app + everyone: false + + - flag_name: EMBER_PROJECT_WIKI + name: ember_project_wiki_page + note: This flag controls wheter the `Project Wiki Home Page` view routes to the Ember app + everyone: false + + - flag_name: EMBER_REGISTRATION_FORM_DETAIL + name: ember_registration_form_detail_page + note: This flag controls wheter the `Node Register Template Page` view routes to the Ember app + everyone: false + + - flag_name: EMBER_SEARCH_PAGE + name: ember_search_page + note: This flag controls wheter the `Search Page` view routes to the Ember app + everyone: false + + - flag_name: EMBER_USER_PROFILE + name: ember_user_profile_page + note: This flag controls wheter the `User Profile Page` view routes to the Ember app + everyone: false + + - flag_name: EMBER_USER_SETTINGS + name: ember_user_settings_page + note: This flag controls wheter the `User Settings Page` view routes to the Ember app + everyone: false + + - flag_name: EMBER_USER_SETTINGS_ADDONS + name: ember_user_settings_addons_page + note: This flag controls wheter the `User Addons Page` view routes to the Ember app + everyone: false + + - flag_name: EMBER_USER_SETTINGS_NOTIFICATIONS + name: ember_user_settings_notifications_page + note: This flag controls wheter the `User Notifications Page` view routes to the Ember app + everyone: false + + - flag_name: EMBER_MEETINGS + name: ember_meetings_page + note: This is complete and should be permanently on. + everyone: true + + - flag_name: EMBER_EDIT_DRAFT_REGISTRATION + name: ember_edit_draft_registration_page + note: This is complete and should be permanently on. + everyone: true + + - flag_name: EMBER_FILE_REGISTRATION_DETAIL + name: ember_file_registration_detail_page + note: This is complete and should be permanently on. + everyone: true + + - flag_name: EMBER_REGISTRATION_FILES + name: ember_registration_files_page + note: This is complete and should be permanently on. + everyone: true + + - flag_name: EMBER_REGISTRIES_DETAIL_PAGE + name: ember_registries_detail_page + note: This is complete and should be permanently on. + everyone: true + + - flag_name: EMBER_USER_SETTINGS_ACCOUNTS + name: ember_user_settings_account_page + note: This is complete and should be permanently on. + everyone: true + + - flag_name: EMBER_USER_SETTINGS_APPS + name: ember_user_settings_apps_page + note: This is complete and should be permanently on. + everyone: true + + - flag_name: EMBER_USER_SETTINGS_TOKENS + name: ember_user_settings_tokens_page + note: This is complete and should be permanently on. + everyone: true + + - flag_name: EMBER_AB_TESTING_HOME_PAGE_VERSION_B + name: ab_testing_home_page_version_b + note: This is no longer used. + + - flag_name: EMBER_AB_TESTING_HOME_PAGE_HERO_TEXT_VERSION_B + name: ab_testing_home_page_hero_text_version_b + note: This is no longer used. + everyone: true + + - flag_name: EMBER_PROJECT_ANALYTICS + name: ember_project_analytics_page + note: This is no longer used. + everyone: false + + - flag_name: EMBER_PROJECT_FORKS + name: ember_project_forks_page + note: This is no longer used. + everyone: false + + - flag_name: EMBER_PROJECT_REGISTRATIONS + name: ember_project_registrations_page + note: This is no longer used. + everyone: false + + - flag_name: ENABLE_CHRONOS + name: enable_chronos + note: This is not used + everyone: true + +switches: + - flag_name: DISABLE_ENGAGEMENT_EMAILS + name: disable_engagement_emails + note: if set to true, prevents engagment emails from being sent + active: false + + - flag_name: ELASTICSEARCH_METRICS + name: elasticsearch_metrics + note: enables ES metrics server + active: true + + - flag_name: ENFORCE_CSRF + name: enforce_csrf + note: enforces csrf for OSF session authentication + active: true + + - flag_name: ENABLE_RAW_METRICS + name: enable_raw_metrics + note: allows for raw queries againest our ES metrics database + active: false + + - flag_name: OSF_PREREGISTRATION + name: osf_preregistration + note: This is no longer used + + - flag_name: ENABLE_INACTIVE_SCHEMAS + name: enable_inactive_schemas + note: This is no longer used diff --git a/osf/management/commands/manage_switch_flags.py b/osf/management/commands/manage_switch_flags.py index 186ef15e682..ef39aa89f82 100644 --- a/osf/management/commands/manage_switch_flags.py +++ b/osf/management/commands/manage_switch_flags.py @@ -1,38 +1,36 @@ # -*- coding: utf-8 -*- import logging +import yaml from django.core.management.base import BaseCommand - -from osf.features import switches, flags -from waffle.models import Flag, Switch +from django.db import transaction +from website import settings logger = logging.getLogger(__name__) + def manage_waffle(delete_waffle=False): - file_switches = list(switches.values()) - current_switches = Switch.objects.values_list('name', flat=True) - - add_switches = set(file_switches) - set(current_switches) - for switch in add_switches: - Switch.objects.get_or_create(name=switch, defaults={'active': False}) - logger.info('Adding switch: {}'.format(switch)) - - file_flags = list(flags.values()) - current_flags = Flag.objects.values_list('name', flat=True) - - add_flags = set(file_flags) - set(current_flags) - for flag_name in add_flags: - Flag.objects.get_or_create(name=flag_name, defaults={'everyone': False}) - logger.info('Adding flag: {}'.format(flag_name)) - - if delete_waffle: - delete_switches = set(current_switches) - set(file_switches) - Switch.objects.filter(name__in=delete_switches).delete() - logger.info('Deleting switches: {}'.format(delete_switches)) - - delete_flags = set(current_flags) - set(file_flags) - Flag.objects.filter(name__in=delete_flags).delete() - logger.info('Deleting flags: {}'.format(delete_flags)) + # Inline importation of models is done to so for use in post migrate signal. + from django.apps import apps + Flag = apps.get_model('waffle.Flag') + Switch = apps.get_model('waffle.Switch') + + with transaction.atomic(): + if delete_waffle: + results = Switch.objects.all().delete() + logger.info(f'Deleting switches: {results}') + results = Flag.objects.all().delete() + logger.info(f'Deleting flags: {results}') + + with open(settings.WAFFLE_VALUES_YAML, 'r') as stream: + features = yaml.safe_load(stream) + for flag in features['flags']: + flag.pop('flag_name') + Flag.objects.update_or_create(name=flag['name'], defaults=flag) + for switch in features['switches']: + switch.pop('flag_name') + Switch.objects.update_or_create(name=switch['name'], defaults=switch) + class Command(BaseCommand): """Ensure all features and switches are updated with the switch and flag files diff --git a/osf/migrations/0083_add_ember_waffle_flags.py b/osf/migrations/0083_add_ember_waffle_flags.py index 925da76a37c..f4cca4b73e3 100644 --- a/osf/migrations/0083_add_ember_waffle_flags.py +++ b/osf/migrations/0083_add_ember_waffle_flags.py @@ -56,5 +56,4 @@ class Migration(migrations.Migration): ] operations = [ - migrations.RunPython(add_ember_waffle_flags, reverse_func) ] diff --git a/osf/migrations/0121_remove_support_page_waffle_flag.py b/osf/migrations/0121_remove_support_page_waffle_flag.py index 043b9a63f83..db51535e24a 100644 --- a/osf/migrations/0121_remove_support_page_waffle_flag.py +++ b/osf/migrations/0121_remove_support_page_waffle_flag.py @@ -20,5 +20,4 @@ class Migration(migrations.Migration): ] operations = [ - migrations.RunPython(remove_support_page_waffle_flags, reverse_func) ] diff --git a/osf/migrations/0121_remove_waffle_flags.py b/osf/migrations/0121_remove_waffle_flags.py index f7728c6410e..b694d966379 100644 --- a/osf/migrations/0121_remove_waffle_flags.py +++ b/osf/migrations/0121_remove_waffle_flags.py @@ -31,5 +31,4 @@ class Migration(migrations.Migration): ] operations = [ - migrations.RunPython(remove_waffle_flags, add_ember_waffle_flags) ] diff --git a/osf/migrations/0135_user_settings_waffles.py b/osf/migrations/0135_user_settings_waffles.py index 3ef7a18d1f0..988cd9c8829 100644 --- a/osf/migrations/0135_user_settings_waffles.py +++ b/osf/migrations/0135_user_settings_waffles.py @@ -5,7 +5,6 @@ from django.db import migrations from osf import features -from osf.utils.migrations import AddWaffleFlags USER_SETTINGS_FLAGS = [ @@ -24,5 +23,4 @@ class Migration(migrations.Migration): ] operations = [ - AddWaffleFlags(USER_SETTINGS_FLAGS), ] diff --git a/osf/migrations/0136_add_ember_auth_register_waffle_flag.py b/osf/migrations/0136_add_ember_auth_register_waffle_flag.py index 915bf35e8c4..4ad3d61c4ba 100644 --- a/osf/migrations/0136_add_ember_auth_register_waffle_flag.py +++ b/osf/migrations/0136_add_ember_auth_register_waffle_flag.py @@ -3,8 +3,6 @@ from __future__ import unicode_literals from django.db import migrations -from osf import features -from osf.utils.migrations import AddWaffleFlags class Migration(migrations.Migration): @@ -13,5 +11,4 @@ class Migration(migrations.Migration): ] operations = [ - AddWaffleFlags([features.EMBER_AUTH_REGISTER]), ] diff --git a/osf/migrations/0142_remove_forks_flag.py b/osf/migrations/0142_remove_forks_flag.py index 9307b85b639..1fb41fa5e41 100644 --- a/osf/migrations/0142_remove_forks_flag.py +++ b/osf/migrations/0142_remove_forks_flag.py @@ -2,8 +2,6 @@ # Generated by Django 1.11.15 on 2018-10-29 21:29 from __future__ import unicode_literals from django.db import migrations -from osf.utils.migrations import DeleteWaffleFlags -from osf.features import EMBER_PROJECT_FORKS class Migration(migrations.Migration): @@ -13,5 +11,4 @@ class Migration(migrations.Migration): ] operations = [ - DeleteWaffleFlags([EMBER_PROJECT_FORKS]) ] diff --git a/osf/migrations/0142_remove_waffle_analytics_flags.py b/osf/migrations/0142_remove_waffle_analytics_flags.py index 080e2e3d616..53ab673288d 100644 --- a/osf/migrations/0142_remove_waffle_analytics_flags.py +++ b/osf/migrations/0142_remove_waffle_analytics_flags.py @@ -2,8 +2,6 @@ # Generated by Django 1.11.15 on 2018-10-30 15:13 from __future__ import unicode_literals from django.db import migrations -from osf.utils.migrations import DeleteWaffleFlags -from osf.features import EMBER_PROJECT_ANALYTICS class Migration(migrations.Migration): @@ -11,5 +9,4 @@ class Migration(migrations.Migration): ('osf', '0142_remove_forks_flag'), ] operations = [ - DeleteWaffleFlags([EMBER_PROJECT_ANALYTICS]) ] diff --git a/osf/migrations/0144_add_prereg_winddown_switches.py b/osf/migrations/0144_add_prereg_winddown_switches.py index 375c25b621d..e5d2762a580 100644 --- a/osf/migrations/0144_add_prereg_winddown_switches.py +++ b/osf/migrations/0144_add_prereg_winddown_switches.py @@ -3,9 +3,6 @@ from django.db import migrations -from osf import features -from osf.utils.migrations import AddWaffleSwitches - class Migration(migrations.Migration): @@ -14,5 +11,4 @@ class Migration(migrations.Migration): ] operations = [ - AddWaffleSwitches([features.OSF_PREREGISTRATION], active=False), ] diff --git a/osf/migrations/0149_add_datacite_doi_switch.py b/osf/migrations/0149_add_datacite_doi_switch.py index 34d129ff787..278a277ad18 100644 --- a/osf/migrations/0149_add_datacite_doi_switch.py +++ b/osf/migrations/0149_add_datacite_doi_switch.py @@ -3,8 +3,6 @@ from django.db import migrations -from osf.utils.migrations import AddWaffleSwitches - class Migration(migrations.Migration): @@ -13,5 +11,4 @@ class Migration(migrations.Migration): ] operations = [ - AddWaffleSwitches(['disable_datacite_dois'], active=False), ] diff --git a/osf/migrations/0154_remove_ember_project_registrations_flag.py b/osf/migrations/0154_remove_ember_project_registrations_flag.py index a8d16929170..8c9f09a9eaa 100644 --- a/osf/migrations/0154_remove_ember_project_registrations_flag.py +++ b/osf/migrations/0154_remove_ember_project_registrations_flag.py @@ -3,8 +3,7 @@ from __future__ import unicode_literals from django.db import migrations -from osf.utils.migrations import DeleteWaffleFlags -from osf.features import EMBER_PROJECT_REGISTRATIONS + class Migration(migrations.Migration): @@ -13,5 +12,4 @@ class Migration(migrations.Migration): ] operations = [ - DeleteWaffleFlags([EMBER_PROJECT_REGISTRATIONS]) ] diff --git a/osf/migrations/0157_add_storage_usage_flag.py b/osf/migrations/0157_add_storage_usage_flag.py index fdeddf6e590..57b9fbadc3d 100644 --- a/osf/migrations/0157_add_storage_usage_flag.py +++ b/osf/migrations/0157_add_storage_usage_flag.py @@ -2,9 +2,6 @@ from __future__ import unicode_literals from django.db import migrations -from osf import features -from osf.utils.migrations import AddWaffleFlags - class Migration(migrations.Migration): dependencies = [ @@ -12,5 +9,4 @@ class Migration(migrations.Migration): ] operations = [ - AddWaffleFlags([features.STORAGE_USAGE]), ] diff --git a/osf/migrations/0167_auto_20190506_1556.py b/osf/migrations/0167_auto_20190506_1556.py index b63d94b9c53..2145ec2fa31 100644 --- a/osf/migrations/0167_auto_20190506_1556.py +++ b/osf/migrations/0167_auto_20190506_1556.py @@ -2,9 +2,6 @@ from __future__ import unicode_literals from django.db import migrations -from osf import features -from osf.utils.migrations import AddWaffleFlags - class Migration(migrations.Migration): dependencies = [ @@ -12,5 +9,4 @@ class Migration(migrations.Migration): ] operations = [ - AddWaffleFlags([features.OSF_GROUPS], on_for_everyone=False), ] diff --git a/osf/migrations/0174_add_ab_testing_home_page_version_b_flag.py b/osf/migrations/0174_add_ab_testing_home_page_version_b_flag.py index 73aa52be2c4..fd714e6bf8c 100644 --- a/osf/migrations/0174_add_ab_testing_home_page_version_b_flag.py +++ b/osf/migrations/0174_add_ab_testing_home_page_version_b_flag.py @@ -3,8 +3,6 @@ from __future__ import unicode_literals from django.db import migrations -from osf import features -from osf.utils.migrations import AddWaffleFlags class Migration(migrations.Migration): @@ -13,5 +11,4 @@ class Migration(migrations.Migration): ] operations = [ - AddWaffleFlags([features.EMBER_AB_TESTING_HOME_PAGE_VERSION_B]), ] diff --git a/osf/migrations/0195_add_enable_chronos_waffle_flag.py b/osf/migrations/0195_add_enable_chronos_waffle_flag.py index b0c585474fb..42eeb83446c 100644 --- a/osf/migrations/0195_add_enable_chronos_waffle_flag.py +++ b/osf/migrations/0195_add_enable_chronos_waffle_flag.py @@ -3,8 +3,6 @@ from __future__ import unicode_literals from django.db import migrations -from osf import features -from osf.utils.migrations import AddWaffleFlags class Migration(migrations.Migration): @@ -13,5 +11,4 @@ class Migration(migrations.Migration): ] operations = [ - AddWaffleFlags([features.ENABLE_CHRONOS]), ] diff --git a/osf/migrations/0197_add_ab_testing_home_page_hero_text_version_b_flag.py b/osf/migrations/0197_add_ab_testing_home_page_hero_text_version_b_flag.py index c8a55d4f956..323cc0dc960 100644 --- a/osf/migrations/0197_add_ab_testing_home_page_hero_text_version_b_flag.py +++ b/osf/migrations/0197_add_ab_testing_home_page_hero_text_version_b_flag.py @@ -3,8 +3,6 @@ from __future__ import unicode_literals from django.db import migrations -from osf import features -from osf.utils.migrations import AddWaffleFlags, DeleteWaffleFlags class Migration(migrations.Migration): @@ -13,6 +11,4 @@ class Migration(migrations.Migration): ] operations = [ - AddWaffleFlags([features.EMBER_AB_TESTING_HOME_PAGE_HERO_TEXT_VERSION_B]), - DeleteWaffleFlags([features.EMBER_AB_TESTING_HOME_PAGE_VERSION_B]), ] diff --git a/osf/migrations/0199_draft_node_permissions.py b/osf/migrations/0199_draft_node_permissions.py index d319df22e3d..1da33146cfb 100644 --- a/osf/migrations/0199_draft_node_permissions.py +++ b/osf/migrations/0199_draft_node_permissions.py @@ -3,7 +3,6 @@ from __future__ import unicode_literals import logging from django.db import migrations -from django.core.management.sql import emit_post_migrate_signal from osf.migrations.sql.draft_nodes_migration import ( add_draft_read_write_admin_auth_groups, @@ -14,10 +13,6 @@ logger = logging.getLogger(__name__) -def post_migrate_signal(state, schema): - # this is to make sure that the draft registration permissions created earlier exist! - emit_post_migrate_signal(3, False, 'default') - class Migration(migrations.Migration): dependencies = [ diff --git a/osf/migrations/0201_add_egap_flag.py b/osf/migrations/0201_add_egap_flag.py index 54b7079d723..f93c9d41177 100644 --- a/osf/migrations/0201_add_egap_flag.py +++ b/osf/migrations/0201_add_egap_flag.py @@ -3,8 +3,6 @@ from __future__ import unicode_literals from django.db import migrations -from osf import features -from osf.utils.migrations import AddWaffleFlags class Migration(migrations.Migration): @@ -13,5 +11,4 @@ class Migration(migrations.Migration): ] operations = [ - AddWaffleFlags([features.EGAP_ADMINS], on_for_everyone=None), ] diff --git a/osf/migrations/__init__.py b/osf/migrations/__init__.py index 69f8c29269b..9e3bf4a3f1e 100644 --- a/osf/migrations/__init__.py +++ b/osf/migrations/__init__.py @@ -1,9 +1,12 @@ # -*- coding: utf-8 -*- +import sys import logging from django.db.utils import ProgrammingError +from osf.management.commands.manage_switch_flags import manage_waffle from django.core.management import call_command from api.base import settings + logger = logging.getLogger(__file__) @@ -123,6 +126,13 @@ def update_permission_groups(sender, verbosity=0, **kwargs): update_provider_auth_groups(verbosity) +def update_waffle_flags(sender, verbosity=0, **kwargs): + if getattr(sender, 'label', None) == 'osf': + if 'pytest' not in sys.modules: + manage_waffle() + logger.info('Waffle flags have been synced') + + def create_cache_table(sender, verbosity=0, **kwargs): if getattr(sender, 'label', None) == 'osf': call_command('createcachetable', tablename=settings.CACHES[settings.STORAGE_USAGE_CACHE_NAME]['LOCATION']) diff --git a/osf_tests/management_commands/test_manage_switch_flags.py b/osf_tests/management_commands/test_manage_switch_flags.py index fb150294092..547d3062831 100644 --- a/osf_tests/management_commands/test_manage_switch_flags.py +++ b/osf_tests/management_commands/test_manage_switch_flags.py @@ -1,37 +1,40 @@ # -*- coding: utf-8 -*- import pytest +from unittest.mock import patch, mock_open from waffle.models import Flag, Switch -from osf.features import flags, switches from osf.management.commands.manage_switch_flags import manage_waffle -@pytest.fixture() -def test_switch(monkeypatch): - test_switches = switches.copy() - test_switches['TEST_SWITCH'] = 'new_test_switch' - monkeypatch.setattr('osf.management.commands.manage_switch_flags.switches', test_switches) - return test_switches - -@pytest.fixture() -def test_flag(monkeypatch): - test_flags = flags.copy() - test_flags['TEST_FLAG'] = 'new_test_flag' - monkeypatch.setattr('osf.management.commands.manage_switch_flags.flags', test_flags) - return test_flags - @pytest.mark.django_db -def test_manage_flags(test_switch, test_flag, monkeypatch): - manage_waffle() - assert Flag.objects.filter(name='new_test_flag') - assert Switch.objects.filter(name='new_test_switch') +class TestWaffleFlags(): + + @pytest.fixture() + def yaml_data(self): + return ''' + flags: + - flag_name: TEST_FLAG + name: test_flag_page + note: This is for tests only + everyone: true + switches: + - flag_name: TEST_SWITCH + name: test_switch_page + note: This is for tests only + active: false + ''' - monkeypatch.setattr('osf.management.commands.manage_switch_flags.flags', flags) - monkeypatch.setattr('osf.management.commands.manage_switch_flags.switches', switches) + def test_manage_flags(self, yaml_data): + with patch('builtins.open', mock_open(read_data=yaml_data)): + manage_waffle() + assert Flag.objects.all().count() == 1 + assert Switch.objects.all().count() == 1 - manage_waffle() - assert Flag.objects.filter(name='new_test_flag') - assert Switch.objects.filter(name='new_test_switch') + def test_manage_flags_delete(self, yaml_data): + Flag.objects.create(name='new_test_flag') + Switch.objects.create(name='new_test_flag') - manage_waffle(True) - assert not Flag.objects.filter(name='new_test_flag') - assert not Switch.objects.filter(name='new_test_switch') + with patch('builtins.open', mock_open(read_data=yaml_data)): + manage_waffle() + manage_waffle(delete_waffle=True) + assert not Flag.objects.filter(name='new_test_flag') + assert not Switch.objects.filter(name='new_test_switch') diff --git a/website/settings/defaults.py b/website/settings/defaults.py index 6e6efb01e34..a70476ea82e 100644 --- a/website/settings/defaults.py +++ b/website/settings/defaults.py @@ -2108,3 +2108,4 @@ def from_node_usage(cls, usage_bytes, private_limit=None, public_limit=None): CAS_LOG_LEVEL = 3 # ERROR PREPRINT_METRICS_START_DATE = datetime.datetime(2019, 1, 1) +WAFFLE_VALUES_YAML = 'osf/features.yaml' \ No newline at end of file From 15f15e924b806f7cec13b812f262960a437e57c2 Mon Sep 17 00:00:00 2001 From: John Tordoff Date: Tue, 12 Jul 2022 13:43:07 -0400 Subject: [PATCH 04/72] [ENG-3865] Create Licenses using post-migrate signal (#9961) * remove licenses from migration stream and only use post-migrate signal Co-authored-by: John Tordoff <> --- osf/apps.py | 7 ++++++- osf/migrations/0037_ensure_licenses.py | 2 -- osf/migrations/0095_add_url_to_licenses.py | 2 -- osf/migrations/0095_ensure_licenses.py | 2 -- osf/migrations/0138_ensure_subjects_and_providers.py | 4 ---- osf/migrations/__init__.py | 10 ++++++++-- osf_tests/test_registration_bulk_upload_parser.py | 4 +++- 7 files changed, 17 insertions(+), 14 deletions(-) diff --git a/osf/apps.py b/osf/apps.py index f32ed14ef46..08ca75d405b 100644 --- a/osf/apps.py +++ b/osf/apps.py @@ -4,7 +4,8 @@ from osf.migrations import ( update_permission_groups, update_waffle_flags, - create_cache_table + create_cache_table, + update_license ) logger = logging.getLogger(__file__) @@ -21,6 +22,10 @@ def ready(self): update_permission_groups, dispatch_uid='osf.apps.update_permissions_groups' ) + post_migrate.connect( + update_license, + dispatch_uid='osf.apps.ensure_licenses', + ) post_migrate.connect( update_waffle_flags, dispatch_uid='osf.apps.update_waffle_flags' diff --git a/osf/migrations/0037_ensure_licenses.py b/osf/migrations/0037_ensure_licenses.py index dc8d8e62e71..577653824a4 100644 --- a/osf/migrations/0037_ensure_licenses.py +++ b/osf/migrations/0037_ensure_licenses.py @@ -5,7 +5,6 @@ import logging from django.db import migrations -from osf.utils.migrations import ensure_licenses, remove_licenses logger = logging.getLogger(__file__) @@ -18,5 +17,4 @@ class Migration(migrations.Migration): ] operations = [ - migrations.RunPython(ensure_licenses, remove_licenses), ] diff --git a/osf/migrations/0095_add_url_to_licenses.py b/osf/migrations/0095_add_url_to_licenses.py index 5205ab1978b..b1e4c92c1df 100644 --- a/osf/migrations/0095_add_url_to_licenses.py +++ b/osf/migrations/0095_add_url_to_licenses.py @@ -3,7 +3,6 @@ from __future__ import unicode_literals from django.db import migrations, models -from osf.utils.migrations import ensure_licenses, remove_licenses class Migration(migrations.Migration): @@ -18,5 +17,4 @@ class Migration(migrations.Migration): name='url', field=models.URLField(blank=True), ), - migrations.RunPython(ensure_licenses, remove_licenses), ] diff --git a/osf/migrations/0095_ensure_licenses.py b/osf/migrations/0095_ensure_licenses.py index 561a647f662..78f732dfa1c 100644 --- a/osf/migrations/0095_ensure_licenses.py +++ b/osf/migrations/0095_ensure_licenses.py @@ -5,7 +5,6 @@ import logging from django.db import migrations -from osf.utils.migrations import ensure_licenses, remove_licenses logger = logging.getLogger(__file__) @@ -18,5 +17,4 @@ class Migration(migrations.Migration): ] operations = [ - migrations.RunPython(ensure_licenses, remove_licenses), ] diff --git a/osf/migrations/0138_ensure_subjects_and_providers.py b/osf/migrations/0138_ensure_subjects_and_providers.py index 2cb09cb7bee..6c4984b614c 100644 --- a/osf/migrations/0138_ensure_subjects_and_providers.py +++ b/osf/migrations/0138_ensure_subjects_and_providers.py @@ -19,8 +19,6 @@ 'domain': DOMAIN, 'share_publish_type': 'Preprint', 'domain_redirect_enabled': False, - 'default_license': 'CC0 1.0 Universal', - 'licenses_acceptable': ['CC0 1.0 Universal', 'CC-By Attribution 4.0 International', 'No license'], } OSF_REGISTRIES_DATA = { '_id': 'osf', @@ -29,8 +27,6 @@ 'domain': DOMAIN, 'share_publish_type': 'Registration', 'domain_redirect_enabled': False, - 'default_license': 'CC0 1.0 Universal', - 'licenses_acceptable': ['CC0 1.0 Universal', 'CC-By Attribution 4.0 International', 'No license'], } def _create_provider(cls, data, state): diff --git a/osf/migrations/__init__.py b/osf/migrations/__init__.py index 9e3bf4a3f1e..ca7c647456e 100644 --- a/osf/migrations/__init__.py +++ b/osf/migrations/__init__.py @@ -4,7 +4,7 @@ from django.db.utils import ProgrammingError from osf.management.commands.manage_switch_flags import manage_waffle from django.core.management import call_command -from api.base import settings +from api.base import settings as api_settings logger = logging.getLogger(__file__) @@ -126,6 +126,12 @@ def update_permission_groups(sender, verbosity=0, **kwargs): update_provider_auth_groups(verbosity) +def update_license(sender, verbosity=0, **kwargs): + if getattr(sender, 'label', None) == 'osf': + from osf.utils.migrations import ensure_licenses + ensure_licenses() + + def update_waffle_flags(sender, verbosity=0, **kwargs): if getattr(sender, 'label', None) == 'osf': if 'pytest' not in sys.modules: @@ -135,4 +141,4 @@ def update_waffle_flags(sender, verbosity=0, **kwargs): def create_cache_table(sender, verbosity=0, **kwargs): if getattr(sender, 'label', None) == 'osf': - call_command('createcachetable', tablename=settings.CACHES[settings.STORAGE_USAGE_CACHE_NAME]['LOCATION']) + call_command('createcachetable', tablename=api_settings.CACHES[api_settings.STORAGE_USAGE_CACHE_NAME]['LOCATION']) diff --git a/osf_tests/test_registration_bulk_upload_parser.py b/osf_tests/test_registration_bulk_upload_parser.py index 7421a9700c7..b7c78774e9f 100644 --- a/osf_tests/test_registration_bulk_upload_parser.py +++ b/osf_tests/test_registration_bulk_upload_parser.py @@ -8,7 +8,7 @@ from rest_framework.exceptions import NotFound from osf_tests.factories import SubjectFactory -from osf.models import RegistrationSchema, RegistrationProvider +from osf.models import RegistrationSchema, RegistrationProvider, NodeLicense from osf.registrations.utils import (BulkRegistrationUpload, InvalidHeadersError, FileUploadNotSupportedError, DuplicateHeadersError, @@ -79,6 +79,8 @@ def provider_subjects(self): @pytest.fixture() def registration_provider(self, open_ended_schema, provider_subjects): osf_provider = RegistrationProvider.load('osf') + osf_provider.default_license = NodeLicense.objects.get(name='No license') + osf_provider.licenses_acceptable.add(NodeLicense.objects.get(name='No license')) osf_provider.schemas.add(open_ended_schema) osf_provider.subjects.add(*provider_subjects) osf_provider.save() From 5746a84f4a6ed6f14fd68e7c563750eaa4f11690 Mon Sep 17 00:00:00 2001 From: Longze Chen Date: Wed, 13 Jul 2022 12:10:27 -0400 Subject: [PATCH 05/72] [ENG-3863] Move schema ensuring and schema blocks update to post-migrate signals (#9974) * Set noop to all ensure_schema migrations * Set noop to shema and shema block updates * Add ensuring schema and updating schema blocks to post-migrate signals * Set noop to one-time data migrations, which include * Preprint permissions * Schema to schema blocks * Draft node permissions * Remove manual post-migration signals from PND * Move generate_object_id into migration utils * Replace duplicate function with inline imports --- osf/apps.py | 13 ++++- osf/migrations/0038_ensure_schemas.py | 6 +- osf/migrations/0077_ensure_schemas.py | 6 +- osf/migrations/0078_ensure_schemas.py | 6 +- osf/migrations/0080_ensure_schemas.py | 5 +- osf/migrations/0096_ensure_schemas.py | 6 +- osf/migrations/0112_ensure_schemas.py | 6 +- osf/migrations/0136_preprint_node_divorce.py | 6 -- ...7_transfer_preprint_service_permissions.py | 30 +--------- .../0142_change_registration_schemas.py | 3 - osf/migrations/0152_ensure_schemas.py | 5 +- osf/migrations/0162_post_migrate.py | 6 -- osf/migrations/0170_ensure_schemas.py | 6 +- osf/migrations/0172_ensure_schemas.py | 6 +- osf/migrations/0173_ensure_schemas.py | 6 +- .../0191_migrate_schemas_to_schemablocks.py | 57 +------------------ osf/migrations/0196_update_schemas.py | 16 +----- osf/migrations/0199_draft_node_permissions.py | 11 +--- osf/migrations/0204_ensure_schemas.py | 5 +- osf/migrations/0207_ensure_schemas.py | 5 +- osf/migrations/0207_update_schemas2.py | 12 +--- osf/migrations/0208_update_EGAP_schema.py | 7 +-- osf/migrations/0221_add_schemas.py | 21 +------ osf/migrations/0227_add_secondary_data.py | 15 +---- osf/migrations/__init__.py | 12 +++- osf/utils/migrations.py | 4 +- 26 files changed, 45 insertions(+), 236 deletions(-) diff --git a/osf/apps.py b/osf/apps.py index 08ca75d405b..87b2bc398f9 100644 --- a/osf/apps.py +++ b/osf/apps.py @@ -5,31 +5,42 @@ update_permission_groups, update_waffle_flags, create_cache_table, - update_license + update_license, + add_registration_schemas ) logger = logging.getLogger(__file__) class AppConfig(BaseAppConfig): + name = 'osf' app_label = 'osf' managed = True def ready(self): super(AppConfig, self).ready() + + post_migrate.connect( + add_registration_schemas, + dispatch_uid='osf.apps.add_registration_schemas' + ) + post_migrate.connect( update_permission_groups, dispatch_uid='osf.apps.update_permissions_groups' ) + post_migrate.connect( update_license, dispatch_uid='osf.apps.ensure_licenses', ) + post_migrate.connect( update_waffle_flags, dispatch_uid='osf.apps.update_waffle_flags' ) + post_migrate.connect( create_cache_table, dispatch_uid='osf.apps.create_cache_table' diff --git a/osf/migrations/0038_ensure_schemas.py b/osf/migrations/0038_ensure_schemas.py index aa83d6524e8..404bc77d646 100644 --- a/osf/migrations/0038_ensure_schemas.py +++ b/osf/migrations/0038_ensure_schemas.py @@ -5,8 +5,6 @@ import logging from django.db import migrations -from osf.utils.migrations import ensure_schemas, remove_schemas - logger = logging.getLogger(__file__) @@ -17,6 +15,4 @@ class Migration(migrations.Migration): ('osf', '0037_ensure_licenses'), ] - operations = [ - migrations.RunPython(ensure_schemas, remove_schemas), - ] + operations = [] diff --git a/osf/migrations/0077_ensure_schemas.py b/osf/migrations/0077_ensure_schemas.py index 1a52b8c93c7..a3a8763abe5 100644 --- a/osf/migrations/0077_ensure_schemas.py +++ b/osf/migrations/0077_ensure_schemas.py @@ -5,8 +5,6 @@ import logging from django.db import migrations -from osf.utils.migrations import ensure_schemas, remove_schemas - logger = logging.getLogger(__file__) @@ -17,6 +15,4 @@ class Migration(migrations.Migration): ('osf', '0076_action_rename'), ] - operations = [ - migrations.RunPython(ensure_schemas, remove_schemas), - ] + operations = [] diff --git a/osf/migrations/0078_ensure_schemas.py b/osf/migrations/0078_ensure_schemas.py index 930658b1c2e..bcbb2084a31 100644 --- a/osf/migrations/0078_ensure_schemas.py +++ b/osf/migrations/0078_ensure_schemas.py @@ -3,8 +3,6 @@ import logging from django.db import migrations -from osf.utils.migrations import ensure_schemas, remove_schemas - logger = logging.getLogger(__file__) @@ -15,6 +13,4 @@ class Migration(migrations.Migration): ('osf', '0077_add_maintenance_permissions'), ] - operations = [ - migrations.RunPython(ensure_schemas, remove_schemas), - ] + operations = [] diff --git a/osf/migrations/0080_ensure_schemas.py b/osf/migrations/0080_ensure_schemas.py index 428c3aed0cc..0b9de570775 100644 --- a/osf/migrations/0080_ensure_schemas.py +++ b/osf/migrations/0080_ensure_schemas.py @@ -3,7 +3,6 @@ import logging from django.db import migrations -from osf.utils.migrations import ensure_schemas, remove_schemas logger = logging.getLogger(__file__) @@ -15,6 +14,4 @@ class Migration(migrations.Migration): ('osf', '0079_merge_20180207_1545'), ] - operations = [ - migrations.RunPython(ensure_schemas, remove_schemas), - ] + operations = [] diff --git a/osf/migrations/0096_ensure_schemas.py b/osf/migrations/0096_ensure_schemas.py index 45a3751c593..ec6d40621db 100644 --- a/osf/migrations/0096_ensure_schemas.py +++ b/osf/migrations/0096_ensure_schemas.py @@ -3,8 +3,6 @@ import logging from django.db import migrations -from osf.utils.migrations import ensure_schemas, remove_schemas - logger = logging.getLogger(__file__) @@ -15,6 +13,4 @@ class Migration(migrations.Migration): ('osf', '0095_reset_osf_abstractprovider_licenses_acceptable_id_seq'), ] - operations = [ - migrations.RunPython(ensure_schemas, remove_schemas), - ] + operations = [] diff --git a/osf/migrations/0112_ensure_schemas.py b/osf/migrations/0112_ensure_schemas.py index 06805cd28b5..f28075029e3 100644 --- a/osf/migrations/0112_ensure_schemas.py +++ b/osf/migrations/0112_ensure_schemas.py @@ -3,8 +3,6 @@ import logging from django.db import migrations -from osf.utils.migrations import ensure_schemas, remove_schemas - logger = logging.getLogger(__file__) @@ -15,6 +13,4 @@ class Migration(migrations.Migration): ('osf', '0111_auto_20180605_1240'), ] - operations = [ - migrations.RunPython(ensure_schemas, remove_schemas), - ] + operations = [] diff --git a/osf/migrations/0136_preprint_node_divorce.py b/osf/migrations/0136_preprint_node_divorce.py index 870bacdd470..ea86dcd002d 100644 --- a/osf/migrations/0136_preprint_node_divorce.py +++ b/osf/migrations/0136_preprint_node_divorce.py @@ -7,7 +7,6 @@ from django.contrib.contenttypes.models import ContentType from django.db import migrations from django.db.models import Func, Value, F, Q -from django.core.management.sql import emit_post_migrate_signal from bulk_update.helper import bulk_update logger = logging.getLogger(__name__) @@ -89,11 +88,6 @@ def reverse_func(apps, schema_editor): def format_group(self, name): return group_format.format(self=self, group=name) -def emit_signals(state, schema): - # this is to make sure that the permissions created earlier exist! - emit_post_migrate_signal(2, False, 'default') - logger.info('Starting preprint node divorce [SQL]:') - class Migration(migrations.Migration): diff --git a/osf/migrations/0137_transfer_preprint_service_permissions.py b/osf/migrations/0137_transfer_preprint_service_permissions.py index bdcca0eb2c9..98a93da98a6 100644 --- a/osf/migrations/0137_transfer_preprint_service_permissions.py +++ b/osf/migrations/0137_transfer_preprint_service_permissions.py @@ -5,38 +5,10 @@ from django.db import migrations -def unmigrate_preprint_service_permissions(state, schema): - Permission = state.get_model('auth', 'permission') - - # New permission groups - Permission.objects.filter(codename='add_preprint').update(codename='add_preprintservice', name='Can add preprint service') - Permission.objects.filter(codename='change_preprint').update(codename='change_preprintservice', name='Can change preprint service') - Permission.objects.filter(codename='delete_preprint').update(codename='delete_preprintservice', name='Can delete preprint service') - Permission.objects.filter(codename='view_preprint').update(codename='view_preprintservice', name='Can view preprint service details in the admin app.') - -def migrate_preprint_service_permissions(state, schema): - """ - Django permissions on the preprint model have new names. - """ - Permission = state.get_model('auth', 'permission') - - Permission.objects.filter(codename='add_preprint').delete() - Permission.objects.filter(codename='change_preprint').delete() - Permission.objects.filter(codename='delete_preprint').delete() - Permission.objects.filter(codename='view_preprint').delete() - - # Old permission groups - Permission.objects.filter(codename='add_preprintservice').update(codename='add_preprint', name='Can add preprint') - Permission.objects.filter(codename='change_preprintservice').update(codename='change_preprint', name='Can change preprint') - Permission.objects.filter(codename='delete_preprintservice').update(codename='delete_preprint', name='Can delete preprint') - Permission.objects.filter(codename='view_preprintservice').update(codename='view_preprint', name='Can view preprint details in the admin app') - class Migration(migrations.Migration): dependencies = [ ('osf', '0136_preprint_node_divorce'), ] - operations = [ - migrations.RunPython(migrate_preprint_service_permissions, unmigrate_preprint_service_permissions), - ] + operations = [] diff --git a/osf/migrations/0142_change_registration_schemas.py b/osf/migrations/0142_change_registration_schemas.py index d24f8763091..92e76bf97ed 100644 --- a/osf/migrations/0142_change_registration_schemas.py +++ b/osf/migrations/0142_change_registration_schemas.py @@ -3,7 +3,6 @@ import logging from django.db import migrations -from osf.utils.migrations import ensure_schemas logger = logging.getLogger(__file__) @@ -16,6 +15,4 @@ class Migration(migrations.Migration): ] operations = [ - # To reverse this migrations simply revert changes to the schema and re-run - migrations.RunPython(ensure_schemas, ensure_schemas), ] diff --git a/osf/migrations/0152_ensure_schemas.py b/osf/migrations/0152_ensure_schemas.py index 1f9002c1ea8..6d3a65183c0 100644 --- a/osf/migrations/0152_ensure_schemas.py +++ b/osf/migrations/0152_ensure_schemas.py @@ -1,7 +1,6 @@ from __future__ import unicode_literals from django.db import migrations -from osf.utils.migrations import ensure_schemas class Migration(migrations.Migration): @@ -10,6 +9,4 @@ class Migration(migrations.Migration): ('osf', '0151_auto_20181215_1911'), ] - operations = [ - migrations.RunPython(ensure_schemas, ensure_schemas), - ] + operations = [] diff --git a/osf/migrations/0162_post_migrate.py b/osf/migrations/0162_post_migrate.py index e0b7b5dd57c..f82ae7f9a28 100644 --- a/osf/migrations/0162_post_migrate.py +++ b/osf/migrations/0162_post_migrate.py @@ -4,15 +4,9 @@ import logging from django.db import migrations -from django.core.management.sql import emit_post_migrate_signal logger = logging.getLogger(__name__) -def post_migrate_signal(state, schema): - # this is to make sure that the permissions created earlier exist! - emit_post_migrate_signal(3, False, 'default') - logger.info('Starting guardian/groups migration [SQL]:') - class Migration(migrations.Migration): diff --git a/osf/migrations/0170_ensure_schemas.py b/osf/migrations/0170_ensure_schemas.py index 8f171af69da..d38a9e34a06 100644 --- a/osf/migrations/0170_ensure_schemas.py +++ b/osf/migrations/0170_ensure_schemas.py @@ -3,7 +3,6 @@ from __future__ import unicode_literals from django.db import migrations -from osf.utils.migrations import ensure_schemas class Migration(migrations.Migration): @@ -11,7 +10,4 @@ class Migration(migrations.Migration): ('osf', '0169_merge_20190618_1429'), ] - operations = [ - # To reverse this migrations simply revert changes to the schema and re-run - migrations.RunPython(ensure_schemas, ensure_schemas), - ] + operations = [] diff --git a/osf/migrations/0172_ensure_schemas.py b/osf/migrations/0172_ensure_schemas.py index e30987f2267..fc51538cdcd 100644 --- a/osf/migrations/0172_ensure_schemas.py +++ b/osf/migrations/0172_ensure_schemas.py @@ -3,7 +3,6 @@ from __future__ import unicode_literals from django.db import migrations -from osf.utils.migrations import ensure_schemas class Migration(migrations.Migration): @@ -12,7 +11,4 @@ class Migration(migrations.Migration): ('osf', '0171_add_registration_files_count'), ] - operations = [ - # To reverse this migrations simply revert changes to the schema and re-run - migrations.RunPython(ensure_schemas, ensure_schemas), - ] + operations = [] diff --git a/osf/migrations/0173_ensure_schemas.py b/osf/migrations/0173_ensure_schemas.py index 474d0b2fffb..afa5fbf7988 100644 --- a/osf/migrations/0173_ensure_schemas.py +++ b/osf/migrations/0173_ensure_schemas.py @@ -3,7 +3,6 @@ from __future__ import unicode_literals from django.db import migrations -from osf.utils.migrations import ensure_schemas class Migration(migrations.Migration): @@ -12,7 +11,4 @@ class Migration(migrations.Migration): ('osf', '0172_ensure_schemas'), ] - operations = [ - # To reverse this migrations simply revert changes to the schema and re-run - migrations.RunPython(ensure_schemas, ensure_schemas), - ] + operations = [] diff --git a/osf/migrations/0191_migrate_schemas_to_schemablocks.py b/osf/migrations/0191_migrate_schemas_to_schemablocks.py index 30650db0010..9acce22f8b1 100644 --- a/osf/migrations/0191_migrate_schemas_to_schemablocks.py +++ b/osf/migrations/0191_migrate_schemas_to_schemablocks.py @@ -4,59 +4,9 @@ import logging from django.db import migrations -from osf.utils.migrations import map_schemas_to_schemablocks, unmap_schemablocks logger = logging.getLogger(__file__) -def remove_version_1_schemas(state, schema): - RegistrationSchema = state.get_model('osf', 'registrationschema') - assert RegistrationSchema.objects.filter(schema_version=1, abstractnode__isnull=False).count() == 0 - assert RegistrationSchema.objects.filter(schema_version=1, draftregistration__isnull=False).count() == 0 - RegistrationSchema.objects.filter(schema_version=1).delete() - -def update_schemaless_registrations(state, schema): - RegistrationSchema = state.get_model('osf', 'registrationschema') - AbstractNode = state.get_model('osf', 'abstractnode') - - open_ended_schema = RegistrationSchema.objects.get(name='Open-Ended Registration', schema_version=2) - open_ended_meta = { - '{}'.format(open_ended_schema._id): { - 'summary': { - 'comments': [], - 'extra': [], - 'value': '' - } - } - } - - schemaless_regs_with_meta = AbstractNode.objects.filter(type='osf.registration', registered_schema__isnull=True).exclude(registered_meta={}) - schemaless_regs_without_meta = AbstractNode.objects.filter(type='osf.registration', registered_schema__isnull=True, registered_meta={}) - - for reg in schemaless_regs_without_meta.all(): - reg.registered_schema.add(open_ended_schema) - reg.registered_meta = open_ended_meta - reg.save() - - for reg in schemaless_regs_with_meta.all(): - reg.registered_schema.add(RegistrationSchema.objects.get(_id=reg.registered_meta.keys()[0])) - -def update_schema_configs(state, schema): - RegistrationSchema = state.get_model('osf', 'registrationschema') - for rs in RegistrationSchema.objects.all(): - if rs.schema.get('description', False): - rs.description = rs.schema['description'] - if rs.schema.get('config', False): - rs.config = rs.schema['config'] - rs.save() - -def unset_schema_configs(state, schema): - RegistrationSchema = state.get_model('osf', 'registrationschema') - RegistrationSchema.objects.update( - config=dict(), - description='', - ) - - def noop(*args, **kwargs): pass @@ -66,9 +16,4 @@ class Migration(migrations.Migration): ('osf', '0190_add_schema_block_models') ] - operations = [ - migrations.RunPython(remove_version_1_schemas, noop), - migrations.RunPython(update_schemaless_registrations, noop), - migrations.RunPython(update_schema_configs, unset_schema_configs), - migrations.RunPython(map_schemas_to_schemablocks, unmap_schemablocks) - ] + operations = [] diff --git a/osf/migrations/0196_update_schemas.py b/osf/migrations/0196_update_schemas.py index 94c0a1b199e..7413dcce658 100644 --- a/osf/migrations/0196_update_schemas.py +++ b/osf/migrations/0196_update_schemas.py @@ -1,17 +1,6 @@ from __future__ import unicode_literals from django.db import migrations -from osf.utils.migrations import UpdateRegistrationSchemasAndSchemaBlocks - -def make_egap_active_but_invisible(state, schema): - RegistrationSchema = state.get_model('osf', 'registrationschema') - egap_registration = RegistrationSchema.objects.get(name='EGAP Registration', schema_version=2) - egap_registration.visible = False - egap_registration.active = True - egap_registration.save() - -def noop(*args, **kwargs): - pass class Migration(migrations.Migration): @@ -19,7 +8,4 @@ class Migration(migrations.Migration): ('osf', '0195_add_enable_chronos_waffle_flag'), ] - operations = [ - UpdateRegistrationSchemasAndSchemaBlocks(), - migrations.RunPython(make_egap_active_but_invisible, noop), - ] + operations = [] diff --git a/osf/migrations/0199_draft_node_permissions.py b/osf/migrations/0199_draft_node_permissions.py index 1da33146cfb..a927fe08654 100644 --- a/osf/migrations/0199_draft_node_permissions.py +++ b/osf/migrations/0199_draft_node_permissions.py @@ -4,12 +4,6 @@ import logging from django.db import migrations -from osf.migrations.sql.draft_nodes_migration import ( - add_draft_read_write_admin_auth_groups, - remove_draft_auth_groups, - add_permissions_to_draft_registration_groups, - drop_draft_reg_group_object_permission_table) - logger = logging.getLogger(__name__) @@ -19,7 +13,4 @@ class Migration(migrations.Migration): ('osf', '0198_draft_node_models'), ] - operations = [ - migrations.RunSQL(add_draft_read_write_admin_auth_groups, remove_draft_auth_groups), - migrations.RunSQL(add_permissions_to_draft_registration_groups, drop_draft_reg_group_object_permission_table), - ] + operations = [] diff --git a/osf/migrations/0204_ensure_schemas.py b/osf/migrations/0204_ensure_schemas.py index 8cff19141bb..75da61c15e5 100644 --- a/osf/migrations/0204_ensure_schemas.py +++ b/osf/migrations/0204_ensure_schemas.py @@ -1,7 +1,6 @@ from __future__ import unicode_literals from django.db import migrations -from osf.utils.migrations import UpdateRegistrationSchemasAndSchemaBlocks class Migration(migrations.Migration): @@ -9,6 +8,4 @@ class Migration(migrations.Migration): ('osf', '0203_auto_20200312_1435'), ] - operations = [ - UpdateRegistrationSchemasAndSchemaBlocks(), - ] + operations = [] diff --git a/osf/migrations/0207_ensure_schemas.py b/osf/migrations/0207_ensure_schemas.py index f4d380d5997..5b2b6cf7287 100644 --- a/osf/migrations/0207_ensure_schemas.py +++ b/osf/migrations/0207_ensure_schemas.py @@ -1,7 +1,6 @@ from __future__ import unicode_literals from django.db import migrations -from osf.utils.migrations import UpdateRegistrationSchemasAndSchemaBlocks class Migration(migrations.Migration): @@ -9,6 +8,4 @@ class Migration(migrations.Migration): ('osf', '0206_auto_20200528_1319'), ] - operations = [ - UpdateRegistrationSchemasAndSchemaBlocks(), - ] + operations = [] diff --git a/osf/migrations/0207_update_schemas2.py b/osf/migrations/0207_update_schemas2.py index e437df179a5..c6417621367 100644 --- a/osf/migrations/0207_update_schemas2.py +++ b/osf/migrations/0207_update_schemas2.py @@ -1,14 +1,7 @@ from __future__ import unicode_literals from django.db import migrations -from osf.utils.migrations import UpdateRegistrationSchemasAndSchemaBlocks -def make_egap_active_but_invisible(state, schema): - RegistrationSchema = state.get_model('osf', 'registrationschema') - new_egap_registration = RegistrationSchema.objects.get(name='EGAP Registration', schema_version=3) - new_egap_registration.visible = False - new_egap_registration.active = True - new_egap_registration.save() def noop(*args, **kwargs): pass @@ -19,7 +12,4 @@ class Migration(migrations.Migration): ('osf', '0207_ensure_schemas'), ] - operations = [ - UpdateRegistrationSchemasAndSchemaBlocks(), - migrations.RunPython(make_egap_active_but_invisible, noop), - ] + operations = [] diff --git a/osf/migrations/0208_update_EGAP_schema.py b/osf/migrations/0208_update_EGAP_schema.py index aecae0a094e..16fb699eb2b 100644 --- a/osf/migrations/0208_update_EGAP_schema.py +++ b/osf/migrations/0208_update_EGAP_schema.py @@ -1,10 +1,7 @@ from __future__ import unicode_literals from django.db import migrations -from osf.utils.migrations import UpdateRegistrationSchemasAndSchemaBlocks -def noop(*args, **kwargs): - pass class Migration(migrations.Migration): @@ -12,6 +9,4 @@ class Migration(migrations.Migration): ('osf', '0207_update_schemas2'), ] - operations = [ - UpdateRegistrationSchemasAndSchemaBlocks(), - ] + operations = [] diff --git a/osf/migrations/0221_add_schemas.py b/osf/migrations/0221_add_schemas.py index 8a74fcfd87a..a1f871c130e 100644 --- a/osf/migrations/0221_add_schemas.py +++ b/osf/migrations/0221_add_schemas.py @@ -3,22 +3,6 @@ from django.db import migrations logger = logging.getLogger(__file__) -from osf.models import RegistrationSchema -from osf.utils.migrations import ensure_schemas -from website.project.metadata.schemas import ensure_schema_structure, from_json -from osf.utils.migrations import UpdateRegistrationSchemasAndSchemaBlocks - - -def add_invisible_schemas(apps, schema_editor): - schemas = [ - ensure_schema_structure(from_json('asist-hypothesis-capability-registration.json')), - ensure_schema_structure(from_json('asist-results-registration.json')), - ensure_schema_structure(from_json('real-world-evidence.json')), - ] - - schema_names = [schema['name'] for schema in schemas] - - RegistrationSchema.objects.filter(name__in=schema_names).update(visible=False, active=True) class Migration(migrations.Migration): @@ -27,7 +11,4 @@ class Migration(migrations.Migration): ('osf', '0219_auto_20201020_1836'), ] - operations = [ - UpdateRegistrationSchemasAndSchemaBlocks(), - migrations.RunPython(add_invisible_schemas, ensure_schemas), - ] + operations = [] diff --git a/osf/migrations/0227_add_secondary_data.py b/osf/migrations/0227_add_secondary_data.py index 1e697fdf877..ea9e80679cb 100644 --- a/osf/migrations/0227_add_secondary_data.py +++ b/osf/migrations/0227_add_secondary_data.py @@ -3,16 +3,6 @@ from django.db import migrations logger = logging.getLogger(__file__) -from osf.models import RegistrationSchema -from osf.utils.migrations import ensure_schemas -from website.project.metadata.schemas import ensure_schema_structure, from_json -from osf.utils.migrations import UpdateRegistrationSchemasAndSchemaBlocks - - -def add_schema(apps, schema_editor): - schema = ensure_schema_structure(from_json('secondary-data.json')) - - RegistrationSchema.objects.filter(name=schema['name']).update(visible=False, active=True) class Migration(migrations.Migration): @@ -21,7 +11,4 @@ class Migration(migrations.Migration): ('osf', '0226_auto_20210224_1610'), ] - operations = [ - UpdateRegistrationSchemasAndSchemaBlocks(), - migrations.RunPython(add_schema, ensure_schemas), - ] + operations = [] diff --git a/osf/migrations/__init__.py b/osf/migrations/__init__.py index ca7c647456e..7a33220b3f6 100644 --- a/osf/migrations/__init__.py +++ b/osf/migrations/__init__.py @@ -1,11 +1,13 @@ # -*- coding: utf-8 -*- import sys import logging + from django.db.utils import ProgrammingError -from osf.management.commands.manage_switch_flags import manage_waffle from django.core.management import call_command -from api.base import settings as api_settings +from api.base import settings as api_settings +from osf.management.commands.manage_switch_flags import manage_waffle +from osf.utils.migrations import ensure_schemas, map_schemas_to_schemablocks logger = logging.getLogger(__file__) @@ -142,3 +144,9 @@ def update_waffle_flags(sender, verbosity=0, **kwargs): def create_cache_table(sender, verbosity=0, **kwargs): if getattr(sender, 'label', None) == 'osf': call_command('createcachetable', tablename=api_settings.CACHES[api_settings.STORAGE_USAGE_CACHE_NAME]['LOCATION']) + + +def add_registration_schemas(sender, verbosity=0, **kwargs): + if getattr(sender, 'label', None) == 'osf': + ensure_schemas() + map_schemas_to_schemablocks() diff --git a/osf/utils/migrations.py b/osf/utils/migrations.py index 3ede133f7d0..e2e7811ffdc 100644 --- a/osf/utils/migrations.py +++ b/osf/utils/migrations.py @@ -13,7 +13,6 @@ from django.db import connection from django.db.migrations.operations.base import Operation -from osf.models.base import generate_object_id from osf.utils.sanitize import strip_html, unescape_entities from website import settings from website.project.metadata.schemas import get_osf_meta_schemas @@ -41,6 +40,7 @@ ('textarea-xl', 'string'): 'long-text-input', } + def get_osf_models(): """ Helper function to retrieve all osf related models. @@ -349,6 +349,7 @@ def create_schema_blocks_for_question(state, rs, question, sub=False): create_schema_blocks_for_question(state, rs, subquestion, sub=True) else: # All schema blocks related to a particular question share the same schema_block_group_key. + from osf.models.base import generate_object_id schema_block_group_key = generate_object_id() title, description, help, example = find_title_description_help_example(rs, question) @@ -412,6 +413,7 @@ def create_schema_blocks_for_atomic_schema(schema): # Each 'question-label' generates a 'schema_block_group_key' that is inherited # By all input and input-option blocks until the next question-label appears if block_type == 'question-label': + from osf.models.base import generate_object_id current_group_key = generate_object_id() block['schema_block_group_key'] = current_group_key elif block_type == 'paragraph': # if a paragraph trails a question-label From c2c5e4ebf5bc781e2bc159cf53f0d09531a481ec Mon Sep 17 00:00:00 2001 From: John Tordoff Date: Wed, 13 Jul 2022 16:05:13 -0400 Subject: [PATCH 06/72] [ENG-3868] Move blocked email domains to post-migrate signal (#9958) * Fix signal and clean-up * don't use bulk create until ignore_conflicts exsists * allow BLACKLISTED_DOMAINS to be seamlessly overridden Co-authored-by: John Tordoff <> --- osf/apps.py | 14 +++++++++++--- osf/migrations/0136_preprint_node_divorce.py | 3 +++ osf/migrations/0147_blacklistedemaildomain.py | 2 -- osf/migrations/__init__.py | 12 ++++++++++++ 4 files changed, 26 insertions(+), 5 deletions(-) diff --git a/osf/apps.py b/osf/apps.py index 87b2bc398f9..339e451375f 100644 --- a/osf/apps.py +++ b/osf/apps.py @@ -1,12 +1,15 @@ import logging + from django.apps import AppConfig as BaseAppConfig from django.db.models.signals import post_migrate + from osf.migrations import ( - update_permission_groups, - update_waffle_flags, + add_registration_schemas, create_cache_table, + update_blocked_email_domains, update_license, - add_registration_schemas + update_permission_groups, + update_waffle_flags, ) logger = logging.getLogger(__file__) @@ -45,3 +48,8 @@ def ready(self): create_cache_table, dispatch_uid='osf.apps.create_cache_table' ) + + post_migrate.connect( + update_blocked_email_domains, + dispatch_uid='osf.apps.update_blocked_email_domains' + ) diff --git a/osf/migrations/0136_preprint_node_divorce.py b/osf/migrations/0136_preprint_node_divorce.py index ea86dcd002d..3f11d62cc77 100644 --- a/osf/migrations/0136_preprint_node_divorce.py +++ b/osf/migrations/0136_preprint_node_divorce.py @@ -11,6 +11,7 @@ logger = logging.getLogger(__name__) + def reverse_func(apps, schema_editor): PreprintContributor = apps.get_model('osf', 'PreprintContributor') PreprintTags = apps.get_model('osf', 'Preprint_Tags') @@ -83,8 +84,10 @@ def reverse_func(apps, schema_editor): modified_field.auto_now = True node_modified_field.auto_now = True + group_format = 'preprint_{self.id}_{group}' + def format_group(self, name): return group_format.format(self=self, group=name) diff --git a/osf/migrations/0147_blacklistedemaildomain.py b/osf/migrations/0147_blacklistedemaildomain.py index c98410dcb97..406cf498e83 100644 --- a/osf/migrations/0147_blacklistedemaildomain.py +++ b/osf/migrations/0147_blacklistedemaildomain.py @@ -39,6 +39,4 @@ class Migration(migrations.Migration): 'abstract': False, }, ), - migrations.RunPython(populate_blacklisted_domains, remove_blacklisted_domains) - ] diff --git a/osf/migrations/__init__.py b/osf/migrations/__init__.py index 7a33220b3f6..c68beea4073 100644 --- a/osf/migrations/__init__.py +++ b/osf/migrations/__init__.py @@ -8,6 +8,7 @@ from api.base import settings as api_settings from osf.management.commands.manage_switch_flags import manage_waffle from osf.utils.migrations import ensure_schemas, map_schemas_to_schemablocks +from website import settings as osf_settings logger = logging.getLogger(__file__) @@ -150,3 +151,14 @@ def add_registration_schemas(sender, verbosity=0, **kwargs): if getattr(sender, 'label', None) == 'osf': ensure_schemas() map_schemas_to_schemablocks() + + +def update_blocked_email_domains(sender, verbosity=0, **kwargs): + if getattr(sender, 'label', None) == 'osf': + from django.apps import apps + NotableEmailDomain = apps.get_model('osf', 'NotableEmailDomain') + for domain in osf_settings.BLACKLISTED_DOMAINS: + NotableEmailDomain.objects.update_or_create( + domain=domain, + defaults={'note': NotableEmailDomain.Note.EXCLUDE_FROM_ACCOUNT_CREATION}, + ) From f22e531f9547e4d6d4686e35b0e2ce368b9d40f2 Mon Sep 17 00:00:00 2001 From: John Tordoff Date: Fri, 15 Jul 2022 13:02:54 -0400 Subject: [PATCH 07/72] [ENG-3866] Move citation style population out of migration stream (#9966) * Move loading of citation styles to post-migration signal * Peg repo to commit SHA * Attempt to speed things up by loading fixture * Move update_citation_styles to management command * Remove old test like thing * Clean up URL setting and docstring * Remove install bower from CI setup * Reorder imports * Reintroduce tests, but test skip them * Final clean-up Co-authored-by: John Tordoff <> Co-authored-by: Longze Chen --- api/base/settings/defaults.py | 2 + .../commands/sync_citation_styles.py | 136 ++++++++++++++++++ osf/migrations/0074_parse_citation_styles.py | 5 +- osf/migrations/0107_add_dependent_styles.py | 4 +- .../test_registration_bulk_upload_parser.py | 26 +++- tasks/__init__.py | 6 - tests/test_citeprocpy.py | 5 +- website/settings/defaults.py | 2 +- 8 files changed, 165 insertions(+), 21 deletions(-) create mode 100644 osf/management/commands/sync_citation_styles.py diff --git a/api/base/settings/defaults.py b/api/base/settings/defaults.py index c419e2fed80..6b4c8310cd2 100644 --- a/api/base/settings/defaults.py +++ b/api/base/settings/defaults.py @@ -351,3 +351,5 @@ DEFAULT_ES_NULL_VALUE = 'N/A' TRAVIS_ENV = False + +CITATION_STYLES_REPO_URL = 'https://github.com/CenterForOpenScience/styles/archive/88e6ed31a91e9f5a480b486029cda97b535935d4.zip' diff --git a/osf/management/commands/sync_citation_styles.py b/osf/management/commands/sync_citation_styles.py new file mode 100644 index 00000000000..4ca29e16ba7 --- /dev/null +++ b/osf/management/commands/sync_citation_styles.py @@ -0,0 +1,136 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +import io +import logging +import os +import re +import requests +import zipfile + +from django.apps import apps +from django.core.management.base import BaseCommand +from django.db import transaction +from lxml import etree +from urllib.parse import urlparse + +from api.base import settings + +logger = logging.getLogger(__name__) + + +def sync_citation_styles(dry_run=False): + CitationStyle = apps.get_model('osf', 'citationstyle') + zip_data = io.BytesIO(requests.get(settings.CITATION_STYLES_REPO_URL).content) + with transaction.atomic(): + with zipfile.ZipFile(zip_data) as zip_file: + for file_name in [name for name in zip_file.namelist() if name.endswith('.zip') and not name.startswith('dependent')]: + root = etree.fromstring(zip_file.read(file_name)) + + namespace = re.search(r'\{.*\}', root.tag).group() + title = root.find('{namespace}info/{namespace}title'.format(namespace=f'{namespace}')).text + has_bibliography = 'Bluebook' in title + + if not has_bibliography: + bib = root.find(f'{{{namespace}}}bibliography') + layout = bib.find(f'{{{namespace}}}layout') if bib is not None else None + has_bibliography = True + if layout is not None and len(layout.getchildren()) == 1 and 'choose' in layout.getchildren()[0].tag: + choose = layout.find(f'{{{namespace}}}choose') + else_tag = choose.find(f'{{{namespace}}}else') + if else_tag is None: + supported_types = [] + match_none = False + for child in choose.getchildren(): + types = child.get('type', None) + match_none = child.get('match', 'any') == 'none' + if types is not None: + types = types.split(' ') + supported_types.extend(types) + if 'webpage' in types: + break + else: + if len(supported_types) and not match_none: + # has_bibliography set to False now means that either bibliography tag is absent + # or our type (webpage) is not supported by the current version of this style. + has_bibliography = False + + summary = getattr( + root.find('{namespace}info/{namespace}summary'.format(namespace=f'{namespace}')), 'text', None + ) + short_title = getattr( + root.find('{namespace}info/{namespace}title-short'.format(namespace=f'{namespace}')), 'text', None + ) + # Required + fields = { + '_id': os.path.splitext(os.path.basename(file_name))[0], + 'title': title, + 'has_bibliography': has_bibliography, 'parent_style': None, + 'short_title': short_title, + 'summary': summary + } + + CitationStyle.objects.update_or_create(**fields) + + for file_name in [name for name in zip_file.namelist() if name.endswith('.zip') and name.startswith('dependent')]: + root = etree.fromstring(zip_file.read(file_name)) + + namespace = re.search(r'\{.*\}', root.tag).group() + title = root.find('{namespace}info/{namespace}title'.format(namespace=f'{namespace}')).text + has_bibliography = root.find(f'{{{namespace}}}bibliography') is not None or 'Bluebook' in title + + style_id = os.path.splitext(os.path.basename(file_name))[0] + links = root.findall('{namespace}info/{namespace}link'.format(namespace=f'{namespace}')) + for link in links: + if link.get('rel') == 'independent-parent': + parent_style_id = urlparse(link.get('href')).path.split('/')[-1] + parent_style = CitationStyle.objects.get(_id=parent_style_id) + + if parent_style is not None: + summary = getattr( + root.find('{namespace}info/{namespace}summary'.format(namespace=f'{namespace}')), + 'text', None + ) + short_title = getattr( + root.find('{namespace}info/{namespace}title-short'.format(namespace=f'{namespace}')), + 'text', None + ) + + parent_has_bibliography = parent_style.has_bibliography + fields = { + '_id': style_id, + 'title': title, + 'has_bibliography': parent_has_bibliography, + 'parent_style': parent_style_id, + 'short_title': short_title, + 'summary': summary + } + CitationStyle.objects.update_or_create(**fields) + break + else: + logger.debug('Unable to load parent_style object: parent {}, dependent style {}'.format(parent_style_id, style_id)) + else: + fields = { + '_id': style_id, + 'title': title, + 'has_bibliography': has_bibliography, + 'parent_style': None + } + CitationStyle.objects.update_or_create(**fields) + + if dry_run: + raise RuntimeError('This is a dry run rolling back transaction.') + + +class Command(BaseCommand): + """Updates citation styles to its current repo URL.""" + def add_arguments(self, parser): + super().add_arguments(parser) + parser.add_argument( + '--dry', + action='store_true', + dest='dry_run', + ) + + def handle(self, *args, **options): + dry_run = options.get('dry_run') + sync_citation_styles(dry_run=dry_run) diff --git a/osf/migrations/0074_parse_citation_styles.py b/osf/migrations/0074_parse_citation_styles.py index 9fcda18c20f..137640b531d 100644 --- a/osf/migrations/0074_parse_citation_styles.py +++ b/osf/migrations/0074_parse_citation_styles.py @@ -23,7 +23,6 @@ def get_style_files(path): files = (os.path.join(path, x) for x in os.listdir(path)) return (f for f in files if os.path.isfile(f)) - def parse_citation_styles(state, schema): # drop all styles CitationStyle = state.get_model('osf', 'citationstyle') @@ -74,6 +73,4 @@ class Migration(migrations.Migration): ('osf', '0073_citationstyle_has_bibliography'), ] - operations = [ - migrations.RunPython(parse_citation_styles, revert), - ] + operations = [] diff --git a/osf/migrations/0107_add_dependent_styles.py b/osf/migrations/0107_add_dependent_styles.py index 1311b833a9b..d55db73c45c 100644 --- a/osf/migrations/0107_add_dependent_styles.py +++ b/osf/migrations/0107_add_dependent_styles.py @@ -147,6 +147,4 @@ class Migration(migrations.Migration): ('osf', '0106_citationstyle_parent_style'), ] - operations = [ - migrations.RunPython(update_styles, revert), - ] + operations = [] diff --git a/osf_tests/test_registration_bulk_upload_parser.py b/osf_tests/test_registration_bulk_upload_parser.py index b7c78774e9f..14a4538f602 100644 --- a/osf_tests/test_registration_bulk_upload_parser.py +++ b/osf_tests/test_registration_bulk_upload_parser.py @@ -9,11 +9,20 @@ from osf_tests.factories import SubjectFactory from osf.models import RegistrationSchema, RegistrationProvider, NodeLicense +from osf.registrations.utils import ( + BulkRegistrationUpload, + CategoryField, + ContributorField, + DuplicateHeadersError, + FileUploadNotSupportedError, + InvalidHeadersError, + LicenseField, + MAX_EXCEL_COLUMN_NUMBER, + METADATA_FIELDS, + Store, + get_excel_column_name, +) -from osf.registrations.utils import (BulkRegistrationUpload, InvalidHeadersError, - FileUploadNotSupportedError, DuplicateHeadersError, - get_excel_column_name, Store, CategoryField, LicenseField, ContributorField, - MAX_EXCEL_COLUMN_NUMBER, METADATA_FIELDS) def write_csv(header_row, *rows): csv_buffer = io.StringIO() @@ -24,6 +33,7 @@ def write_csv(header_row, *rows): csv_buffer.seek(0) return csv_buffer + def make_row(field_values={}): return {**{ 'Title': 'Test title', @@ -42,6 +52,7 @@ def make_row(field_values={}): 'summary': 'Test study', }, **field_values} + def assert_parsed(actual_parsed, expected_parsed): parsed = {**actual_parsed['metadata'], **actual_parsed['registration_responses']} for key, value in expected_parsed.items(): @@ -54,6 +65,7 @@ def assert_parsed(actual_parsed, expected_parsed): continue assert_equal(actual, expected) + def assert_errors(actual_errors, expected_errors): for error in actual_errors: assert_true('header' in error) @@ -65,6 +77,7 @@ def assert_errors(actual_errors, expected_errors): assert_true(len(actual_errors), len(expected_errors.keys())) + @pytest.mark.django_db class TestBulkUploadParserValidationErrors: @@ -79,8 +92,9 @@ def provider_subjects(self): @pytest.fixture() def registration_provider(self, open_ended_schema, provider_subjects): osf_provider = RegistrationProvider.load('osf') - osf_provider.default_license = NodeLicense.objects.get(name='No license') - osf_provider.licenses_acceptable.add(NodeLicense.objects.get(name='No license')) + node_license = NodeLicense.objects.get(name='No license') + osf_provider.default_license = node_license + osf_provider.licenses_acceptable.add(node_license) osf_provider.schemas.add(open_ended_schema) osf_provider.subjects.add(*provider_subjects) osf_provider.save() diff --git a/tasks/__init__.py b/tasks/__init__.py index 414f3de7a4e..f3124943544 100755 --- a/tasks/__init__.py +++ b/tasks/__init__.py @@ -467,16 +467,10 @@ def remove_failures_from_testmon(ctx, db_path=None): @task def travis_setup(ctx): - ctx.run('npm install -g bower', echo=True) - with open('package.json', 'r') as fobj: package_json = json.load(fobj) ctx.run('npm install @centerforopenscience/list-of-licenses@{}'.format(package_json['dependencies']['@centerforopenscience/list-of-licenses']), echo=True) - with open('bower.json', 'r') as fobj: - bower_json = json.load(fobj) - ctx.run('bower install {}'.format(bower_json['dependencies']['styles']), echo=True) - @task def test_travis_addons(ctx, numprocesses=None, coverage=False, testmon=False): """ diff --git a/tests/test_citeprocpy.py b/tests/test_citeprocpy.py index 75552ecdfb4..00def543371 100644 --- a/tests/test_citeprocpy.py +++ b/tests/test_citeprocpy.py @@ -4,11 +4,13 @@ from django.utils import timezone from nose.tools import * # noqa: F403 +import pytest from api.citations.utils import render_citation +from osf.models import OSFUser from osf_tests.factories import UserFactory, PreprintFactory from tests.base import OsfTestCase -from osf.models import OSFUser + class Node: _id = '2nthu' @@ -18,6 +20,7 @@ class Node: visible_contributors = '' +@pytest.mark.skip() class TestCiteprocpy(OsfTestCase): def setUp(self): diff --git a/website/settings/defaults.py b/website/settings/defaults.py index a70476ea82e..dabaf1b0b66 100644 --- a/website/settings/defaults.py +++ b/website/settings/defaults.py @@ -2108,4 +2108,4 @@ def from_node_usage(cls, usage_bytes, private_limit=None, public_limit=None): CAS_LOG_LEVEL = 3 # ERROR PREPRINT_METRICS_START_DATE = datetime.datetime(2019, 1, 1) -WAFFLE_VALUES_YAML = 'osf/features.yaml' \ No newline at end of file +WAFFLE_VALUES_YAML = 'osf/features.yaml' From 250b832b2b97c77aba310d65ab953057909f61a2 Mon Sep 17 00:00:00 2001 From: John Tordoff Date: Tue, 19 Jul 2022 17:55:32 -0400 Subject: [PATCH 08/72] [ENG-3867] Create Storage Regions on post migration signal (#9965) * Remove storage region configuration from the migration stream and add to config file * Only ensure default provider and remove yaml config * Remove default storage region backfill * Region gets or creates, but not updates * Use _id and name as positional arguments and fix osf_settings Co-authored-by: John Tordoff <> Co-authored-by: Longze Chen --- osf/apps.py | 6 ++++++ .../0099_add_default_storage_region.py | 1 - osf/migrations/__init__.py | 21 +++++++++++++++++++ website/settings/defaults.py | 1 + 4 files changed, 28 insertions(+), 1 deletion(-) diff --git a/osf/apps.py b/osf/apps.py index 339e451375f..c76685c669d 100644 --- a/osf/apps.py +++ b/osf/apps.py @@ -9,6 +9,7 @@ update_blocked_email_domains, update_license, update_permission_groups, + update_storage_regions, update_waffle_flags, ) @@ -53,3 +54,8 @@ def ready(self): update_blocked_email_domains, dispatch_uid='osf.apps.update_blocked_email_domains' ) + + post_migrate.connect( + update_storage_regions, + dispatch_uid='osf.apps.update_storage_regions' + ) diff --git a/osf/migrations/0099_add_default_storage_region.py b/osf/migrations/0099_add_default_storage_region.py index 5d3b1b7e37b..8b475a24506 100644 --- a/osf/migrations/0099_add_default_storage_region.py +++ b/osf/migrations/0099_add_default_storage_region.py @@ -75,5 +75,4 @@ class Migration(migrations.Migration): ] operations = [ - migrations.RunPython(add_osfstorage_addon, remove_osfstorage_addon), ] diff --git a/osf/migrations/__init__.py b/osf/migrations/__init__.py index c68beea4073..288f4990fe3 100644 --- a/osf/migrations/__init__.py +++ b/osf/migrations/__init__.py @@ -2,9 +2,11 @@ import sys import logging +from django.apps import apps from django.db.utils import ProgrammingError from django.core.management import call_command +from addons.osfstorage.settings import DEFAULT_REGION_ID, DEFAULT_REGION_NAME from api.base import settings as api_settings from osf.management.commands.manage_switch_flags import manage_waffle from osf.utils.migrations import ensure_schemas, map_schemas_to_schemablocks @@ -162,3 +164,22 @@ def update_blocked_email_domains(sender, verbosity=0, **kwargs): domain=domain, defaults={'note': NotableEmailDomain.Note.EXCLUDE_FROM_ACCOUNT_CREATION}, ) + + +def update_storage_regions(sender, verbosity=0, **kwargs): + if getattr(sender, 'label', None) == 'osf': + ensure_default_storage_region() + + +def ensure_default_storage_region(): + osfstorage_config = apps.get_app_config('addons_osfstorage') + Region = apps.get_model('addons_osfstorage', 'Region') + Region.objects.get_or_create( + _id=DEFAULT_REGION_ID, + name=DEFAULT_REGION_NAME, + defaults={ + 'waterbutler_credentials': osfstorage_config.WATERBUTLER_CREDENTIALS, + 'waterbutler_settings': osfstorage_config.WATERBUTLER_SETTINGS, + 'waterbutler_url': osf_settings.WATERBUTLER_URL + } + ) diff --git a/website/settings/defaults.py b/website/settings/defaults.py index dabaf1b0b66..7220447344c 100644 --- a/website/settings/defaults.py +++ b/website/settings/defaults.py @@ -2108,4 +2108,5 @@ def from_node_usage(cls, usage_bytes, private_limit=None, public_limit=None): CAS_LOG_LEVEL = 3 # ERROR PREPRINT_METRICS_START_DATE = datetime.datetime(2019, 1, 1) + WAFFLE_VALUES_YAML = 'osf/features.yaml' From 8052ea472b90d4d575c1408308c70c57b5a136da Mon Sep 17 00:00:00 2001 From: Longze Chen Date: Wed, 27 Jul 2022 17:38:09 -0400 Subject: [PATCH 09/72] [ENG-3836] Follow-up: Add PyYAML to Requirements (#9993) --- requirements.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/requirements.txt b/requirements.txt index f814c65a0e3..2229e239f2b 100644 --- a/requirements.txt +++ b/requirements.txt @@ -37,6 +37,7 @@ citeproc-py==0.4.0 boto3==1.4.7 django-waffle==0.13.0 pymongo==3.7.1 +PyYAML==6.0 tqdm==4.28.1 # Python markdown extensions for comment emails git+https://github.com/CenterForOpenScience/mdx_del_ins.git From 65b344bef04b6792b50477ef4799a16146e5f5b4 Mon Sep 17 00:00:00 2001 From: John Tordoff Date: Thu, 28 Jul 2022 16:43:17 -0400 Subject: [PATCH 10/72] [ENG-3862] Move post-migrate signal out of migration stream for default providers (#9971) * Remove default provider population from migration to post-migrate signal * Add conditional from local env * Load with get_default and refactor * Fix rebase conflicts: settings -> osf_settings * Remove subjects population Co-authored-by: John Tordoff <> Co-authored-by: Longze Chen --- osf/apps.py | 6 +++ .../0138_ensure_subjects_and_providers.py | 4 -- osf/migrations/__init__.py | 49 ++++++++++++++++++- osf/models/provider.py | 5 +- .../test_registration_bulk_upload_parser.py | 15 +++--- 5 files changed, 65 insertions(+), 14 deletions(-) diff --git a/osf/apps.py b/osf/apps.py index c76685c669d..afbd64a4e75 100644 --- a/osf/apps.py +++ b/osf/apps.py @@ -11,6 +11,7 @@ update_permission_groups, update_storage_regions, update_waffle_flags, + update_default_providers ) logger = logging.getLogger(__file__) @@ -50,6 +51,11 @@ def ready(self): dispatch_uid='osf.apps.create_cache_table' ) + post_migrate.connect( + update_default_providers, + dispatch_uid='osf.apps.update_default_providers' + ) + post_migrate.connect( update_blocked_email_domains, dispatch_uid='osf.apps.update_blocked_email_domains' diff --git a/osf/migrations/0138_ensure_subjects_and_providers.py b/osf/migrations/0138_ensure_subjects_and_providers.py index 6c4984b614c..38ff9c08453 100644 --- a/osf/migrations/0138_ensure_subjects_and_providers.py +++ b/osf/migrations/0138_ensure_subjects_and_providers.py @@ -96,9 +96,5 @@ class Migration(migrations.Migration): ] operations = [ - migrations.RunPython(create_osf_registries, migrations.RunPython.noop), ] if getattr(settings, 'TEST_ENV', False) else [ - migrations.RunPython(create_osf_preprints, migrations.RunPython.noop), - migrations.RunPython(create_subjects, migrations.RunPython.noop), - migrations.RunPython(create_osf_registries, migrations.RunPython.noop), ] diff --git a/osf/migrations/__init__.py b/osf/migrations/__init__.py index 288f4990fe3..9482efc3820 100644 --- a/osf/migrations/__init__.py +++ b/osf/migrations/__init__.py @@ -3,8 +3,8 @@ import logging from django.apps import apps -from django.db.utils import ProgrammingError from django.core.management import call_command +from django.db.utils import ProgrammingError from addons.osfstorage.settings import DEFAULT_REGION_ID, DEFAULT_REGION_NAME from api.base import settings as api_settings @@ -14,6 +14,22 @@ logger = logging.getLogger(__file__) +OSF_PREPRINTS_PROVIDER_DATA = { + '_id': 'osf', + 'name': 'Open Science Framework', + 'domain': osf_settings.DOMAIN, + 'share_publish_type': 'Preprint', + 'domain_redirect_enabled': False, +} + +OSF_REGISTRIES_PROVIDER_DATA = { + '_id': 'osf', + 'name': 'OSF Registries', + 'domain': osf_settings.DOMAIN, + 'share_publish_type': 'Registration', + 'domain_redirect_enabled': False, +} + # Admin group permissions def get_admin_read_permissions(): @@ -149,6 +165,37 @@ def create_cache_table(sender, verbosity=0, **kwargs): call_command('createcachetable', tablename=api_settings.CACHES[api_settings.STORAGE_USAGE_CACHE_NAME]['LOCATION']) +def update_default_providers(sender, verbosity=0, **kwargs): + if getattr(sender, 'label', None) == 'osf': + if 'pytest' in sys.modules: + ensure_default_registration_provider() + else: + ensure_default_providers() + + +def ensure_default_providers(): + ensure_default_preprint_provider() + ensure_default_registration_provider() + + +def ensure_default_preprint_provider(): + PreprintProvider = apps.get_model('osf', 'PreprintProvider') + + PreprintProvider.objects.update_or_create( + _id=OSF_PREPRINTS_PROVIDER_DATA['_id'], + defaults=OSF_PREPRINTS_PROVIDER_DATA + ) + + +def ensure_default_registration_provider(): + RegistrationProvider = apps.get_model('osf', 'RegistrationProvider') + + RegistrationProvider.objects.update_or_create( + _id=OSF_REGISTRIES_PROVIDER_DATA['_id'], + defaults=OSF_REGISTRIES_PROVIDER_DATA + ) + + def add_registration_schemas(sender, verbosity=0, **kwargs): if getattr(sender, 'label', None) == 'osf': ensure_schemas() diff --git a/osf/models/provider.py b/osf/models/provider.py index 400d9789d3e..8f5e567074c 100644 --- a/osf/models/provider.py +++ b/osf/models/provider.py @@ -311,8 +311,9 @@ def get_default_id(cls): """, [cls.default__id] ) - default_id = cursor.fetchone()[0] - return default_id + default_id = cursor.fetchone() + if default_id: + return default_id[0] @property def readable_type(self): diff --git a/osf_tests/test_registration_bulk_upload_parser.py b/osf_tests/test_registration_bulk_upload_parser.py index 14a4538f602..ae6648fb94e 100644 --- a/osf_tests/test_registration_bulk_upload_parser.py +++ b/osf_tests/test_registration_bulk_upload_parser.py @@ -91,14 +91,15 @@ def provider_subjects(self): @pytest.fixture() def registration_provider(self, open_ended_schema, provider_subjects): - osf_provider = RegistrationProvider.load('osf') + provider = RegistrationProvider.get_default() node_license = NodeLicense.objects.get(name='No license') - osf_provider.default_license = node_license - osf_provider.licenses_acceptable.add(node_license) - osf_provider.schemas.add(open_ended_schema) - osf_provider.subjects.add(*provider_subjects) - osf_provider.save() - return osf_provider + provider.default_license = node_license + provider.licenses_acceptable.add(node_license) + provider.schemas.add(open_ended_schema) + provider.subjects.add(*provider_subjects) + provider.licenses_acceptable.add(NodeLicense.objects.get(name='No license')) + provider.save() + return provider @pytest.fixture() def question_headers(self): From 205e56026ebcbbb92df062682efa734534e6a8ea Mon Sep 17 00:00:00 2001 From: John Tordoff Date: Thu, 11 Aug 2022 10:16:26 -0400 Subject: [PATCH 11/72] Remove unused password change view/route (#9985) Co-authored-by: John Tordoff <> --- admin/base/urls.py | 1 - admin/common_auth/urls.py | 8 -------- requirements.txt | 1 - 3 files changed, 10 deletions(-) diff --git a/admin/base/urls.py b/admin/base/urls.py index d3354f425eb..a43968e9079 100644 --- a/admin/base/urls.py +++ b/admin/base/urls.py @@ -21,7 +21,6 @@ url(r'^collection_providers/', include('admin.collection_providers.urls', namespace='collection_providers')), url(r'^registration_providers/', include('admin.registration_providers.urls', namespace='registration_providers')), url(r'^account/', include('admin.common_auth.urls', namespace='auth')), - url(r'^password/', include('password_reset.urls')), url(r'^nodes/', include('admin.nodes.urls', namespace='nodes')), url(r'^preprints/', include('admin.preprints.urls', namespace='preprints')), url(r'^subjects/', include('admin.subjects.urls', namespace='subjects')), diff --git a/admin/common_auth/urls.py b/admin/common_auth/urls.py index b1fa39b9284..07e676a892e 100644 --- a/admin/common_auth/urls.py +++ b/admin/common_auth/urls.py @@ -1,8 +1,6 @@ from __future__ import absolute_import from django.conf.urls import url -from django.urls import reverse_lazy -from django.contrib.auth.views import password_change, password_change_done from admin.common_auth import views @@ -12,12 +10,6 @@ url(r'^login/?$', views.LoginView.as_view(), name='login'), url(r'^logout/$', views.logout_user, name='logout'), url(r'^register/$', views.RegisterUser.as_view(), name='register'), - url(r'^password_change/$', password_change, - {'post_change_redirect': reverse_lazy('auth:password_change_done')}, - name='password_change'), - url(r'^password_change/done/$', password_change_done, - {'template_name': 'password_change_done.html'}, - name='password_change_done'), url(r'^settings/desk/$', views.DeskUserCreateFormView.as_view(), name='desk'), url(r'^settings/desk/update/$', views.DeskUserUpdateFormView.as_view(), name='desk_update'), ] diff --git a/requirements.txt b/requirements.txt index 2229e239f2b..d9fc1560edf 100644 --- a/requirements.txt +++ b/requirements.txt @@ -69,7 +69,6 @@ django-guardian==1.4.9 # Admin requirements django-webpack-loader==0.5.0 -django-password-reset==1.0 sendgrid-django==2.0.0 # Analytics requirements From 1675f6fe125f1bd960f656e3732e6ce306ba6f7a Mon Sep 17 00:00:00 2001 From: John Tordoff Date: Thu, 11 Aug 2022 10:17:43 -0400 Subject: [PATCH 12/72] Update import paths and fix deprecated modules for Django 3 (#9983) Co-authored-by: John Tordoff <> --- admin/brands/views.py | 2 +- admin/internet_archive/views.py | 2 +- admin/management/views.py | 2 +- admin/nodes/views.py | 2 +- admin/preprints/views.py | 2 +- admin/registration_schemas/views.py | 2 +- api/base/pagination.py | 2 +- api/base/serializers.py | 2 +- api/base/versioning.py | 2 +- api/files/annotations.py | 2 +- api/files/serializers.py | 2 +- tests/json_api_test_app.py | 4 ++-- 12 files changed, 13 insertions(+), 13 deletions(-) diff --git a/admin/brands/views.py b/admin/brands/views.py index ff093c447ea..3fc6a25ce6b 100644 --- a/admin/brands/views.py +++ b/admin/brands/views.py @@ -6,7 +6,7 @@ CreateView, UpdateView, ) -from django.core.urlresolvers import reverse_lazy +from django.urls import reverse_lazy from django.forms.models import model_to_dict from django.contrib import messages diff --git a/admin/internet_archive/views.py b/admin/internet_archive/views.py index e5a9fdaf9bd..254718726f5 100644 --- a/admin/internet_archive/views.py +++ b/admin/internet_archive/views.py @@ -13,7 +13,7 @@ from osf.management.commands.sync_ia_metadata import ( sync_ia_metadata, ) -from django.core.urlresolvers import reverse +from django.urls import reverse from django.shortcuts import redirect from admin.base.forms import ArchiveRegistrationWithPigeonForm from website import settings diff --git a/admin/management/views.py b/admin/management/views.py index 48ba1c8ca41..0ead29e0df7 100644 --- a/admin/management/views.py +++ b/admin/management/views.py @@ -6,7 +6,7 @@ from osf.management.commands.manage_switch_flags import manage_waffle from osf.management.commands.update_registration_schemas import update_registration_schemas from scripts.find_spammy_content import manage_spammy_content -from django.core.urlresolvers import reverse +from django.urls import reverse from django.shortcuts import redirect from osf.models import Preprint, Node, Registration diff --git a/admin/nodes/views.py b/admin/nodes/views.py index 73a210bb97b..4254e4fabea 100644 --- a/admin/nodes/views.py +++ b/admin/nodes/views.py @@ -4,7 +4,7 @@ from django.utils import timezone from django.core.exceptions import PermissionDenied, ValidationError -from django.core.urlresolvers import NoReverseMatch +from django.urls import NoReverseMatch from django.db.models import F, Case, When, IntegerField from django.contrib import messages from django.contrib.auth.mixins import PermissionRequiredMixin diff --git a/admin/preprints/views.py b/admin/preprints/views.py index 7b25cd10359..0b8eca12825 100644 --- a/admin/preprints/views.py +++ b/admin/preprints/views.py @@ -1,6 +1,6 @@ from django.db.models import F from django.core.exceptions import PermissionDenied -from django.core.urlresolvers import NoReverseMatch +from django.urls import NoReverseMatch from django.contrib import messages from django.contrib.auth.mixins import PermissionRequiredMixin from django.shortcuts import redirect diff --git a/admin/registration_schemas/views.py b/admin/registration_schemas/views.py index 4070a9109ae..aa205839029 100644 --- a/admin/registration_schemas/views.py +++ b/admin/registration_schemas/views.py @@ -5,7 +5,7 @@ from django.views.generic import ListView, TemplateView, FormView, DeleteView from admin.registration_schemas.forms import RegistrationSchemaCreateForm, RegistrationSchemaEditForm from django.contrib import messages -from django.core.urlresolvers import reverse_lazy +from django.urls import reverse_lazy from django.db.models import Max from django.http import HttpResponseRedirect diff --git a/api/base/pagination.py b/api/base/pagination.py index 920f4e39e5c..a2ea6612dae 100644 --- a/api/base/pagination.py +++ b/api/base/pagination.py @@ -1,4 +1,4 @@ -from django.utils import six +import six from collections import OrderedDict from django.urls import reverse from django.core.paginator import InvalidPage, Paginator as DjangoPaginator diff --git a/api/base/serializers.py b/api/base/serializers.py index 5d3f7e996f7..965324946d7 100644 --- a/api/base/serializers.py +++ b/api/base/serializers.py @@ -4,7 +4,7 @@ import furl import waffle -from django.core.urlresolvers import resolve, reverse, NoReverseMatch +from django.urls import resolve, reverse, NoReverseMatch from django.core.exceptions import ImproperlyConfigured from distutils.version import StrictVersion diff --git a/api/base/versioning.py b/api/base/versioning.py index b56b614bab1..7ca74cc82d1 100644 --- a/api/base/versioning.py +++ b/api/base/versioning.py @@ -1,4 +1,4 @@ -from django.core.urlresolvers import NoReverseMatch +from django.urls import NoReverseMatch from rest_framework import exceptions as drf_exceptions from rest_framework import versioning as drf_versioning from rest_framework.compat import unicode_http_header diff --git a/api/files/annotations.py b/api/files/annotations.py index 53b38bcf069..a4a107438d6 100644 --- a/api/files/annotations.py +++ b/api/files/annotations.py @@ -1,5 +1,5 @@ from django.db.models import BooleanField, Case, Exists, F, IntegerField, Max, OuterRef, Q, Subquery, Value, When -from django.db.models.functions.base import Cast +from django.db.models.functions import Cast from django.contrib.postgres.fields.jsonb import KeyTextTransform from osf.utils.datetime_aware_jsonfield import DateTimeAwareJSONField from osf.utils.fields import NonNaiveDateTimeField diff --git a/api/files/serializers.py b/api/files/serializers.py index c007a37d9f1..c66ea12d0ce 100644 --- a/api/files/serializers.py +++ b/api/files/serializers.py @@ -1,7 +1,7 @@ from datetime import datetime from collections import OrderedDict -from django.core.urlresolvers import resolve, reverse +from django.urls import resolve, reverse from django.core.exceptions import ValidationError import furl diff --git a/tests/json_api_test_app.py b/tests/json_api_test_app.py index b78e6b376d8..2702c83b7a8 100644 --- a/tests/json_api_test_app.py +++ b/tests/json_api_test_app.py @@ -4,7 +4,7 @@ from django.test.signals import template_rendered from django.core import signals from django.test.client import store_rendered_templates -from django.utils.functional import curry +from functools import partial try: from django.db import close_old_connections except ImportError: @@ -82,7 +82,7 @@ def do_request(self, req, status, expect_errors): # Curry a data dictionary into an instance of the template renderer # callback function. data = {} - on_template_render = curry(store_rendered_templates, data) + on_template_render = partial(store_rendered_templates, data) template_rendered.connect(on_template_render) response = super(JSONAPITestApp, self).do_request(req, status, From 391af601ed5101b304e3385366484dcd2412f157 Mon Sep 17 00:00:00 2001 From: John Tordoff Date: Thu, 11 Aug 2022 10:18:25 -0400 Subject: [PATCH 13/72] Update postgres backend and remove failover router for Django 3 (#10011) Co-authored-by: John Tordoff <> --- api/base/settings/defaults.py | 3 +- osf/db/__init__.py | 0 osf/db/backends/__init__.py | 0 osf/db/backends/postgresql/__init__.py | 0 osf/db/backends/postgresql/base.py | 68 ------------------- osf/db/router.py | 91 -------------------------- 6 files changed, 1 insertion(+), 161 deletions(-) delete mode 100644 osf/db/__init__.py delete mode 100644 osf/db/backends/__init__.py delete mode 100644 osf/db/backends/postgresql/__init__.py delete mode 100644 osf/db/backends/postgresql/base.py delete mode 100644 osf/db/router.py diff --git a/api/base/settings/defaults.py b/api/base/settings/defaults.py index 6b4c8310cd2..d80d7ce996b 100644 --- a/api/base/settings/defaults.py +++ b/api/base/settings/defaults.py @@ -22,7 +22,7 @@ DATABASES = { 'default': { 'CONN_MAX_AGE': 0, - 'ENGINE': 'osf.db.backends.postgresql', # django.db.backends.postgresql + 'ENGINE': 'django.db.backends.postgresql', 'NAME': os.environ.get('OSF_DB_NAME', 'osf'), 'USER': os.environ.get('OSF_DB_USER', 'postgres'), 'PASSWORD': os.environ.get('OSF_DB_PASSWORD', ''), @@ -35,7 +35,6 @@ }, } -DATABASE_ROUTERS = ['osf.db.router.PostgreSQLFailoverRouter', ] PASSWORD_HASHERS = [ 'django.contrib.auth.hashers.BCryptSHA256PasswordHasher', 'django.contrib.auth.hashers.BCryptPasswordHasher', diff --git a/osf/db/__init__.py b/osf/db/__init__.py deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/osf/db/backends/__init__.py b/osf/db/backends/__init__.py deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/osf/db/backends/postgresql/__init__.py b/osf/db/backends/postgresql/__init__.py deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/osf/db/backends/postgresql/base.py b/osf/db/backends/postgresql/base.py deleted file mode 100644 index 75fbdcdabe8..00000000000 --- a/osf/db/backends/postgresql/base.py +++ /dev/null @@ -1,68 +0,0 @@ -from past.builtins import basestring -import uuid - -import psycopg2 -from django.conf import settings -from django.db.backends.postgresql.base import \ - DatabaseWrapper as PostgresqlDatabaseWrapper -from django.db.backends.postgresql.base import utc_tzinfo_factory - - -class server_side_cursors(object): - """ - With block helper that enables and disables server side cursors. - """ - - def __init__(self, qs_or_using_or_connection, itersize=2000): - from django.db import connections - from django.db.models.query import QuerySet - - self.itersize = itersize - if isinstance(qs_or_using_or_connection, QuerySet): - self.connection = connections[qs_or_using_or_connection.db] - elif isinstance(qs_or_using_or_connection, basestring): - self.connection = connections[qs_or_using_or_connection] - else: - self.connection = qs_or_using_or_connection - - def __enter__(self): - self.connection.server_side_cursors = True - self.connection.server_side_cursor_itersize = self.itersize - - def __exit__(self, type, value, traceback): - self.connection.server_side_cursors = False - self.connection.server_side_cursor_itersize = None - - -# TODO: Server-side cursors are supported in Django 1.11. Remove our -# implementation in favor of Django's -class DatabaseWrapper(PostgresqlDatabaseWrapper): - """ - Psycopg2 database backend that allows the use of server side cursors. - - Usage: - - qs = Model.objects.all() - with server_side_cursors(qs, itersize=x): - for item in qs.iterator(): - item.value - """ - - def __init__(self, *args, **kwargs): - self.server_side_cursors = False - self.server_side_cursor_itersize = None - - super(DatabaseWrapper, self).__init__(*args, **kwargs) - - def create_cursor(self, name=None): - if not self.server_side_cursors: - return super(DatabaseWrapper, self).create_cursor(name=name) - - cursor = self.connection.cursor( - name='osf.db.backends.postgresql_cursors:{}'.format( - uuid.uuid4().hex), - cursor_factory=psycopg2.extras.DictCursor, ) - cursor.tzinfo_factory = utc_tzinfo_factory if settings.USE_TZ else None - cursor.itersize = self.server_side_cursor_itersize - - return cursor diff --git a/osf/db/router.py b/osf/db/router.py deleted file mode 100644 index 9b3df5abd57..00000000000 --- a/osf/db/router.py +++ /dev/null @@ -1,91 +0,0 @@ -from django.conf import settings -import psycopg2 - - -class PostgreSQLFailoverRouter(object): - """ - A custom database router that loops through the databases defined in django.conf.settings.DATABASES and returns the - first one that is not read only. If it finds none that are writable it calls exit() in order to convince docker - to restart the container. - """ - DSNS = dict() - CACHED_MASTER = None - - def __init__(self): - """ - Builds the list of DSNs from django's config and determines the writeable host. - """ - self._get_dsns() - if not self.CACHED_MASTER: - self.CACHED_MASTER = self._get_master() - - def _get_master(self): - """ - Finds the first database that's writeable and returns the configuration name. - :return: :str: name of database config or None - """ - for name, dsn in self.DSNS.items(): - conn = self._get_conn(dsn) - cur = conn.cursor() - cur.execute('SHOW transaction_read_only;') # 'on' for slaves, 'off' for masters - row = cur.fetchone() - if row[0] == u'off': - cur.close() - conn.close() - return name - cur.close() - conn.close() - return None - - def _get_dsns(self): - """ - Builds a list of databases DSNs - :return: None - """ - template = '{protocol}://{USER}:{PASSWORD}@{HOST}:{PORT}/{NAME}' - for name, db in settings.DATABASES.items(): - if 'postgresql' in db['ENGINE']: - db['protocol'] = 'postgres' - else: - raise Exception('PostgreSQLFailoverRouter only works with PostgreSQL... ... ...') - self.DSNS[name] = template.format(**db) - - def _get_conn(self, dsn): - """ - Returns a psycopg2 connection for a DSN - :param dsn: postgres DSN - :return: psycopg2 connection - """ - return psycopg2.connect(dsn) - - def db_for_read(self, model, **hints): - """ - Returns a django database connection name for reading or kills itself - :param model: django model (disused) - :param hints: hints to help choosing a database (disused) - :return: - """ - if not self.CACHED_MASTER: - exit() - return self.CACHED_MASTER - - def db_for_write(self, model, **hints): - """ - Returns a django database connection name for writing or kills itself - :param model: django model (disused) - :param hints: hints to help choosing a database (disused) - :return: - """ - if not self.CACHED_MASTER: - exit() - return self.CACHED_MASTER - - def allow_relation(self, obj1, obj2, **hints): - # None if the router has no opinion - # https://docs.djangoproject.com/en/1.10/topics/db/multi-db/#allow_relation - return None - - def allow_migrate(self, db, app_label, model_name=None, **hints): - # None if the router has no opinion. - # https://docs.djangoproject.com/en/1.10/topics/db/multi-db/#allow_migrate - return None From c9c7f44b9728108074f89f9b53b31a7bc51a304e Mon Sep 17 00:00:00 2001 From: John Tordoff Date: Thu, 11 Aug 2022 10:19:16 -0400 Subject: [PATCH 14/72] Move file metadata population to unit test fixtures (#9994) * Move datacite schema population out of migration stream * Move pytest fixuture data populator out of test class Co-authored-by: John Tordoff <> Co-authored-by: Longze Chen --- .../views/test_file_metadata_record_detail.py | 11 +++++++++++ .../views/test_file_metadata_record_download.py | 8 ++++++++ .../views/test_file_metadata_schema_detail.py | 7 +++++++ .../0136_add_datacite_file_metadata_schema.py | 1 - .../0137_add_fm_record_to_osfstorage_files.py | 4 +--- osf/migrations/__init__.py | 16 ++++++++++++++++ osf_tests/test_file_metadata.py | 8 ++++++++ 7 files changed, 51 insertions(+), 4 deletions(-) diff --git a/api_tests/files/views/test_file_metadata_record_detail.py b/api_tests/files/views/test_file_metadata_record_detail.py index 44050c93206..35ef50b4f6a 100644 --- a/api_tests/files/views/test_file_metadata_record_detail.py +++ b/api_tests/files/views/test_file_metadata_record_detail.py @@ -11,14 +11,24 @@ PreprintFactory, ) +from osf.migrations import ensure_datacite_file_schema + + +@pytest.fixture(autouse=True) +def datacite_file_schema(): + return ensure_datacite_file_schema() + + @pytest.fixture() def user(): return AuthUserFactory() + @pytest.fixture() def preprint(user): return PreprintFactory(creator=user) + @pytest.fixture() def preprint_record(user, preprint): primary_file = preprint.primary_file @@ -99,6 +109,7 @@ def test_preprint_file_metadata_record(self, app, user, preprint_record, unpubli assert res.status_code == 200 assert res.json['data']['id'] == unpublished_preprint_record._id + @pytest.mark.django_db class TestFileMetadataRecordUpdate: diff --git a/api_tests/files/views/test_file_metadata_record_download.py b/api_tests/files/views/test_file_metadata_record_download.py index b1fca8d54b5..d36c98a8a0a 100644 --- a/api_tests/files/views/test_file_metadata_record_download.py +++ b/api_tests/files/views/test_file_metadata_record_download.py @@ -7,6 +7,14 @@ ProjectFactory ) +from osf.migrations import ensure_datacite_file_schema + + +@pytest.fixture(autouse=True) +def datacite_file_schema(): + return ensure_datacite_file_schema() + + @pytest.mark.django_db class TestFileMetadataRecordDownload: diff --git a/api_tests/schemas/views/test_file_metadata_schema_detail.py b/api_tests/schemas/views/test_file_metadata_schema_detail.py index 3ebca552685..da270c4a236 100644 --- a/api_tests/schemas/views/test_file_metadata_schema_detail.py +++ b/api_tests/schemas/views/test_file_metadata_schema_detail.py @@ -6,6 +6,13 @@ AuthUserFactory, ) +from osf.migrations import ensure_datacite_file_schema + + +@pytest.fixture(autouse=True) +def datacite_file_schema(): + return ensure_datacite_file_schema() + @pytest.mark.django_db class TestFileMetadataSchemaDetail: diff --git a/osf/migrations/0136_add_datacite_file_metadata_schema.py b/osf/migrations/0136_add_datacite_file_metadata_schema.py index 23c58417c60..906bc058c89 100644 --- a/osf/migrations/0136_add_datacite_file_metadata_schema.py +++ b/osf/migrations/0136_add_datacite_file_metadata_schema.py @@ -40,5 +40,4 @@ class Migration(migrations.Migration): ] operations = [ - migrations.RunPython(add_datacite_schema, remove_datacite_schema) ] diff --git a/osf/migrations/0137_add_fm_record_to_osfstorage_files.py b/osf/migrations/0137_add_fm_record_to_osfstorage_files.py index f24b475744b..7aa62e71474 100644 --- a/osf/migrations/0137_add_fm_record_to_osfstorage_files.py +++ b/osf/migrations/0137_add_fm_record_to_osfstorage_files.py @@ -54,6 +54,4 @@ class Migration(migrations.Migration): ('osf', '0136_add_datacite_file_metadata_schema'), ] - operations = [ - migrations.RunPython(add_records_to_files_sql, remove_records_from_files), - ] + operations = [] diff --git a/osf/migrations/__init__.py b/osf/migrations/__init__.py index 9482efc3820..c6a29590fe1 100644 --- a/osf/migrations/__init__.py +++ b/osf/migrations/__init__.py @@ -1,5 +1,6 @@ # -*- coding: utf-8 -*- import sys +import json import logging from django.apps import apps @@ -230,3 +231,18 @@ def ensure_default_storage_region(): 'waterbutler_url': osf_settings.WATERBUTLER_URL } ) + + +def ensure_datacite_file_schema(): + ''' Test use only ''' + from osf.models import FileMetadataSchema + with open('osf/metadata/schemas/datacite.json') as f: + jsonschema = json.load(f) + _, created = FileMetadataSchema.objects.get_or_create( + _id='datacite', + schema_version=1, + defaults={ + 'name': 'datacite', + 'schema': jsonschema + } + ) diff --git a/osf_tests/test_file_metadata.py b/osf_tests/test_file_metadata.py index ec386096ebd..ae5821a1755 100644 --- a/osf_tests/test_file_metadata.py +++ b/osf_tests/test_file_metadata.py @@ -7,19 +7,27 @@ from website.settings import DOI_FORMAT, DATACITE_PREFIX from website.project.licenses import set_license from osf.models import FileMetadataSchema, NodeLicense, NodeLog +from osf.migrations import ensure_datacite_file_schema from osf_tests.factories import ProjectFactory, SubjectFactory, AuthUserFactory from osf.utils.permissions import READ from api_tests.utils import create_test_file +@pytest.fixture(autouse=True) +def datacite_file_schema(): + return ensure_datacite_file_schema() + + @pytest.fixture() def node(): return ProjectFactory() + @pytest.fixture() def osf_file(node): return create_test_file(target=node, user=node.creator) + def inject_placeholder_doi(json_data): # the OSF cannot currently issue DOIs for a file, which is required for datacite schema validation. # Manually add a placeholder in tests for validation until we handle this better. From 721ef909b91924b031b272f6603e1b815b6ccb26 Mon Sep 17 00:00:00 2001 From: Longze Chen Date: Thu, 11 Aug 2022 11:21:19 -0400 Subject: [PATCH 15/72] Remove password_reset from installed apps --- admin/base/settings/defaults.py | 1 - 1 file changed, 1 deletion(-) diff --git a/admin/base/settings/defaults.py b/admin/base/settings/defaults.py index 0e2d29dae76..a894baf4774 100644 --- a/admin/base/settings/defaults.py +++ b/admin/base/settings/defaults.py @@ -84,7 +84,6 @@ 'django_celery_results', 'raven.contrib.django.raven_compat', 'webpack_loader', - 'password_reset', 'guardian', 'waffle', 'elasticsearch_metrics', From 285d9a6e34354b19470c347b031e19dba8a8145b Mon Sep 17 00:00:00 2001 From: John Tordoff Date: Tue, 16 Aug 2022 20:36:48 -0400 Subject: [PATCH 16/72] [Django Upgrade] Fix one sub-query slicing issue (#10012) Co-authored-by: John Tordoff <> --- osf/models/node.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/osf/models/node.py b/osf/models/node.py index 06ffebf026a..1afbe9b5b11 100644 --- a/osf/models/node.py +++ b/osf/models/node.py @@ -981,7 +981,7 @@ def registrations_all(self): def osfstorage_region(self): from addons.osfstorage.models import Region osfs_settings = self._settings_model('osfstorage') - region_subquery = osfs_settings.objects.filter(owner=self.id).values('region_id') + region_subquery = osfs_settings.objects.filter(owner=self.id).values_list('region_id', flat=True)[0] return Region.objects.get(id=region_subquery) @property From 06f6fe9aaee7c22985f01ff711093fc31420fd61 Mon Sep 17 00:00:00 2001 From: John Tordoff Date: Tue, 16 Aug 2022 20:39:07 -0400 Subject: [PATCH 17/72] [Django Upgrade] Upgrade django-elasticsearch-metrics (#10021) Co-authored-by: John Tordoff <> --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index d9fc1560edf..f5dcb0fb4d0 100644 --- a/requirements.txt +++ b/requirements.txt @@ -93,7 +93,7 @@ datacite==1.1.2 # Metrics -django-elasticsearch-metrics==5.0.0 +git+https://github.com/Johnetordoff/django-elasticsearch-metrics.git@update-django-3 # Impact Metrics CSV Export djangorestframework-csv==2.1.0 From 724f59ac6ae3a55bb44cef5311a914033877d560 Mon Sep 17 00:00:00 2001 From: John Tordoff Date: Tue, 16 Aug 2022 20:41:45 -0400 Subject: [PATCH 18/72] [Django Upgrade] Replace M2M direct assignment (#10010) Co-authored-by: John Tordoff <> --- admin/meetings/views.py | 2 +- api_tests/preprints/views/test_preprint_detail.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/admin/meetings/views.py b/admin/meetings/views.py index cbee5dae49b..df496a70a13 100644 --- a/admin/meetings/views.py +++ b/admin/meetings/views.py @@ -65,7 +65,7 @@ def form_valid(self, form): custom_fields, data = get_custom_fields(form.cleaned_data) if 'admins' in form.changed_data: admin_users = get_admin_users(data.get('admins')) - self.conf.admins = admin_users + self.conf.admins.set(admin_users) self.conf.name = data.get('name') self.conf.info_url = data.get('info_url') self.conf.logo_url = data.get('logo_url') diff --git a/api_tests/preprints/views/test_preprint_detail.py b/api_tests/preprints/views/test_preprint_detail.py index 39a5db2d822..dc2f61d2e3c 100644 --- a/api_tests/preprints/views/test_preprint_detail.py +++ b/api_tests/preprints/views/test_preprint_detail.py @@ -1200,7 +1200,7 @@ def no_license(self): @pytest.fixture() def preprint_provider(self, cc0_license, no_license): preprint_provider = PreprintProviderFactory() - preprint_provider.licenses_acceptable = [cc0_license, no_license] + preprint_provider.licenses_acceptable.add(*[cc0_license, no_license]) preprint_provider.save() return preprint_provider From afa62a7643460bc857d8d0f1aebf470883b58454 Mon Sep 17 00:00:00 2001 From: John Tordoff Date: Tue, 16 Aug 2022 20:43:37 -0400 Subject: [PATCH 19/72] [Django Upgrade] Upgrade markdown and mdx_del_ins (#9984) Co-authored-by: John Tordoff <> --- addons/wiki/models.py | 12 ++++-------- requirements.txt | 4 ++-- website/project/views/comment.py | 2 +- 3 files changed, 7 insertions(+), 11 deletions(-) diff --git a/addons/wiki/models.py b/addons/wiki/models.py index 36e935b91d7..4c4e9a89c35 100644 --- a/addons/wiki/models.py +++ b/addons/wiki/models.py @@ -67,16 +67,12 @@ def build_html_output(content, node): content, extensions=[ wikilinks.WikiLinkExtension( - configs=[ - ('base_url', ''), - ('end_url', ''), - ('build_url', functools.partial(build_wiki_url, node)) - ] + base_url='', + end_url='', + build_url=functools.partial(build_wiki_url, node) ), fenced_code.FencedCodeExtension(), - codehilite.CodeHiliteExtension( - [('css_class', 'highlight')] - ) + codehilite.CodeHiliteExtension(css_class='highlight') ] ) diff --git a/requirements.txt b/requirements.txt index f5dcb0fb4d0..d2fe4f3a0d6 100644 --- a/requirements.txt +++ b/requirements.txt @@ -11,7 +11,7 @@ Werkzeug==1.0.0 Flask==1.0 gevent==1.2.2 Mako==1.0.7 -Markdown==2.6.9 +Markdown==3.3.7 WTForms==1.0.4 # Fork of celery 4.1.1 with https://github.com/celery/celery/pull/4278 backported, # which fixes a bug that was causing stuck registrations @@ -40,7 +40,7 @@ pymongo==3.7.1 PyYAML==6.0 tqdm==4.28.1 # Python markdown extensions for comment emails -git+https://github.com/CenterForOpenScience/mdx_del_ins.git +git+https://github.com/Johnetordoff/mdx_del_ins.git@django-3 certifi==2020.12.5 sendgrid==1.5.13 diff --git a/website/project/views/comment.py b/website/project/views/comment.py index f028ee8fd01..33de3042955 100644 --- a/website/project/views/comment.py +++ b/website/project/views/comment.py @@ -106,7 +106,7 @@ def update_comment_node(root_target_id, source_node, destination_node): def render_email_markdown(content): - return markdown.markdown(content, ['del_ins', 'markdown.extensions.tables', 'markdown.extensions.fenced_code']) + return markdown.markdown(content, extensions=['mdx_del_ins', 'markdown.extensions.tables', 'markdown.extensions.fenced_code']) @comment_added.connect From d15c88fa3fe9c3fb76a00ced0bb6f6bd742ee839 Mon Sep 17 00:00:00 2001 From: Longze Chen Date: Thu, 18 Aug 2022 14:41:25 -0400 Subject: [PATCH 20/72] [Django Upgrade] Move schema activeness/visibility update to pytest fixtures (#10029) --- .../views/test_draft_registration_list.py | 7 +++++++ .../views/test_node_draft_registration_list.py | 7 +++++++ .../views/test_registration_schemas_detail.py | 8 ++++++++ osf/migrations/__init__.py | 17 ++++++++++++++++- 4 files changed, 38 insertions(+), 1 deletion(-) diff --git a/api_tests/draft_registrations/views/test_draft_registration_list.py b/api_tests/draft_registrations/views/test_draft_registration_list.py index 5957ab9f257..b8b5d3a024f 100644 --- a/api_tests/draft_registrations/views/test_draft_registration_list.py +++ b/api_tests/draft_registrations/views/test_draft_registration_list.py @@ -8,6 +8,7 @@ ) from api.base.settings.defaults import API_BASE +from osf.migrations import ensure_invisible_and_inactive_schema from osf.models import DraftRegistration, NodeLicense, RegistrationProvider, Institution from osf_tests.factories import ( RegistrationFactory, @@ -20,6 +21,12 @@ from website import mails, settings + +@pytest.fixture(autouse=True) +def invisible_and_inactive_schema(): + return ensure_invisible_and_inactive_schema() + + @pytest.mark.django_db class TestDraftRegistrationListNewWorkflow(TestDraftRegistrationList): @pytest.fixture() diff --git a/api_tests/nodes/views/test_node_draft_registration_list.py b/api_tests/nodes/views/test_node_draft_registration_list.py index 828eefb0b1b..a37a81ad53e 100644 --- a/api_tests/nodes/views/test_node_draft_registration_list.py +++ b/api_tests/nodes/views/test_node_draft_registration_list.py @@ -3,6 +3,7 @@ from api.base.settings.defaults import API_BASE from framework.auth.core import Auth +from osf.migrations import ensure_invisible_and_inactive_schema from osf.models import RegistrationSchema, RegistrationProvider from osf_tests.factories import ( ProjectFactory, @@ -20,6 +21,12 @@ OPEN_ENDED_SCHEMA_VERSION = 3 SCHEMA_VERSION = 2 + +@pytest.fixture(autouse=True) +def invisible_and_inactive_schema(): + return ensure_invisible_and_inactive_schema() + + @pytest.mark.django_db class DraftRegistrationTestCase: diff --git a/api_tests/schemas/views/test_registration_schemas_detail.py b/api_tests/schemas/views/test_registration_schemas_detail.py index 89423debff4..2e43e266ed8 100644 --- a/api_tests/schemas/views/test_registration_schemas_detail.py +++ b/api_tests/schemas/views/test_registration_schemas_detail.py @@ -1,6 +1,7 @@ import pytest from api.base.settings.defaults import API_BASE +from osf.migrations import ensure_invisible_and_inactive_schema from osf.models import RegistrationSchema from osf_tests.factories import ( AuthUserFactory, @@ -10,10 +11,12 @@ SCHEMA_VERSION = 2 + @pytest.fixture() def user(): return AuthUserFactory() + @pytest.fixture() def schema(): return RegistrationSchema.objects.filter( @@ -22,6 +25,11 @@ def schema(): ).first() +@pytest.fixture(autouse=True) +def invisible_and_inactive_schema(): + return ensure_invisible_and_inactive_schema() + + class TestDeprecatedMetaSchemaDetail: def test_deprecated_metaschemas_routes(self, app, user, schema): # test base /metaschemas/ GET with min version diff --git a/osf/migrations/__init__.py b/osf/migrations/__init__.py index c6a29590fe1..4704956d772 100644 --- a/osf/migrations/__init__.py +++ b/osf/migrations/__init__.py @@ -234,7 +234,7 @@ def ensure_default_storage_region(): def ensure_datacite_file_schema(): - ''' Test use only ''' + """ Test use only """ from osf.models import FileMetadataSchema with open('osf/metadata/schemas/datacite.json') as f: jsonschema = json.load(f) @@ -246,3 +246,18 @@ def ensure_datacite_file_schema(): 'schema': jsonschema } ) + + +def ensure_invisible_and_inactive_schema(): + """ Test use only """ + from osf.models import RegistrationSchema + v2_inactive_schema = [ + 'EGAP Project', + 'OSF Preregistration', + 'Confirmatory - General', + 'RIDIE Registration - Study Complete', + 'RIDIE Registration - Study Initiation', + ] + v2_inactive_schema = v2_inactive_schema + ['Election Research Preacceptance Competition'] + RegistrationSchema.objects.filter(name__in=v2_inactive_schema).update(visible=False) + RegistrationSchema.objects.filter(name__in=v2_inactive_schema).update(active=False) From 3f162f166acff55c4cb5ee2020b5efd739f605d8 Mon Sep 17 00:00:00 2001 From: Longze Chen Date: Wed, 17 Aug 2022 15:12:54 -0400 Subject: [PATCH 21/72] Remove osf migrations --- osf/migrations/0001_initial.py | 1428 ----------------- .../0002_add_lower_index_to_tags.py | 26 - osf/migrations/0003_auto_20170330_1251.py | 22 - osf/migrations/0003_auto_20170402_1611.py | 34 - .../0004_abstractnode_comment_level.py | 20 - osf/migrations/0005_merge.py | 16 - .../0006_add_jsonb_index_for_fileversions.py | 29 - osf/migrations/0007_auto_20170403_2304.py | 97 -- osf/migrations/0007_auto_20170404_0857.py | 19 - osf/migrations/0008_merge.py | 16 - osf/migrations/0009_auto_20170406_1614.py | 21 - .../0010_update_osfuser_permissions.py | 19 - osf/migrations/0011_auto_20170410_1711.py | 20 - osf/migrations/0012_auto_20170411_1548.py | 20 - osf/migrations/0013_auto_20170412_0957.py | 21 - osf/migrations/0013_auto_20170417_1437.py | 25 - osf/migrations/0014_merge.py | 16 - osf/migrations/0015_auto_20170421_1244.py | 23 - .../0015_preprintprovider_domain.py | 20 - osf/migrations/0016_auto_20170424_1609.py | 35 - ...reprintprovider_domain_redirect_enabled.py | 20 - osf/migrations/0017_auto_20170419_1323.py | 20 - osf/migrations/0018_merge_20170424_1330.py | 16 - osf/migrations/0019_merge_20170424_1956.py | 16 - osf/migrations/0020_auto_20170426_0920.py | 20 - .../0021_retraction_date_retracted.py | 21 - .../0021_unique_notificationsettings__ids.py | 40 - osf/migrations/0022_auto_20170503_1818.py | 20 - osf/migrations/0023_merge_20170503_1947.py | 16 - .../0024_migrate_subject_parents_to_parent.py | 96 -- .../0025_migrate_preprint_subjects_to_fks.py | 48 - .../0026_rename_preprintservice_subjects.py | 24 - osf/migrations/0027_auto_20170428_1435.py | 24 - osf/migrations/0028_auto_20170504_1548.py | 19 - osf/migrations/0029_auto_20170511_1553.py | 26 - ...eprint_provider_institution_permissions.py | 24 - .../0031_preprintprovider_share_source.py | 20 - ...032_unquote_gd_nodesettings_folder_path.py | 42 - osf/migrations/0033_user_emails_to_fk.py | 77 - .../0034_rename_email_user_relation.py | 22 - osf/migrations/0035_metaschema_active.py | 20 - osf/migrations/0036_auto_20170605_1520.py | 53 - osf/migrations/0037_ensure_licenses.py | 20 - ...037_remove_emails_for_unconfirmed_users.py | 38 - osf/migrations/0038_ensure_schemas.py | 18 - osf/migrations/0039_maintenancestate.py | 24 - osf/migrations/0040_merge_20170619_0922.py | 16 - osf/migrations/0041_auto_20170706_1024.py | 25 - osf/migrations/0042_auto_20170707_1019.py | 50 - .../0042_preprintprovider_share_title.py | 20 - osf/migrations/0043_merge_20170725_1328.py | 16 - osf/migrations/0043_set_share_title.py | 44 - .../0044_basefilenode_uniqueness_index.py | 90 -- .../0044_ever_mentioned_array_to_m2m.py | 49 - .../0045_add_view_subject_permissions.py | 19 - osf/migrations/0046_merge_20170803_1147.py | 16 - ...remove_abstractnode_users_watching_node.py | 19 - osf/migrations/0048_merge_20170804_0910.py | 16 - .../0049_preprintprovider_preprint_word.py | 20 - osf/migrations/0050_auto_20170809_1511.py | 25 - .../0051_remove_invalid_social_entries.py | 37 - ...052_preprintprovider_share_publish_type.py | 20 - osf/migrations/0053_add_quickfiles.py | 117 -- osf/migrations/0053_nodelog_faster_index.py | 21 - .../0054_add_file_version_indices.py | 24 - osf/migrations/0054_auto_20170823_1555.py | 20 - osf/migrations/0055_auto_20170823_1648.py | 22 - .../0055_update_metaschema_active.py | 21 - osf/migrations/0056_merge_20170831_0832.py | 16 - .../0057_order_fileversion_by_date_created.py | 19 - osf/migrations/0058_merge_20170913_2232.py | 16 - osf/migrations/0059_merge_20170914_1100.py | 16 - .../0060_add_nodelog_should_hide_nid_index.py | 21 - osf/migrations/0060_reviews.py | 72 - ...1_add_reviews_notification_subscription.py | 20 - osf/migrations/0062_accept_preprints.py | 29 - osf/migrations/0063_merge_20171012_1215.py | 16 - osf/migrations/0064_auto_20171019_0918.py | 20 - osf/migrations/0065_auto_20171024_1330.py | 50 - ...eprintservice_original_publication_date.py | 21 - osf/migrations/0066_merge_20171121_1050.py | 16 - osf/migrations/0067_auto_20171121_1050.py | 50 - .../0068_creator_modified_renames.py | 27 - .../0068_draftregistration_deleted.py | 21 - ...68_preprintservice_preprint_doi_created.py | 21 - osf/migrations/0069_auto_20171127_1119.py | 50 - .../0069_skippable_created_modified.py | 510 ------ osf/migrations/0070_auto_20171121_1805.py | 76 - osf/migrations/0070_merge_20171127_2232.py | 16 - osf/migrations/0071_merge_20171128_0950.py | 16 - osf/migrations/0072_merge_20171128_1018.py | 16 - .../0073_citationstyle_has_bibliography.py | 20 - osf/migrations/0074_auto_20171207_1331.py | 21 - osf/migrations/0074_parse_citation_styles.py | 76 - osf/migrations/0075_merge_20171207_1511.py | 16 - osf/migrations/0076_action_rename.py | 24 - .../0077_add_maintenance_permissions.py | 20 - osf/migrations/0077_add_noderequest_model.py | 85 - .../0077_bannerimage_scheduledbanner.py | 43 - osf/migrations/0077_ensure_schemas.py | 18 - .../0077_preprintprovider_facebook_app_id.py | 20 - osf/migrations/0078_add_banner_permissions.py | 20 - osf/migrations/0078_ensure_schemas.py | 16 - osf/migrations/0078_merge_20180206_1148.py | 16 - osf/migrations/0079_merge_20180202_1206.py | 17 - osf/migrations/0079_merge_20180207_1545.py | 16 - osf/migrations/0080_add_abstractprovider.py | 134 -- osf/migrations/0080_ensure_schemas.py | 17 - ...0081_alter_abstractprovider_permissions.py | 19 - osf/migrations/0081_merge_20180212_0949.py | 16 - .../0082_add_preprint_word_choice.py | 20 - osf/migrations/0082_merge_20180213_1502.py | 16 - osf/migrations/0083_add_ember_waffle_flags.py | 59 - .../0083_add_file_fields_for_target.py | 36 - osf/migrations/0083_merge_20180228_1619.py | 16 - osf/migrations/0084_merge_20180308_1821.py | 16 - .../0084_migrate_node_info_for_target.py | 61 - .../0085_finalize_file_node_to_target.py | 30 - osf/migrations/0085_merge_20180316_1625.py | 16 - .../0086_pre_migrate_collections.py | 91 -- .../0087_migrate_collections_data.py | 155 -- .../0088_post_migrate_collections.py | 24 - osf/migrations/0089_auto_20180315_1114.py | 78 - .../0090_add_collection_groups_permissions.py | 120 -- .../0091_notificationsubscription_provider.py | 21 - ...092_populate_notification_subscriptions.py | 70 - osf/migrations/0093_node_subjects.py | 25 - ...0094_update_preprintprovider_group_auth.py | 21 - .../0095_abstractprovider_allow_commenting.py | 20 - osf/migrations/0095_add_url_to_licenses.py | 20 - .../0095_collectedguidmetadata_subjects.py | 20 - osf/migrations/0095_ensure_licenses.py | 20 - ...ractprovider_licenses_acceptable_id_seq.py | 33 - ...096_abstractprovider_primary_collection.py | 21 - .../0096_add_provider_doi_prefixes.py | 66 - osf/migrations/0096_ensure_schemas.py | 16 - osf/migrations/0096_merge_20180413_1110.py | 16 - ...96_modify_noderequestaction_noderequest.py | 41 - osf/migrations/0097_merge_20180416_1453.py | 16 - osf/migrations/0097_merge_20180416_1533.py | 16 - osf/migrations/0098_auto_20180418_1722.py | 26 - osf/migrations/0098_merge_20180416_1807.py | 16 - osf/migrations/0098_merge_20180424_1329.py | 16 - .../0099_add_default_storage_region.py | 78 - .../0099_file_version_user_metadata.py | 37 - osf/migrations/0099_merge_20180426_0930.py | 16 - osf/migrations/0099_merge_20180427_1109.py | 16 - osf/migrations/0099_merge_20180505_1027.py | 16 - ...099_migrate_comments_on_deleted_objects.py | 40 - .../0099_whitelistedsharepreprintprovider.py | 28 - .../0100_notificationdigest_provider.py | 21 - .../0100_set_access_request_enabled.py | 49 - osf/migrations/0101_merge_20180508_1011.py | 16 - osf/migrations/0101_merge_20180514_1932.py | 16 - .../0101_osfuser_accepted_terms_of_service.py | 21 - osf/migrations/0102_merge_20180509_0846.py | 17 - ...03_set_osf_storage_node_settings_region.py | 71 - osf/migrations/0104_merge_20180518_1337.py | 16 - osf/migrations/0104_merge_20180523_1240.py | 16 - osf/migrations/0104_merge_20180524_1257.py | 16 - osf/migrations/0104_merge_20180524_1621.py | 16 - .../0105_add_identifier_deleted_field.py | 21 - osf/migrations/0105_merge_20180525_1529.py | 16 - osf/migrations/0106_auto_20180601_1341.py | 20 - .../0106_citationstyle_parent_style.py | 20 - osf/migrations/0106_merge_20180531_0919.py | 16 - .../0106_set_preprint_identifier_category.py | 39 - osf/migrations/0107_add_dependent_styles.py | 150 -- osf/migrations/0107_merge_20180604_1232.py | 16 - osf/migrations/0108_auto_20180530_1310.py | 99 -- osf/migrations/0109_merge_20180611_1410.py | 16 - osf/migrations/0110_set_ever_public.py | 23 - osf/migrations/0111_auto_20180605_1240.py | 69 - ...12_alter_collectionprovider_permissions.py | 19 - osf/migrations/0112_ensure_schemas.py | 16 - osf/migrations/0112_merge_20180614_1454.py | 16 - ...d_view_collectionprovider_to_admin_perm.py | 19 - osf/migrations/0113_auto_20180615_1308.py | 47 - osf/migrations/0114_merge_20180621_1322.py | 16 - osf/migrations/0114_merge_20180628_1234.py | 16 - osf/migrations/0115_auto_20180621_1324.py | 20 - osf/migrations/0115_auto_20180628_1253.py | 45 - osf/migrations/0116_merge_20180703_2258.py | 16 - osf/migrations/0116_merge_20180706_0901.py | 16 - osf/migrations/0116_osfuser_deleted.py | 21 - osf/migrations/0117_auto_20180625_0810.py | 66 - osf/migrations/0117_merge_20180712_1241.py | 16 - osf/migrations/0117_set_is_root.py | 25 - osf/migrations/0118_auto_20180706_1127.py | 31 - osf/migrations/0118_auto_20180716_1216.py | 19 - osf/migrations/0119_add_asset_perms.py | 19 - ...add_registrationprovider_perms_to_admin.py | 21 - osf/migrations/0120_merge_20180716_1457.py | 16 - ...0121_add_preprintrequest_perms_to_admin.py | 22 - .../0121_generalize_schema_models.py | 19 - osf/migrations/0121_merge_20180801_1458.py | 16 - .../0121_remove_support_page_waffle_flag.py | 23 - osf/migrations/0121_remove_waffle_flags.py | 34 - .../0121_remove_wiki_fields_from_node.py | 23 - osf/migrations/0122_auto_20180801_2105.py | 20 - .../0122_unique_provider__id_by_type.py | 25 - osf/migrations/0123_auto_20180726_1546.py | 34 - osf/migrations/0123_merge_20180802_2004.py | 16 - osf/migrations/0123_merge_20180803_1346.py | 16 - osf/migrations/0124_merge_20180803_1425.py | 16 - osf/migrations/0124_merge_20180808_1451.py | 16 - osf/migrations/0124_merge_20180815_1924.py | 16 - osf/migrations/0124_merge_20180816_1229.py | 16 - osf/migrations/0125_auto_20180808_1942.py | 66 - osf/migrations/0125_merge_20180822_1508.py | 16 - osf/migrations/0125_merge_20180824_1856.py | 16 - .../0126_update_review_group_names.py | 46 - .../0126_update_social_data_format.py | 72 - .../0127_add_regions_to_all_versions.py | 56 - osf/migrations/0127_merge_20180822_1927.py | 16 - osf/migrations/0128_merge_20180827_1907.py | 16 - osf/migrations/0128_merge_20180829_0012.py | 16 - .../0128_rename_collectionsubmission.py | 24 - osf/migrations/0129_merge_20180831_1412.py | 16 - osf/migrations/0129_merge_20180904_2028.py | 16 - osf/migrations/0129_merge_20180910_1926.py | 16 - .../0129_remove_osfuser_is_claimed.py | 19 - osf/migrations/0130_auto_20180912_2039.py | 46 - osf/migrations/0130_fileversion_region.py | 22 - osf/migrations/0130_merge_20180914_1414.py | 16 - osf/migrations/0131_merge_20180914_1937.py | 16 - osf/migrations/0132_merge_20180914_2001.py | 17 - osf/migrations/0133_merge_20180920_1604.py | 16 - osf/migrations/0133_merge_20180921_0025.py | 16 - .../0134_abstractnode_custom_citation.py | 20 - osf/migrations/0134_add_provider_reg_fks.py | 26 - .../0135_add_file_metadata_models.py | 56 - ...egistrations_to_osf_registries_provider.py | 56 - .../0135_update_preprint_model_for_divorce.py | 138 -- osf/migrations/0135_user_settings_waffles.py | 26 - .../0136_add_datacite_file_metadata_schema.py | 43 - ...136_add_ember_auth_register_waffle_flag.py | 14 - osf/migrations/0136_merge_20181010_2242.py | 16 - osf/migrations/0136_preprint_node_divorce.py | 420 ----- .../0137_add_fm_record_to_osfstorage_files.py | 57 - osf/migrations/0137_auto_20181012_1756.py | 66 - osf/migrations/0137_merge_20181011_1525.py | 16 - ...7_transfer_preprint_service_permissions.py | 14 - .../0138_ensure_subjects_and_providers.py | 100 -- osf/migrations/0138_merge_20181012_1944.py | 16 - .../0138_remove_node_preprint_fields.py | 31 - osf/migrations/0139_merge_20181003_1759.py | 16 - osf/migrations/0139_merge_20181019_0412.py | 16 - .../0139_rename_aspredicted_schema.py | 38 - osf/migrations/0140_merge_20181011_0021.py | 17 - osf/migrations/0140_merge_20181022_1446.py | 16 - osf/migrations/0141_merge_20181011_2016.py | 16 - osf/migrations/0141_merge_20181023_1526.py | 16 - .../0142_change_registration_schemas.py | 18 - osf/migrations/0142_merge_20181015_1554.py | 16 - osf/migrations/0142_remove_forks_flag.py | 14 - .../0142_remove_waffle_analytics_flags.py | 12 - osf/migrations/0143_merge_20181023_1807.py | 16 - osf/migrations/0143_merge_20181115_1458.py | 16 - .../0144_add_prereg_winddown_switches.py | 14 - osf/migrations/0144_merge_20181113_1420.py | 16 - ...add_preprint_contenttype_to_collections.py | 37 - .../0145_add_visible_to_registrationschema.py | 19 - osf/migrations/0146_merge_20181119_2236.py | 16 - .../0146_update_registration_schemas.py | 45 - osf/migrations/0147_blacklistedemaildomain.py | 42 - .../0147_repoint_preprint_pagecounters.py | 48 - osf/migrations/0148_merge_20181213_2253.py | 16 - .../0149_add_datacite_doi_switch.py | 14 - osf/migrations/0150_fix_deleted_preprints.py | 45 - osf/migrations/0151_auto_20181215_1911.py | 19 - osf/migrations/0152_ensure_schemas.py | 12 - osf/migrations/0152_remove_doi_switches.py | 17 - osf/migrations/0153_merge_20181221_1842.py | 16 - ...remove_ember_project_registrations_flag.py | 15 - osf/migrations/0155_merge_20190115_1437.py | 16 - .../0156_abstractnode_article_doi.py | 21 - osf/migrations/0156_auto_20190306_1648.py | 62 - osf/migrations/0156_create_cache_table.py | 11 - osf/migrations/0157_add_storage_usage_flag.py | 12 - osf/migrations/0158_fix_fork_last_logged.py | 48 - osf/migrations/0159_merge_20190331_2301.py | 16 - .../0160_add_permissions_to_node.py | 23 - osf/migrations/0160_merge_20190408_1618.py | 16 - .../0161_add_spam_fields_to_user.py | 68 - osf/migrations/0161_guardian_direct_fks.py | 82 - osf/migrations/0162_conference_submissions.py | 24 - osf/migrations/0162_post_migrate.py | 18 - .../0163_migrate_preprints_to_direct_fks.py | 90 -- .../0163_populate_conference_submissions.py | 43 - osf/migrations/0164_add_guardian_to_nodes.py | 352 ---- osf/migrations/0165_osfgroup.py | 106 -- osf/migrations/0166_merge_20190429_1632.py | 16 - osf/migrations/0167_auto_20190506_1556.py | 12 - osf/migrations/0168_merge_20190610_2308.py | 16 - osf/migrations/0169_merge_20190618_1429.py | 16 - osf/migrations/0170_ensure_schemas.py | 13 - .../0171_add_registration_files_count.py | 55 - osf/migrations/0172_ensure_schemas.py | 14 - osf/migrations/0173_ensure_schemas.py | 14 - ...add_ab_testing_home_page_version_b_flag.py | 14 - osf/migrations/0175_pagecounter_schema.py | 36 - osf/migrations/0176_pagecounter_data.py | 29 - osf/migrations/0177_pagecounter_index.py | 21 - .../0178_apioauth2scope_is_public.py | 20 - ...0179_apioauth2personaltoken_scopes_temp.py | 78 - .../0180_finalize_token_scopes_mig.py | 24 - .../0181_osfuser_contacted_deactivation.py | 20 - .../0182_add_custom_file_versions_through.py | 33 - .../0183_populate_file_versions_through.py | 98 -- .../0184_remove_basefilenode_versions.py | 19 - osf/migrations/0185_basefilenode_versions.py | 20 - .../0186_make_pagecounter_fields_nonnull.py | 31 - ...remove_outdated_contributor_permissions.py | 39 - osf/migrations/0188_deleted_field_mig.py | 41 - osf/migrations/0189_deleted_field_data.py | 44 - .../0190_add_schema_block_models.py | 58 - ...1_abstractnode_external_registered_date.py | 21 - .../0191_migrate_schemas_to_schemablocks.py | 19 - ...tractnode_external_registration_boolean.py | 24 - .../0192_add_registation_responses_fields.py | 46 - .../0193_migrate_registered_meta.py | 66 - osf/migrations/0194_merge_20191113_1611.py | 16 - .../0195_add_enable_chronos_waffle_flag.py | 14 - osf/migrations/0196_update_schemas.py | 11 - ...ting_home_page_hero_text_version_b_flag.py | 14 - osf/migrations/0198_draft_node_models.py | 186 --- osf/migrations/0199_draft_node_permissions.py | 16 - osf/migrations/0200_auto_20200214_1518.py | 31 - osf/migrations/0201_add_egap_flag.py | 14 - osf/migrations/0202_add_sloan.py | 70 - osf/migrations/0203_auto_20200312_1435.py | 25 - osf/migrations/0204_ensure_schemas.py | 11 - osf/migrations/0205_auto_20200323_1850.py | 24 - osf/migrations/0206_auto_20200528_1319.py | 21 - osf/migrations/0207_ensure_schemas.py | 11 - osf/migrations/0207_update_schemas2.py | 15 - osf/migrations/0208_update_EGAP_schema.py | 12 - .../0209_conference_auto_check_spam.py | 20 - osf/migrations/0210_branded_registries.py | 60 - osf/migrations/0211_auto_20200709_1320.py | 21 - .../0212_registrationschema_providers.py | 20 - osf/migrations/0213_auto_20200728_1609.py | 22 - osf/migrations/0214_auto_20200701_1658.py | 30 - osf/migrations/0215_auto_20200819_1942.py | 26 - osf/migrations/0216_auto_20200910_1259.py | 25 - osf/migrations/0217_auto_20200901_1344.py | 54 - osf/migrations/0218_auto_20200929_1850.py | 51 - osf/migrations/0219_auto_20201020_1836.py | 35 - osf/migrations/0221_add_schemas.py | 14 - osf/migrations/0222_auto_20201023_2033.py | 68 - osf/migrations/0223_auto_20201026_1843.py | 28 - ...registration_subscription_notifications.py | 34 - osf/migrations/0225_auto_20201119_2027.py | 60 - osf/migrations/0226_auto_20210224_1610.py | 41 - osf/migrations/0227_add_secondary_data.py | 14 - .../0228_abstractnode_branched_from_node.py | 20 - osf/migrations/0229_auto_20210317_2013.py | 26 - .../0230_make_run_management_perm.py | 15 - .../0231_abstractprovider_default_schema.py | 21 - osf/migrations/0232_abstractnode_ia_url.py | 20 - osf/migrations/0233_auto_20210608_1816.py | 36 - osf/migrations/0234_auto_20210610_1812.py | 21 - osf/migrations/0235_auto_20210823_1310.py | 73 - osf/migrations/0236_auto_20210913_2008.py | 107 -- osf/migrations/0237_auto_20210929_1529.py | 64 - .../0238_abstractprovider_allow_updates.py | 20 - osf/migrations/0239_auto_20211110_1921.py | 19 - osf/migrations/0239_notable_email_domains.py | 21 - osf/migrations/0240_merge_20211110_2051.py | 16 - ...241_abstractprovider_allow_bulk_uploads.py | 20 - osf/migrations/0242_auto_20220125_1604.py | 23 - osf/migrations/0243_auto_20211025_1353.py | 30 - osf/migrations/0244_auto_20220517_1718.py | 25 - osf/migrations/0245_auto_20220621_1950.py | 25 - .../0246_add_outcomes_and_artifacts.py | 83 - .../0247_artifact_finalized_and_deleted.py | 41 - osf/migrations/0248_artifact_tweaks.py | 33 - ...ma_response_justification_to_text_field.py | 20 - 379 files changed, 14359 deletions(-) delete mode 100644 osf/migrations/0001_initial.py delete mode 100644 osf/migrations/0002_add_lower_index_to_tags.py delete mode 100644 osf/migrations/0003_auto_20170330_1251.py delete mode 100644 osf/migrations/0003_auto_20170402_1611.py delete mode 100644 osf/migrations/0004_abstractnode_comment_level.py delete mode 100644 osf/migrations/0005_merge.py delete mode 100644 osf/migrations/0006_add_jsonb_index_for_fileversions.py delete mode 100644 osf/migrations/0007_auto_20170403_2304.py delete mode 100644 osf/migrations/0007_auto_20170404_0857.py delete mode 100644 osf/migrations/0008_merge.py delete mode 100644 osf/migrations/0009_auto_20170406_1614.py delete mode 100644 osf/migrations/0010_update_osfuser_permissions.py delete mode 100644 osf/migrations/0011_auto_20170410_1711.py delete mode 100644 osf/migrations/0012_auto_20170411_1548.py delete mode 100644 osf/migrations/0013_auto_20170412_0957.py delete mode 100644 osf/migrations/0013_auto_20170417_1437.py delete mode 100644 osf/migrations/0014_merge.py delete mode 100644 osf/migrations/0015_auto_20170421_1244.py delete mode 100644 osf/migrations/0015_preprintprovider_domain.py delete mode 100644 osf/migrations/0016_auto_20170424_1609.py delete mode 100644 osf/migrations/0016_preprintprovider_domain_redirect_enabled.py delete mode 100644 osf/migrations/0017_auto_20170419_1323.py delete mode 100644 osf/migrations/0018_merge_20170424_1330.py delete mode 100644 osf/migrations/0019_merge_20170424_1956.py delete mode 100644 osf/migrations/0020_auto_20170426_0920.py delete mode 100644 osf/migrations/0021_retraction_date_retracted.py delete mode 100644 osf/migrations/0021_unique_notificationsettings__ids.py delete mode 100644 osf/migrations/0022_auto_20170503_1818.py delete mode 100644 osf/migrations/0023_merge_20170503_1947.py delete mode 100644 osf/migrations/0024_migrate_subject_parents_to_parent.py delete mode 100644 osf/migrations/0025_migrate_preprint_subjects_to_fks.py delete mode 100644 osf/migrations/0026_rename_preprintservice_subjects.py delete mode 100644 osf/migrations/0027_auto_20170428_1435.py delete mode 100644 osf/migrations/0028_auto_20170504_1548.py delete mode 100644 osf/migrations/0029_auto_20170511_1553.py delete mode 100644 osf/migrations/0030_preprint_provider_institution_permissions.py delete mode 100644 osf/migrations/0031_preprintprovider_share_source.py delete mode 100644 osf/migrations/0032_unquote_gd_nodesettings_folder_path.py delete mode 100644 osf/migrations/0033_user_emails_to_fk.py delete mode 100644 osf/migrations/0034_rename_email_user_relation.py delete mode 100644 osf/migrations/0035_metaschema_active.py delete mode 100644 osf/migrations/0036_auto_20170605_1520.py delete mode 100644 osf/migrations/0037_ensure_licenses.py delete mode 100644 osf/migrations/0037_remove_emails_for_unconfirmed_users.py delete mode 100644 osf/migrations/0038_ensure_schemas.py delete mode 100644 osf/migrations/0039_maintenancestate.py delete mode 100644 osf/migrations/0040_merge_20170619_0922.py delete mode 100644 osf/migrations/0041_auto_20170706_1024.py delete mode 100644 osf/migrations/0042_auto_20170707_1019.py delete mode 100644 osf/migrations/0042_preprintprovider_share_title.py delete mode 100644 osf/migrations/0043_merge_20170725_1328.py delete mode 100644 osf/migrations/0043_set_share_title.py delete mode 100644 osf/migrations/0044_basefilenode_uniqueness_index.py delete mode 100644 osf/migrations/0044_ever_mentioned_array_to_m2m.py delete mode 100644 osf/migrations/0045_add_view_subject_permissions.py delete mode 100644 osf/migrations/0046_merge_20170803_1147.py delete mode 100644 osf/migrations/0047_remove_abstractnode_users_watching_node.py delete mode 100644 osf/migrations/0048_merge_20170804_0910.py delete mode 100644 osf/migrations/0049_preprintprovider_preprint_word.py delete mode 100644 osf/migrations/0050_auto_20170809_1511.py delete mode 100644 osf/migrations/0051_remove_invalid_social_entries.py delete mode 100644 osf/migrations/0052_preprintprovider_share_publish_type.py delete mode 100644 osf/migrations/0053_add_quickfiles.py delete mode 100644 osf/migrations/0053_nodelog_faster_index.py delete mode 100644 osf/migrations/0054_add_file_version_indices.py delete mode 100644 osf/migrations/0054_auto_20170823_1555.py delete mode 100644 osf/migrations/0055_auto_20170823_1648.py delete mode 100644 osf/migrations/0055_update_metaschema_active.py delete mode 100644 osf/migrations/0056_merge_20170831_0832.py delete mode 100644 osf/migrations/0057_order_fileversion_by_date_created.py delete mode 100644 osf/migrations/0058_merge_20170913_2232.py delete mode 100644 osf/migrations/0059_merge_20170914_1100.py delete mode 100644 osf/migrations/0060_add_nodelog_should_hide_nid_index.py delete mode 100644 osf/migrations/0060_reviews.py delete mode 100644 osf/migrations/0061_add_reviews_notification_subscription.py delete mode 100644 osf/migrations/0062_accept_preprints.py delete mode 100644 osf/migrations/0063_merge_20171012_1215.py delete mode 100644 osf/migrations/0064_auto_20171019_0918.py delete mode 100644 osf/migrations/0065_auto_20171024_1330.py delete mode 100644 osf/migrations/0065_preprintservice_original_publication_date.py delete mode 100644 osf/migrations/0066_merge_20171121_1050.py delete mode 100644 osf/migrations/0067_auto_20171121_1050.py delete mode 100644 osf/migrations/0068_creator_modified_renames.py delete mode 100644 osf/migrations/0068_draftregistration_deleted.py delete mode 100644 osf/migrations/0068_preprintservice_preprint_doi_created.py delete mode 100644 osf/migrations/0069_auto_20171127_1119.py delete mode 100644 osf/migrations/0069_skippable_created_modified.py delete mode 100644 osf/migrations/0070_auto_20171121_1805.py delete mode 100644 osf/migrations/0070_merge_20171127_2232.py delete mode 100644 osf/migrations/0071_merge_20171128_0950.py delete mode 100644 osf/migrations/0072_merge_20171128_1018.py delete mode 100644 osf/migrations/0073_citationstyle_has_bibliography.py delete mode 100644 osf/migrations/0074_auto_20171207_1331.py delete mode 100644 osf/migrations/0074_parse_citation_styles.py delete mode 100644 osf/migrations/0075_merge_20171207_1511.py delete mode 100644 osf/migrations/0076_action_rename.py delete mode 100644 osf/migrations/0077_add_maintenance_permissions.py delete mode 100644 osf/migrations/0077_add_noderequest_model.py delete mode 100644 osf/migrations/0077_bannerimage_scheduledbanner.py delete mode 100644 osf/migrations/0077_ensure_schemas.py delete mode 100644 osf/migrations/0077_preprintprovider_facebook_app_id.py delete mode 100644 osf/migrations/0078_add_banner_permissions.py delete mode 100644 osf/migrations/0078_ensure_schemas.py delete mode 100644 osf/migrations/0078_merge_20180206_1148.py delete mode 100644 osf/migrations/0079_merge_20180202_1206.py delete mode 100644 osf/migrations/0079_merge_20180207_1545.py delete mode 100644 osf/migrations/0080_add_abstractprovider.py delete mode 100644 osf/migrations/0080_ensure_schemas.py delete mode 100644 osf/migrations/0081_alter_abstractprovider_permissions.py delete mode 100644 osf/migrations/0081_merge_20180212_0949.py delete mode 100644 osf/migrations/0082_add_preprint_word_choice.py delete mode 100644 osf/migrations/0082_merge_20180213_1502.py delete mode 100644 osf/migrations/0083_add_ember_waffle_flags.py delete mode 100644 osf/migrations/0083_add_file_fields_for_target.py delete mode 100644 osf/migrations/0083_merge_20180228_1619.py delete mode 100644 osf/migrations/0084_merge_20180308_1821.py delete mode 100644 osf/migrations/0084_migrate_node_info_for_target.py delete mode 100644 osf/migrations/0085_finalize_file_node_to_target.py delete mode 100644 osf/migrations/0085_merge_20180316_1625.py delete mode 100644 osf/migrations/0086_pre_migrate_collections.py delete mode 100644 osf/migrations/0087_migrate_collections_data.py delete mode 100644 osf/migrations/0088_post_migrate_collections.py delete mode 100644 osf/migrations/0089_auto_20180315_1114.py delete mode 100644 osf/migrations/0090_add_collection_groups_permissions.py delete mode 100644 osf/migrations/0091_notificationsubscription_provider.py delete mode 100644 osf/migrations/0092_populate_notification_subscriptions.py delete mode 100644 osf/migrations/0093_node_subjects.py delete mode 100644 osf/migrations/0094_update_preprintprovider_group_auth.py delete mode 100644 osf/migrations/0095_abstractprovider_allow_commenting.py delete mode 100644 osf/migrations/0095_add_url_to_licenses.py delete mode 100644 osf/migrations/0095_collectedguidmetadata_subjects.py delete mode 100644 osf/migrations/0095_ensure_licenses.py delete mode 100644 osf/migrations/0095_reset_osf_abstractprovider_licenses_acceptable_id_seq.py delete mode 100644 osf/migrations/0096_abstractprovider_primary_collection.py delete mode 100644 osf/migrations/0096_add_provider_doi_prefixes.py delete mode 100644 osf/migrations/0096_ensure_schemas.py delete mode 100644 osf/migrations/0096_merge_20180413_1110.py delete mode 100644 osf/migrations/0096_modify_noderequestaction_noderequest.py delete mode 100644 osf/migrations/0097_merge_20180416_1453.py delete mode 100644 osf/migrations/0097_merge_20180416_1533.py delete mode 100644 osf/migrations/0098_auto_20180418_1722.py delete mode 100644 osf/migrations/0098_merge_20180416_1807.py delete mode 100644 osf/migrations/0098_merge_20180424_1329.py delete mode 100644 osf/migrations/0099_add_default_storage_region.py delete mode 100644 osf/migrations/0099_file_version_user_metadata.py delete mode 100644 osf/migrations/0099_merge_20180426_0930.py delete mode 100644 osf/migrations/0099_merge_20180427_1109.py delete mode 100644 osf/migrations/0099_merge_20180505_1027.py delete mode 100644 osf/migrations/0099_migrate_comments_on_deleted_objects.py delete mode 100644 osf/migrations/0099_whitelistedsharepreprintprovider.py delete mode 100644 osf/migrations/0100_notificationdigest_provider.py delete mode 100644 osf/migrations/0100_set_access_request_enabled.py delete mode 100644 osf/migrations/0101_merge_20180508_1011.py delete mode 100644 osf/migrations/0101_merge_20180514_1932.py delete mode 100644 osf/migrations/0101_osfuser_accepted_terms_of_service.py delete mode 100644 osf/migrations/0102_merge_20180509_0846.py delete mode 100644 osf/migrations/0103_set_osf_storage_node_settings_region.py delete mode 100644 osf/migrations/0104_merge_20180518_1337.py delete mode 100644 osf/migrations/0104_merge_20180523_1240.py delete mode 100644 osf/migrations/0104_merge_20180524_1257.py delete mode 100644 osf/migrations/0104_merge_20180524_1621.py delete mode 100644 osf/migrations/0105_add_identifier_deleted_field.py delete mode 100644 osf/migrations/0105_merge_20180525_1529.py delete mode 100644 osf/migrations/0106_auto_20180601_1341.py delete mode 100644 osf/migrations/0106_citationstyle_parent_style.py delete mode 100644 osf/migrations/0106_merge_20180531_0919.py delete mode 100644 osf/migrations/0106_set_preprint_identifier_category.py delete mode 100644 osf/migrations/0107_add_dependent_styles.py delete mode 100644 osf/migrations/0107_merge_20180604_1232.py delete mode 100644 osf/migrations/0108_auto_20180530_1310.py delete mode 100644 osf/migrations/0109_merge_20180611_1410.py delete mode 100644 osf/migrations/0110_set_ever_public.py delete mode 100644 osf/migrations/0111_auto_20180605_1240.py delete mode 100644 osf/migrations/0112_alter_collectionprovider_permissions.py delete mode 100644 osf/migrations/0112_ensure_schemas.py delete mode 100644 osf/migrations/0112_merge_20180614_1454.py delete mode 100644 osf/migrations/0113_add_view_collectionprovider_to_admin_perm.py delete mode 100644 osf/migrations/0113_auto_20180615_1308.py delete mode 100644 osf/migrations/0114_merge_20180621_1322.py delete mode 100644 osf/migrations/0114_merge_20180628_1234.py delete mode 100644 osf/migrations/0115_auto_20180621_1324.py delete mode 100644 osf/migrations/0115_auto_20180628_1253.py delete mode 100644 osf/migrations/0116_merge_20180703_2258.py delete mode 100644 osf/migrations/0116_merge_20180706_0901.py delete mode 100644 osf/migrations/0116_osfuser_deleted.py delete mode 100644 osf/migrations/0117_auto_20180625_0810.py delete mode 100644 osf/migrations/0117_merge_20180712_1241.py delete mode 100644 osf/migrations/0117_set_is_root.py delete mode 100644 osf/migrations/0118_auto_20180706_1127.py delete mode 100644 osf/migrations/0118_auto_20180716_1216.py delete mode 100644 osf/migrations/0119_add_asset_perms.py delete mode 100644 osf/migrations/0119_add_registrationprovider_perms_to_admin.py delete mode 100644 osf/migrations/0120_merge_20180716_1457.py delete mode 100644 osf/migrations/0121_add_preprintrequest_perms_to_admin.py delete mode 100644 osf/migrations/0121_generalize_schema_models.py delete mode 100644 osf/migrations/0121_merge_20180801_1458.py delete mode 100644 osf/migrations/0121_remove_support_page_waffle_flag.py delete mode 100644 osf/migrations/0121_remove_waffle_flags.py delete mode 100644 osf/migrations/0121_remove_wiki_fields_from_node.py delete mode 100644 osf/migrations/0122_auto_20180801_2105.py delete mode 100644 osf/migrations/0122_unique_provider__id_by_type.py delete mode 100644 osf/migrations/0123_auto_20180726_1546.py delete mode 100644 osf/migrations/0123_merge_20180802_2004.py delete mode 100644 osf/migrations/0123_merge_20180803_1346.py delete mode 100644 osf/migrations/0124_merge_20180803_1425.py delete mode 100644 osf/migrations/0124_merge_20180808_1451.py delete mode 100644 osf/migrations/0124_merge_20180815_1924.py delete mode 100644 osf/migrations/0124_merge_20180816_1229.py delete mode 100644 osf/migrations/0125_auto_20180808_1942.py delete mode 100644 osf/migrations/0125_merge_20180822_1508.py delete mode 100644 osf/migrations/0125_merge_20180824_1856.py delete mode 100644 osf/migrations/0126_update_review_group_names.py delete mode 100644 osf/migrations/0126_update_social_data_format.py delete mode 100644 osf/migrations/0127_add_regions_to_all_versions.py delete mode 100644 osf/migrations/0127_merge_20180822_1927.py delete mode 100644 osf/migrations/0128_merge_20180827_1907.py delete mode 100644 osf/migrations/0128_merge_20180829_0012.py delete mode 100644 osf/migrations/0128_rename_collectionsubmission.py delete mode 100644 osf/migrations/0129_merge_20180831_1412.py delete mode 100644 osf/migrations/0129_merge_20180904_2028.py delete mode 100644 osf/migrations/0129_merge_20180910_1926.py delete mode 100644 osf/migrations/0129_remove_osfuser_is_claimed.py delete mode 100644 osf/migrations/0130_auto_20180912_2039.py delete mode 100644 osf/migrations/0130_fileversion_region.py delete mode 100644 osf/migrations/0130_merge_20180914_1414.py delete mode 100644 osf/migrations/0131_merge_20180914_1937.py delete mode 100644 osf/migrations/0132_merge_20180914_2001.py delete mode 100644 osf/migrations/0133_merge_20180920_1604.py delete mode 100644 osf/migrations/0133_merge_20180921_0025.py delete mode 100644 osf/migrations/0134_abstractnode_custom_citation.py delete mode 100644 osf/migrations/0134_add_provider_reg_fks.py delete mode 100644 osf/migrations/0135_add_file_metadata_models.py delete mode 100644 osf/migrations/0135_migrate_registrations_to_osf_registries_provider.py delete mode 100644 osf/migrations/0135_update_preprint_model_for_divorce.py delete mode 100644 osf/migrations/0135_user_settings_waffles.py delete mode 100644 osf/migrations/0136_add_datacite_file_metadata_schema.py delete mode 100644 osf/migrations/0136_add_ember_auth_register_waffle_flag.py delete mode 100644 osf/migrations/0136_merge_20181010_2242.py delete mode 100644 osf/migrations/0136_preprint_node_divorce.py delete mode 100644 osf/migrations/0137_add_fm_record_to_osfstorage_files.py delete mode 100644 osf/migrations/0137_auto_20181012_1756.py delete mode 100644 osf/migrations/0137_merge_20181011_1525.py delete mode 100644 osf/migrations/0137_transfer_preprint_service_permissions.py delete mode 100644 osf/migrations/0138_ensure_subjects_and_providers.py delete mode 100644 osf/migrations/0138_merge_20181012_1944.py delete mode 100644 osf/migrations/0138_remove_node_preprint_fields.py delete mode 100644 osf/migrations/0139_merge_20181003_1759.py delete mode 100644 osf/migrations/0139_merge_20181019_0412.py delete mode 100644 osf/migrations/0139_rename_aspredicted_schema.py delete mode 100644 osf/migrations/0140_merge_20181011_0021.py delete mode 100644 osf/migrations/0140_merge_20181022_1446.py delete mode 100644 osf/migrations/0141_merge_20181011_2016.py delete mode 100644 osf/migrations/0141_merge_20181023_1526.py delete mode 100644 osf/migrations/0142_change_registration_schemas.py delete mode 100644 osf/migrations/0142_merge_20181015_1554.py delete mode 100644 osf/migrations/0142_remove_forks_flag.py delete mode 100644 osf/migrations/0142_remove_waffle_analytics_flags.py delete mode 100644 osf/migrations/0143_merge_20181023_1807.py delete mode 100644 osf/migrations/0143_merge_20181115_1458.py delete mode 100644 osf/migrations/0144_add_prereg_winddown_switches.py delete mode 100644 osf/migrations/0144_merge_20181113_1420.py delete mode 100644 osf/migrations/0145_add_preprint_contenttype_to_collections.py delete mode 100644 osf/migrations/0145_add_visible_to_registrationschema.py delete mode 100644 osf/migrations/0146_merge_20181119_2236.py delete mode 100644 osf/migrations/0146_update_registration_schemas.py delete mode 100644 osf/migrations/0147_blacklistedemaildomain.py delete mode 100644 osf/migrations/0147_repoint_preprint_pagecounters.py delete mode 100644 osf/migrations/0148_merge_20181213_2253.py delete mode 100644 osf/migrations/0149_add_datacite_doi_switch.py delete mode 100644 osf/migrations/0150_fix_deleted_preprints.py delete mode 100644 osf/migrations/0151_auto_20181215_1911.py delete mode 100644 osf/migrations/0152_ensure_schemas.py delete mode 100644 osf/migrations/0152_remove_doi_switches.py delete mode 100644 osf/migrations/0153_merge_20181221_1842.py delete mode 100644 osf/migrations/0154_remove_ember_project_registrations_flag.py delete mode 100644 osf/migrations/0155_merge_20190115_1437.py delete mode 100644 osf/migrations/0156_abstractnode_article_doi.py delete mode 100644 osf/migrations/0156_auto_20190306_1648.py delete mode 100644 osf/migrations/0156_create_cache_table.py delete mode 100644 osf/migrations/0157_add_storage_usage_flag.py delete mode 100644 osf/migrations/0158_fix_fork_last_logged.py delete mode 100644 osf/migrations/0159_merge_20190331_2301.py delete mode 100644 osf/migrations/0160_add_permissions_to_node.py delete mode 100644 osf/migrations/0160_merge_20190408_1618.py delete mode 100644 osf/migrations/0161_add_spam_fields_to_user.py delete mode 100644 osf/migrations/0161_guardian_direct_fks.py delete mode 100644 osf/migrations/0162_conference_submissions.py delete mode 100644 osf/migrations/0162_post_migrate.py delete mode 100644 osf/migrations/0163_migrate_preprints_to_direct_fks.py delete mode 100644 osf/migrations/0163_populate_conference_submissions.py delete mode 100644 osf/migrations/0164_add_guardian_to_nodes.py delete mode 100644 osf/migrations/0165_osfgroup.py delete mode 100644 osf/migrations/0166_merge_20190429_1632.py delete mode 100644 osf/migrations/0167_auto_20190506_1556.py delete mode 100644 osf/migrations/0168_merge_20190610_2308.py delete mode 100644 osf/migrations/0169_merge_20190618_1429.py delete mode 100644 osf/migrations/0170_ensure_schemas.py delete mode 100644 osf/migrations/0171_add_registration_files_count.py delete mode 100644 osf/migrations/0172_ensure_schemas.py delete mode 100644 osf/migrations/0173_ensure_schemas.py delete mode 100644 osf/migrations/0174_add_ab_testing_home_page_version_b_flag.py delete mode 100644 osf/migrations/0175_pagecounter_schema.py delete mode 100644 osf/migrations/0176_pagecounter_data.py delete mode 100644 osf/migrations/0177_pagecounter_index.py delete mode 100644 osf/migrations/0178_apioauth2scope_is_public.py delete mode 100644 osf/migrations/0179_apioauth2personaltoken_scopes_temp.py delete mode 100644 osf/migrations/0180_finalize_token_scopes_mig.py delete mode 100644 osf/migrations/0181_osfuser_contacted_deactivation.py delete mode 100644 osf/migrations/0182_add_custom_file_versions_through.py delete mode 100644 osf/migrations/0183_populate_file_versions_through.py delete mode 100644 osf/migrations/0184_remove_basefilenode_versions.py delete mode 100644 osf/migrations/0185_basefilenode_versions.py delete mode 100644 osf/migrations/0186_make_pagecounter_fields_nonnull.py delete mode 100644 osf/migrations/0187_remove_outdated_contributor_permissions.py delete mode 100644 osf/migrations/0188_deleted_field_mig.py delete mode 100644 osf/migrations/0189_deleted_field_data.py delete mode 100644 osf/migrations/0190_add_schema_block_models.py delete mode 100644 osf/migrations/0191_abstractnode_external_registered_date.py delete mode 100644 osf/migrations/0191_migrate_schemas_to_schemablocks.py delete mode 100644 osf/migrations/0192_abstractnode_external_registration_boolean.py delete mode 100644 osf/migrations/0192_add_registation_responses_fields.py delete mode 100644 osf/migrations/0193_migrate_registered_meta.py delete mode 100644 osf/migrations/0194_merge_20191113_1611.py delete mode 100644 osf/migrations/0195_add_enable_chronos_waffle_flag.py delete mode 100644 osf/migrations/0196_update_schemas.py delete mode 100644 osf/migrations/0197_add_ab_testing_home_page_hero_text_version_b_flag.py delete mode 100644 osf/migrations/0198_draft_node_models.py delete mode 100644 osf/migrations/0199_draft_node_permissions.py delete mode 100644 osf/migrations/0200_auto_20200214_1518.py delete mode 100644 osf/migrations/0201_add_egap_flag.py delete mode 100644 osf/migrations/0202_add_sloan.py delete mode 100644 osf/migrations/0203_auto_20200312_1435.py delete mode 100644 osf/migrations/0204_ensure_schemas.py delete mode 100644 osf/migrations/0205_auto_20200323_1850.py delete mode 100644 osf/migrations/0206_auto_20200528_1319.py delete mode 100644 osf/migrations/0207_ensure_schemas.py delete mode 100644 osf/migrations/0207_update_schemas2.py delete mode 100644 osf/migrations/0208_update_EGAP_schema.py delete mode 100644 osf/migrations/0209_conference_auto_check_spam.py delete mode 100644 osf/migrations/0210_branded_registries.py delete mode 100644 osf/migrations/0211_auto_20200709_1320.py delete mode 100644 osf/migrations/0212_registrationschema_providers.py delete mode 100644 osf/migrations/0213_auto_20200728_1609.py delete mode 100644 osf/migrations/0214_auto_20200701_1658.py delete mode 100644 osf/migrations/0215_auto_20200819_1942.py delete mode 100644 osf/migrations/0216_auto_20200910_1259.py delete mode 100644 osf/migrations/0217_auto_20200901_1344.py delete mode 100644 osf/migrations/0218_auto_20200929_1850.py delete mode 100644 osf/migrations/0219_auto_20201020_1836.py delete mode 100644 osf/migrations/0221_add_schemas.py delete mode 100644 osf/migrations/0222_auto_20201023_2033.py delete mode 100644 osf/migrations/0223_auto_20201026_1843.py delete mode 100644 osf/migrations/0224_population_registration_subscription_notifications.py delete mode 100644 osf/migrations/0225_auto_20201119_2027.py delete mode 100644 osf/migrations/0226_auto_20210224_1610.py delete mode 100644 osf/migrations/0227_add_secondary_data.py delete mode 100644 osf/migrations/0228_abstractnode_branched_from_node.py delete mode 100644 osf/migrations/0229_auto_20210317_2013.py delete mode 100644 osf/migrations/0230_make_run_management_perm.py delete mode 100644 osf/migrations/0231_abstractprovider_default_schema.py delete mode 100644 osf/migrations/0232_abstractnode_ia_url.py delete mode 100644 osf/migrations/0233_auto_20210608_1816.py delete mode 100644 osf/migrations/0234_auto_20210610_1812.py delete mode 100644 osf/migrations/0235_auto_20210823_1310.py delete mode 100644 osf/migrations/0236_auto_20210913_2008.py delete mode 100644 osf/migrations/0237_auto_20210929_1529.py delete mode 100644 osf/migrations/0238_abstractprovider_allow_updates.py delete mode 100644 osf/migrations/0239_auto_20211110_1921.py delete mode 100644 osf/migrations/0239_notable_email_domains.py delete mode 100644 osf/migrations/0240_merge_20211110_2051.py delete mode 100644 osf/migrations/0241_abstractprovider_allow_bulk_uploads.py delete mode 100644 osf/migrations/0242_auto_20220125_1604.py delete mode 100644 osf/migrations/0243_auto_20211025_1353.py delete mode 100644 osf/migrations/0244_auto_20220517_1718.py delete mode 100644 osf/migrations/0245_auto_20220621_1950.py delete mode 100644 osf/migrations/0246_add_outcomes_and_artifacts.py delete mode 100644 osf/migrations/0247_artifact_finalized_and_deleted.py delete mode 100644 osf/migrations/0248_artifact_tweaks.py delete mode 100644 osf/migrations/0249_schema_response_justification_to_text_field.py diff --git a/osf/migrations/0001_initial.py b/osf/migrations/0001_initial.py deleted file mode 100644 index 56bfce6f69d..00000000000 --- a/osf/migrations/0001_initial.py +++ /dev/null @@ -1,1428 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9 on 2017-03-23 20:34 -from __future__ import unicode_literals - -import dirtyfields.dirtyfields -from django.conf import settings -from django.contrib.admin.models import LogEntry -import django.contrib.postgres.fields -from django.db import migrations, models -import django.db.models.deletion -import django.utils.timezone -import osf.models.admin_log_entry -import osf.models.base -import osf.models.conference -import osf.models.mixins -import osf.models.oauth -import osf.models.sanctions -import osf.models.spam -import osf.models.user -import osf.models.validators -import osf.utils.datetime_aware_jsonfield -import osf.utils.fields - - -class Migration(migrations.Migration): - - initial = True - - dependencies = [ - ('contenttypes', '0002_remove_content_type_name'), - ('auth', '0007_alter_validators_add_error_messages'), - ] - - operations = [ - migrations.CreateModel( - name='OSFUser', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('password', models.CharField(max_length=128, verbose_name='password')), - ('last_login', models.DateTimeField(blank=True, null=True, verbose_name='last login')), - ('is_superuser', models.BooleanField(default=False, help_text='Designates that this user has all permissions without explicitly assigning them.', verbose_name='superuser status')), - ('guid_string', django.contrib.postgres.fields.ArrayField(base_field=models.CharField(blank=True, max_length=255, null=True), blank=True, null=True, size=None)), - ('content_type_pk', models.PositiveIntegerField(blank=True, null=True)), - ('username', models.CharField(db_index=True, max_length=255, unique=True)), - ('fullname', models.CharField(max_length=255)), - ('is_registered', models.BooleanField(db_index=True, default=False)), - ('is_claimed', models.BooleanField(db_index=True, default=False)), - ('security_messages', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=dict)), - ('is_invited', models.BooleanField(db_index=True, default=False)), - ('unclaimed_records', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=dict)), - ('contributor_added_email_records', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=dict)), - ('verification_key', models.CharField(blank=True, max_length=255, null=True)), - ('verification_key_v2', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=dict, null=True)), - ('email_last_sent', osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True)), - ('emails', django.contrib.postgres.fields.ArrayField(base_field=models.CharField(max_length=255), blank=True, default=list, size=None)), - ('email_verifications', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=dict)), - ('mailing_lists', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=dict)), - ('mailchimp_mailing_lists', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=dict)), - ('osf_mailing_lists', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=osf.models.user.get_default_mailing_lists)), - ('date_registered', osf.utils.fields.NonNaiveDateTimeField(db_index=True, default=django.utils.timezone.now)), - ('given_name', models.CharField(blank=True, max_length=255)), - ('middle_names', models.CharField(blank=True, max_length=255)), - ('family_name', models.CharField(blank=True, max_length=255)), - ('suffix', models.CharField(blank=True, max_length=255)), - ('external_identity', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=dict)), - ('jobs', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=list, validators=[osf.models.validators.validate_history_item])), - ('schools', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=list, validators=[osf.models.validators.validate_history_item])), - ('social', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=dict, validators=[osf.models.validators.validate_social])), - ('piwik_token', models.CharField(blank=True, max_length=255)), - ('date_last_login', osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True)), - ('date_confirmed', osf.utils.fields.NonNaiveDateTimeField(blank=True, db_index=True, null=True)), - ('date_disabled', osf.utils.fields.NonNaiveDateTimeField(blank=True, db_index=True, null=True)), - ('comments_viewed_timestamp', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=dict)), - ('timezone', models.CharField(blank=True, default='Etc/UTC', max_length=255)), - ('locale', models.CharField(blank=True, default='en_US', max_length=255)), - ('requested_deactivation', models.BooleanField(default=False)), - ('notifications_configured', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=dict)), - ('is_active', models.BooleanField(default=False)), - ('is_staff', models.BooleanField(default=False)), - ], - options={ - 'permissions': (('view_user', 'Can view user details'),), - }, - bases=(dirtyfields.dirtyfields.DirtyFieldsMixin, models.Model), - ), - migrations.CreateModel( - name='AbstractNode', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('guid_string', django.contrib.postgres.fields.ArrayField(base_field=models.CharField(blank=True, max_length=255, null=True), blank=True, null=True, size=None)), - ('content_type_pk', models.PositiveIntegerField(blank=True, null=True)), - ('type', models.CharField(choices=[('osf.node', 'node'), ('osf.collection', 'collection'), ('osf.registration', 'registration')], db_index=True, max_length=255)), - ('spam_status', models.IntegerField(blank=True, db_index=True, default=None, null=True)), - ('spam_pro_tip', models.CharField(blank=True, default=None, max_length=200, null=True)), - ('spam_data', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=dict)), - ('date_last_reported', osf.utils.fields.NonNaiveDateTimeField(blank=True, db_index=True, default=None, null=True)), - ('reports', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=dict, validators=[osf.models.spam._validate_reports])), - ('category', models.CharField(blank=True, choices=[('analysis', 'Analysis'), ('communication', 'Communication'), ('data', 'Data'), ('hypothesis', 'Hypothesis'), ('instrumentation', 'Instrumentation'), ('methods and measures', 'Methods and Measures'), ('procedure', 'Procedure'), ('project', 'Project'), ('software', 'Software'), ('other', 'Other'), ('', 'Uncategorized')], default='', max_length=255)), - ('child_node_subscriptions', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=dict)), - ('date_created', osf.utils.fields.NonNaiveDateTimeField(default=django.utils.timezone.now)), - ('date_modified', osf.utils.fields.NonNaiveDateTimeField(blank=True, db_index=True, null=True)), - ('deleted_date', osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True)), - ('description', models.TextField(blank=True, default='')), - ('file_guid_to_share_uuids', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=dict)), - ('forked_date', osf.utils.fields.NonNaiveDateTimeField(blank=True, db_index=True, null=True)), - ('is_fork', models.BooleanField(db_index=True, default=False)), - ('is_public', models.BooleanField(db_index=True, default=False)), - ('is_deleted', models.BooleanField(db_index=True, default=False)), - ('piwik_site_id', models.IntegerField(blank=True, null=True)), - ('public_comments', models.BooleanField(default=True)), - ('suspended', models.BooleanField(db_index=True, default=False)), - ('title', models.TextField(validators=[osf.models.validators.validate_title])), - ('wiki_pages_current', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=dict)), - ('wiki_pages_versions', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=dict)), - ('wiki_private_uuids', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=dict)), - ('preprint_article_doi', models.CharField(blank=True, max_length=128, null=True, validators=[osf.models.validators.validate_doi])), - ('_is_preprint_orphan', models.NullBooleanField(default=False)), - ('_has_abandoned_preprint', models.BooleanField(default=False)), - ('keenio_read_key', models.CharField(blank=True, max_length=1000, null=True)), - ('is_bookmark_collection', models.NullBooleanField(db_index=True, default=False)), - ('registered_date', osf.utils.fields.NonNaiveDateTimeField(blank=True, db_index=True, null=True)), - ('registered_meta', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=dict, null=True)), - ], - bases=(dirtyfields.dirtyfields.DirtyFieldsMixin, osf.models.mixins.CommentableMixin, models.Model), - ), - migrations.CreateModel( - name='AdminLogEntry', - fields=[ - ], - options={ - 'proxy': True, - }, - bases=(LogEntry,), - managers=[ - ('objects', osf.models.admin_log_entry.AdminLogEntryManager()), - ], - ), - migrations.CreateModel( - name='AdminProfile', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('desk_token', models.CharField(blank=True, max_length=45)), - ('desk_token_secret', models.CharField(blank=True, max_length=45)), - ('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='admin_profile', to=settings.AUTH_USER_MODEL)), - ], - options={ - 'permissions': (('mark_spam', 'Can mark comments, projects and registrations as spam'), ('view_spam', 'Can view nodes, comments, and projects marked as spam'), ('view_metrics', 'Can view metrics on the OSF Admin app'), ('view_desk', 'Can view details about Desk users')), - }, - ), - migrations.CreateModel( - name='AlternativeCitation', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), - ('name', models.CharField(max_length=256)), - ('text', models.CharField(max_length=2048)), - ], - options={ - 'abstract': False, - }, - ), - migrations.CreateModel( - name='ApiOAuth2Application', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), - ('client_id', models.CharField(db_index=True, default=osf.models.oauth.generate_client_id, max_length=50, unique=True)), - ('client_secret', models.CharField(default=osf.models.oauth.generate_client_secret, max_length=40)), - ('is_active', models.BooleanField(db_index=True, default=True)), - ('name', models.CharField(db_index=True, max_length=200)), - ('description', models.CharField(blank=True, max_length=1000, null=True)), - ('date_created', osf.utils.fields.NonNaiveDateTimeField(default=django.utils.timezone.now)), - ('home_url', models.URLField()), - ('callback_url', models.URLField()), - ('owner', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL)), - ], - options={ - 'abstract': False, - }, - ), - migrations.CreateModel( - name='ApiOAuth2PersonalToken', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), - ('token_id', models.CharField(default=osf.models.oauth.generate_token_id, max_length=70, unique=True)), - ('name', models.CharField(db_index=True, max_length=100)), - ('scopes', models.CharField(max_length=300)), - ('is_active', models.BooleanField(db_index=True, default=True)), - ('owner', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL)), - ], - options={ - 'abstract': False, - }, - ), - migrations.CreateModel( - name='ApiOAuth2Scope', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), - ('name', models.CharField(db_index=True, max_length=50, unique=True)), - ('description', models.CharField(max_length=255)), - ('is_active', models.BooleanField(db_index=True, default=True)), - ], - options={ - 'abstract': False, - }, - ), - migrations.CreateModel( - name='ArchiveJob', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), - ('done', models.BooleanField(default=False, verbose_name='completed')), - ('sent', models.BooleanField(default=False, verbose_name='emails sent')), - ('status', models.CharField(default='INITIATED', max_length=40)), - ('datetime_initiated', osf.utils.fields.NonNaiveDateTimeField(default=django.utils.timezone.now, verbose_name='initiated at')), - ('initiator', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), - ], - options={ - 'abstract': False, - }, - ), - migrations.CreateModel( - name='ArchiveTarget', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), - ('name', models.CharField(max_length=2048)), - ('status', models.CharField(default='INITIATED', max_length=40)), - ('stat_result', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=dict)), - ('errors', django.contrib.postgres.fields.ArrayField(base_field=models.TextField(), blank=True, default=list, size=None)), - ], - options={ - 'abstract': False, - }, - ), - migrations.CreateModel( - name='BaseFileNode', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), - ('guid_string', django.contrib.postgres.fields.ArrayField(base_field=models.CharField(blank=True, max_length=255, null=True), blank=True, null=True, size=None)), - ('content_type_pk', models.PositiveIntegerField(blank=True, null=True)), - ('type', models.CharField(choices=[('osf.trashedfilenode', 'trashed file node'), ('osf.trashedfile', 'trashed file'), ('osf.trashedfolder', 'trashed folder'), ('osf.osfstoragefilenode', 'osf storage file node'), ('osf.osfstoragefile', 'osf storage file'), ('osf.osfstoragefolder', 'osf storage folder'), ('osf.boxfilenode', 'box file node'), ('osf.boxfolder', 'box folder'), ('osf.boxfile', 'box file'), ('osf.dataversefilenode', 'dataverse file node'), ('osf.dataversefolder', 'dataverse folder'), ('osf.dataversefile', 'dataverse file'), ('osf.dropboxfilenode', 'dropbox file node'), ('osf.dropboxfolder', 'dropbox folder'), ('osf.dropboxfile', 'dropbox file'), ('osf.figsharefilenode', 'figshare file node'), ('osf.figsharefolder', 'figshare folder'), ('osf.figsharefile', 'figshare file'), ('osf.githubfilenode', 'github file node'), ('osf.githubfolder', 'github folder'), ('osf.githubfile', 'github file'), ('osf.googledrivefilenode', 'google drive file node'), ('osf.googledrivefolder', 'google drive folder'), ('osf.googledrivefile', 'google drive file'), ('osf.owncloudfilenode', 'owncloud file node'), ('osf.owncloudfolder', 'owncloud folder'), ('osf.owncloudfile', 'owncloud file'), ('osf.s3filenode', 's3 file node'), ('osf.s3folder', 's3 folder'), ('osf.s3file', 's3 file')], db_index=True, max_length=255)), - ('last_touched', osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True)), - ('_history', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=list)), - ('provider', models.CharField(db_index=True, max_length=25)), - ('name', models.TextField(blank=True, null=True)), - ('_path', models.TextField(blank=True, null=True)), - ('_materialized_path', models.TextField(blank=True, null=True)), - ('deleted_on', osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True)), - ('checkout', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), - ('copied_from', models.ForeignKey(blank=True, default=None, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='copy_of', to='osf.BaseFileNode')), - ('deleted_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='files_deleted_by', to=settings.AUTH_USER_MODEL)), - ('node', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='files', to='osf.AbstractNode')), - ('parent', models.ForeignKey(blank=True, default=None, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='_children', to='osf.BaseFileNode')), - ], - options={ - 'abstract': False, - }, - bases=(osf.models.mixins.CommentableMixin, models.Model), - ), - migrations.CreateModel( - name='BlackListGuid', - fields=[ - ('id', models.AutoField(primary_key=True, serialize=False)), - ('guid', osf.utils.fields.LowercaseCharField(db_index=True, max_length=255, unique=True)), - ], - options={ - 'abstract': False, - }, - ), - migrations.CreateModel( - name='CitationStyle', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('_id', models.CharField(db_index=True, max_length=255)), - ('title', models.CharField(max_length=255)), - ('date_parsed', osf.utils.fields.NonNaiveDateTimeField(default=django.utils.timezone.now)), - ('short_title', models.CharField(blank=True, max_length=2048, null=True)), - ('summary', models.CharField(blank=True, max_length=4200, null=True)), - ], - options={ - 'abstract': False, - 'ordering': ['_id'], - }, - ), - migrations.CreateModel( - name='Comment', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('guid_string', django.contrib.postgres.fields.ArrayField(base_field=models.CharField(blank=True, max_length=255, null=True), blank=True, null=True, size=None)), - ('content_type_pk', models.PositiveIntegerField(blank=True, null=True)), - ('spam_status', models.IntegerField(blank=True, db_index=True, default=None, null=True)), - ('spam_pro_tip', models.CharField(blank=True, default=None, max_length=200, null=True)), - ('spam_data', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=dict)), - ('date_last_reported', osf.utils.fields.NonNaiveDateTimeField(blank=True, db_index=True, default=None, null=True)), - ('reports', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=dict, validators=[osf.models.spam._validate_reports])), - ('date_created', osf.utils.fields.NonNaiveDateTimeField(default=django.utils.timezone.now)), - ('date_modified', osf.utils.fields.NonNaiveDateTimeField(default=django.utils.timezone.now)), - ('modified', models.BooleanField(default=False)), - ('is_deleted', models.BooleanField(default=False)), - ('page', models.CharField(blank=True, max_length=255)), - ('content', models.TextField(validators=[osf.models.validators.CommentMaxLength(500), osf.models.validators.string_required])), - ('ever_mentioned', django.contrib.postgres.fields.ArrayField(base_field=models.CharField(blank=True, max_length=10), blank=True, default=list, size=None)), - ('node', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='osf.AbstractNode')), - ], - options={ - 'abstract': False, - }, - bases=(osf.models.mixins.CommentableMixin, models.Model), - ), - migrations.CreateModel( - name='Conference', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), - ('endpoint', models.CharField(db_index=True, max_length=255, unique=True)), - ('name', models.CharField(max_length=255)), - ('info_url', models.URLField(blank=True)), - ('logo_url', models.URLField(blank=True)), - ('location', models.CharField(blank=True, max_length=2048, null=True)), - ('start_date', osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True)), - ('end_date', osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True)), - ('is_meeting', models.BooleanField(default=True)), - ('active', models.BooleanField()), - ('public_projects', models.BooleanField(default=True)), - ('poster', models.BooleanField(default=True)), - ('talk', models.BooleanField(default=True)), - ('field_names', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(default=osf.models.conference.get_default_field_names)), - ('num_submissions', models.IntegerField(default=0)), - ('admins', models.ManyToManyField(to=settings.AUTH_USER_MODEL)), - ], - options={ - 'permissions': (('view_conference', 'Can view conference details in the admin app.'),), - }, - ), - migrations.CreateModel( - name='Contributor', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('read', models.BooleanField(default=False)), - ('write', models.BooleanField(default=False)), - ('admin', models.BooleanField(default=False)), - ('visible', models.BooleanField(default=False)), - ('node', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='osf.AbstractNode')), - ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), - ], - ), - migrations.CreateModel( - name='DraftRegistration', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), - ('datetime_initiated', osf.utils.fields.NonNaiveDateTimeField(default=django.utils.timezone.now)), - ('datetime_updated', osf.utils.fields.NonNaiveDateTimeField(default=django.utils.timezone.now)), - ('registration_metadata', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=dict)), - ('_metaschema_flags', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=dict)), - ('notes', models.TextField(blank=True)), - ], - options={ - 'abstract': False, - }, - ), - migrations.CreateModel( - name='DraftRegistrationApproval', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), - ('approval_state', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=dict)), - ('end_date', osf.utils.fields.NonNaiveDateTimeField(blank=True, default=None, null=True)), - ('initiation_date', osf.utils.fields.NonNaiveDateTimeField(blank=True, default=django.utils.timezone.now, null=True)), - ('state', models.CharField(choices=[('unapproved', 'Unapproved'), ('approved', 'Approved'), ('rejected', 'Rejected'), ('completed', 'Completed')], default='unapproved', max_length=255)), - ('meta', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=dict)), - ], - options={ - 'abstract': False, - }, - ), - migrations.CreateModel( - name='DraftRegistrationLog', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), - ('date', osf.utils.fields.NonNaiveDateTimeField(default=django.utils.timezone.now)), - ('action', models.CharField(max_length=255)), - ('draft', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='logs', to='osf.DraftRegistration')), - ('user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), - ], - options={ - 'abstract': False, - }, - ), - migrations.CreateModel( - name='Embargo', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), - ('approval_state', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=dict)), - ('end_date', osf.utils.fields.NonNaiveDateTimeField(blank=True, default=None, null=True)), - ('initiation_date', osf.utils.fields.NonNaiveDateTimeField(blank=True, default=django.utils.timezone.now, null=True)), - ('state', models.CharField(choices=[('unapproved', 'Unapproved'), ('approved', 'Approved'), ('rejected', 'Rejected'), ('completed', 'Completed')], default='unapproved', max_length=255)), - ('notify_initiator_on_complete', models.BooleanField(default=False)), - ('stashed_urls', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=dict)), - ('for_existing_registration', models.BooleanField(default=False)), - ('initiated_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), - ], - options={ - 'abstract': False, - }, - bases=(osf.models.sanctions.SanctionCallbackMixin, models.Model), - ), - migrations.CreateModel( - name='EmbargoTerminationApproval', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), - ('approval_state', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=dict)), - ('end_date', osf.utils.fields.NonNaiveDateTimeField(blank=True, default=None, null=True)), - ('initiation_date', osf.utils.fields.NonNaiveDateTimeField(blank=True, default=django.utils.timezone.now, null=True)), - ('state', models.CharField(choices=[('unapproved', 'Unapproved'), ('approved', 'Approved'), ('rejected', 'Rejected'), ('completed', 'Completed')], default='unapproved', max_length=255)), - ('notify_initiator_on_complete', models.BooleanField(default=False)), - ('stashed_urls', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=dict)), - ('initiated_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), - ], - options={ - 'abstract': False, - }, - ), - migrations.CreateModel( - name='ExternalAccount', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), - ('oauth_key', osf.utils.fields.EncryptedTextField(blank=True, null=True)), - ('oauth_secret', osf.utils.fields.EncryptedTextField(blank=True, null=True)), - ('refresh_token', osf.utils.fields.EncryptedTextField(blank=True, null=True)), - ('date_last_refreshed', osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True)), - ('expires_at', osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True)), - ('scopes', django.contrib.postgres.fields.ArrayField(base_field=models.CharField(max_length=128), blank=True, default=list, size=None)), - ('provider', models.CharField(max_length=50)), - ('provider_name', models.CharField(max_length=255)), - ('provider_id', models.CharField(max_length=255)), - ('display_name', osf.utils.fields.EncryptedTextField(blank=True, null=True)), - ('profile_url', osf.utils.fields.EncryptedTextField(blank=True, null=True)), - ], - ), - migrations.CreateModel( - name='FileVersion', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), - ('identifier', models.CharField(max_length=100)), - ('date_created', osf.utils.fields.NonNaiveDateTimeField(default=django.utils.timezone.now)), - ('size', models.BigIntegerField(blank=True, default=-1)), - ('content_type', models.CharField(blank=True, max_length=100, null=True)), - ('date_modified', osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True)), - ('metadata', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=dict)), - ('location', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=None, null=True, validators=[osf.models.validators.validate_location])), - ('creator', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), - ], - options={ - 'ordering': ('date_created',), - }, - ), - migrations.CreateModel( - name='Guid', - fields=[ - ('id', models.AutoField(primary_key=True, serialize=False)), - ('_id', osf.utils.fields.LowercaseCharField(db_index=True, default=osf.models.base.generate_guid, max_length=255, unique=True)), - ('object_id', models.PositiveIntegerField(blank=True, null=True)), - ('created', osf.utils.fields.NonNaiveDateTimeField(db_index=True, default=django.utils.timezone.now)), - ('content_type', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='contenttypes.ContentType')), - ], - options={ - 'ordering': ['-created'], - 'get_latest_by': 'created', - }, - ), - migrations.CreateModel( - name='Identifier', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), - ('object_id', models.PositiveIntegerField(blank=True, null=True)), - ('category', models.CharField(max_length=10)), - ('value', models.CharField(max_length=50)), - ('content_type', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='contenttypes.ContentType')), - ], - ), - migrations.CreateModel( - name='Institution', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), - ('banner_name', models.CharField(blank=True, max_length=255, null=True)), - ('login_url', models.URLField(blank=True, null=True)), - ('domains', django.contrib.postgres.fields.ArrayField(base_field=models.CharField(max_length=255), blank=True, db_index=True, null=True, size=None)), - ('email_domains', django.contrib.postgres.fields.ArrayField(base_field=models.CharField(max_length=255), blank=True, db_index=True, null=True, size=None)), - ('logo_name', models.CharField(max_length=255, null=True)), - ('logout_url', models.URLField(blank=True, null=True)), - ('name', models.CharField(max_length=255)), - ('description', models.TextField(blank=True, default='', null=True)), - ('is_deleted', models.BooleanField(db_index=True, default=False)), - ], - options={ - 'abstract': False, - }, - ), - migrations.CreateModel( - name='InstitutionalContributor', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('read', models.BooleanField(default=False)), - ('write', models.BooleanField(default=False)), - ('admin', models.BooleanField(default=False)), - ('visible', models.BooleanField(default=False)), - ('institution', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='osf.Institution')), - ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), - ], - ), - migrations.CreateModel( - name='MailRecord', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), - ('data', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField()), - ('users_created', models.ManyToManyField(to=settings.AUTH_USER_MODEL)), - ], - options={ - 'abstract': False, - }, - ), - migrations.CreateModel( - name='MetaSchema', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), - ('name', models.CharField(max_length=255)), - ('schema', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(default=dict)), - ('category', models.CharField(blank=True, max_length=255, null=True)), - ('schema_version', models.IntegerField()), - ], - ), - migrations.CreateModel( - name='NodeLicense', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), - ('license_id', models.CharField(max_length=128, unique=True)), - ('name', models.CharField(max_length=256, unique=True)), - ('text', models.TextField()), - ('properties', django.contrib.postgres.fields.ArrayField(base_field=models.CharField(max_length=128), blank=True, default=list, size=None)), - ], - ), - migrations.CreateModel( - name='NodeLicenseRecord', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), - ('year', models.CharField(blank=True, max_length=128, null=True)), - ('copyright_holders', django.contrib.postgres.fields.ArrayField(base_field=models.CharField(blank=True, max_length=256, null=True), blank=True, default=list, size=None)), - ('node_license', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='osf.NodeLicense')), - ], - options={ - 'abstract': False, - }, - ), - migrations.CreateModel( - name='NodeLog', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), - ('date', osf.utils.fields.NonNaiveDateTimeField(blank=True, db_index=True, default=django.utils.timezone.now, null=True)), - ('action', models.CharField(db_index=True, max_length=255)), - ('params', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(default=dict)), - ('should_hide', models.BooleanField(default=False)), - ('foreign_user', models.CharField(blank=True, max_length=255, null=True)), - ('node', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='logs', to='osf.AbstractNode')), - ('original_node', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='osf.AbstractNode')), - ('user', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='logs', to=settings.AUTH_USER_MODEL)), - ], - options={ - 'ordering': ['-date'], - 'get_latest_by': 'date', - }, - ), - migrations.CreateModel( - name='NodeRelation', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), - ('is_node_link', models.BooleanField(db_index=True, default=False)), - ('child', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='osf.AbstractNode')), - ('parent', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='node_relations', to='osf.AbstractNode')), - ], - ), - migrations.CreateModel( - name='NotificationDigest', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), - ('timestamp', osf.utils.fields.NonNaiveDateTimeField()), - ('send_type', models.CharField(db_index=True, max_length=50, validators=[osf.models.validators.validate_subscription_type])), - ('event', models.CharField(max_length=50)), - ('message', models.CharField(max_length=2048)), - ('node_lineage', django.contrib.postgres.fields.ArrayField(base_field=models.CharField(max_length=5), size=None)), - ('user', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), - ], - options={ - 'abstract': False, - }, - ), - migrations.CreateModel( - name='NotificationSubscription', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('_id', models.CharField(db_index=True, max_length=50)), - ('event_name', models.CharField(max_length=50)), - ('email_digest', models.ManyToManyField(related_name='_notificationsubscription_email_digest_+', to=settings.AUTH_USER_MODEL)), - ('email_transactional', models.ManyToManyField(related_name='_notificationsubscription_email_transactional_+', to=settings.AUTH_USER_MODEL)), - ('none', models.ManyToManyField(related_name='_notificationsubscription_none_+', to=settings.AUTH_USER_MODEL)), - ('user', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='notification_subscriptions', to=settings.AUTH_USER_MODEL)), - ], - options={ - 'abstract': False, - }, - ), - migrations.CreateModel( - name='PageCounter', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('_id', models.CharField(db_index=True, max_length=300, unique=True)), - ('date', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(default=dict)), - ('total', models.PositiveIntegerField(default=0)), - ('unique', models.PositiveIntegerField(default=0)), - ], - options={ - 'abstract': False, - }, - ), - migrations.CreateModel( - name='PreprintProvider', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), - ('name', models.CharField(max_length=128)), - ('logo_name', models.CharField(blank=True, max_length=128, null=True)), - ('header_text', models.TextField(blank=True, default='')), - ('description', models.CharField(blank=True, max_length=256, null=True)), - ('banner_name', models.CharField(blank=True, max_length=128, null=True)), - ('external_url', models.URLField(blank=True, null=True)), - ('email_contact', models.CharField(blank=True, max_length=200, null=True)), - ('email_support', models.CharField(blank=True, max_length=200, null=True)), - ('example', models.CharField(blank=True, max_length=20, null=True)), - ('access_token', osf.utils.fields.EncryptedTextField(blank=True, null=True)), - ('advisory_board', models.TextField(blank=True, null=True)), - ('social_twitter', models.CharField(blank=True, max_length=200, null=True)), - ('social_facebook', models.CharField(blank=True, max_length=200, null=True)), - ('social_instagram', models.CharField(blank=True, max_length=200, null=True)), - ('subjects_acceptable', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=list)), - ('licenses_acceptable', models.ManyToManyField(blank=True, to='osf.NodeLicense')), - ], - options={ - 'abstract': False, - }, - ), - migrations.CreateModel( - name='PreprintService', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('guid_string', django.contrib.postgres.fields.ArrayField(base_field=models.CharField(blank=True, max_length=255, null=True), blank=True, null=True, size=None)), - ('content_type_pk', models.PositiveIntegerField(blank=True, null=True)), - ('date_created', osf.utils.fields.NonNaiveDateTimeField(default=django.utils.timezone.now)), - ('date_modified', osf.utils.fields.NonNaiveDateTimeField(auto_now=True)), - ('is_published', models.BooleanField(db_index=True, default=False)), - ('date_published', osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True)), - ('subjects', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=list, null=True)), - ('license', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='osf.NodeLicenseRecord')), - ('node', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='preprints', to='osf.AbstractNode')), - ('provider', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='preprint_services', to='osf.PreprintProvider')), - ], - ), - migrations.CreateModel( - name='PrivateLink', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), - ('date_created', osf.utils.fields.NonNaiveDateTimeField(default=django.utils.timezone.now)), - ('key', models.CharField(max_length=512, unique=True)), - ('name', models.CharField(blank=True, max_length=255, null=True)), - ('is_deleted', models.BooleanField(default=False)), - ('anonymous', models.BooleanField(default=False)), - ('creator', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL)), - ('nodes', models.ManyToManyField(related_name='private_links', to='osf.AbstractNode')), - ], - options={ - 'abstract': False, - }, - ), - migrations.CreateModel( - name='QueuedMail', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), - ('to_addr', models.CharField(max_length=255)), - ('send_at', osf.utils.fields.NonNaiveDateTimeField(db_index=True)), - ('email_type', models.CharField(db_index=True, max_length=255)), - ('data', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=dict)), - ('sent_at', osf.utils.fields.NonNaiveDateTimeField(blank=True, db_index=True, null=True)), - ('user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), - ], - options={ - 'abstract': False, - }, - ), - migrations.CreateModel( - name='RecentlyAddedContributor', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('date_added', osf.utils.fields.NonNaiveDateTimeField(default=django.utils.timezone.now)), - ('contributor', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='recently_added_by', to=settings.AUTH_USER_MODEL)), - ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), - ], - ), - migrations.CreateModel( - name='RegistrationApproval', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), - ('approval_state', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=dict)), - ('end_date', osf.utils.fields.NonNaiveDateTimeField(blank=True, default=None, null=True)), - ('initiation_date', osf.utils.fields.NonNaiveDateTimeField(blank=True, default=django.utils.timezone.now, null=True)), - ('state', models.CharField(choices=[('unapproved', 'Unapproved'), ('approved', 'Approved'), ('rejected', 'Rejected'), ('completed', 'Completed')], default='unapproved', max_length=255)), - ('notify_initiator_on_complete', models.BooleanField(default=False)), - ('stashed_urls', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=dict)), - ('initiated_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), - ], - options={ - 'abstract': False, - }, - bases=(osf.models.sanctions.SanctionCallbackMixin, models.Model), - ), - migrations.CreateModel( - name='Retraction', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), - ('approval_state', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=dict)), - ('end_date', osf.utils.fields.NonNaiveDateTimeField(blank=True, default=None, null=True)), - ('initiation_date', osf.utils.fields.NonNaiveDateTimeField(blank=True, default=django.utils.timezone.now, null=True)), - ('state', models.CharField(choices=[('unapproved', 'Unapproved'), ('approved', 'Approved'), ('rejected', 'Rejected'), ('completed', 'Completed')], default='unapproved', max_length=255)), - ('notify_initiator_on_complete', models.BooleanField(default=False)), - ('stashed_urls', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=dict)), - ('justification', models.CharField(blank=True, max_length=2048, null=True)), - ('initiated_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), - ], - options={ - 'abstract': False, - }, - ), - migrations.CreateModel( - name='Session', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), - ('date_created', osf.utils.fields.NonNaiveDateTimeField(default=django.utils.timezone.now)), - ('date_modified', osf.utils.fields.NonNaiveDateTimeField(default=django.utils.timezone.now)), - ('data', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=dict)), - ], - options={ - 'abstract': False, - }, - ), - migrations.CreateModel( - name='Subject', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), - ('text', models.CharField(max_length=256, unique=True)), - ('parents', models.ManyToManyField(related_name='children', to='osf.Subject')), - ], - options={ - 'abstract': False, - }, - ), - migrations.CreateModel( - name='Tag', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(db_index=True, max_length=1024)), - ('system', models.BooleanField(default=False)), - ], - ), - migrations.CreateModel( - name='UserActivityCounter', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('_id', models.CharField(db_index=True, max_length=5, unique=True)), - ('action', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(default=dict)), - ('date', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(default=dict)), - ('total', models.PositiveIntegerField(default=0)), - ], - options={ - 'abstract': False, - }, - ), - migrations.AlterUniqueTogether( - name='tag', - unique_together=set([('name', 'system')]), - ), - migrations.AlterUniqueTogether( - name='nodelicense', - unique_together=set([('_id', 'license_id')]), - ), - migrations.AlterUniqueTogether( - name='metaschema', - unique_together=set([('name', 'schema_version')]), - ), - migrations.AddField( - model_name='institution', - name='contributors', - field=models.ManyToManyField(related_name='institutions', through='osf.InstitutionalContributor', to=settings.AUTH_USER_MODEL), - ), - migrations.AlterUniqueTogether( - name='externalaccount', - unique_together=set([('provider', 'provider_id')]), - ), - migrations.AddField( - model_name='draftregistration', - name='approval', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='osf.DraftRegistrationApproval'), - ), - migrations.AddField( - model_name='draftregistration', - name='initiator', - field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL), - ), - migrations.AddField( - model_name='draftregistration', - name='registration_schema', - field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='osf.MetaSchema'), - ), - migrations.AddField( - model_name='comment', - name='root_target', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='comments', to='osf.Guid'), - ), - migrations.AddField( - model_name='comment', - name='target', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='child_comments', to='osf.Guid'), - ), - migrations.AddField( - model_name='comment', - name='user', - field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL), - ), - migrations.AddField( - model_name='basefilenode', - name='tags', - field=models.ManyToManyField(related_name='basefilenode_tagged', to='osf.Tag'), - ), - migrations.AddField( - model_name='basefilenode', - name='versions', - field=models.ManyToManyField(to='osf.FileVersion'), - ), - migrations.AddField( - model_name='archivejob', - name='target_addons', - field=models.ManyToManyField(to='osf.ArchiveTarget'), - ), - migrations.AddField( - model_name='abstractnode', - name='_contributors', - field=models.ManyToManyField(related_name='nodes', through='osf.Contributor', to=settings.AUTH_USER_MODEL), - ), - migrations.AddField( - model_name='abstractnode', - name='_nodes', - field=models.ManyToManyField(related_name='parent_nodes', through='osf.NodeRelation', to='osf.AbstractNode'), - ), - migrations.AddField( - model_name='abstractnode', - name='affiliated_institutions', - field=models.ManyToManyField(related_name='nodes', to='osf.Institution'), - ), - migrations.AddField( - model_name='abstractnode', - name='alternative_citations', - field=models.ManyToManyField(related_name='nodes', to='osf.AlternativeCitation'), - ), - migrations.AddField( - model_name='abstractnode', - name='creator', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='created', to=settings.AUTH_USER_MODEL), - ), - migrations.AddField( - model_name='abstractnode', - name='embargo', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='registrations', to='osf.Embargo'), - ), - migrations.AddField( - model_name='abstractnode', - name='embargo_termination_approval', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='registrations', to='osf.EmbargoTerminationApproval'), - ), - migrations.AddField( - model_name='abstractnode', - name='forked_from', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='forks', to='osf.AbstractNode'), - ), - migrations.AddField( - model_name='abstractnode', - name='node_license', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='nodes', to='osf.NodeLicenseRecord'), - ), - migrations.AddField( - model_name='abstractnode', - name='preprint_file', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='osf.BaseFileNode'), - ), - migrations.AddField( - model_name='abstractnode', - name='registered_from', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='registrations', to='osf.AbstractNode'), - ), - migrations.AddField( - model_name='abstractnode', - name='registered_schema', - field=models.ManyToManyField(to='osf.MetaSchema'), - ), - migrations.AddField( - model_name='abstractnode', - name='registered_user', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='related_to', to=settings.AUTH_USER_MODEL), - ), - migrations.AddField( - model_name='abstractnode', - name='registration_approval', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='registrations', to='osf.RegistrationApproval'), - ), - migrations.AddField( - model_name='abstractnode', - name='retraction', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='registrations', to='osf.Retraction'), - ), - migrations.AddField( - model_name='abstractnode', - name='root', - field=models.ForeignKey(blank=True, default=None, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='descendants', to='osf.AbstractNode'), - ), - migrations.AddField( - model_name='abstractnode', - name='tags', - field=models.ManyToManyField(related_name='abstractnode_tagged', to='osf.Tag'), - ), - migrations.AddField( - model_name='abstractnode', - name='template_node', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='templated_from', to='osf.AbstractNode'), - ), - migrations.AddField( - model_name='abstractnode', - name='users_watching_node', - field=models.ManyToManyField(related_name='watching', to=settings.AUTH_USER_MODEL), - ), - migrations.AddField( - model_name='osfuser', - name='affiliated_institutions', - field=models.ManyToManyField(blank=True, to='osf.Institution'), - ), - migrations.AddField( - model_name='osfuser', - name='external_accounts', - field=models.ManyToManyField(blank=True, to='osf.ExternalAccount'), - ), - migrations.AddField( - model_name='osfuser', - name='groups', - field=models.ManyToManyField(blank=True, help_text='The groups this user belongs to. A user will get all permissions granted to each of their groups.', related_name='user_set', related_query_name='user', to='auth.Group', verbose_name='groups'), - ), - migrations.AddField( - model_name='osfuser', - name='merged_by', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='merger', to=settings.AUTH_USER_MODEL), - ), - migrations.AddField( - model_name='osfuser', - name='recently_added', - field=models.ManyToManyField(through='osf.RecentlyAddedContributor', to=settings.AUTH_USER_MODEL), - ), - migrations.AddField( - model_name='osfuser', - name='tags', - field=models.ManyToManyField(blank=True, to='osf.Tag'), - ), - migrations.AddField( - model_name='osfuser', - name='user_permissions', - field=models.ManyToManyField(blank=True, help_text='Specific permissions for this user.', related_name='user_set', related_query_name='user', to='auth.Permission', verbose_name='user permissions'), - ), - migrations.CreateModel( - name='BoxFileNode', - fields=[ - ], - options={ - 'proxy': True, - }, - bases=('osf.basefilenode',), - ), - migrations.CreateModel( - name='Collection', - fields=[ - ], - options={ - 'proxy': True, - }, - bases=('osf.abstractnode',), - ), - migrations.CreateModel( - name='DataverseFileNode', - fields=[ - ], - options={ - 'proxy': True, - }, - bases=('osf.basefilenode',), - ), - migrations.CreateModel( - name='DropboxFileNode', - fields=[ - ], - options={ - 'proxy': True, - }, - bases=('osf.basefilenode',), - ), - migrations.CreateModel( - name='FigshareFileNode', - fields=[ - ], - options={ - 'proxy': True, - }, - bases=('osf.basefilenode',), - ), - migrations.CreateModel( - name='GithubFileNode', - fields=[ - ], - options={ - 'proxy': True, - }, - bases=('osf.basefilenode',), - ), - migrations.CreateModel( - name='GoogleDriveFileNode', - fields=[ - ], - options={ - 'proxy': True, - }, - bases=('osf.basefilenode',), - ), - migrations.CreateModel( - name='Node', - fields=[ - ], - options={ - 'proxy': True, - 'permissions': (('view_node', 'Can view node details'),), - }, - bases=('osf.abstractnode',), - ), - migrations.CreateModel( - name='OsfStorageFileNode', - fields=[ - ], - options={ - 'proxy': True, - }, - bases=('osf.basefilenode',), - ), - migrations.CreateModel( - name='OwncloudFileNode', - fields=[ - ], - options={ - 'proxy': True, - }, - bases=('osf.basefilenode',), - ), - migrations.CreateModel( - name='Registration', - fields=[ - ], - options={ - 'proxy': True, - 'permissions': (('view_registration', 'Can view registration details'),), - }, - bases=('osf.abstractnode',), - ), - migrations.CreateModel( - name='S3FileNode', - fields=[ - ], - options={ - 'proxy': True, - }, - bases=('osf.basefilenode',), - ), - migrations.CreateModel( - name='TrashedFileNode', - fields=[ - ], - options={ - 'proxy': True, - }, - bases=('osf.basefilenode',), - ), - migrations.AlterUniqueTogether( - name='recentlyaddedcontributor', - unique_together=set([('user', 'contributor')]), - ), - migrations.AlterUniqueTogether( - name='preprintservice', - unique_together=set([('node', 'provider')]), - ), - migrations.AddField( - model_name='notificationsubscription', - name='node', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='notification_subscriptions', to='osf.Node'), - ), - migrations.AlterUniqueTogether( - name='noderelation', - unique_together=set([('parent', 'child')]), - ), - migrations.AlterIndexTogether( - name='noderelation', - index_together=set([('is_node_link', 'child', 'parent')]), - ), - migrations.AlterOrderWithRespectTo( - name='noderelation', - order_with_respect_to='parent', - ), - migrations.AddField( - model_name='mailrecord', - name='nodes_created', - field=models.ManyToManyField(to='osf.Node'), - ), - migrations.AlterUniqueTogether( - name='institutionalcontributor', - unique_together=set([('user', 'institution')]), - ), - migrations.AlterUniqueTogether( - name='identifier', - unique_together=set([('object_id', 'content_type', 'category')]), - ), - migrations.AlterIndexTogether( - name='guid', - index_together=set([('content_type', 'object_id', 'created')]), - ), - migrations.AddField( - model_name='embargoterminationapproval', - name='embargoed_registration', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='osf.Registration'), - ), - migrations.AddField( - model_name='draftregistration', - name='branched_from', - field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='registered_draft', to='osf.Node'), - ), - migrations.AddField( - model_name='draftregistration', - name='registered_node', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='draft_registration', to='osf.Registration'), - ), - migrations.AlterUniqueTogether( - name='contributor', - unique_together=set([('user', 'node')]), - ), - migrations.AlterOrderWithRespectTo( - name='contributor', - order_with_respect_to='node', - ), - migrations.AddField( - model_name='archivejob', - name='dst_node', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='archive_jobs', to='osf.Registration', verbose_name='destination node'), - ), - migrations.AddField( - model_name='archivejob', - name='src_node', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='osf.Node', verbose_name='source node'), - ), - migrations.AlterIndexTogether( - name='abstractnode', - index_together=set([('is_public', 'is_deleted', 'type')]), - ), - migrations.CreateModel( - name='BoxFile', - fields=[ - ], - options={ - 'proxy': True, - }, - bases=('osf.boxfilenode', models.Model), - ), - migrations.CreateModel( - name='BoxFolder', - fields=[ - ], - options={ - 'proxy': True, - }, - bases=('osf.boxfilenode', models.Model), - ), - migrations.CreateModel( - name='DataverseFile', - fields=[ - ], - options={ - 'proxy': True, - }, - bases=('osf.dataversefilenode', models.Model), - ), - migrations.CreateModel( - name='DataverseFolder', - fields=[ - ], - options={ - 'proxy': True, - }, - bases=('osf.dataversefilenode', models.Model), - ), - migrations.CreateModel( - name='DropboxFile', - fields=[ - ], - options={ - 'proxy': True, - }, - bases=('osf.dropboxfilenode', models.Model), - ), - migrations.CreateModel( - name='DropboxFolder', - fields=[ - ], - options={ - 'proxy': True, - }, - bases=('osf.dropboxfilenode', models.Model), - ), - migrations.CreateModel( - name='FigshareFile', - fields=[ - ], - options={ - 'proxy': True, - }, - bases=('osf.figsharefilenode', models.Model), - ), - migrations.CreateModel( - name='FigshareFolder', - fields=[ - ], - options={ - 'proxy': True, - }, - bases=('osf.figsharefilenode', models.Model), - ), - migrations.CreateModel( - name='GithubFile', - fields=[ - ], - options={ - 'proxy': True, - }, - bases=('osf.githubfilenode', models.Model), - ), - migrations.CreateModel( - name='GithubFolder', - fields=[ - ], - options={ - 'proxy': True, - }, - bases=('osf.githubfilenode', models.Model), - ), - migrations.CreateModel( - name='GoogleDriveFile', - fields=[ - ], - options={ - 'proxy': True, - }, - bases=('osf.googledrivefilenode', models.Model), - ), - migrations.CreateModel( - name='GoogleDriveFolder', - fields=[ - ], - options={ - 'proxy': True, - }, - bases=('osf.googledrivefilenode', models.Model), - ), - migrations.CreateModel( - name='OsfStorageFile', - fields=[ - ], - options={ - 'proxy': True, - }, - bases=('osf.osfstoragefilenode', models.Model), - ), - migrations.CreateModel( - name='OsfStorageFolder', - fields=[ - ], - options={ - 'proxy': True, - }, - bases=('osf.osfstoragefilenode', models.Model), - ), - migrations.CreateModel( - name='OwncloudFile', - fields=[ - ], - options={ - 'proxy': True, - }, - bases=('osf.owncloudfilenode', models.Model), - ), - migrations.CreateModel( - name='OwncloudFolder', - fields=[ - ], - options={ - 'proxy': True, - }, - bases=('osf.owncloudfilenode', models.Model), - ), - migrations.CreateModel( - name='S3File', - fields=[ - ], - options={ - 'proxy': True, - }, - bases=('osf.s3filenode', models.Model), - ), - migrations.CreateModel( - name='S3Folder', - fields=[ - ], - options={ - 'proxy': True, - }, - bases=('osf.s3filenode', models.Model), - ), - migrations.CreateModel( - name='TrashedFile', - fields=[ - ], - options={ - 'proxy': True, - }, - bases=('osf.trashedfilenode',), - ), - migrations.CreateModel( - name='TrashedFolder', - fields=[ - ], - options={ - 'proxy': True, - }, - bases=('osf.trashedfilenode',), - ), - migrations.RunSQL( - [ - """ - CREATE UNIQUE INDEX one_bookmark_collection_per_user ON osf_abstractnode (creator_id, is_bookmark_collection, is_deleted) - WHERE is_bookmark_collection=TRUE AND is_deleted=FALSE; - """ - ], [ - """ - DROP INDEX IF EXISTS one_bookmark_collection_per_user RESTRICT; - """ - ] - ), - migrations.RunSQL( - [ - """ - CREATE INDEX osf_abstractnode_registered_date_index ON public.osf_abstractnode (registered_date DESC); - CREATE INDEX osf_abstractnode_registration_pub_del_type_index ON public.osf_abstractnode (is_public, is_deleted, type) WHERE is_public=TRUE and is_deleted=FALSE and type = 'osf.registration'; - CREATE INDEX osf_abstractnode_node_pub_del_type_index ON public.osf_abstractnode (is_public, is_deleted, type) WHERE is_public=TRUE and is_deleted=FALSE and type = 'osf.node'; - CREATE INDEX osf_abstractnode_collection_pub_del_type_index ON public.osf_abstractnode (is_public, is_deleted, type) WHERE is_public=TRUE and is_deleted=FALSE and type = 'osf.collection'; - """ - ], - [ - """ - DROP INDEX public.osf_abstractnode_registered_date_index RESTRICT; - DROP INDEX public.osf_abstractnode_registration_pub_del_type_index RESTRICT; - DROP INDEX public.osf_abstractnode_node_pub_del_type_index RESTRICT; - DROP INDEX public.osf_abstractnode_collection_pub_del_type_index RESTRICT; - """ - ] - ), - migrations.RunSQL( - [ - """ - CREATE UNIQUE INDEX osf_basefilenode_non_trashed_unique_index - ON public.osf_basefilenode - (node_id, name, parent_id, type, _path) - WHERE type NOT IN ('osf.trashedfilenode', 'osf.trashedfile', 'osf.trashedfolder'); - """, - ], - [ - """ - DROP INDEX public.osf_basefilenode_non_trashed_unique_index RESTRICT; - """ - ] - ), - ] diff --git a/osf/migrations/0002_add_lower_index_to_tags.py b/osf/migrations/0002_add_lower_index_to_tags.py deleted file mode 100644 index b351682b2da..00000000000 --- a/osf/migrations/0002_add_lower_index_to_tags.py +++ /dev/null @@ -1,26 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9 on 2017-03-30 14:55 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0001_initial'), - ] - - operations = [ - migrations.RunSQL( - [ - """ - CREATE INDEX lowercase_tag_index ON osf_tag (lower(name), system); - """ - ], [ - """ - DROP INDEX IF EXISTS lowercase_tag_index RESTRICT; - """ - ] - ) - ] diff --git a/osf/migrations/0003_auto_20170330_1251.py b/osf/migrations/0003_auto_20170330_1251.py deleted file mode 100644 index 47a82a7cfb5..00000000000 --- a/osf/migrations/0003_auto_20170330_1251.py +++ /dev/null @@ -1,22 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9 on 2017-03-29 17:51 -from __future__ import unicode_literals - -from django.db import migrations -import django.utils.timezone -import osf.utils.fields - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0002_add_lower_index_to_tags'), - ] - - operations = [ - migrations.AlterField( - model_name='preprintservice', - name='date_modified', - field=osf.utils.fields.NonNaiveDateTimeField(default=django.utils.timezone.now), - ), - ] diff --git a/osf/migrations/0003_auto_20170402_1611.py b/osf/migrations/0003_auto_20170402_1611.py deleted file mode 100644 index 2b6ca4cd236..00000000000 --- a/osf/migrations/0003_auto_20170402_1611.py +++ /dev/null @@ -1,34 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9 on 2017-04-02 21:11 -from __future__ import unicode_literals - -from django.db import migrations -import django.db.models.manager - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0002_add_lower_index_to_tags'), - ] - - operations = [ - migrations.AlterModelOptions( - name='tag', - options={'ordering': ('name',)}, - ), - migrations.AlterModelManagers( - name='fileversion', - managers=[ - ('includable_objects', django.db.models.manager.Manager()), - ], - ), - migrations.RemoveField( - model_name='abstractnode', - name='public_comments', - ), - migrations.RemoveField( - model_name='osfuser', - name='piwik_token', - ), - ] diff --git a/osf/migrations/0004_abstractnode_comment_level.py b/osf/migrations/0004_abstractnode_comment_level.py deleted file mode 100644 index babe32c6dcb..00000000000 --- a/osf/migrations/0004_abstractnode_comment_level.py +++ /dev/null @@ -1,20 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9 on 2017-04-02 21:47 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0003_auto_20170402_1611'), - ] - - operations = [ - migrations.AddField( - model_name='abstractnode', - name='comment_level', - field=models.CharField(default='public', max_length=10), - ), - ] diff --git a/osf/migrations/0005_merge.py b/osf/migrations/0005_merge.py deleted file mode 100644 index eb2ba856b7a..00000000000 --- a/osf/migrations/0005_merge.py +++ /dev/null @@ -1,16 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9 on 2017-04-03 01:16 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0003_auto_20170330_1251'), - ('osf', '0004_abstractnode_comment_level'), - ] - - operations = [ - ] diff --git a/osf/migrations/0006_add_jsonb_index_for_fileversions.py b/osf/migrations/0006_add_jsonb_index_for_fileversions.py deleted file mode 100644 index 73a5bba0be2..00000000000 --- a/osf/migrations/0006_add_jsonb_index_for_fileversions.py +++ /dev/null @@ -1,29 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9 on 2017-04-03 20:50 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0005_merge'), - ] - - operations = [ - migrations.RunSQL( - [ - """ - CREATE INDEX fileversion_metadata_sha_arch_vault_index - ON osf_fileversion ((osf_fileversion.metadata -> 'sha256'), (osf_fileversion.metadata -> 'archive'), ( - osf_fileversion.metadata -> 'vault')); - """ - ], - [ - """ - DROP INDEX fileversion_metadata_sha_arch_vault_index; - """ - ] - ) - ] diff --git a/osf/migrations/0007_auto_20170403_2304.py b/osf/migrations/0007_auto_20170403_2304.py deleted file mode 100644 index 446fe94128a..00000000000 --- a/osf/migrations/0007_auto_20170403_2304.py +++ /dev/null @@ -1,97 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9 on 2017-04-04 04:04 -from __future__ import unicode_literals - -from django.db import migrations -import django.utils.timezone -import osf.utils.fields - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0006_add_jsonb_index_for_fileversions'), - ] - - operations = [ - migrations.RemoveField( - model_name='osfuser', - name='mailing_lists', - ), - migrations.AlterField( - model_name='abstractnode', - name='date_created', - field=osf.utils.fields.NonNaiveDateTimeField(auto_now_add=True), - ), - migrations.AlterField( - model_name='abstractnode', - name='date_modified', - field=osf.utils.fields.NonNaiveDateTimeField(auto_now=True, db_index=True, default=django.utils.timezone.now), - preserve_default=False, - ), - migrations.AlterField( - model_name='apioauth2application', - name='date_created', - field=osf.utils.fields.NonNaiveDateTimeField(auto_now_add=True), - ), - migrations.AlterField( - model_name='comment', - name='date_created', - field=osf.utils.fields.NonNaiveDateTimeField(auto_now_add=True), - ), - migrations.AlterField( - model_name='comment', - name='date_modified', - field=osf.utils.fields.NonNaiveDateTimeField(auto_now=True), - ), - migrations.AlterField( - model_name='draftregistration', - name='datetime_initiated', - field=osf.utils.fields.NonNaiveDateTimeField(auto_now_add=True), - ), - migrations.AlterField( - model_name='draftregistration', - name='datetime_updated', - field=osf.utils.fields.NonNaiveDateTimeField(auto_now=True), - ), - migrations.AlterField( - model_name='fileversion', - name='date_created', - field=osf.utils.fields.NonNaiveDateTimeField(auto_now_add=True), - ), - migrations.AlterField( - model_name='guid', - name='created', - field=osf.utils.fields.NonNaiveDateTimeField(auto_now_add=True, db_index=True), - ), - migrations.AlterField( - model_name='osfuser', - name='date_registered', - field=osf.utils.fields.NonNaiveDateTimeField(auto_now_add=True, db_index=True), - ), - migrations.AlterField( - model_name='preprintservice', - name='date_created', - field=osf.utils.fields.NonNaiveDateTimeField(auto_now_add=True), - ), - migrations.AlterField( - model_name='preprintservice', - name='date_modified', - field=osf.utils.fields.NonNaiveDateTimeField(auto_now=True), - ), - migrations.AlterField( - model_name='recentlyaddedcontributor', - name='date_added', - field=osf.utils.fields.NonNaiveDateTimeField(auto_now=True), - ), - migrations.AlterField( - model_name='session', - name='date_created', - field=osf.utils.fields.NonNaiveDateTimeField(auto_now_add=True), - ), - migrations.AlterField( - model_name='session', - name='date_modified', - field=osf.utils.fields.NonNaiveDateTimeField(auto_now=True), - ), - ] diff --git a/osf/migrations/0007_auto_20170404_0857.py b/osf/migrations/0007_auto_20170404_0857.py deleted file mode 100644 index 667bc46d919..00000000000 --- a/osf/migrations/0007_auto_20170404_0857.py +++ /dev/null @@ -1,19 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9 on 2017-04-04 13:57 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0006_add_jsonb_index_for_fileversions'), - ] - - operations = [ - migrations.AlterModelOptions( - name='preprintservice', - options={'permissions': (('view_preprintservice', 'Can view preprint service details in the admin app.'),)}, - ), - ] diff --git a/osf/migrations/0008_merge.py b/osf/migrations/0008_merge.py deleted file mode 100644 index fa30473cdd8..00000000000 --- a/osf/migrations/0008_merge.py +++ /dev/null @@ -1,16 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9 on 2017-04-06 20:48 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0007_auto_20170403_2304'), - ('osf', '0007_auto_20170404_0857'), - ] - - operations = [ - ] diff --git a/osf/migrations/0009_auto_20170406_1614.py b/osf/migrations/0009_auto_20170406_1614.py deleted file mode 100644 index 198779366fe..00000000000 --- a/osf/migrations/0009_auto_20170406_1614.py +++ /dev/null @@ -1,21 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9 on 2017-04-06 21:14 -from __future__ import unicode_literals - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0008_merge'), - ] - - operations = [ - migrations.AlterField( - model_name='noderelation', - name='child', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='_parents', to='osf.AbstractNode'), - ), - ] diff --git a/osf/migrations/0010_update_osfuser_permissions.py b/osf/migrations/0010_update_osfuser_permissions.py deleted file mode 100644 index 172eae7dfe1..00000000000 --- a/osf/migrations/0010_update_osfuser_permissions.py +++ /dev/null @@ -1,19 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9 on 2017-04-05 17:30 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0009_auto_20170406_1614'), - ] - - operations = [ - migrations.AlterModelOptions( - name='osfuser', - options={'permissions': (('view_osfuser', 'Can view user details'),)}, - ), - ] diff --git a/osf/migrations/0011_auto_20170410_1711.py b/osf/migrations/0011_auto_20170410_1711.py deleted file mode 100644 index 510bfe8ebb3..00000000000 --- a/osf/migrations/0011_auto_20170410_1711.py +++ /dev/null @@ -1,20 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9 on 2017-04-10 22:11 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0010_update_osfuser_permissions'), - ] - - operations = [ - migrations.AlterField( - model_name='fileversion', - name='size', - field=models.BigIntegerField(blank=True, default=-1, null=True), - ), - ] diff --git a/osf/migrations/0012_auto_20170411_1548.py b/osf/migrations/0012_auto_20170411_1548.py deleted file mode 100644 index cc9dc02eabf..00000000000 --- a/osf/migrations/0012_auto_20170411_1548.py +++ /dev/null @@ -1,20 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9 on 2017-04-05 17:30 -from __future__ import unicode_literals - -from django.db import migrations - -def noop(*args): - # This migration used to handle admin permissions - # This is now handled by the post_migrate signal - pass - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0011_auto_20170410_1711'), - ] - - operations = [ - migrations.RunPython(noop, noop), - ] diff --git a/osf/migrations/0013_auto_20170412_0957.py b/osf/migrations/0013_auto_20170412_0957.py deleted file mode 100644 index e370be72194..00000000000 --- a/osf/migrations/0013_auto_20170412_0957.py +++ /dev/null @@ -1,21 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9 on 2017-04-12 14:57 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0012_auto_20170411_1548'), - ] - - operations = [ - migrations.AlterField( - model_name='basefilenode', - name='name', - field=models.TextField(blank=True, default=''), - preserve_default=False, - ), - ] diff --git a/osf/migrations/0013_auto_20170417_1437.py b/osf/migrations/0013_auto_20170417_1437.py deleted file mode 100644 index c5df57e4480..00000000000 --- a/osf/migrations/0013_auto_20170417_1437.py +++ /dev/null @@ -1,25 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9 on 2017-04-17 19:37 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0012_auto_20170411_1548'), - ] - - operations = [ - migrations.AddField( - model_name='institution', - name='delegation_protocol', - field=models.CharField(blank=True, choices=[('cas-pac4j', 'CAS by pac4j'), ('oauth-pac4j', 'OAuth by pac4j'), ('saml-shib', 'SAML by Shibboleth'), ('', 'No Delegation Protocol')], default='', max_length=15), - ), - migrations.AlterField( - model_name='institution', - name='logo_name', - field=models.CharField(blank=True, max_length=255, null=True), - ), - ] diff --git a/osf/migrations/0014_merge.py b/osf/migrations/0014_merge.py deleted file mode 100644 index 19f5d8b4426..00000000000 --- a/osf/migrations/0014_merge.py +++ /dev/null @@ -1,16 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9 on 2017-04-18 14:25 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0013_auto_20170417_1437'), - ('osf', '0013_auto_20170412_0957'), - ] - - operations = [ - ] diff --git a/osf/migrations/0015_auto_20170421_1244.py b/osf/migrations/0015_auto_20170421_1244.py deleted file mode 100644 index 19ab0c49d70..00000000000 --- a/osf/migrations/0015_auto_20170421_1244.py +++ /dev/null @@ -1,23 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11 on 2017-04-21 17:44 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0014_merge'), - ] - - operations = [ - migrations.AlterModelOptions( - name='abstractnode', - options={'base_manager_name': 'objects'}, - ), - migrations.AlterModelOptions( - name='basefilenode', - options={'base_manager_name': 'objects'}, - ), - ] diff --git a/osf/migrations/0015_preprintprovider_domain.py b/osf/migrations/0015_preprintprovider_domain.py deleted file mode 100644 index 6c5a2b0f81a..00000000000 --- a/osf/migrations/0015_preprintprovider_domain.py +++ /dev/null @@ -1,20 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9 on 2017-04-18 16:13 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0014_merge'), - ] - - operations = [ - migrations.AddField( - model_name='preprintprovider', - name='domain', - field=models.URLField(blank=True, null=True), - ), - ] diff --git a/osf/migrations/0016_auto_20170424_1609.py b/osf/migrations/0016_auto_20170424_1609.py deleted file mode 100644 index 1d2a66e8c73..00000000000 --- a/osf/migrations/0016_auto_20170424_1609.py +++ /dev/null @@ -1,35 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11 on 2017-04-24 21:09 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0015_auto_20170421_1244'), - ] - - operations = [ - migrations.RemoveField( - model_name='abstractnode', - name='guid_string', - ), - migrations.RemoveField( - model_name='basefilenode', - name='guid_string', - ), - migrations.RemoveField( - model_name='comment', - name='guid_string', - ), - migrations.RemoveField( - model_name='osfuser', - name='guid_string', - ), - migrations.RemoveField( - model_name='preprintservice', - name='guid_string', - ), - ] diff --git a/osf/migrations/0016_preprintprovider_domain_redirect_enabled.py b/osf/migrations/0016_preprintprovider_domain_redirect_enabled.py deleted file mode 100644 index 1784e2920ac..00000000000 --- a/osf/migrations/0016_preprintprovider_domain_redirect_enabled.py +++ /dev/null @@ -1,20 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9 on 2017-04-19 18:12 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0015_preprintprovider_domain'), - ] - - operations = [ - migrations.AddField( - model_name='preprintprovider', - name='domain_redirect_enabled', - field=models.BooleanField(default=False), - ), - ] diff --git a/osf/migrations/0017_auto_20170419_1323.py b/osf/migrations/0017_auto_20170419_1323.py deleted file mode 100644 index 62e8ab98ebc..00000000000 --- a/osf/migrations/0017_auto_20170419_1323.py +++ /dev/null @@ -1,20 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9 on 2017-04-19 18:23 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0016_preprintprovider_domain_redirect_enabled'), - ] - - operations = [ - migrations.AlterField( - model_name='preprintprovider', - name='domain', - field=models.URLField(blank=True, default=b'', null=True), - ), - ] diff --git a/osf/migrations/0018_merge_20170424_1330.py b/osf/migrations/0018_merge_20170424_1330.py deleted file mode 100644 index 2f0e6e90305..00000000000 --- a/osf/migrations/0018_merge_20170424_1330.py +++ /dev/null @@ -1,16 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11 on 2017-04-24 18:30 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0017_auto_20170419_1323'), - ('osf', '0015_auto_20170421_1244'), - ] - - operations = [ - ] diff --git a/osf/migrations/0019_merge_20170424_1956.py b/osf/migrations/0019_merge_20170424_1956.py deleted file mode 100644 index 9fe98a14047..00000000000 --- a/osf/migrations/0019_merge_20170424_1956.py +++ /dev/null @@ -1,16 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11 on 2017-04-25 00:56 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0016_auto_20170424_1609'), - ('osf', '0018_merge_20170424_1330'), - ] - - operations = [ - ] diff --git a/osf/migrations/0020_auto_20170426_0920.py b/osf/migrations/0020_auto_20170426_0920.py deleted file mode 100644 index fc3909b0a35..00000000000 --- a/osf/migrations/0020_auto_20170426_0920.py +++ /dev/null @@ -1,20 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11 on 2017-04-26 14:20 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0019_merge_20170424_1956'), - ] - - operations = [ - migrations.AlterField( - model_name='preprintprovider', - name='domain', - field=models.URLField(blank=True, default=b''), - ), - ] diff --git a/osf/migrations/0021_retraction_date_retracted.py b/osf/migrations/0021_retraction_date_retracted.py deleted file mode 100644 index ab0418f2181..00000000000 --- a/osf/migrations/0021_retraction_date_retracted.py +++ /dev/null @@ -1,21 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11 on 2017-05-01 14:03 -from __future__ import unicode_literals - -from django.db import migrations -import osf.utils.fields - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0020_auto_20170426_0920'), - ] - - operations = [ - migrations.AddField( - model_name='retraction', - name='date_retracted', - field=osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True), - ), - ] diff --git a/osf/migrations/0021_unique_notificationsettings__ids.py b/osf/migrations/0021_unique_notificationsettings__ids.py deleted file mode 100644 index 3acf82110ae..00000000000 --- a/osf/migrations/0021_unique_notificationsettings__ids.py +++ /dev/null @@ -1,40 +0,0 @@ -# -*- coding: utf-8 -*- -# This is an auto-migration and not a management command because: -# 1. The next script would fail if duplicate records existed -# 2. This should only need to be run once -from __future__ import unicode_literals -import logging - -from django.db import connection, migrations - -logger = logging.getLogger(__file__) - -def remove_duplicate_notificationsubscriptions(state, schema): - NotificationSubscription = state.get_model('osf', 'notificationsubscription') - # Deletes the newest from each set of duplicates - sql = """ - SELECT MAX(id) - FROM osf_notificationsubscription - GROUP BY _id HAVING COUNT(*) > 1; - """ - with connection.cursor() as cursor: - cursor.execute(sql) - ids = list(sum(cursor.fetchall(), ())) - logger.info('Deleting duplicate NotificationSubscriptions with `id`s {}'.format(ids)) - # Use Django to cascade delete through tables - NotificationSubscription.objects.filter(id__in=ids).delete() - -def noop(*args): - logger.info('Removal of duplicates cannot be reversed, skipping.') - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0020_auto_20170426_0920'), - ] - - operations = [ - migrations.RunPython( - remove_duplicate_notificationsubscriptions, noop - ), - ] diff --git a/osf/migrations/0022_auto_20170503_1818.py b/osf/migrations/0022_auto_20170503_1818.py deleted file mode 100644 index 5fc070aaf98..00000000000 --- a/osf/migrations/0022_auto_20170503_1818.py +++ /dev/null @@ -1,20 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11 on 2017-05-03 23:18 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0021_unique_notificationsettings__ids'), - ] - - operations = [ - migrations.AlterField( - model_name='notificationsubscription', - name='_id', - field=models.CharField(db_index=True, max_length=50, unique=True), - ), - ] diff --git a/osf/migrations/0023_merge_20170503_1947.py b/osf/migrations/0023_merge_20170503_1947.py deleted file mode 100644 index 0eb1d6eaf04..00000000000 --- a/osf/migrations/0023_merge_20170503_1947.py +++ /dev/null @@ -1,16 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11 on 2017-05-04 00:47 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0022_auto_20170503_1818'), - ('osf', '0021_retraction_date_retracted'), - ] - - operations = [ - ] diff --git a/osf/migrations/0024_migrate_subject_parents_to_parent.py b/osf/migrations/0024_migrate_subject_parents_to_parent.py deleted file mode 100644 index f3847857dbc..00000000000 --- a/osf/migrations/0024_migrate_subject_parents_to_parent.py +++ /dev/null @@ -1,96 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals -import logging - -from django.db import connection, migrations, models - -from osf.models.validators import validate_subject_hierarchy_length - -logger = logging.getLogger(__name__) - -def add_custom_mapping_constraint(state, schema): - sql = """ - ALTER TABLE osf_subject - ADD CONSTRAINT customs_must_be_mapped - CHECK (bepress_subject_id IS NOT NULL OR provider_id = %s); - """ - try: - osf_id = state.get_model('osf', 'preprintprovider').objects.get(_id='osf').id - except models.ObjectDoesNotExist: - # Allow test / local dev DBs to pass - logger.warn('Unable to create contraint - assuming test environment.') - pass - else: - with connection.cursor() as cursor: - cursor.execute(sql, [osf_id]) - -def remove_custom_mapping_constraint(*args): - sql = """ - ALTER TABLE osf_subject - DROP CONSTRAINT IF EXISTS customs_must_be_mapped RESTRICT; - """ - with connection.cursor() as cursor: - cursor.execute(sql) - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0023_merge_20170503_1947'), - ] - - operations = [ - migrations.AddField( - model_name='subject', - name='parent', - field=models.ForeignKey(blank=True, null=True, on_delete=models.deletion.SET_NULL, related_name='children', to='osf.Subject', validators=[validate_subject_hierarchy_length]), - ), - migrations.AddField( - model_name='subject', - name='provider', - field=models.ForeignKey(blank=True, null=True, on_delete=models.deletion.SET_NULL, to='osf.PreprintProvider', related_name='subjects') - ), - migrations.AddField( - model_name='subject', - name='bepress_subject', - field=models.ForeignKey(blank=True, null=True, on_delete=models.deletion.CASCADE, to='osf.Subject', related_name='aliases') - ), - migrations.RunSQL( - [""" - UPDATE osf_subject - SET provider_id = (SELECT id FROM osf_preprintprovider WHERE _id = 'osf'); - """], [""" - UPDATE osf_subject - SET provider_id = NULL; - """] - ), - migrations.RunSQL( - [""" - UPDATE osf_subject - SET parent_id=subquery.to_subject_id - FROM (SELECT from_subject_id, to_subject_id - FROM osf_subject_parents) AS subquery - WHERE osf_subject.id=subquery.from_subject_id; - """], [""" - INSERT INTO osf_subject_parents (from_subject_id, to_subject_id) - SELECT id, parent_id FROM osf_subject - WHERE parent_id IS NOT NULL; - """] - ), - migrations.RunPython( - add_custom_mapping_constraint, remove_custom_mapping_constraint - ), - migrations.RemoveField( - model_name='subject', - name='parents' - ), - migrations.AlterField( - model_name='subject', - name='parent', - field=models.ForeignKey(blank=True, null=True, on_delete=models.deletion.SET_NULL, related_name='children', to='osf.Subject', validators=[validate_subject_hierarchy_length]), - ), - migrations.AlterField( - model_name='subject', - name='provider', - field=models.ForeignKey(blank=False, null=False, on_delete=models.deletion.CASCADE, to='osf.PreprintProvider', related_name='subjects') - ), - ] diff --git a/osf/migrations/0025_migrate_preprint_subjects_to_fks.py b/osf/migrations/0025_migrate_preprint_subjects_to_fks.py deleted file mode 100644 index 3f7e6143b77..00000000000 --- a/osf/migrations/0025_migrate_preprint_subjects_to_fks.py +++ /dev/null @@ -1,48 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9 on 2017-04-17 19:58 -from __future__ import unicode_literals - -from django.db import migrations, models - - -def migrate_data(state, schema): - Preprint = state.get_model('osf', 'preprintservice') - Subject = state.get_model('osf', 'subject') - # Avoid updating date_modified for migration - field = Preprint._meta.get_field('date_modified') - field.auto_now = False - for pp in Preprint.objects.all(): - for s_id in list(set(sum(pp.subjects, []))): - s = Subject.objects.get(_id=s_id) - pp._subjects.add(s) - pp.save() - field.auto_now = True - -def unmigrate_data(state, scheme): - Preprint = state.get_model('osf', 'preprintservice') - # Avoid updating date_modified for migration - field = Preprint._meta.get_field('date_modified') - field.auto_now = False - for pp in Preprint.objects.all(): - pp.subjects = [ - [s._id for s in hier] for hier in pp.subject_hierarchy - ] - pp.save() - field.auto_now = True - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0024_migrate_subject_parents_to_parent'), - ] - - operations = [ - migrations.AddField( - model_name='preprintservice', - name='_subjects', - field=models.ManyToManyField(blank=True, related_name='preprint_services', to='osf.Subject'), - ), - migrations.RunPython( - migrate_data, unmigrate_data - ), - ] diff --git a/osf/migrations/0026_rename_preprintservice_subjects.py b/osf/migrations/0026_rename_preprintservice_subjects.py deleted file mode 100644 index 176cafd1a17..00000000000 --- a/osf/migrations/0026_rename_preprintservice_subjects.py +++ /dev/null @@ -1,24 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9 on 2017-04-17 22:49 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0025_migrate_preprint_subjects_to_fks'), - ] - - operations = [ - migrations.RemoveField( - model_name='preprintservice', - name='subjects', - ), - migrations.RenameField( - model_name='preprintservice', - old_name='_subjects', - new_name='subjects' - ), - ] diff --git a/osf/migrations/0027_auto_20170428_1435.py b/osf/migrations/0027_auto_20170428_1435.py deleted file mode 100644 index 6bccba7b2f1..00000000000 --- a/osf/migrations/0027_auto_20170428_1435.py +++ /dev/null @@ -1,24 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9 on 2017-04-28 19:35 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0026_rename_preprintservice_subjects'), - ] - - operations = [ - migrations.AlterField( - model_name='subject', - name='text', - field=models.CharField(max_length=256), - ), - migrations.AlterUniqueTogether( - name='subject', - unique_together=set([('text', 'provider')]), - ), - ] diff --git a/osf/migrations/0028_auto_20170504_1548.py b/osf/migrations/0028_auto_20170504_1548.py deleted file mode 100644 index 4677f36de31..00000000000 --- a/osf/migrations/0028_auto_20170504_1548.py +++ /dev/null @@ -1,19 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11 on 2017-05-04 20:48 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0027_auto_20170428_1435'), - ] - - operations = [ - migrations.AlterModelOptions( - name='subject', - options={'base_manager_name': 'objects'}, - ), - ] diff --git a/osf/migrations/0029_auto_20170511_1553.py b/osf/migrations/0029_auto_20170511_1553.py deleted file mode 100644 index ba330e01371..00000000000 --- a/osf/migrations/0029_auto_20170511_1553.py +++ /dev/null @@ -1,26 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11 on 2017-05-11 20:53 -from __future__ import unicode_literals - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0028_auto_20170504_1548'), - ] - - operations = [ - migrations.AddField( - model_name='preprintprovider', - name='default_license', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='default_license', to='osf.NodeLicense'), - ), - migrations.AlterField( - model_name='preprintprovider', - name='licenses_acceptable', - field=models.ManyToManyField(blank=True, related_name='licenses_acceptable', to='osf.NodeLicense'), - ), - ] diff --git a/osf/migrations/0030_preprint_provider_institution_permissions.py b/osf/migrations/0030_preprint_provider_institution_permissions.py deleted file mode 100644 index 3e768fd7075..00000000000 --- a/osf/migrations/0030_preprint_provider_institution_permissions.py +++ /dev/null @@ -1,24 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9 on 2017-03-27 17:22 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0029_auto_20170511_1553'), - ] - - operations = [ - migrations.AlterModelOptions( - name='institution', - options={'permissions': (('view_institution', 'Can view institution details'),)}, - ), - migrations.AlterModelOptions( - name='preprintprovider', - options={'permissions': (('view_preprintprovider', 'Can view preprint provider details'),)}, - ), - - ] diff --git a/osf/migrations/0031_preprintprovider_share_source.py b/osf/migrations/0031_preprintprovider_share_source.py deleted file mode 100644 index a4a0fe4225b..00000000000 --- a/osf/migrations/0031_preprintprovider_share_source.py +++ /dev/null @@ -1,20 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11 on 2017-05-18 14:33 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0030_preprint_provider_institution_permissions'), - ] - - operations = [ - migrations.AddField( - model_name='preprintprovider', - name='share_source', - field=models.CharField(blank=True, max_length=200), - ), - ] diff --git a/osf/migrations/0032_unquote_gd_nodesettings_folder_path.py b/osf/migrations/0032_unquote_gd_nodesettings_folder_path.py deleted file mode 100644 index 1ca7a925cf1..00000000000 --- a/osf/migrations/0032_unquote_gd_nodesettings_folder_path.py +++ /dev/null @@ -1,42 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.1 on 2017-05-30 19:21 -from __future__ import unicode_literals -from future.moves.urllib.parse import quote, unquote - - -from django_bulk_update.helper import bulk_update -from django.db import migrations - - -def unquote_folder_paths(state, schema): - try: - NodeSettings = state.get_model('addons_googledrive', 'nodesettings') - targets = NodeSettings.objects.filter(folder_path__isnull=False) - except LookupError: - return - for obj in targets: - try: - obj.folder_path = unquote(obj.folder_path).decode('utf-8') - except UnicodeEncodeError: - obj.folder_path = unquote(obj.folder_path) - bulk_update(targets, update_fields=['folder_path']) - -def quote_folder_paths(state, schema): - try: - NodeSettings = state.get_model('addons_googledrive', 'nodesettings') - targets = NodeSettings.objects.filter(folder_path__isnull=False) - except LookupError: - return - for obj in targets: - obj.folder_path = quote(obj.folder_path.encode('utf-8')) - bulk_update(targets, update_fields=['folder_path']) - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0031_preprintprovider_share_source'), - ] - - operations = [ - migrations.RunPython(unquote_folder_paths, quote_folder_paths), - ] diff --git a/osf/migrations/0033_user_emails_to_fk.py b/osf/migrations/0033_user_emails_to_fk.py deleted file mode 100644 index 5d8ac457c10..00000000000 --- a/osf/migrations/0033_user_emails_to_fk.py +++ /dev/null @@ -1,77 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11 on 2017-05-11 17:48 -from __future__ import unicode_literals - -from django.conf import settings -from django.db import migrations, models -from django.db.models.deletion import CASCADE -from django_extensions.db.fields import CreationDateTimeField, ModificationDateTimeField -from osf.models.validators import validate_email -from osf.utils.fields import LowercaseEmailField - - -def create_emails(user, Email): - uid = user['id'] - primary_email = user['username'].lower().strip() - emails = set([e.lower().strip() for e in user['emails']]) - active = user['is_active'] - if active or not Email.objects.filter(address=primary_email).exists(): - _, created = Email.objects.get_or_create(address=primary_email, user_id=uid) - assert created, 'Email object for username {} already exists'.format(primary_email) - for email in emails: - if email == primary_email: - # Already created above - continue - if active or not Email.objects.filter(address=email).exists(): - _, created = Email.objects.get_or_create(address=email, user_id=uid) - assert created, 'Email object for email {} on user {} already exists'.format(email, uid) - - -def populate_email_model(state, schema): - # Note: it is expected that any duplicates have been merged before this is ran. - # If not, this will error - OSFUser = state.get_model('osf', 'osfuser') - Email = state.get_model('osf', 'email') - for user in OSFUser.objects.filter(is_active=True).values('id', 'username', 'emails', 'is_active'): - # Give priority to active users - create_emails(user, Email) - for user in OSFUser.objects.filter(is_active=False, merged_by__isnull=True).values('id', 'username', 'emails', 'is_active'): - create_emails(user, Email) - - -def restore_old_emails(state, schema): - # Not possible with complete accuracy -- some disabled users may have lost info - Email = state.get_model('osf', 'email') - for email in Email.objects.all(): - if email.address not in email.user.emails: - email.user.emails.append(email.address) - email.user.save() - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0032_unquote_gd_nodesettings_folder_path'), - ] - - operations = [ - migrations.CreateModel( - name='Email', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('created', CreationDateTimeField(auto_now_add=True, verbose_name='created')), - ('modified', ModificationDateTimeField(auto_now=True, verbose_name='modified')), - ('address', LowercaseEmailField(max_length=254, unique=True, db_index=True, validators=[validate_email])), - ('user', models.ForeignKey(blank=False, null=False, on_delete=CASCADE, related_name='_emails', to=settings.AUTH_USER_MODEL)), - ], - options={ - 'abstract': False, - }, - ), - migrations.RunPython( - populate_email_model, restore_old_emails - ), - migrations.RemoveField( - model_name='osfuser', - name='emails' - ), - ] diff --git a/osf/migrations/0034_rename_email_user_relation.py b/osf/migrations/0034_rename_email_user_relation.py deleted file mode 100644 index cacab821123..00000000000 --- a/osf/migrations/0034_rename_email_user_relation.py +++ /dev/null @@ -1,22 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11 on 2017-05-11 22:25 -from __future__ import unicode_literals - -from django.conf import settings -from django.db.models.deletion import CASCADE -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0033_user_emails_to_fk'), - ] - - operations = [ - migrations.AlterField( - model_name='email', - name='user', - field=models.ForeignKey(on_delete=CASCADE, related_name='emails', to=settings.AUTH_USER_MODEL) - ), - ] diff --git a/osf/migrations/0035_metaschema_active.py b/osf/migrations/0035_metaschema_active.py deleted file mode 100644 index 1bdbaf008b5..00000000000 --- a/osf/migrations/0035_metaschema_active.py +++ /dev/null @@ -1,20 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.1 on 2017-06-05 18:58 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0034_rename_email_user_relation'), - ] - - operations = [ - migrations.AddField( - model_name='metaschema', - name='active', - field=models.BooleanField(default=True), - ), - ] diff --git a/osf/migrations/0036_auto_20170605_1520.py b/osf/migrations/0036_auto_20170605_1520.py deleted file mode 100644 index 419e8de6729..00000000000 --- a/osf/migrations/0036_auto_20170605_1520.py +++ /dev/null @@ -1,53 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.1 on 2017-06-05 20:20 -from __future__ import unicode_literals - -import django.contrib.postgres.fields -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0035_metaschema_active'), - ] - - operations = [ - migrations.RemoveField( - model_name='preprintprovider', - name='banner_name', - ), - migrations.RemoveField( - model_name='preprintprovider', - name='header_text', - ), - migrations.RemoveField( - model_name='preprintprovider', - name='logo_name', - ), - migrations.AddField( - model_name='preprintprovider', - name='additional_providers', - field=django.contrib.postgres.fields.ArrayField(base_field=models.CharField(max_length=200), blank=True, default=list, size=None), - ), - migrations.AddField( - model_name='preprintprovider', - name='allow_submissions', - field=models.BooleanField(default=True), - ), - migrations.AddField( - model_name='preprintprovider', - name='footer_links', - field=models.TextField(blank=True, default=''), - ), - migrations.AlterField( - model_name='preprintprovider', - name='advisory_board', - field=models.TextField(blank=True, default=''), - ), - migrations.AlterField( - model_name='preprintprovider', - name='description', - field=models.TextField(blank=True, default=''), - ), - ] diff --git a/osf/migrations/0037_ensure_licenses.py b/osf/migrations/0037_ensure_licenses.py deleted file mode 100644 index 577653824a4..00000000000 --- a/osf/migrations/0037_ensure_licenses.py +++ /dev/null @@ -1,20 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11 on 2017-05-24 19:33 -from __future__ import unicode_literals - -import logging - -from django.db import migrations - - -logger = logging.getLogger(__file__) - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0036_auto_20170605_1520'), - ] - - operations = [ - ] diff --git a/osf/migrations/0037_remove_emails_for_unconfirmed_users.py b/osf/migrations/0037_remove_emails_for_unconfirmed_users.py deleted file mode 100644 index 77dc970b1e9..00000000000 --- a/osf/migrations/0037_remove_emails_for_unconfirmed_users.py +++ /dev/null @@ -1,38 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.1 on 2017-06-16 19:59 -"""Removes Email objects that associated with unconfirmed users. These -were incorrectly created in 0033_user_emails_to_fk. -""" -from __future__ import unicode_literals - -from django.db import migrations - - -def remove_emails(state, *args, **kwargs): - Email = state.get_model('osf', 'email') - Email.objects.filter(user__date_confirmed__isnull=True).delete() - -# copied from 0033_user_emails_to_fk -def restore_emails(state, *args, **kwargs): - Email = state.get_model('osf', 'email') - OSFUser = state.get_model('osf', 'osfuser') - for user in OSFUser.objects.filter(date_confirmed__isnull=True).values('id', 'username', 'is_active'): - uid = user['id'] - primary_email = user['username'].lower().strip() - active = user['is_active'] - if active or not Email.objects.filter(address=primary_email).exists(): - _, created = Email.objects.get_or_create(address=primary_email, user_id=uid) - assert created, 'Email object for username {} already exists'.format(primary_email) - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0036_auto_20170605_1520'), - ] - - operations = [ - migrations.RunPython( - remove_emails, restore_emails - ), - ] diff --git a/osf/migrations/0038_ensure_schemas.py b/osf/migrations/0038_ensure_schemas.py deleted file mode 100644 index 404bc77d646..00000000000 --- a/osf/migrations/0038_ensure_schemas.py +++ /dev/null @@ -1,18 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11 on 2017-05-24 19:33 -from __future__ import unicode_literals - -import logging - -from django.db import migrations - -logger = logging.getLogger(__file__) - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0037_ensure_licenses'), - ] - - operations = [] diff --git a/osf/migrations/0039_maintenancestate.py b/osf/migrations/0039_maintenancestate.py deleted file mode 100644 index c853132220e..00000000000 --- a/osf/migrations/0039_maintenancestate.py +++ /dev/null @@ -1,24 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11 on 2017-06-07 17:44 -from __future__ import unicode_literals - -from django.db import migrations, models -import osf.utils.fields - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0038_ensure_schemas'), - ] - - operations = [ - migrations.CreateModel( - name='MaintenanceState', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('start', osf.utils.fields.NonNaiveDateTimeField()), - ('end', osf.utils.fields.NonNaiveDateTimeField()), - ], - ), - ] diff --git a/osf/migrations/0040_merge_20170619_0922.py b/osf/migrations/0040_merge_20170619_0922.py deleted file mode 100644 index a7a29d9e7d6..00000000000 --- a/osf/migrations/0040_merge_20170619_0922.py +++ /dev/null @@ -1,16 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.1 on 2017-06-19 14:22 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0039_maintenancestate'), - ('osf', '0037_remove_emails_for_unconfirmed_users'), - ] - - operations = [ - ] diff --git a/osf/migrations/0041_auto_20170706_1024.py b/osf/migrations/0041_auto_20170706_1024.py deleted file mode 100644 index 2f91b8f1c2a..00000000000 --- a/osf/migrations/0041_auto_20170706_1024.py +++ /dev/null @@ -1,25 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.2 on 2017-07-06 15:24 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0040_merge_20170619_0922'), - ] - - operations = [ - migrations.AddField( - model_name='subject', - name='highlighted', - field=models.BooleanField(db_index=True, default=False), - ), - migrations.AlterField( - model_name='subject', - name='text', - field=models.CharField(db_index=True, max_length=256), - ), - ] diff --git a/osf/migrations/0042_auto_20170707_1019.py b/osf/migrations/0042_auto_20170707_1019.py deleted file mode 100644 index aebd65ab022..00000000000 --- a/osf/migrations/0042_auto_20170707_1019.py +++ /dev/null @@ -1,50 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.2 on 2017-07-07 15:19 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0041_auto_20170706_1024'), - ] - - operations = [ - migrations.CreateModel( - name='BitbucketFileNode', - fields=[ - ], - options={ - 'proxy': True, - 'indexes': [], - }, - bases=('osf.basefilenode',), - ), - migrations.AlterField( - model_name='basefilenode', - name='type', - field=models.CharField(choices=[('osf.trashedfilenode', 'trashed file node'), ('osf.trashedfile', 'trashed file'), ('osf.trashedfolder', 'trashed folder'), ('osf.osfstoragefilenode', 'osf storage file node'), ('osf.osfstoragefile', 'osf storage file'), ('osf.osfstoragefolder', 'osf storage folder'), ('osf.bitbucketfilenode', 'bitbucket file node'), ('osf.bitbucketfolder', 'bitbucket folder'), ('osf.bitbucketfile', 'bitbucket file'), ('osf.boxfilenode', 'box file node'), ('osf.boxfolder', 'box folder'), ('osf.boxfile', 'box file'), ('osf.dataversefilenode', 'dataverse file node'), ('osf.dataversefolder', 'dataverse folder'), ('osf.dataversefile', 'dataverse file'), ('osf.dropboxfilenode', 'dropbox file node'), ('osf.dropboxfolder', 'dropbox folder'), ('osf.dropboxfile', 'dropbox file'), ('osf.figsharefilenode', 'figshare file node'), ('osf.figsharefolder', 'figshare folder'), ('osf.figsharefile', 'figshare file'), ('osf.githubfilenode', 'github file node'), ('osf.githubfolder', 'github folder'), ('osf.githubfile', 'github file'), ('osf.googledrivefilenode', 'google drive file node'), ('osf.googledrivefolder', 'google drive folder'), ('osf.googledrivefile', 'google drive file'), ('osf.owncloudfilenode', 'owncloud file node'), ('osf.owncloudfolder', 'owncloud folder'), ('osf.owncloudfile', 'owncloud file'), ('osf.s3filenode', 's3 file node'), ('osf.s3folder', 's3 folder'), ('osf.s3file', 's3 file')], db_index=True, max_length=255), - ), - migrations.CreateModel( - name='BitbucketFile', - fields=[ - ], - options={ - 'proxy': True, - 'indexes': [], - }, - bases=('osf.bitbucketfilenode', models.Model), - ), - migrations.CreateModel( - name='BitbucketFolder', - fields=[ - ], - options={ - 'proxy': True, - 'indexes': [], - }, - bases=('osf.bitbucketfilenode', models.Model), - ), - ] diff --git a/osf/migrations/0042_preprintprovider_share_title.py b/osf/migrations/0042_preprintprovider_share_title.py deleted file mode 100644 index c22b1b82247..00000000000 --- a/osf/migrations/0042_preprintprovider_share_title.py +++ /dev/null @@ -1,20 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.2 on 2017-07-20 18:24 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0041_auto_20170706_1024'), - ] - - operations = [ - migrations.AddField( - model_name='preprintprovider', - name='share_title', - field=models.TextField(blank=True, default=b''), - ), - ] diff --git a/osf/migrations/0043_merge_20170725_1328.py b/osf/migrations/0043_merge_20170725_1328.py deleted file mode 100644 index 02a5c8f1096..00000000000 --- a/osf/migrations/0043_merge_20170725_1328.py +++ /dev/null @@ -1,16 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.2 on 2017-07-25 18:28 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0042_auto_20170707_1019'), - ('osf', '0042_preprintprovider_share_title'), - ] - - operations = [ - ] diff --git a/osf/migrations/0043_set_share_title.py b/osf/migrations/0043_set_share_title.py deleted file mode 100644 index 3a2f366e9fe..00000000000 --- a/osf/migrations/0043_set_share_title.py +++ /dev/null @@ -1,44 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.1 on 2017-08-03 15:07 -"""Sets the share_title field on production PreprintProviders. Makes no -updates if the listed providers don't exist in the current envirionment. -""" -from __future__ import unicode_literals - -from django.db import migrations - -# _id => share_title -SHARE_TITLES = { - 'osf': 'OSF', - 'lawarxiv': 'LawArXiv', - 'mindrxiv': 'MindRxiv', - 'bitss': 'BITSS', - 'agrixiv': 'AgriXiv', - 'engrxiv': 'engrXiv', - 'lissa': 'LIS Scholarship Archive', - 'psyarxiv': 'PsyArXiv', - 'socarxiv': 'SocArXiv', -} - -def set_share_titles(state, *args, **kwargs): - PreprintProvider = state.get_model('osf', 'preprintprovider') - for provider in PreprintProvider.objects.filter(_id__in=list(SHARE_TITLES.keys())): - provider.share_title = SHARE_TITLES[provider._id] - provider.save() - - -def unset_share_titles(state, *args, **kwargs): - PreprintProvider = state.get_model('osf', 'preprintprovider') - PreprintProvider.objects.filter(_id__in=list(SHARE_TITLES.keys())).update(share_title='') - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0042_preprintprovider_share_title'), - ] - - operations = [ - migrations.RunPython( - set_share_titles, unset_share_titles - ), - ] diff --git a/osf/migrations/0044_basefilenode_uniqueness_index.py b/osf/migrations/0044_basefilenode_uniqueness_index.py deleted file mode 100644 index d222654344d..00000000000 --- a/osf/migrations/0044_basefilenode_uniqueness_index.py +++ /dev/null @@ -1,90 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals -import logging - -from django.db import connection -from django.db import migrations - -logger = logging.getLogger(__name__) - -def remove_duplicate_filenodes(*args): - from osf.models.files import BaseFileNode - sql = """ - SELECT id - FROM (SELECT - *, - LEAD(row, 1) - OVER () AS nextrow - FROM (SELECT - *, - ROW_NUMBER() - OVER (w) AS row - FROM (SELECT * - FROM osf_basefilenode - WHERE (node_id IS NULL OR name IS NULL OR parent_id IS NULL OR type IS NULL OR _path IS NULL) AND - type NOT IN ('osf.trashedfilenode', 'osf.trashedfile', 'osf.trashedfolder')) AS null_files - WINDOW w AS ( - PARTITION BY node_id, name, parent_id, type, _path - ORDER BY id )) AS x) AS y - WHERE row > 1 OR nextrow > 1; - """ - visited = [] - with connection.cursor() as cursor: - cursor.execute(sql) - dupes = BaseFileNode.objects.filter(id__in=[t[0] for t in cursor.fetchall()]) - logger.info('\nFound {} dupes, merging and removing'.format(dupes.count())) - for dupe in dupes: - visited.append(dupe.id) - force = False - next_dupe = dupes.exclude(id__in=visited).filter(node_id=dupe.node_id, name=dupe.name, parent_id=dupe.parent_id, type=dupe.type, _path=dupe._path).first() - if dupe.node_id is None: - # Bad data, force-delete - force = True - if not next_dupe: - # Last one, don't delete - continue - if dupe.versions.count() > 1: - logger.warn('{} Expected 0 or 1 versions, got {}'.format(dupe.id, dupe.versions.count())) - # Don't modify versioned files - continue - for guid in list(dupe.guids.all()): - guid.referent = next_dupe - guid.save() - if force: - BaseFileNode.objects.filter(id=dupe.id).delete() - else: - dupe.delete() - with connection.cursor() as cursor: - logger.info('Validating clean-up success...') - cursor.execute(sql) - dupes = BaseFileNode.objects.filter(id__in=cursor.fetchall()) - if dupes.exists(): - logger.error('Dupes exist after migration, failing\n{}'.format(dupes.values_list('id', flat=True))) - logger.info('Indexing...') - -def noop(*args): - pass - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0043_set_share_title'), - ] - - operations = [ - migrations.RunPython(remove_duplicate_filenodes, noop), - migrations.RunSQL( - [ - """ - CREATE UNIQUE INDEX active_file_node_path_name_type_unique_index - ON public.osf_basefilenode (node_id, _path, name, type) - WHERE (type NOT IN ('osf.trashedfilenode', 'osf.trashedfile', 'osf.trashedfolder') - AND parent_id IS NULL); - """ - ], [ - """ - DROP INDEX IF EXISTS active_file_node_path_name_type_unique_index RESTRICT; - """ - ] - ) - ] diff --git a/osf/migrations/0044_ever_mentioned_array_to_m2m.py b/osf/migrations/0044_ever_mentioned_array_to_m2m.py deleted file mode 100644 index 698d1e65512..00000000000 --- a/osf/migrations/0044_ever_mentioned_array_to_m2m.py +++ /dev/null @@ -1,49 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.2 on 2017-07-25 17:16 -from __future__ import unicode_literals - -from django.conf import settings -from django.db import migrations, models -from osf.utils.migrations import disable_auto_now_fields - - -def migrate_user_guid_array_to_m2m(state, schema): - from osf.models import OSFUser as FindableOSFUser - AddableOSFUser = state.get_model('osf', 'osfuser') - Comment = state.get_model('osf', 'comment') - for comment in Comment.objects.exclude(_ever_mentioned=[]).all(): - for user in AddableOSFUser.objects.filter(id__in=[FindableOSFUser.objects.get(guids___id=_id).id for _id in comment._ever_mentioned]): - comment.ever_mentioned.add(user) - -def unmigrate_user_guid_array_from_m2m(state, schema): - Comment = state.get_model('osf', 'comment') - with disable_auto_now_fields(models=[Comment]): - for comment in Comment.objects.exclude(ever_mentioned__isnull=False).all(): - comment._ever_mentioned = list(comment.ever_mentioned.values_list('guids___id', flat=True)) - comment.save() - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0043_merge_20170725_1328'), - ] - - operations = [ - migrations.RenameField( - model_name='comment', - old_name='ever_mentioned', - new_name='_ever_mentioned' - ), - migrations.AddField( - model_name='comment', - name='ever_mentioned', - field=models.ManyToManyField(blank=True, related_name='mentioned_in', to=settings.AUTH_USER_MODEL), - ), - migrations.RunPython( - migrate_user_guid_array_to_m2m, unmigrate_user_guid_array_from_m2m - ), - migrations.RemoveField( - model_name='comment', - name='_ever_mentioned' - ), - ] diff --git a/osf/migrations/0045_add_view_subject_permissions.py b/osf/migrations/0045_add_view_subject_permissions.py deleted file mode 100644 index 21dcdc9b95a..00000000000 --- a/osf/migrations/0045_add_view_subject_permissions.py +++ /dev/null @@ -1,19 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11 on 2017-07-17 20:11 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0044_ever_mentioned_array_to_m2m'), - ] - - operations = [ - migrations.AlterModelOptions( - name='subject', - options={'base_manager_name': 'objects', 'permissions': (('view_subject', 'Can view subject details'),)}, - ), - ] diff --git a/osf/migrations/0046_merge_20170803_1147.py b/osf/migrations/0046_merge_20170803_1147.py deleted file mode 100644 index d089de1980e..00000000000 --- a/osf/migrations/0046_merge_20170803_1147.py +++ /dev/null @@ -1,16 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.1 on 2017-08-03 16:47 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0043_set_share_title'), - ('osf', '0045_add_view_subject_permissions'), - ] - - operations = [ - ] diff --git a/osf/migrations/0047_remove_abstractnode_users_watching_node.py b/osf/migrations/0047_remove_abstractnode_users_watching_node.py deleted file mode 100644 index c40a74fb37f..00000000000 --- a/osf/migrations/0047_remove_abstractnode_users_watching_node.py +++ /dev/null @@ -1,19 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.1 on 2017-08-03 17:30 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0046_merge_20170803_1147'), - ] - - operations = [ - migrations.RemoveField( - model_name='abstractnode', - name='users_watching_node', - ), - ] diff --git a/osf/migrations/0048_merge_20170804_0910.py b/osf/migrations/0048_merge_20170804_0910.py deleted file mode 100644 index d4469bde49e..00000000000 --- a/osf/migrations/0048_merge_20170804_0910.py +++ /dev/null @@ -1,16 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.1 on 2017-08-04 14:10 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0047_remove_abstractnode_users_watching_node'), - ('osf', '0044_basefilenode_uniqueness_index'), - ] - - operations = [ - ] diff --git a/osf/migrations/0049_preprintprovider_preprint_word.py b/osf/migrations/0049_preprintprovider_preprint_word.py deleted file mode 100644 index 685914e0cdd..00000000000 --- a/osf/migrations/0049_preprintprovider_preprint_word.py +++ /dev/null @@ -1,20 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.2 on 2017-08-09 17:56 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0048_merge_20170804_0910'), - ] - - operations = [ - migrations.AddField( - model_name='preprintprovider', - name='preprint_word', - field=models.CharField(choices=[('preprint', 'Preprint'), ('paper', 'Paper'), ('thesis', 'Thesis'), ('none', 'None')], default='preprint', max_length=10), - ), - ] diff --git a/osf/migrations/0050_auto_20170809_1511.py b/osf/migrations/0050_auto_20170809_1511.py deleted file mode 100644 index fd4158f93c6..00000000000 --- a/osf/migrations/0050_auto_20170809_1511.py +++ /dev/null @@ -1,25 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.4 on 2017-08-09 20:11 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0049_preprintprovider_preprint_word'), - ] - - operations = [ - migrations.AddField( - model_name='maintenancestate', - name='level', - field=models.IntegerField(choices=[(1, 'info'), (2, 'warning'), (3, 'danger')], default=1), - ), - migrations.AddField( - model_name='maintenancestate', - name='message', - field=models.TextField(blank=True), - ), - ] diff --git a/osf/migrations/0051_remove_invalid_social_entries.py b/osf/migrations/0051_remove_invalid_social_entries.py deleted file mode 100644 index ac002d2e682..00000000000 --- a/osf/migrations/0051_remove_invalid_social_entries.py +++ /dev/null @@ -1,37 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.3 on 2017-08-10 12:35 -from __future__ import unicode_literals - -from django.db import migrations - -from osf.models import OSFUser as osfuser - -import logging - -logger = logging.getLogger(__file__) - -def remove_invalid_social_entries(state, *args, **kwargs): - OSFUser = state.get_model('osf', 'osfuser') - # targets = OSFUser.objects.filter() - targets = OSFUser.objects.exclude(social={}) - - logger.info('Removing invalid social entries!') - - for user in targets: - for invalid_key in set(user.social.keys()) - set(osfuser.SOCIAL_FIELDS.keys()): - logger.warn(str(dir(user))) - user.social.pop(invalid_key) - logger.info('User ID {0}: dropped social: {1}'.format(user.id, invalid_key)) - user.save() - - logger.info('Invalid social entry removal completed.') - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0050_auto_20170809_1511'), - ] - - operations = [ - migrations.RunPython(remove_invalid_social_entries) - ] diff --git a/osf/migrations/0052_preprintprovider_share_publish_type.py b/osf/migrations/0052_preprintprovider_share_publish_type.py deleted file mode 100644 index 6e612af5e13..00000000000 --- a/osf/migrations/0052_preprintprovider_share_publish_type.py +++ /dev/null @@ -1,20 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.4 on 2017-08-11 18:58 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0051_remove_invalid_social_entries'), - ] - - operations = [ - migrations.AddField( - model_name='preprintprovider', - name='share_publish_type', - field=models.CharField(choices=[(b'Preprint', b'Preprint'), (b'Thesis', b'Thesis')], default=b'Preprint', help_text=b'This SHARE type will be used when pushing publications to SHARE', max_length=32), - ), - ] diff --git a/osf/migrations/0053_add_quickfiles.py b/osf/migrations/0053_add_quickfiles.py deleted file mode 100644 index 23f39590765..00000000000 --- a/osf/migrations/0053_add_quickfiles.py +++ /dev/null @@ -1,117 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11 on 2017-06-13 17:35 -from __future__ import unicode_literals - -import logging - -from django.db import migrations, models -from django.core.paginator import Paginator - -from addons.osfstorage.models import NodeSettings as OSFSNodeSettings, OsfStorageFolder -from osf.models import OSFUser, QuickFilesNode, Contributor -from osf.models.base import ensure_guid -from osf.models.quickfiles import get_quickfiles_project_title - -logger = logging.getLogger(__name__) -logging.basicConfig(level=logging.INFO) - - -def add_quickfiles(*args, **kwargs): - ids_without_quickfiles = list(OSFUser.objects.exclude(nodes_created__type=QuickFilesNode._typedmodels_type).values_list('id', flat=True)) - - users_without_quickfiles = OSFUser.objects.filter(id__in=ids_without_quickfiles).order_by('id') - total_quickfiles_to_create = users_without_quickfiles.count() - - logger.info('About to add a QuickFilesNode for {} users.'.format(total_quickfiles_to_create)) - - paginated_users = Paginator(users_without_quickfiles, 1000) - - total_created = 0 - for page_num in paginated_users.page_range: - quickfiles_to_create = [] - for user in paginated_users.page(page_num).object_list: - quickfiles_to_create.append( - QuickFilesNode( - title=get_quickfiles_project_title(user), - creator=user - ) - ) - total_created += 1 - - all_quickfiles = QuickFilesNode.objects.bulk_create(quickfiles_to_create) - logger.info('Created {}/{} QuickFilesNodes'.format(total_created, total_quickfiles_to_create)) - logger.info('Preparing to create contributors and folders') - - contributors_to_create = [] - osfs_folders_to_create = [] - for quickfiles in all_quickfiles: - ensure_guid(QuickFilesNode, quickfiles, True) - osfs_folders_to_create.append( - OsfStorageFolder(provider='osfstorage', name='', node=quickfiles) - ) - - contributors_to_create.append( - Contributor( - user=quickfiles.creator, - node=quickfiles, - visible=True, - read=True, - write=True, - admin=True, - _order=0 - ) - ) - - Contributor.objects.bulk_create(contributors_to_create) - OsfStorageFolder.objects.bulk_create(osfs_folders_to_create) - - logger.info('Contributors and addons folders') - logger.info('Adding storage addons') - osfs_to_create = [] - for folder in osfs_folders_to_create: - osfs_to_create.append( - OSFSNodeSettings(owner=folder.node, root_node=folder) - ) - - OSFSNodeSettings.objects.bulk_create(osfs_to_create) - -def remove_quickfiles(*args, **kwargs): - QuickFilesNode.objects.all().delete() - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0052_preprintprovider_share_publish_type'), - ] - - operations = [ - migrations.CreateModel( - name='QuickFilesNode', - fields=[ - ], - options={ - 'proxy': True, - 'indexes': [], - }, - bases=('osf.abstractnode',), - ), - migrations.AlterField( - model_name='abstractnode', - name='type', - field=models.CharField(choices=[('osf.node', 'node'), ('osf.collection', 'collection'), ('osf.registration', 'registration'), ('osf.quickfilesnode', 'quickfilesnode')], db_index=True, max_length=255), - ), - migrations.RunPython(add_quickfiles, remove_quickfiles), - migrations.RunSQL( - [ - """ - CREATE UNIQUE INDEX one_quickfiles_per_user ON osf_abstractnode (creator_id, type, is_deleted) - WHERE type='osf.quickfilesnode' AND is_deleted=FALSE; - """ - ], [ - """ - DROP INDEX IF EXISTS one_quickfiles_per_user RESTRICT; - """ - ] - ), - ] diff --git a/osf/migrations/0053_nodelog_faster_index.py b/osf/migrations/0053_nodelog_faster_index.py deleted file mode 100644 index cfb2d65ca93..00000000000 --- a/osf/migrations/0053_nodelog_faster_index.py +++ /dev/null @@ -1,21 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.4 on 2017-08-30 16:59 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0052_preprintprovider_share_publish_type'), - ] - - operations = [ - migrations.RunSQL([ - 'CREATE INDEX nodelog__node_id_date_desc on osf_nodelog (node_id, date DESC);', - # 'VACUUM ANALYZE osf_nodelog;' # Run this manually, requires ~3 min downtime - ], [ - 'DROP INDEX IF EXISTS nodelog__node_id_date_desc RESTRICT;', - ]) - ] diff --git a/osf/migrations/0054_add_file_version_indices.py b/osf/migrations/0054_add_file_version_indices.py deleted file mode 100644 index f1b7e49c438..00000000000 --- a/osf/migrations/0054_add_file_version_indices.py +++ /dev/null @@ -1,24 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.4 on 2017-09-11 18:14 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0053_nodelog_faster_index'), - ] - - operations = [ - migrations.RunSQL([ - 'CREATE INDEX basefilenode_versions_compound_ids ON osf_basefilenode_versions (basefilenode_id, fileversion_id);', - 'CREATE INDEX fileversion_date_created_desc on osf_fileversion (date_created DESC);', - # 'VACUUM ANALYZE osf_basefilenode_versions;' # Run this manually, requires ~1 min downtime - # 'VACUUM ANALYZE osf_fileversion;' # Run this manually, requires ~2 min downtime - ], [ - 'DROP INDEX IF EXISTS basefilenode_versions_compound_ids RESTRICT;', - 'DROP INDEX IF EXISTS fileversion_date_created_desc RESTRICT;', - ]) - ] diff --git a/osf/migrations/0054_auto_20170823_1555.py b/osf/migrations/0054_auto_20170823_1555.py deleted file mode 100644 index d36458d4ee5..00000000000 --- a/osf/migrations/0054_auto_20170823_1555.py +++ /dev/null @@ -1,20 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.4 on 2017-08-23 20:55 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0053_add_quickfiles'), - ] - - operations = [ - migrations.AlterField( - model_name='abstractnode', - name='type', - field=models.CharField(choices=[('osf.node', 'node'), ('osf.collection', 'collection'), ('osf.registration', 'registration'), ('osf.quickfilesnode', 'quick files node')], db_index=True, max_length=255), - ), - ] diff --git a/osf/migrations/0055_auto_20170823_1648.py b/osf/migrations/0055_auto_20170823_1648.py deleted file mode 100644 index 585d8fcb78c..00000000000 --- a/osf/migrations/0055_auto_20170823_1648.py +++ /dev/null @@ -1,22 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.2 on 2017-08-23 21:48 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0054_auto_20170823_1555'), - ] - - operations = [ - migrations.RemoveField( - model_name='abstractnode', - name='alternative_citations', - ), - migrations.DeleteModel( - name='AlternativeCitation', - ), - ] diff --git a/osf/migrations/0055_update_metaschema_active.py b/osf/migrations/0055_update_metaschema_active.py deleted file mode 100644 index aaf618f164a..00000000000 --- a/osf/migrations/0055_update_metaschema_active.py +++ /dev/null @@ -1,21 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.4 on 2017-09-14 14:32 -from __future__ import unicode_literals - -from django.db import migrations - - -def update_metaschema_active(*args, **kwargs): - MetaSchema = args[0].get_model('osf', 'metaschema') - MetaSchema.objects.filter(schema_version__lt=2).update(active=False) - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0054_add_file_version_indices'), - ] - - operations = [ - migrations.RunPython(update_metaschema_active, ), - ] diff --git a/osf/migrations/0056_merge_20170831_0832.py b/osf/migrations/0056_merge_20170831_0832.py deleted file mode 100644 index 887fe77a98b..00000000000 --- a/osf/migrations/0056_merge_20170831_0832.py +++ /dev/null @@ -1,16 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.4 on 2017-08-31 13:32 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0053_nodelog_faster_index'), - ('osf', '0055_auto_20170823_1648'), - ] - - operations = [ - ] diff --git a/osf/migrations/0057_order_fileversion_by_date_created.py b/osf/migrations/0057_order_fileversion_by_date_created.py deleted file mode 100644 index e2a801dffa7..00000000000 --- a/osf/migrations/0057_order_fileversion_by_date_created.py +++ /dev/null @@ -1,19 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.3 on 2017-09-13 17:49 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0056_merge_20170831_0832'), - ] - - operations = [ - migrations.AlterModelOptions( - name='fileversion', - options={'ordering': ('-date_created',)}, - ), - ] diff --git a/osf/migrations/0058_merge_20170913_2232.py b/osf/migrations/0058_merge_20170913_2232.py deleted file mode 100644 index dae51095b09..00000000000 --- a/osf/migrations/0058_merge_20170913_2232.py +++ /dev/null @@ -1,16 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.4 on 2017-09-14 03:32 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0057_order_fileversion_by_date_created'), - ('osf', '0054_add_file_version_indices'), - ] - - operations = [ - ] diff --git a/osf/migrations/0059_merge_20170914_1100.py b/osf/migrations/0059_merge_20170914_1100.py deleted file mode 100644 index d2884469f17..00000000000 --- a/osf/migrations/0059_merge_20170914_1100.py +++ /dev/null @@ -1,16 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.4 on 2017-09-14 16:00 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0058_merge_20170913_2232'), - ('osf', '0055_update_metaschema_active'), - ] - - operations = [ - ] diff --git a/osf/migrations/0060_add_nodelog_should_hide_nid_index.py b/osf/migrations/0060_add_nodelog_should_hide_nid_index.py deleted file mode 100644 index 493140a8e43..00000000000 --- a/osf/migrations/0060_add_nodelog_should_hide_nid_index.py +++ /dev/null @@ -1,21 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.4 on 2017-10-09 22:12 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - atomic = False # CREATE INDEX CONCURRENTLY cannot be run in a txn - - dependencies = [ - ('osf', '0059_merge_20170914_1100'), - ] - - operations = [ - migrations.RunSQL([ - 'CREATE INDEX CONCURRENTLY osf_nodelog_should_hide_nid ON osf_nodelog (should_hide, node_id);', - ], [ - 'DROP INDEX IF EXISTS osf_nodelog_should_hide_nid, RESTRICT;' - ]) - ] diff --git a/osf/migrations/0060_reviews.py b/osf/migrations/0060_reviews.py deleted file mode 100644 index 3b946733fe1..00000000000 --- a/osf/migrations/0060_reviews.py +++ /dev/null @@ -1,72 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.4 on 2017-09-14 11:09 -from __future__ import unicode_literals - -from django.conf import settings -from django.db import migrations, models -import django.db.models.deletion -import osf.models.base -import osf.utils.fields - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0059_merge_20170914_1100'), - ('guardian', '0001_initial'), - ] - - operations = [ - migrations.CreateModel( - name='Action', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), - ('trigger', models.CharField(choices=[('accept', 'Accept'), ('edit_comment', 'Edit_Comment'), ('reject', 'Reject'), ('submit', 'Submit')], max_length=31)), - ('from_state', models.CharField(choices=[('accepted', 'Accepted'), ('initial', 'Initial'), ('pending', 'Pending'), ('rejected', 'Rejected')], max_length=31)), - ('to_state', models.CharField(choices=[('accepted', 'Accepted'), ('initial', 'Initial'), ('pending', 'Pending'), ('rejected', 'Rejected')], max_length=31)), - ('comment', models.TextField(blank=True)), - ('is_deleted', models.BooleanField(default=False)), - ('date_created', osf.utils.fields.NonNaiveDateTimeField(auto_now_add=True)), - ('date_modified', osf.utils.fields.NonNaiveDateTimeField(auto_now=True)), - ('creator', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='+', to=settings.AUTH_USER_MODEL)), - ], - options={ - 'abstract': False, - }, - ), - migrations.AlterModelOptions( - name='preprintprovider', - options={'permissions': (('view_submissions', 'Can view all submissions to this provider'), ('add_moderator', 'Can add other users as moderators for this provider'), ('view_actions', 'Can view actions on submissions to this provider'), ('add_reviewer', 'Can add other users as reviewers for this provider'), ('review_assigned_submissions', 'Can submit reviews for submissions to this provider which have been assigned to this user'), ('assign_reviewer', 'Can assign reviewers to review specific submissions to this provider'), ('set_up_moderation', 'Can set up moderation for this provider'), ('view_assigned_submissions', 'Can view submissions to this provider which have been assigned to this user'), ('edit_reviews_settings', 'Can edit reviews settings for this provider'), ('accept_submissions', 'Can accept submissions to this provider'), ('reject_submissions', 'Can reject submissions to this provider'), ('edit_review_comments', 'Can edit comments on actions for this provider'), ('view_preprintprovider', 'Can view preprint provider details'))}, - ), - migrations.AddField( - model_name='preprintprovider', - name='reviews_comments_anonymous', - field=models.NullBooleanField(), - ), - migrations.AddField( - model_name='preprintprovider', - name='reviews_comments_private', - field=models.NullBooleanField(), - ), - migrations.AddField( - model_name='preprintprovider', - name='reviews_workflow', - field=models.CharField(blank=True, choices=[(None, 'None'), ('pre-moderation', 'Pre-Moderation'), ('post-moderation', 'Post-Moderation')], max_length=15, null=True), - ), - migrations.AddField( - model_name='preprintservice', - name='date_last_transitioned', - field=models.DateTimeField(blank=True, db_index=True, null=True), - ), - migrations.AddField( - model_name='preprintservice', - name='reviews_state', - field=models.CharField(choices=[('accepted', 'Accepted'), ('initial', 'Initial'), ('pending', 'Pending'), ('rejected', 'Rejected')], db_index=True, default='initial', max_length=15), - ), - migrations.AddField( - model_name='action', - name='target', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='actions', to='osf.PreprintService'), - ), - ] diff --git a/osf/migrations/0061_add_reviews_notification_subscription.py b/osf/migrations/0061_add_reviews_notification_subscription.py deleted file mode 100644 index ae9c691c865..00000000000 --- a/osf/migrations/0061_add_reviews_notification_subscription.py +++ /dev/null @@ -1,20 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.4 on 2017-10-02 19:38 -from __future__ import unicode_literals - -from django.db import migrations -from osf.management.commands.add_notification_subscription import add_reviews_notification_setting - - -def add_reviews_notification_subscription(state, schema_editor): - add_reviews_notification_setting('global_reviews', state=state) - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0060_reviews'), - ] - - operations = [ - migrations.RunPython(add_reviews_notification_subscription), - ] diff --git a/osf/migrations/0062_accept_preprints.py b/osf/migrations/0062_accept_preprints.py deleted file mode 100644 index 7eeec8c1cb9..00000000000 --- a/osf/migrations/0062_accept_preprints.py +++ /dev/null @@ -1,29 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.4 on 2017-09-27 19:13 -from __future__ import unicode_literals - -from django.db import migrations -from django.db.models import F - -from osf.utils.workflows import DefaultStates - - -# When a preprint provider is set up with a reviews/moderation workflow, -# make sure all existing preprints will be in a public state. -def accept_all_published_preprints(apps, schema_editor): - Preprint = apps.get_model('osf', 'PreprintService') - published_preprints = Preprint.objects.filter(is_published=True, reviews_state=DefaultStates.INITIAL.value) - published_preprints.update(reviews_state=DefaultStates.ACCEPTED.value, date_last_transitioned=F('date_published')) - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0061_add_reviews_notification_subscription'), - ] - - operations = [ - migrations.RunPython( - accept_all_published_preprints - ), - ] diff --git a/osf/migrations/0063_merge_20171012_1215.py b/osf/migrations/0063_merge_20171012_1215.py deleted file mode 100644 index 762f3d5ee2e..00000000000 --- a/osf/migrations/0063_merge_20171012_1215.py +++ /dev/null @@ -1,16 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.4 on 2017-10-12 17:15 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0060_add_nodelog_should_hide_nid_index'), - ('osf', '0062_accept_preprints'), - ] - - operations = [ - ] diff --git a/osf/migrations/0064_auto_20171019_0918.py b/osf/migrations/0064_auto_20171019_0918.py deleted file mode 100644 index 194a33efc1a..00000000000 --- a/osf/migrations/0064_auto_20171019_0918.py +++ /dev/null @@ -1,20 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.4 on 2017-10-19 14:18 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0063_merge_20171012_1215'), - ] - - operations = [ - migrations.AlterField( - model_name='notificationdigest', - name='message', - field=models.TextField(), - ), - ] diff --git a/osf/migrations/0065_auto_20171024_1330.py b/osf/migrations/0065_auto_20171024_1330.py deleted file mode 100644 index 8999ebfedda..00000000000 --- a/osf/migrations/0065_auto_20171024_1330.py +++ /dev/null @@ -1,50 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.4 on 2017-10-24 18:30 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0064_auto_20171019_0918'), - ] - - operations = [ - migrations.CreateModel( - name='GitLabFileNode', - fields=[ - ], - options={ - 'proxy': True, - 'indexes': [], - }, - bases=('osf.basefilenode',), - ), - migrations.AlterField( - model_name='basefilenode', - name='type', - field=models.CharField(choices=[('osf.trashedfilenode', 'trashed file node'), ('osf.trashedfile', 'trashed file'), ('osf.trashedfolder', 'trashed folder'), ('osf.osfstoragefilenode', 'osf storage file node'), ('osf.osfstoragefile', 'osf storage file'), ('osf.osfstoragefolder', 'osf storage folder'), ('osf.bitbucketfilenode', 'bitbucket file node'), ('osf.bitbucketfolder', 'bitbucket folder'), ('osf.bitbucketfile', 'bitbucket file'), ('osf.boxfilenode', 'box file node'), ('osf.boxfolder', 'box folder'), ('osf.boxfile', 'box file'), ('osf.dataversefilenode', 'dataverse file node'), ('osf.dataversefolder', 'dataverse folder'), ('osf.dataversefile', 'dataverse file'), ('osf.dropboxfilenode', 'dropbox file node'), ('osf.dropboxfolder', 'dropbox folder'), ('osf.dropboxfile', 'dropbox file'), ('osf.figsharefilenode', 'figshare file node'), ('osf.figsharefolder', 'figshare folder'), ('osf.figsharefile', 'figshare file'), ('osf.githubfilenode', 'github file node'), ('osf.githubfolder', 'github folder'), ('osf.githubfile', 'github file'), ('osf.gitlabfilenode', 'git lab file node'), ('osf.gitlabfolder', 'git lab folder'), ('osf.gitlabfile', 'git lab file'), ('osf.googledrivefilenode', 'google drive file node'), ('osf.googledrivefolder', 'google drive folder'), ('osf.googledrivefile', 'google drive file'), ('osf.owncloudfilenode', 'owncloud file node'), ('osf.owncloudfolder', 'owncloud folder'), ('osf.owncloudfile', 'owncloud file'), ('osf.s3filenode', 's3 file node'), ('osf.s3folder', 's3 folder'), ('osf.s3file', 's3 file')], db_index=True, max_length=255), - ), - migrations.CreateModel( - name='GitLabFile', - fields=[ - ], - options={ - 'proxy': True, - 'indexes': [], - }, - bases=('osf.gitlabfilenode', models.Model), - ), - migrations.CreateModel( - name='GitLabFolder', - fields=[ - ], - options={ - 'proxy': True, - 'indexes': [], - }, - bases=('osf.gitlabfilenode', models.Model), - ), - ] diff --git a/osf/migrations/0065_preprintservice_original_publication_date.py b/osf/migrations/0065_preprintservice_original_publication_date.py deleted file mode 100644 index fa5d4328f82..00000000000 --- a/osf/migrations/0065_preprintservice_original_publication_date.py +++ /dev/null @@ -1,21 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.4 on 2017-10-24 17:29 -from __future__ import unicode_literals - -from django.db import migrations -import osf.utils.fields - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0064_auto_20171019_0918'), - ] - - operations = [ - migrations.AddField( - model_name='preprintservice', - name='original_publication_date', - field=osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True), - ), - ] diff --git a/osf/migrations/0066_merge_20171121_1050.py b/osf/migrations/0066_merge_20171121_1050.py deleted file mode 100644 index 8c3658528ff..00000000000 --- a/osf/migrations/0066_merge_20171121_1050.py +++ /dev/null @@ -1,16 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.7 on 2017-11-21 16:50 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0065_preprintservice_original_publication_date'), - ('osf', '0065_auto_20171024_1330'), - ] - - operations = [ - ] diff --git a/osf/migrations/0067_auto_20171121_1050.py b/osf/migrations/0067_auto_20171121_1050.py deleted file mode 100644 index 5a6e43da58c..00000000000 --- a/osf/migrations/0067_auto_20171121_1050.py +++ /dev/null @@ -1,50 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.7 on 2017-11-21 16:50 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0066_merge_20171121_1050'), - ] - - operations = [ - migrations.CreateModel( - name='OneDriveFileNode', - fields=[ - ], - options={ - 'proxy': True, - 'indexes': [], - }, - bases=('osf.basefilenode',), - ), - migrations.AlterField( - model_name='basefilenode', - name='type', - field=models.CharField(choices=[('osf.trashedfilenode', 'trashed file node'), ('osf.trashedfile', 'trashed file'), ('osf.trashedfolder', 'trashed folder'), ('osf.osfstoragefilenode', 'osf storage file node'), ('osf.osfstoragefile', 'osf storage file'), ('osf.osfstoragefolder', 'osf storage folder'), ('osf.bitbucketfilenode', 'bitbucket file node'), ('osf.bitbucketfolder', 'bitbucket folder'), ('osf.bitbucketfile', 'bitbucket file'), ('osf.boxfilenode', 'box file node'), ('osf.boxfolder', 'box folder'), ('osf.boxfile', 'box file'), ('osf.dataversefilenode', 'dataverse file node'), ('osf.dataversefolder', 'dataverse folder'), ('osf.dataversefile', 'dataverse file'), ('osf.dropboxfilenode', 'dropbox file node'), ('osf.dropboxfolder', 'dropbox folder'), ('osf.dropboxfile', 'dropbox file'), ('osf.figsharefilenode', 'figshare file node'), ('osf.figsharefolder', 'figshare folder'), ('osf.figsharefile', 'figshare file'), ('osf.githubfilenode', 'github file node'), ('osf.githubfolder', 'github folder'), ('osf.githubfile', 'github file'), ('osf.gitlabfilenode', 'git lab file node'), ('osf.gitlabfolder', 'git lab folder'), ('osf.gitlabfile', 'git lab file'), ('osf.googledrivefilenode', 'google drive file node'), ('osf.googledrivefolder', 'google drive folder'), ('osf.googledrivefile', 'google drive file'), ('osf.onedrivefilenode', 'one drive file node'), ('osf.onedrivefolder', 'one drive folder'), ('osf.onedrivefile', 'one drive file'), ('osf.owncloudfilenode', 'owncloud file node'), ('osf.owncloudfolder', 'owncloud folder'), ('osf.owncloudfile', 'owncloud file'), ('osf.s3filenode', 's3 file node'), ('osf.s3folder', 's3 folder'), ('osf.s3file', 's3 file')], db_index=True, max_length=255), - ), - migrations.CreateModel( - name='OneDriveFile', - fields=[ - ], - options={ - 'proxy': True, - 'indexes': [], - }, - bases=('osf.onedrivefilenode', models.Model), - ), - migrations.CreateModel( - name='OneDriveFolder', - fields=[ - ], - options={ - 'proxy': True, - 'indexes': [], - }, - bases=('osf.onedrivefilenode', models.Model), - ), - ] diff --git a/osf/migrations/0068_creator_modified_renames.py b/osf/migrations/0068_creator_modified_renames.py deleted file mode 100644 index 11b56a3d2cf..00000000000 --- a/osf/migrations/0068_creator_modified_renames.py +++ /dev/null @@ -1,27 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.2 on 2017-07-13 15:25 -from __future__ import unicode_literals - -from django.conf import settings -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0067_auto_20171121_1050'), - ] - - operations = [ - migrations.AlterField( - model_name='abstractnode', - name='creator', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='nodes_created', to=settings.AUTH_USER_MODEL), - ), - migrations.RenameField( - model_name='comment', - old_name='modified', - new_name='edited' - ), - ] diff --git a/osf/migrations/0068_draftregistration_deleted.py b/osf/migrations/0068_draftregistration_deleted.py deleted file mode 100644 index ae7967c733b..00000000000 --- a/osf/migrations/0068_draftregistration_deleted.py +++ /dev/null @@ -1,21 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.7 on 2017-11-27 16:35 -from __future__ import unicode_literals - -from django.db import migrations -import osf.utils.fields - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0067_auto_20171121_1050'), - ] - - operations = [ - migrations.AddField( - model_name='draftregistration', - name='deleted', - field=osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True), - ), - ] diff --git a/osf/migrations/0068_preprintservice_preprint_doi_created.py b/osf/migrations/0068_preprintservice_preprint_doi_created.py deleted file mode 100644 index 19de40a4900..00000000000 --- a/osf/migrations/0068_preprintservice_preprint_doi_created.py +++ /dev/null @@ -1,21 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.7 on 2017-11-27 17:19 -from __future__ import unicode_literals - -from django.db import migrations -import osf.utils.fields - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0067_auto_20171121_1050'), - ] - - operations = [ - migrations.AddField( - model_name='preprintservice', - name='preprint_doi_created', - field=osf.utils.fields.NonNaiveDateTimeField(blank=True, default=None, null=True), - ), - ] diff --git a/osf/migrations/0069_auto_20171127_1119.py b/osf/migrations/0069_auto_20171127_1119.py deleted file mode 100644 index 96c99c8bc1e..00000000000 --- a/osf/migrations/0069_auto_20171127_1119.py +++ /dev/null @@ -1,50 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.7 on 2017-11-27 17:19 -from __future__ import unicode_literals -import logging - -from django.db import migrations -from osf.utils.migrations import disable_auto_now_fields - -logger = logging.getLogger(__name__) - -def add_preprint_doi_created(state, schema): - """ - Sets preprint_doi_created equal to date_published for existing published preprints. - """ - PreprintService = state.get_model('osf', 'preprintservice') - null_preprint_doi_created = PreprintService.objects.filter(preprint_doi_created__isnull=True, date_published__isnull=False) - preprints_count = null_preprint_doi_created.count() - current_preprint = 0 - logger.info('{} published preprints found with preprint_doi_created is null.'.format(preprints_count)) - ContentType = state.get_model('contenttypes', 'ContentType') - Identifier = state.get_model('osf', 'identifier') - - with disable_auto_now_fields(models=[PreprintService]): - for preprint in null_preprint_doi_created: - current_preprint += 1 - content_type = ContentType.objects.get_for_model(preprint) - if Identifier.objects.filter(object_id=preprint.id, category='doi', content_type=content_type).exists(): - preprint.preprint_doi_created = preprint.date_published - preprint.save() - logger.info('Preprint ID {}, {}/{} preprint_doi_created field populated.'.format(preprint.id, current_preprint, preprints_count)) - else: - logger.info('Preprint ID {}, {}/{} skipped because a DOI has not been created.'.format(preprint.id, current_preprint, preprints_count)) - -def reverse_func(state, schema): - """ - Reverses data migration. Sets preprint_doi_created field back to null. - """ - PreprintService = state.get_model('osf', 'preprintservice') - logger.info('Reversing preprint_doi_created migration.') - PreprintService.objects.filter(preprint_doi_created__isnull=False).update(preprint_doi_created=None) - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0068_preprintservice_preprint_doi_created'), - ] - - operations = [ - migrations.RunPython(add_preprint_doi_created, reverse_func) - ] diff --git a/osf/migrations/0069_skippable_created_modified.py b/osf/migrations/0069_skippable_created_modified.py deleted file mode 100644 index 9b6bc3bdfc7..00000000000 --- a/osf/migrations/0069_skippable_created_modified.py +++ /dev/null @@ -1,510 +0,0 @@ -# -*- coding: utf-8 -*- -# Note: -# This migration is skippable if `scripts/premigrate_created_modified.py` -# is utilized. It allows the larger of these tables to be updated asynchronously without downtime. -# It requires not releasing these model changes until the beat tasks are approximately complete. -from __future__ import unicode_literals -import logging - -from django.db import migrations -import django.utils.timezone -import django_extensions.db.fields -import osf.utils.fields -from website import settings - -logger = logging.getLogger(__file__) - -PREMIGRATED = '1-minute-incremental-migrations' in settings.CeleryConfig.beat_schedule - -def finalize_premigrated(state, schema): - from scripts.premigrate_created_modified import finalize_migration - logger.info('Finalizing pre-migraiton') - finalize_migration() - -OPERATIONS = [ - migrations.AlterModelOptions( - name='fileversion', - options={'ordering': ('-created',)}, - ), - migrations.RenameField( - model_name='action', - old_name='date_modified', - new_name='modified', - ), - migrations.RenameField( - model_name='action', - old_name='date_created', - new_name='created', - ), - migrations.RenameField( - model_name='fileversion', - old_name='date_modified', - new_name='external_modified', - ), - migrations.RenameField( - model_name='abstractnode', - old_name='date_created', - new_name='created', - ), - migrations.RenameField( - model_name='abstractnode', - old_name='date_modified', - new_name='last_logged', - ), - migrations.RenameField( - model_name='apioauth2application', - old_name='date_created', - new_name='created', - ), - migrations.RenameField( - model_name='comment', - old_name='date_created', - new_name='created', - ), - migrations.RenameField( - model_name='comment', - old_name='date_modified', - new_name='modified', - ), - migrations.RenameField( - model_name='fileversion', - old_name='date_created', - new_name='created', - ), - migrations.RenameField( - model_name='preprintservice', - old_name='date_created', - new_name='created', - ), - migrations.RenameField( - model_name='preprintservice', - old_name='date_modified', - new_name='modified' - ), - migrations.RenameField( - model_name='privatelink', - old_name='date_created', - new_name='created', - ), - migrations.RenameField( - model_name='session', - old_name='date_created', - new_name='created', - ), - migrations.RenameField( - model_name='session', - old_name='date_modified', - new_name='modified', - ), - migrations.AddField( - model_name='abstractnode', - name='modified', - field=django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified'), - ), - migrations.AddField( - model_name='apioauth2application', - name='modified', - field=django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified'), - ), - migrations.AddField( - model_name='apioauth2personaltoken', - name='created', - field=django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, default=django.utils.timezone.now, verbose_name='created'), - preserve_default=False, - ), - migrations.AddField( - model_name='apioauth2personaltoken', - name='modified', - field=django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified'), - ), - migrations.AddField( - model_name='apioauth2scope', - name='created', - field=django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, default=django.utils.timezone.now, verbose_name='created'), - preserve_default=False, - ), - migrations.AddField( - model_name='apioauth2scope', - name='modified', - field=django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified'), - ), - migrations.AddField( - model_name='archivejob', - name='created', - field=django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, default=django.utils.timezone.now, verbose_name='created'), - preserve_default=False, - ), - migrations.AddField( - model_name='archivejob', - name='modified', - field=django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified'), - ), - migrations.AddField( - model_name='archivetarget', - name='created', - field=django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, default=django.utils.timezone.now, verbose_name='created'), - preserve_default=False, - ), - migrations.AddField( - model_name='archivetarget', - name='modified', - field=django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified'), - ), - migrations.AddField( - model_name='basefilenode', - name='created', - field=django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, default=django.utils.timezone.now, verbose_name='created'), - preserve_default=False, - ), - migrations.AddField( - model_name='basefilenode', - name='modified', - field=django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified'), - ), - migrations.AddField( - model_name='blacklistguid', - name='created', - field=django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, default=django.utils.timezone.now, verbose_name='created'), - preserve_default=False, - ), - migrations.AddField( - model_name='blacklistguid', - name='modified', - field=django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified'), - ), - migrations.AddField( - model_name='citationstyle', - name='created', - field=django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, default=django.utils.timezone.now, verbose_name='created'), - preserve_default=False, - ), - migrations.AddField( - model_name='citationstyle', - name='modified', - field=django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified'), - ), - migrations.AddField( - model_name='conference', - name='created', - field=django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, default=django.utils.timezone.now, verbose_name='created'), - preserve_default=False, - ), - migrations.AddField( - model_name='conference', - name='modified', - field=django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified'), - ), - migrations.AddField( - model_name='draftregistration', - name='created', - field=django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, default=django.utils.timezone.now, verbose_name='created'), - preserve_default=False, - ), - migrations.AddField( - model_name='draftregistration', - name='modified', - field=django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified'), - ), - migrations.AddField( - model_name='draftregistrationapproval', - name='created', - field=django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, default=django.utils.timezone.now, verbose_name='created'), - preserve_default=False, - ), - migrations.AddField( - model_name='draftregistrationapproval', - name='modified', - field=django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified'), - ), - migrations.AddField( - model_name='draftregistrationlog', - name='created', - field=django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, default=django.utils.timezone.now, verbose_name='created'), - preserve_default=False, - ), - migrations.AddField( - model_name='draftregistrationlog', - name='modified', - field=django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified'), - ), - migrations.AddField( - model_name='embargo', - name='created', - field=django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, default=django.utils.timezone.now, verbose_name='created'), - preserve_default=False, - ), - migrations.AddField( - model_name='embargo', - name='modified', - field=django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified'), - ), - migrations.AddField( - model_name='embargoterminationapproval', - name='created', - field=django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, default=django.utils.timezone.now, verbose_name='created'), - preserve_default=False, - ), - migrations.AddField( - model_name='embargoterminationapproval', - name='modified', - field=django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified'), - ), - migrations.AddField( - model_name='externalaccount', - name='created', - field=django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, default=django.utils.timezone.now, verbose_name='created'), - preserve_default=False, - ), - migrations.AddField( - model_name='externalaccount', - name='modified', - field=django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified'), - ), - migrations.AddField( - model_name='fileversion', - name='modified', - field=django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified'), - ), - migrations.AddField( - model_name='guid', - name='modified', - field=django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified'), - ), - migrations.AddField( - model_name='identifier', - name='created', - field=django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, default=django.utils.timezone.now, verbose_name='created'), - preserve_default=False, - ), - migrations.AddField( - model_name='identifier', - name='modified', - field=django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified'), - ), - migrations.AddField( - model_name='institution', - name='created', - field=django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, default=django.utils.timezone.now, verbose_name='created'), - preserve_default=False, - ), - migrations.AddField( - model_name='institution', - name='last_logged', - field=osf.utils.fields.NonNaiveDateTimeField(blank=True, db_index=True, default=django.utils.timezone.now, null=True), - ), - migrations.AddField( - model_name='institution', - name='modified', - field=django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified'), - ), - migrations.AddField( - model_name='mailrecord', - name='created', - field=django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, default=django.utils.timezone.now, verbose_name='created'), - preserve_default=False, - ), - migrations.AddField( - model_name='mailrecord', - name='modified', - field=django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified'), - ), - migrations.AddField( - model_name='metaschema', - name='created', - field=django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, default=django.utils.timezone.now, verbose_name='created'), - preserve_default=False, - ), - migrations.AddField( - model_name='metaschema', - name='modified', - field=django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified'), - ), - migrations.AddField( - model_name='nodelicense', - name='created', - field=django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, default=django.utils.timezone.now, verbose_name='created'), - preserve_default=False, - ), - migrations.AddField( - model_name='nodelicense', - name='modified', - field=django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified'), - ), - migrations.AddField( - model_name='nodelicenserecord', - name='created', - field=django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, default=django.utils.timezone.now, verbose_name='created'), - preserve_default=False, - ), - migrations.AddField( - model_name='nodelicenserecord', - name='modified', - field=django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified'), - ), - migrations.AddField( - model_name='nodelog', - name='created', - field=django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, default=django.utils.timezone.now, verbose_name='created'), - preserve_default=False, - ), - migrations.AddField( - model_name='nodelog', - name='modified', - field=django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified'), - ), - migrations.AddField( - model_name='noderelation', - name='created', - field=django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, default=django.utils.timezone.now, verbose_name='created'), - preserve_default=False, - ), - migrations.AddField( - model_name='noderelation', - name='modified', - field=django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified'), - ), - migrations.AddField( - model_name='notificationdigest', - name='created', - field=django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, default=django.utils.timezone.now, verbose_name='created'), - preserve_default=False, - ), - migrations.AddField( - model_name='notificationdigest', - name='modified', - field=django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified'), - ), - migrations.AddField( - model_name='notificationsubscription', - name='created', - field=django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, default=django.utils.timezone.now, verbose_name='created'), - preserve_default=False, - ), - migrations.AddField( - model_name='notificationsubscription', - name='modified', - field=django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified'), - ), - migrations.AddField( - model_name='osfuser', - name='created', - field=django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, default=django.utils.timezone.now, verbose_name='created'), - preserve_default=False, - ), - migrations.AddField( - model_name='osfuser', - name='modified', - field=django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified'), - ), - migrations.AddField( - model_name='pagecounter', - name='created', - field=django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, default=django.utils.timezone.now, verbose_name='created'), - preserve_default=False, - ), - migrations.AddField( - model_name='pagecounter', - name='modified', - field=django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified'), - ), - migrations.AddField( - model_name='preprintprovider', - name='created', - field=django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, default=django.utils.timezone.now, verbose_name='created'), - preserve_default=False, - ), - migrations.AddField( - model_name='preprintprovider', - name='modified', - field=django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified'), - ), - migrations.AddField( - model_name='privatelink', - name='modified', - field=django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified'), - ), - migrations.AddField( - model_name='queuedmail', - name='created', - field=django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, default=django.utils.timezone.now, verbose_name='created'), - preserve_default=False, - ), - migrations.AddField( - model_name='queuedmail', - name='modified', - field=django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified'), - ), - migrations.AddField( - model_name='registrationapproval', - name='created', - field=django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, default=django.utils.timezone.now, verbose_name='created'), - preserve_default=False, - ), - migrations.AddField( - model_name='registrationapproval', - name='modified', - field=django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified'), - ), - migrations.AddField( - model_name='retraction', - name='created', - field=django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, default=django.utils.timezone.now, verbose_name='created'), - preserve_default=False, - ), - migrations.AddField( - model_name='retraction', - name='modified', - field=django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified'), - ), - migrations.AddField( - model_name='subject', - name='created', - field=django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, default=django.utils.timezone.now, verbose_name='created'), - preserve_default=False, - ), - migrations.AddField( - model_name='subject', - name='modified', - field=django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified'), - ), - migrations.AddField( - model_name='tag', - name='created', - field=django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, default=django.utils.timezone.now, verbose_name='created'), - preserve_default=False, - ), - migrations.AddField( - model_name='tag', - name='modified', - field=django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified'), - ), - migrations.AddField( - model_name='useractivitycounter', - name='created', - field=django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, default=django.utils.timezone.now, verbose_name='created'), - preserve_default=False, - ), - migrations.AddField( - model_name='useractivitycounter', - name='modified', - field=django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified'), - ), - migrations.AlterField( - model_name='action', - name='created', - field=django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created'), - ), - migrations.AlterField( - model_name='action', - name='modified', - field=django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified'), - ), -] if not PREMIGRATED else [migrations.RunPython(finalize_premigrated)] - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0068_creator_modified_renames'), - ] - - operations = OPERATIONS diff --git a/osf/migrations/0070_auto_20171121_1805.py b/osf/migrations/0070_auto_20171121_1805.py deleted file mode 100644 index ba32ebd665a..00000000000 --- a/osf/migrations/0070_auto_20171121_1805.py +++ /dev/null @@ -1,76 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.7 on 2017-11-22 00:05 -from __future__ import unicode_literals - -from django.db import migrations -import django.utils.timezone -import django_extensions.db.fields -import osf.utils.fields -from website import settings - -PREMIGRATED = '1-minute-incremental-migrations' in settings.CeleryConfig.beat_schedule -OPERATIONS = [ - migrations.AlterField( - model_name='abstractnode', - name='created', - field=django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created'), - ), - migrations.AlterField( - model_name='abstractnode', - name='last_logged', - field=osf.utils.fields.NonNaiveDateTimeField(blank=True, db_index=True, default=django.utils.timezone.now, null=True), - ), - migrations.AlterField( - model_name='apioauth2application', - name='created', - field=django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created'), - ), - migrations.AlterField( - model_name='comment', - name='created', - field=django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created'), - ), - migrations.AlterField( - model_name='comment', - name='modified', - field=django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified'), - ), - migrations.AlterField( - model_name='fileversion', - name='created', - field=django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created'), - ), - migrations.AlterField( - model_name='preprintservice', - name='created', - field=django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created'), - ), - migrations.AlterField( - model_name='preprintservice', - name='modified', - field=django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified'), - ), - migrations.AlterField( - model_name='privatelink', - name='created', - field=django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created'), - ), - migrations.AlterField( - model_name='session', - name='created', - field=django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created'), - ), - migrations.AlterField( - model_name='session', - name='modified', - field=django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified'), - ), -] if not PREMIGRATED else [] - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0069_skippable_created_modified'), - ] - - operations = OPERATIONS diff --git a/osf/migrations/0070_merge_20171127_2232.py b/osf/migrations/0070_merge_20171127_2232.py deleted file mode 100644 index 732a7e42606..00000000000 --- a/osf/migrations/0070_merge_20171127_2232.py +++ /dev/null @@ -1,16 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.7 on 2017-11-28 04:32 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0068_draftregistration_deleted'), - ('osf', '0069_auto_20171127_1119'), - ] - - operations = [ - ] diff --git a/osf/migrations/0071_merge_20171128_0950.py b/osf/migrations/0071_merge_20171128_0950.py deleted file mode 100644 index 75f0f7d9d3f..00000000000 --- a/osf/migrations/0071_merge_20171128_0950.py +++ /dev/null @@ -1,16 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.7 on 2017-11-28 15:50 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0068_draftregistration_deleted'), - ('osf', '0070_auto_20171121_1805'), - ] - - operations = [ - ] diff --git a/osf/migrations/0072_merge_20171128_1018.py b/osf/migrations/0072_merge_20171128_1018.py deleted file mode 100644 index 2a601725405..00000000000 --- a/osf/migrations/0072_merge_20171128_1018.py +++ /dev/null @@ -1,16 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.7 on 2017-11-28 16:18 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0070_merge_20171127_2232'), - ('osf', '0071_merge_20171128_0950'), - ] - - operations = [ - ] diff --git a/osf/migrations/0073_citationstyle_has_bibliography.py b/osf/migrations/0073_citationstyle_has_bibliography.py deleted file mode 100644 index e089e5f0ee6..00000000000 --- a/osf/migrations/0073_citationstyle_has_bibliography.py +++ /dev/null @@ -1,20 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.7 on 2017-12-04 14:53 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0072_merge_20171128_1018'), - ] - - operations = [ - migrations.AddField( - model_name='citationstyle', - name='has_bibliography', - field=models.BooleanField(default=False), - ), - ] diff --git a/osf/migrations/0074_auto_20171207_1331.py b/osf/migrations/0074_auto_20171207_1331.py deleted file mode 100644 index 460b9b80241..00000000000 --- a/osf/migrations/0074_auto_20171207_1331.py +++ /dev/null @@ -1,21 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.7 on 2017-12-07 19:31 -from __future__ import unicode_literals - -from django.db import migrations, models -import osf.models.validators - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0073_citationstyle_has_bibliography'), - ] - - operations = [ - migrations.AlterField( - model_name='comment', - name='content', - field=models.TextField(validators=[osf.models.validators.CommentMaxLength(1000), osf.models.validators.string_required]), - ), - ] diff --git a/osf/migrations/0074_parse_citation_styles.py b/osf/migrations/0074_parse_citation_styles.py deleted file mode 100644 index 137640b531d..00000000000 --- a/osf/migrations/0074_parse_citation_styles.py +++ /dev/null @@ -1,76 +0,0 @@ -# This migration port `scripts/parse_citation_styles` to automatically parse citation styles. -# Additionally, this set the corresponding `has_bibliography` field to `False` for all citation formats whose CSL files do not -# include a bibliography section. As a result, all such citation formats would not show up in OSF -# citation widgets for users to choose. -# -# NOTE: -# As of December 6th, 2017, there are however THREE EXCEPTIONS: -# "Bluebook Law Review", "Bluebook Law Review(2)" and "Bluebook Inline" shares a -# special CSL file ('website/static/bluebook.cls'), in which a bibliography section is defined, -# in order to render bibliographies even though their official CSL files (located in CenterForOpenScience/styles repo) -# do not contain a bibliography section. Therefore, This migration also automatically set `has_bibliography` to `True` for all styles whose titles contain "Bluebook" - -import logging -import os - -from django.db import migrations -from lxml import etree - -from website import settings - -logger = logging.getLogger(__file__) - -def get_style_files(path): - files = (os.path.join(path, x) for x in os.listdir(path)) - return (f for f in files if os.path.isfile(f)) -def parse_citation_styles(state, schema): - # drop all styles - CitationStyle = state.get_model('osf', 'citationstyle') - CitationStyle.objects.all().delete() - - for style_file in get_style_files(settings.CITATION_STYLES_PATH): - with open(style_file, 'r') as f: - try: - root = etree.parse(f).getroot() - except etree.XMLSyntaxError: - continue - - namespace = root.nsmap.get(None) - selector = '{{{ns}}}info/{{{ns}}}'.format(ns=namespace) - - title = root.find(selector + 'title').text - # `has_bibliography` is set to `True` for Bluebook citation formats due to the special way we handle them. - has_bibliography = root.find('{{{ns}}}{tag}'.format(ns=namespace, tag='bibliography')) is not None or 'Bluebook' in title - # Required - fields = { - '_id': os.path.splitext(os.path.basename(style_file))[0], - 'title': title, - 'has_bibliography': has_bibliography, - } - - # Optional - try: - fields['short_title'] = root.find(selector + 'title-short').text - except AttributeError: - pass - - try: - fields['summary'] = root.find(selector + 'summary').text - except AttributeError: - pass - - style = CitationStyle(**fields) - style.save() - -def revert(state, schema): - # The revert of this migration simply removes all CitationStyle instances. - CitationStyle = state.get_model('osf', 'citationstyle') - CitationStyle.objects.all().delete() - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0073_citationstyle_has_bibliography'), - ] - - operations = [] diff --git a/osf/migrations/0075_merge_20171207_1511.py b/osf/migrations/0075_merge_20171207_1511.py deleted file mode 100644 index 0d18954e1d4..00000000000 --- a/osf/migrations/0075_merge_20171207_1511.py +++ /dev/null @@ -1,16 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.7 on 2017-12-07 21:11 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0074_parse_citation_styles'), - ('osf', '0074_auto_20171207_1331'), - ] - - operations = [ - ] diff --git a/osf/migrations/0076_action_rename.py b/osf/migrations/0076_action_rename.py deleted file mode 100644 index 115bab93e6b..00000000000 --- a/osf/migrations/0076_action_rename.py +++ /dev/null @@ -1,24 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.4 on 2017-10-31 19:09 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0075_merge_20171207_1511'), - ] - - operations = [ - migrations.RenameModel( - old_name='Action', - new_name='ReviewAction', - ), - migrations.RenameField( - model_name='preprintservice', - old_name='reviews_state', - new_name='machine_state', - ), - ] diff --git a/osf/migrations/0077_add_maintenance_permissions.py b/osf/migrations/0077_add_maintenance_permissions.py deleted file mode 100644 index 2044f9c264a..00000000000 --- a/osf/migrations/0077_add_maintenance_permissions.py +++ /dev/null @@ -1,20 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11 on 2017-07-17 20:11 -from __future__ import unicode_literals - -from django.db import migrations - -def noop(*args): - # This migration used to add permissions, - # This is now handled by the post_migrate signal - pass - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0076_action_rename'), - ] - - operations = [ - migrations.RunPython(noop, noop), - ] diff --git a/osf/migrations/0077_add_noderequest_model.py b/osf/migrations/0077_add_noderequest_model.py deleted file mode 100644 index 0c11dde6576..00000000000 --- a/osf/migrations/0077_add_noderequest_model.py +++ /dev/null @@ -1,85 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.7 on 2017-11-16 20:26 -from __future__ import unicode_literals - -from django.conf import settings -from django.db import migrations, models -import django.db.models.deletion -import django_extensions.db.fields -import osf.models.base -import osf.utils.fields - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0076_action_rename'), - ] - - operations = [ - migrations.CreateModel( - name='NodeRequest', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), - ('machine_state', models.CharField(choices=[('accepted', 'Accepted'), ('initial', 'Initial'), ('pending', 'Pending'), ('rejected', 'Rejected')], db_index=True, default='initial', max_length=15)), - ('date_last_transitioned', models.DateTimeField(blank=True, db_index=True, null=True)), - ('request_type', models.CharField(choices=[('access', 'Access')], max_length=31)), - ('comment', models.TextField(blank=True, null=True)), - ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), - ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), - ('creator', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='submitted_requests', to=settings.AUTH_USER_MODEL)), - ], - ), - migrations.CreateModel( - name='NodeRequestAction', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), - ('trigger', models.CharField(choices=[('accept', 'Accept'), ('edit_comment', 'Edit_Comment'), ('reject', 'Reject'), ('submit', 'Submit')], max_length=31)), - ('from_state', models.CharField(choices=[('accepted', 'Accepted'), ('initial', 'Initial'), ('pending', 'Pending'), ('rejected', 'Rejected')], max_length=31)), - ('to_state', models.CharField(choices=[('accepted', 'Accepted'), ('initial', 'Initial'), ('pending', 'Pending'), ('rejected', 'Rejected')], max_length=31)), - ('comment', models.TextField(blank=True)), - ('is_deleted', models.BooleanField(default=False)), - ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), - ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), - ('creator', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='+', to=settings.AUTH_USER_MODEL)), - ('target', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='actions', to='osf.NodeRequest')), - ], - options={ - 'abstract': False, - }, - ), - # We add the access_requests_enabled field in two steps - # 1. Add the field - # 2. Adding a default value of True - # This prevents an expensive table rewrite from locking the node table. - migrations.AddField( - model_name='abstractnode', - name='access_requests_enabled', - field=models.NullBooleanField(db_index=True), - ), - # Adding a default does not require a table rewrite - migrations.RunSQL( - [ - 'ALTER TABLE "osf_abstractnode" ALTER COLUMN "access_requests_enabled" SET DEFAULT TRUE', - 'ALTER TABLE "osf_abstractnode" ALTER COLUMN "access_requests_enabled" DROP DEFAULT;', - ], - state_operations=[ - migrations.AlterField( - model_name='abstractnode', - name='access_requests_enabled', - field=models.NullBooleanField(default=True, db_index=True), - ) - ], - ), - migrations.AddField( - model_name='noderequest', - name='target', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='requests', to='osf.AbstractNode'), - ), - migrations.AlterUniqueTogether( - name='noderequest', - unique_together=set([('target', 'creator')]), - ), - ] diff --git a/osf/migrations/0077_bannerimage_scheduledbanner.py b/osf/migrations/0077_bannerimage_scheduledbanner.py deleted file mode 100644 index fe3ae19eab6..00000000000 --- a/osf/migrations/0077_bannerimage_scheduledbanner.py +++ /dev/null @@ -1,43 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.7 on 2018-01-24 13:50 -from __future__ import unicode_literals - -from django.db import migrations, models -import osf.utils.fields -import osf.utils.storage - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0076_action_rename'), - ] - - operations = [ - migrations.CreateModel( - name='BannerImage', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('filename', models.CharField(max_length=256, unique=True)), - ('image', models.BinaryField()), - ], - ), - migrations.CreateModel( - name='ScheduledBanner', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(unique=True, max_length=256)), - ('start_date', osf.utils.fields.NonNaiveDateTimeField()), - ('end_date', osf.utils.fields.NonNaiveDateTimeField()), - ('color', models.CharField(max_length=7)), - ('license', models.CharField(blank=True, max_length=256, null=True)), - ('default_photo', models.FileField(storage=osf.utils.storage.BannerImageStorage(), upload_to='')), - ('default_alt_text', models.TextField()), - ('mobile_photo', models.FileField(storage=osf.utils.storage.BannerImageStorage(), upload_to='')), - ('mobile_alt_text', models.TextField(blank=True, null=True)), - ], - options={ - 'permissions': (('view_scheduledbanner', 'Can view scheduled banner details'),), - }, - ), - ] diff --git a/osf/migrations/0077_ensure_schemas.py b/osf/migrations/0077_ensure_schemas.py deleted file mode 100644 index a3a8763abe5..00000000000 --- a/osf/migrations/0077_ensure_schemas.py +++ /dev/null @@ -1,18 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11 on 2017-05-24 19:33 -from __future__ import unicode_literals - -import logging - -from django.db import migrations - -logger = logging.getLogger(__file__) - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0076_action_rename'), - ] - - operations = [] diff --git a/osf/migrations/0077_preprintprovider_facebook_app_id.py b/osf/migrations/0077_preprintprovider_facebook_app_id.py deleted file mode 100644 index e5f85d16804..00000000000 --- a/osf/migrations/0077_preprintprovider_facebook_app_id.py +++ /dev/null @@ -1,20 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.9 on 2018-01-31 21:43 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0076_action_rename'), - ] - - operations = [ - migrations.AddField( - model_name='preprintprovider', - name='facebook_app_id', - field=models.BigIntegerField(blank=True, null=True), - ), - ] diff --git a/osf/migrations/0078_add_banner_permissions.py b/osf/migrations/0078_add_banner_permissions.py deleted file mode 100644 index 4dba94981be..00000000000 --- a/osf/migrations/0078_add_banner_permissions.py +++ /dev/null @@ -1,20 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11 on 2017-07-17 20:11 -from __future__ import unicode_literals - -from django.db import migrations - -def noop(*args): - # This migration used to add permissions, - # which is now handled by the post_migrate signal - pass - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0077_bannerimage_scheduledbanner'), - ] - - operations = [ - migrations.RunPython(noop, noop), - ] diff --git a/osf/migrations/0078_ensure_schemas.py b/osf/migrations/0078_ensure_schemas.py deleted file mode 100644 index bcbb2084a31..00000000000 --- a/osf/migrations/0078_ensure_schemas.py +++ /dev/null @@ -1,16 +0,0 @@ -from __future__ import unicode_literals - -import logging - -from django.db import migrations - -logger = logging.getLogger(__file__) - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0077_add_maintenance_permissions'), - ] - - operations = [] diff --git a/osf/migrations/0078_merge_20180206_1148.py b/osf/migrations/0078_merge_20180206_1148.py deleted file mode 100644 index 31575de77c2..00000000000 --- a/osf/migrations/0078_merge_20180206_1148.py +++ /dev/null @@ -1,16 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.9 on 2018-02-06 17:48 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0077_preprintprovider_facebook_app_id'), - ('osf', '0077_add_maintenance_permissions'), - ] - - operations = [ - ] diff --git a/osf/migrations/0079_merge_20180202_1206.py b/osf/migrations/0079_merge_20180202_1206.py deleted file mode 100644 index 194cb14a026..00000000000 --- a/osf/migrations/0079_merge_20180202_1206.py +++ /dev/null @@ -1,17 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.9 on 2018-02-02 18:06 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0078_add_banner_permissions'), - ('osf', '0077_add_maintenance_permissions'), - ('osf', '0077_ensure_schemas'), - ] - - operations = [ - ] diff --git a/osf/migrations/0079_merge_20180207_1545.py b/osf/migrations/0079_merge_20180207_1545.py deleted file mode 100644 index 31559a3c127..00000000000 --- a/osf/migrations/0079_merge_20180207_1545.py +++ /dev/null @@ -1,16 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.9 on 2018-02-07 21:45 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0078_merge_20180206_1148'), - ('osf', '0078_ensure_schemas'), - ] - - operations = [ - ] diff --git a/osf/migrations/0080_add_abstractprovider.py b/osf/migrations/0080_add_abstractprovider.py deleted file mode 100644 index cc88bb4911f..00000000000 --- a/osf/migrations/0080_add_abstractprovider.py +++ /dev/null @@ -1,134 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.9 on 2018-02-15 19:48 -from __future__ import unicode_literals - -import dirtyfields.dirtyfields -import django.contrib.postgres.fields -from django.db import migrations, models -import django.db.models.deletion -import django_extensions.db.fields -import osf.models.base -import osf.utils.datetime_aware_jsonfield -import osf.utils.fields - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0079_merge_20180207_1545'), - ] - - operations = [ - migrations.CreateModel( - name='AbstractProvider', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), - ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), - ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), - ('reviews_workflow', models.CharField(blank=True, choices=[(None, 'None'), ('pre-moderation', 'Pre-Moderation'), ('post-moderation', 'Post-Moderation')], max_length=15, null=True)), - ('reviews_comments_private', models.NullBooleanField()), - ('reviews_comments_anonymous', models.NullBooleanField()), - ('type', models.CharField(choices=[('osf.preprintprovider', 'preprint provider')], db_index=True, max_length=255)), - ('name', models.CharField(max_length=128)), - ('advisory_board', models.TextField(blank=True, default='')), - ('description', models.TextField(blank=True, default='')), - ('domain', models.URLField(blank=True, default='')), - ('domain_redirect_enabled', models.BooleanField(default=False)), - ('external_url', models.URLField(blank=True, null=True)), - ('email_contact', models.CharField(blank=True, max_length=200, null=True)), - ('email_support', models.CharField(blank=True, max_length=200, null=True)), - ('social_twitter', models.CharField(blank=True, max_length=200, null=True)), - ('social_facebook', models.CharField(blank=True, max_length=200, null=True)), - ('social_instagram', models.CharField(blank=True, max_length=200, null=True)), - ('footer_links', models.TextField(blank=True, default='')), - ('facebook_app_id', models.BigIntegerField(blank=True, null=True)), - ('example', models.CharField(blank=True, max_length=20, null=True)), - ('allow_submissions', models.BooleanField(default=True)), - ('share_publish_type', models.CharField(choices=[('Preprint', 'Preprint'), ('Thesis', 'Thesis')], default='Preprint', help_text='This SHARE type will be used when pushing publications to SHARE', max_length=32, null=True)), - ('share_source', models.CharField(blank=True, max_length=200, null=True)), - ('share_title', models.TextField(blank=True, default='', null=True)), - ('additional_providers', django.contrib.postgres.fields.ArrayField(base_field=models.CharField(max_length=200), blank=True, default=list, null=True, size=None)), - ('access_token', osf.utils.fields.EncryptedTextField(blank=True, null=True)), - ('preprint_word', models.CharField(choices=[('preprint', 'Preprint'), ('paper', 'Paper'), ('thesis', 'Thesis'), ('none', 'None')], default='preprint', max_length=10, null=True)), - ('subjects_acceptable', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=list, encoder=osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONEncoder, null=True)), - ('default_license', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='default_license', to='osf.NodeLicense')), - ('licenses_acceptable', models.ManyToManyField(blank=True, related_name='licenses_acceptable', to='osf.NodeLicense')), - ], - options={ - 'abstract': False, - }, - bases=(dirtyfields.dirtyfields.DirtyFieldsMixin, models.Model), - ), - migrations.RunSQL( - [ - """ - INSERT INTO osf_abstractprovider (id, created, modified, _id, - reviews_workflow, reviews_comments_private, reviews_comments_anonymous, name, advisory_board, description, - domain, domain_redirect_enabled, external_url, email_contact, email_support, social_twitter, social_facebook, social_instagram, - footer_links, facebook_app_id, example, allow_submissions, share_publish_type, share_source, share_title, additional_providers, - access_token, preprint_word, subjects_acceptable, default_license_id, type) - SELECT id, created, modified, _id, - reviews_workflow, reviews_comments_private, reviews_comments_anonymous, name, advisory_board, description, - domain, domain_redirect_enabled, external_url, email_contact, email_support, social_twitter, social_facebook, social_instagram, - footer_links, facebook_app_id, example, allow_submissions, share_publish_type, share_source, share_title, additional_providers, - access_token, preprint_word, subjects_acceptable, default_license_id, 'osf.preprintprovider' as type - FROM osf_preprintprovider; - INSERT INTO osf_abstractprovider_licenses_acceptable (id, abstractprovider_id, nodelicense_id) - SELECT id, preprintprovider_id, nodelicense_id - FROM osf_preprintprovider_licenses_acceptable - """ - ], [ - """ - INSERT INTO osf_preprintprovider_licenses_acceptable (id, preprintprovider_id, nodelicense_id) - SELECT id, abstractprovider_id, nodelicense_id - FROM osf_abstractprovider_licenses_acceptable - """ - ] - ), - migrations.AlterField( - model_name='subject', - name='provider', - field=models.ForeignKey(on_delete=models.deletion.CASCADE, related_name='subjects', to='osf.AbstractProvider'), - ), - migrations.RunSQL( - migrations.RunSQL.noop, - [ - """ - INSERT INTO osf_preprintprovider (id, created, modified, _id, - reviews_workflow, reviews_comments_private, reviews_comments_anonymous, name, advisory_board, description, - domain, domain_redirect_enabled, external_url, email_contact, email_support, social_twitter, social_facebook, social_instagram, - footer_links, facebook_app_id, example, allow_submissions, share_publish_type, share_source, share_title, additional_providers, - access_token, preprint_word, subjects_acceptable, default_license_id) - SELECT id, created, modified, _id, - reviews_workflow, reviews_comments_private, reviews_comments_anonymous, name, advisory_board, description, - domain, domain_redirect_enabled, external_url, email_contact, email_support, social_twitter, social_facebook, social_instagram, - footer_links, facebook_app_id, example, allow_submissions, share_publish_type, share_source, share_title, additional_providers, - access_token, preprint_word, subjects_acceptable, default_license_id - FROM osf_abstractprovider - """ - ] - ), - migrations.RemoveField( - model_name='preprintprovider', - name='default_license', - ), - migrations.RemoveField( - model_name='preprintprovider', - name='licenses_acceptable', - ), - migrations.DeleteModel( - name='PreprintProvider', - ), - migrations.CreateModel( - name='PreprintProvider', - fields=[ - ], - options={ - 'indexes': [], - 'proxy': True, - 'permissions': (('view_submissions', 'Can view all submissions to this provider'), ('add_moderator', 'Can add other users as moderators for this provider'), ('view_actions', 'Can view actions on submissions to this provider'), ('add_reviewer', 'Can add other users as reviewers for this provider'), ('review_assigned_submissions', 'Can submit reviews for submissions to this provider which have been assigned to this user'), ('assign_reviewer', 'Can assign reviewers to review specific submissions to this provider'), ('set_up_moderation', 'Can set up moderation for this provider'), ('view_assigned_submissions', 'Can view submissions to this provider which have been assigned to this user'), ('edit_reviews_settings', 'Can edit reviews settings for this provider'), ('accept_submissions', 'Can accept submissions to this provider'), ('reject_submissions', 'Can reject submissions to this provider'), ('edit_review_comments', 'Can edit comments on actions for this provider'), ('view_preprintprovider', 'Can view preprint provider details')), - }, - bases=('osf.abstractprovider',), - ), - ] diff --git a/osf/migrations/0080_ensure_schemas.py b/osf/migrations/0080_ensure_schemas.py deleted file mode 100644 index 0b9de570775..00000000000 --- a/osf/migrations/0080_ensure_schemas.py +++ /dev/null @@ -1,17 +0,0 @@ -from __future__ import unicode_literals - -import logging - -from django.db import migrations - - -logger = logging.getLogger(__file__) - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0079_merge_20180207_1545'), - ] - - operations = [] diff --git a/osf/migrations/0081_alter_abstractprovider_permissions.py b/osf/migrations/0081_alter_abstractprovider_permissions.py deleted file mode 100644 index 1cfafdd82df..00000000000 --- a/osf/migrations/0081_alter_abstractprovider_permissions.py +++ /dev/null @@ -1,19 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.9 on 2018-02-08 20:23 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0080_add_abstractprovider'), - ] - - operations = [ - migrations.AlterModelOptions( - name='preprintprovider', - options={'permissions': (('view_submissions', 'Can view all submissions to this provider'), ('add_moderator', 'Can add other users as moderators for this provider'), ('update_moderator', 'Can elevate or lower other moderators/admins'), ('view_actions', 'Can view actions on submissions to this provider'), ('add_reviewer', 'Can add other users as reviewers for this provider'), ('review_assigned_submissions', 'Can submit reviews for submissions to this provider which have been assigned to this user'), ('assign_reviewer', 'Can assign reviewers to review specific submissions to this provider'), ('remove_moderator', 'Can remove moderators from this provider. Implicitly granted to self'), ('set_up_moderation', 'Can set up moderation for this provider'), ('view_assigned_submissions', 'Can view submissions to this provider which have been assigned to this user'), ('edit_reviews_settings', 'Can edit reviews settings for this provider'), ('accept_submissions', 'Can accept submissions to this provider'), ('reject_submissions', 'Can reject submissions to this provider'), ('edit_review_comments', 'Can edit comments on actions for this provider'), ('view_preprintprovider', 'Can view preprint provider details'))}, - ), - ] diff --git a/osf/migrations/0081_merge_20180212_0949.py b/osf/migrations/0081_merge_20180212_0949.py deleted file mode 100644 index ddcf9023e71..00000000000 --- a/osf/migrations/0081_merge_20180212_0949.py +++ /dev/null @@ -1,16 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.9 on 2018-02-12 15:49 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0080_ensure_schemas'), - ('osf', '0079_merge_20180202_1206'), - ] - - operations = [ - ] diff --git a/osf/migrations/0082_add_preprint_word_choice.py b/osf/migrations/0082_add_preprint_word_choice.py deleted file mode 100644 index b30fba42bcb..00000000000 --- a/osf/migrations/0082_add_preprint_word_choice.py +++ /dev/null @@ -1,20 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.9 on 2018-02-27 19:18 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0081_alter_abstractprovider_permissions'), - ] - - operations = [ - migrations.AlterField( - model_name='abstractprovider', - name='preprint_word', - field=models.CharField(choices=[('preprint', 'Preprint'), ('paper', 'Paper'), ('thesis', 'Thesis'), ('work', 'Work'), ('none', 'None')], default='preprint', max_length=10, null=True), - ), - ] diff --git a/osf/migrations/0082_merge_20180213_1502.py b/osf/migrations/0082_merge_20180213_1502.py deleted file mode 100644 index d188481370d..00000000000 --- a/osf/migrations/0082_merge_20180213_1502.py +++ /dev/null @@ -1,16 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.9 on 2018-02-13 21:02 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0077_add_noderequest_model'), - ('osf', '0081_merge_20180212_0949'), - ] - - operations = [ - ] diff --git a/osf/migrations/0083_add_ember_waffle_flags.py b/osf/migrations/0083_add_ember_waffle_flags.py deleted file mode 100644 index f4cca4b73e3..00000000000 --- a/osf/migrations/0083_add_ember_waffle_flags.py +++ /dev/null @@ -1,59 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.9 on 2018-03-02 17:45 -from __future__ import unicode_literals -from waffle.models import Flag -from django.db import migrations - -EMBER_WAFFLE_PAGES = [ - 'create_draft_registration', - 'dashboard', - 'edit_draft_registration', - 'file_detail', - 'home', - 'meeting_detail', - 'meetings', - 'my_projects', - 'project_analytics', - 'project_contributors', - 'project_detail', - 'project_files', - 'project_forks', - 'project_registrations', - 'project_settings', - 'project_wiki', - 'registration_form_detail', - 'search', - 'support', - 'user_profile', - 'user_settings' -] - -def reverse_func(state, schema): - pages = [format_ember_waffle_flag_name(page) for page in EMBER_WAFFLE_PAGES] - Flag.objects.filter(name__in=pages).delete() - return - -def format_ember_waffle_flag_name(page): - return '{}{}{}'.format('ember_', page, '_page') - -def add_ember_waffle_flags(state, schema): - """ - This migration adds some waffle flags for pages that are being emberized. - Waffle flags are used for feature flipping, for example, showing an - emberized page to one set of users, and the existing osf page for another set. - - By default, flags are given an everyone=False value, which overrides all other settings, - making the flag False for everyone. Flag settings can be changed in the Django admin app. - """ - for page in EMBER_WAFFLE_PAGES: - Flag.objects.get_or_create(name=format_ember_waffle_flag_name(page), everyone=False) - return - -class Migration(migrations.Migration): - - dependencies = [ - ('waffle', '0002_auto_20161201_0958'), - ] - - operations = [ - ] diff --git a/osf/migrations/0083_add_file_fields_for_target.py b/osf/migrations/0083_add_file_fields_for_target.py deleted file mode 100644 index e3cbdb11c92..00000000000 --- a/osf/migrations/0083_add_file_fields_for_target.py +++ /dev/null @@ -1,36 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.3 on 2017-10-12 17:36 -from __future__ import unicode_literals - -import logging -from django.db import migrations, models -import django.db.models.deletion - -logger = logging.getLogger(__name__) -logging.basicConfig(level=logging.INFO) - - -class Migration(migrations.Migration): - - dependencies = [ - ('contenttypes', '0002_remove_content_type_name'), - ('osf', '0082_merge_20180213_1502'), - ] - - operations = [ - migrations.AddField( - model_name='basefilenode', - name='target_content_type', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='basefilenode_target', to='contenttypes.ContentType'), - ), - migrations.AddField( - model_name='basefilenode', - name='target_object_id', - field=models.PositiveIntegerField(blank=True, null=True), - ), - migrations.AddField( - model_name='basefilenode', - name='is_root', - field=models.NullBooleanField(), - ), - ] diff --git a/osf/migrations/0083_merge_20180228_1619.py b/osf/migrations/0083_merge_20180228_1619.py deleted file mode 100644 index 1dacf6d491e..00000000000 --- a/osf/migrations/0083_merge_20180228_1619.py +++ /dev/null @@ -1,16 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.9 on 2018-02-28 22:19 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0082_add_preprint_word_choice'), - ('osf', '0082_merge_20180213_1502'), - ] - - operations = [ - ] diff --git a/osf/migrations/0084_merge_20180308_1821.py b/osf/migrations/0084_merge_20180308_1821.py deleted file mode 100644 index 84d857962fb..00000000000 --- a/osf/migrations/0084_merge_20180308_1821.py +++ /dev/null @@ -1,16 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.9 on 2018-03-09 00:21 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0083_add_ember_waffle_flags'), - ('osf', '0082_merge_20180213_1502'), - ] - - operations = [ - ] diff --git a/osf/migrations/0084_migrate_node_info_for_target.py b/osf/migrations/0084_migrate_node_info_for_target.py deleted file mode 100644 index fdc943f103f..00000000000 --- a/osf/migrations/0084_migrate_node_info_for_target.py +++ /dev/null @@ -1,61 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.4 on 2017-11-13 16:14 -from __future__ import unicode_literals, division -import logging - -from django.db import migrations, models, connection -from django.contrib.contenttypes.models import ContentType - -logger = logging.getLogger(__name__) - - -def set_basefilenode_target(apps, schema_editor): - BaseFileNode = apps.get_model('osf', 'basefilenode') - AbstractNode = apps.get_model('osf', 'abstractnode') - target_content_type_id = ContentType.objects.get_for_model(AbstractNode).id - - BATCHSIZE = 10000 - - max_pk = BaseFileNode.objects.aggregate(models.Max('pk'))['pk__max'] - if max_pk is not None: - for offset in range(0, max_pk + 1, BATCHSIZE): - ( - BaseFileNode.objects - .filter(pk__gte=offset) - .filter(pk__lt=offset + BATCHSIZE) - .filter(target_object_id__isnull=True) - .filter(target_content_type_id__isnull=True) - .update( - target_content_type_id=target_content_type_id, - target_object_id=models.F('node_id') - ) - ) - end = offset + BATCHSIZE - percent = '{:.1f}%'.format(end / max_pk * 100) - logger.info( - 'Updated osf_basefilenode {}-{}/{} ({})'.format( - offset, - end, - max_pk, - percent, - ) - ) - - -def reset_basefilenode_target_to_node(*args, **kwargs): - sql = 'UPDATE osf_basefilenode SET node_id = target_object_id;' - with connection.cursor() as cursor: - cursor.execute(sql) - -class Migration(migrations.Migration): - - # Avoid locking basefilenode - atomic = False - - dependencies = [ - ('osf', '0083_add_file_fields_for_target'), - ] - - operations = [ - migrations.RunPython(set_basefilenode_target, reset_basefilenode_target_to_node), - ] diff --git a/osf/migrations/0085_finalize_file_node_to_target.py b/osf/migrations/0085_finalize_file_node_to_target.py deleted file mode 100644 index 9add7b9198d..00000000000 --- a/osf/migrations/0085_finalize_file_node_to_target.py +++ /dev/null @@ -1,30 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.4 on 2017-11-13 18:28 -from __future__ import unicode_literals - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0084_migrate_node_info_for_target'), - ] - - operations = [ - migrations.RemoveField( - model_name='basefilenode', - name='node', - ), - migrations.AlterField( - model_name='basefilenode', - name='target_content_type', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='contenttypes.ContentType'), - ), - migrations.AlterField( - model_name='basefilenode', - name='target_object_id', - field=models.PositiveIntegerField(), - ), - ] diff --git a/osf/migrations/0085_merge_20180316_1625.py b/osf/migrations/0085_merge_20180316_1625.py deleted file mode 100644 index fd205de5563..00000000000 --- a/osf/migrations/0085_merge_20180316_1625.py +++ /dev/null @@ -1,16 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.9 on 2018-03-16 21:25 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0083_merge_20180228_1619'), - ('osf', '0084_merge_20180308_1821'), - ] - - operations = [ - ] diff --git a/osf/migrations/0086_pre_migrate_collections.py b/osf/migrations/0086_pre_migrate_collections.py deleted file mode 100644 index a477241c59b..00000000000 --- a/osf/migrations/0086_pre_migrate_collections.py +++ /dev/null @@ -1,91 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.9 on 2018-03-05 16:30 -from __future__ import unicode_literals - -from django.conf import settings -import django.contrib.postgres.fields -from django.db import migrations, models -import django.db.models.deletion -import django_extensions.db.fields -import osf.models.validators -import osf.utils.fields - - -class Migration(migrations.Migration): - - dependencies = [ - ('contenttypes', '0002_remove_content_type_name'), - ('osf', '0085_merge_20180316_1625'), - ] - - operations = [ - migrations.CreateModel( - name='CollectedGuidMetadata', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), - ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), - ('collected_type', models.CharField(blank=True, max_length=31)), - ('status', models.CharField(blank=True, max_length=31)), - ('creator', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), - ('guid', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='osf.Guid')), - ], - options={ - 'abstract': False, - }, - ), - migrations.DeleteModel( - name='Collection', - ), - migrations.CreateModel( - name='CollectionProvider', - fields=[ - ], - options={ - 'proxy': True, - 'indexes': [], - }, - bases=('osf.abstractprovider',), - ), - migrations.AlterField( - model_name='abstractprovider', - name='type', - field=models.CharField(choices=[('osf.collectionprovider', 'collection provider'), ('osf.preprintprovider', 'preprint provider')], db_index=True, max_length=255), - ), - migrations.CreateModel( - name='Collection', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), - ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), - ('content_type_pk', models.PositiveIntegerField(blank=True, null=True)), - ('title', models.CharField(max_length=200, validators=[osf.models.validators.validate_title])), - ('collected_type_choices', django.contrib.postgres.fields.ArrayField(base_field=models.CharField(max_length=31), blank=True, default=list, size=None)), - ('status_choices', django.contrib.postgres.fields.ArrayField(base_field=models.CharField(max_length=31), blank=True, default=list, size=None)), - ('is_public', models.BooleanField(db_index=True, default=False)), - ('is_promoted', models.BooleanField(db_index=True, default=False)), - ('is_bookmark_collection', models.BooleanField(db_index=True, default=False)), - ('collected_types', models.ManyToManyField(related_name='_collection_collected_types_+', to='contenttypes.ContentType')), - ('creator', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), - ('guid_links', models.ManyToManyField(related_name='collections', through='osf.CollectedGuidMetadata', to='osf.Guid')), - ('provider', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='osf.AbstractProvider')), - ('deleted', osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True)), - ], - options={ - 'abstract': False, - }, - ), - migrations.AddField( - model_name='collectedguidmetadata', - name='collection', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='osf.Collection'), - ), - migrations.AlterOrderWithRespectTo( - name='collectedguidmetadata', - order_with_respect_to='collection', - ), - migrations.AlterUniqueTogether( - name='collectedguidmetadata', - unique_together=set([('collection', 'guid')]), - ), - ] diff --git a/osf/migrations/0087_migrate_collections_data.py b/osf/migrations/0087_migrate_collections_data.py deleted file mode 100644 index 4ecb2c6be95..00000000000 --- a/osf/migrations/0087_migrate_collections_data.py +++ /dev/null @@ -1,155 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.9 on 2018-03-05 20:17 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - dependencies = [ - ('osf', '0086_pre_migrate_collections'), - ] - - operations = [ - migrations.RunSQL( - [ - """ - -- Copy all existing collections into new table, keeping old pks - INSERT INTO osf_collection (id, created, modified, content_type_pk, title, is_public, is_promoted, - deleted, is_bookmark_collection, creator_id, provider_id, collected_type_choices, status_choices) - SELECT id, created, modified, CT.c_id, title, FALSE, FALSE, - CASE WHEN is_deleted IS TRUE - THEN - 'epoch' :: TIMESTAMP WITH TIME ZONE - ELSE - NULL :: TIMESTAMP WITH TIME ZONE - END, - is_bookmark_collection, - creator_id, NULL, ARRAY[]::text[], ARRAY[]::text[] - FROM osf_abstractnode - LEFT JOIN LATERAL ( - SELECT id AS c_id - FROM django_content_type - WHERE app_label = 'osf' AND model = 'collection' - ) CT ON TRUE - WHERE type = 'osf.collection'; - """, """ - -- Copy collected refs into thru-table - INSERT INTO osf_collectedguidmetadata (id, created, modified, collected_type, status, creator_id, guid_id, collection_id, _order) - SELECT nextval('osf_collectedguidmetadata_id_seq'), created, modified, '', '', C.creator_id, G.id, C.id, _order - FROM osf_noderelation NR - LEFT JOIN LATERAL ( - SELECT id, creator_id - FROM osf_collection - WHERE id = NR.parent_id - ) C on TRUE - LEFT JOIN LATERAL ( - SELECT id - FROM osf_guid - WHERE content_type_id = (SELECT id FROM django_content_type WHERE app_label = 'osf' AND model = 'abstractnode') - AND object_id = NR.child_id - ) G ON TRUE - WHERE parent_id IN (SELECT id FROM osf_collection); - """, """ - -- Populate thru-table for collection.collected_types. Until now, only nodes could be collected, so only populate with that type - INSERT INTO osf_collection_collected_types (id, collection_id, contenttype_id) - SELECT nextval('osf_collection_collected_types_id_seq'), C.id, CT.id - FROM osf_collection C - LEFT JOIN LATERAL ( - SELECT id - FROM django_content_type - WHERE app_label = 'osf' - AND model = 'abstractnode' - ) CT ON TRUE; - -- Also populate with collection type. Until now, they were nodes, and several have already been collected - INSERT INTO osf_collection_collected_types (id, collection_id, contenttype_id) - SELECT nextval('osf_collection_collected_types_id_seq'), C.id, CT.id - FROM osf_collection C - LEFT JOIN LATERAL ( - SELECT id - FROM django_content_type - WHERE app_label = 'osf' - AND model = 'collection' - ) CT ON TRUE; - """, """ - -- Point old collection GUIDs to new object - UPDATE osf_guid - SET content_type_id = (SELECT id FROM django_content_type WHERE app_label = 'osf' AND model = 'collection') - WHERE id IN ( - SELECT id - FROM osf_guid - WHERE content_type_id = (SELECT id FROM django_content_type WHERE app_label = 'osf' and model = 'abstractnode') - AND object_id IN (SELECT id FROM osf_collection) - ); - """, """ - -- Make a system tag for old collections - INSERT INTO osf_tag (id, name, system, created, modified) - SELECT nextval('osf_tag_id_seq'), 'old_node_collection', TRUE, current_timestamp, current_timestamp; - """, """ - -- And tag all old collections with it - INSERT INTO osf_abstractnode_tags (id, abstractnode_id, tag_id) - SELECT nextval('osf_abstractnode_tags_id_seq'), N.id, ONT.id - FROM osf_abstractnode N - LEFT JOIN LATERAL ( - SELECT id - FROM osf_tag - WHERE system = TRUE - AND name = 'old_node_collection' - ) ONT ON TRUE - WHERE N.type = 'osf.collection'; - """, """ - -- "Delete" old collection nodes - UPDATE osf_abstractnode - SET type='osf.node', - is_deleted = TRUE, - deleted_date = current_timestamp - WHERE type='osf.collection'; - """, """ - -- Update the collection id seq to avoid conflicts when more are made - SELECT setval('osf_collection_id_seq', max(id)) FROM osf_collection; - """ - ], [ - """ - -- Undelete nodes - UPDATE osf_abstractnode N - SET type = 'osf.collection', - is_deleted = FALSE, - deleted_date = NULL - FROM osf_abstractnode_tags ANT - LEFT JOIN LATERAL ( - SELECT id - FROM osf_tag - WHERE system = TRUE - AND name = 'old_node_collection' - ) T ON TRUE - WHERE ANT.tag_id = T.id AND ANT.abstractnode_id = N.id - """, """ - -- Repoint GUIDs - UPDATE osf_guid - SET content_type_id = (SELECT id FROM django_content_type WHERE app_label = 'osf' AND model = 'abstractnode') - WHERE id IN ( - SELECT id - FROM osf_guid - WHERE content_type_id = (SELECT id FROM django_content_type WHERE app_label = 'osf' and model = 'collection') - AND object_id IN (SELECT id FROM osf_collection) - ); - """, """ - -- Delete everything inserted in the forward - DELETE FROM osf_collection; - DELETE FROM osf_collection_collected_types; - DELETE FROM osf_collectedguidmetadata; - DELETE FROM osf_abstractnode_tags - WHERE tag_id = (SELECT id - FROM osf_tag - WHERE system = TRUE - AND name = 'old_node_collection'); - DELETE FROM osf_tag - WHERE system = TRUE - AND name = 'old_node_collection'; - """, """ - -- Reset collection id sequence - SELECT setval('osf_collection_id_seq', 1); - """ - ] - ), - ] diff --git a/osf/migrations/0088_post_migrate_collections.py b/osf/migrations/0088_post_migrate_collections.py deleted file mode 100644 index f53f27f817d..00000000000 --- a/osf/migrations/0088_post_migrate_collections.py +++ /dev/null @@ -1,24 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.9 on 2018-03-05 20:22 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0087_migrate_collections_data'), - ] - - operations = [ - migrations.RemoveField( - model_name='abstractnode', - name='is_bookmark_collection', - ), - migrations.AlterField( - model_name='abstractnode', - name='type', - field=models.CharField(choices=[('osf.node', 'node'), ('osf.registration', 'registration'), ('osf.quickfilesnode', 'quick files node')], db_index=True, max_length=255), - ), - ] diff --git a/osf/migrations/0089_auto_20180315_1114.py b/osf/migrations/0089_auto_20180315_1114.py deleted file mode 100644 index c0635f51b98..00000000000 --- a/osf/migrations/0089_auto_20180315_1114.py +++ /dev/null @@ -1,78 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.9 on 2018-03-15 16:14 -from __future__ import unicode_literals - -from django.conf import settings -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('auth', '0008_alter_user_username_max_length'), - ('osf', '0088_post_migrate_collections'), - ] - - operations = [ - migrations.CreateModel( - name='CollectionGroupObjectPermission', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ], - options={ - 'abstract': False, - }, - ), - migrations.CreateModel( - name='CollectionUserObjectPermission', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ], - options={ - 'abstract': False, - }, - ), - migrations.AlterModelOptions( - name='collection', - options={'permissions': (('read_collection', 'Read Collection'), ('write_collection', 'Write Collection'), ('admin_collection', 'Admin Collection'))}, - ), - migrations.AddField( - model_name='collectionuserobjectpermission', - name='content_object', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='osf.Collection'), - ), - migrations.AddField( - model_name='collectionuserobjectpermission', - name='permission', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='auth.Permission'), - ), - migrations.AddField( - model_name='collectionuserobjectpermission', - name='user', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL), - ), - migrations.AddField( - model_name='collectiongroupobjectpermission', - name='content_object', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='osf.Collection'), - ), - migrations.AddField( - model_name='collectiongroupobjectpermission', - name='group', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='auth.Group'), - ), - migrations.AddField( - model_name='collectiongroupobjectpermission', - name='permission', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='auth.Permission'), - ), - migrations.AlterUniqueTogether( - name='collectionuserobjectpermission', - unique_together=set([('user', 'permission', 'content_object')]), - ), - migrations.AlterUniqueTogether( - name='collectiongroupobjectpermission', - unique_together=set([('group', 'permission', 'content_object')]), - ), - ] diff --git a/osf/migrations/0090_add_collection_groups_permissions.py b/osf/migrations/0090_add_collection_groups_permissions.py deleted file mode 100644 index 4484a45792e..00000000000 --- a/osf/migrations/0090_add_collection_groups_permissions.py +++ /dev/null @@ -1,120 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.9 on 2018-03-15 17:11 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0089_auto_20180315_1114'), - ] - - operations = [ - migrations.RunSQL( - [ - """ - -- Ensure Permissions exist. Somehow, edge cases exist where the previous migration does not add them - INSERT INTO auth_permission (id, name, content_type_id, codename) - SELECT nextval('auth_permission_id_seq'), 'Read Collection', CT.id, 'read_collection' - FROM django_content_type CT - WHERE CT.app_label = 'osf' AND CT.model = 'collection' - AND NOT EXISTS ( - SELECT * - FROM auth_permission - WHERE codename = 'read_collection'); - INSERT INTO auth_permission (id, name, content_type_id, codename) - SELECT nextval('auth_permission_id_seq'), 'Write Collection', CT.id, 'write_collection' - FROM django_content_type CT - WHERE CT.app_label = 'osf' AND CT.model = 'collection' - AND NOT EXISTS ( - SELECT * - FROM auth_permission - WHERE codename = 'write_collection'); - INSERT INTO auth_permission (id, name, content_type_id, codename) - SELECT nextval('auth_permission_id_seq'), 'Admin Collection', CT.id, 'admin_collection' - FROM django_content_type CT - WHERE CT.app_label = 'osf' AND CT.model = 'collection' - AND NOT EXISTS ( - SELECT * - FROM auth_permission - WHERE codename = 'admin_collection'); - """, """ - -- Create collection groups - Read/Write/Admin - INSERT INTO auth_group (id, name) - SELECT nextval('auth_group_id_seq'), 'collections_' || C.id || '_read' - FROM osf_collection C; - INSERT INTO auth_group (id, name) - SELECT nextval('auth_group_id_seq'), 'collections_' || C.id || '_write' - FROM osf_collection C; - INSERT INTO auth_group (id, name) - SELECT nextval('auth_group_id_seq'), 'collections_' || C.id || '_admin' - FROM osf_collection C; - """, """ - -- Grant collection groups perms - -- -- Because the collection id is encoded in the group name, we can use split_part to extract it - -- ---- and avoid doing an extra join on osf_collection - -- Read granted to R/W/A groups - INSERT INTO osf_collectiongroupobjectpermission (id, content_object_id, group_id, permission_id) - SELECT nextval('osf_collectiongroupobjectpermission_id_seq'), split_part(G.name, '_', 2) :: INT, G.id :: INT, P.id - FROM auth_group G - LEFT JOIN LATERAL ( - SELECT id - FROM auth_permission - WHERE codename = 'read_collection' - ) P ON TRUE - WHERE G.name LIKE 'collections_%'; - -- Write granted to W/A groups - INSERT INTO osf_collectiongroupobjectpermission (id, content_object_id, group_id, permission_id) - SELECT nextval('osf_collectiongroupobjectpermission_id_seq'), split_part(G.name, '_', 2) :: INT, G.id :: INT, P.id - FROM auth_group G - LEFT JOIN LATERAL ( - SELECT id - FROM auth_permission - WHERE codename = 'write_collection' - ) P ON TRUE - WHERE G.name LIKE 'collections_%_write' - OR G.name LIKE 'collections_%_admin'; - -- Admin granted to A groups - INSERT INTO osf_collectiongroupobjectpermission (id, content_object_id, group_id, permission_id) - SELECT nextval('osf_collectiongroupobjectpermission_id_seq'), split_part(G.name, '_', 2) :: INT, G.id :: INT, P.id - FROM auth_group G - LEFT JOIN LATERAL ( - SELECT id - FROM auth_permission - WHERE codename = 'admin_collection' - ) P ON TRUE - WHERE G.name LIKE 'collections_%_admin'; - """, """ - -- Add collection creators to their respective admin groups - INSERT INTO osf_osfuser_groups (id, osfuser_id, group_id) - SELECT nextval('osf_osfuser_groups_id_seq'), C.creator_id, G.id - FROM osf_collection C - LEFT JOIN LATERAL ( - SELECT id - FROM auth_group - WHERE name = 'collections_' || C.id || '_admin' - ) G ON TRUE; - """ - ], [ - """ - -- Delete things from the forward - DELETE FROM osf_osfuser_groups - WHERE group_id IN (SELECT id - FROM auth_group - WHERE name LIKE 'collections_%'); - DELETE FROM osf_collectiongroupobjectpermission; - DELETE FROM auth_group - WHERE name LIKE 'collections_%'; - """, """ - -- Reset id sequence values - SELECT setval('osf_osfuser_groups_id_seq', max(id) + 1) - FROM osf_osfuser_groups; - SELECT setval('osf_collectiongroupobjectpermission_id_seq', 1); - SELECT setval('auth_group_id_seq', max(id) + 1) - FROM auth_group; - """ - ] - ) - ] diff --git a/osf/migrations/0091_notificationsubscription_provider.py b/osf/migrations/0091_notificationsubscription_provider.py deleted file mode 100644 index 0a959414c7e..00000000000 --- a/osf/migrations/0091_notificationsubscription_provider.py +++ /dev/null @@ -1,21 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.9 on 2018-03-07 20:33 -from __future__ import unicode_literals - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0090_add_collection_groups_permissions'), - ] - - operations = [ - migrations.AddField( - model_name='notificationsubscription', - name='provider', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='notification_subscriptions', to='osf.AbstractProvider'), - ), - ] diff --git a/osf/migrations/0092_populate_notification_subscriptions.py b/osf/migrations/0092_populate_notification_subscriptions.py deleted file mode 100644 index 154df5df3a8..00000000000 --- a/osf/migrations/0092_populate_notification_subscriptions.py +++ /dev/null @@ -1,70 +0,0 @@ -import logging - -from django.db import migrations -from django.contrib.auth.models import Group -from guardian.shortcuts import assign_perm, get_perms, remove_perm - -logger = logging.getLogger(__file__) - - -class GroupHelper(object): - """ Helper for managing permission groups for a given provider during migrations. - - The mixed-in functionality from ReviewProviderMixin is unavailable during migrations - """ - - def __init__(self, provider): - self.provider = provider - - def format_group(self, name): - from osf.models.mixins import ReviewProviderMixin - if name not in ReviewProviderMixin.groups: - raise ValueError('Invalid reviews group: "{}"'.format(name)) - return ReviewProviderMixin.group_format.format(self=self.provider, group=name) - - def get_group(self, name): - from django.contrib.auth.models import Group - return Group.objects.get(name=self.format_group(name)) - - def update_provider_auth_groups(self): - from osf.models.mixins import ReviewProviderMixin - for group_name, group_permissions in ReviewProviderMixin.groups.items(): - group, created = Group.objects.get_or_create(name=self.format_group(group_name)) - to_remove = set(get_perms(group, self.provider)).difference(group_permissions) - for p in to_remove: - remove_perm(p, group, self.provider) - for p in group_permissions: - assign_perm(p, group, self.provider) - -def populate_provider_notification_subscriptions(apps, schema_editor): - NotificationSubscription = apps.get_model('osf', 'NotificationSubscription') - PreprintProvider = apps.get_model('osf', 'PreprintProvider') - for provider in PreprintProvider.objects.all(): - helper = GroupHelper(provider) - try: - provider_admins = helper.get_group('admin').user_set.all() - provider_moderators = helper.get_group('moderator').user_set.all() - except Group.DoesNotExist: - logger.warn('Unable to find groups for provider "{}", assuming there are no subscriptions to create.'.format(provider._id)) - continue - instance, created = NotificationSubscription.objects.get_or_create(_id='{provider_id}_new_pending_submissions'.format(provider_id=provider._id), - event_name='new_pending_submissions', - provider=provider) - for user in provider_admins | provider_moderators: - # add user to subscription list but set their notification to none by default - instance.add_user_to_subscription(user, 'email_transactional', save=True) - -def revert(apps, schema_editor): - NotificationSubscription = apps.get_model('osf', 'NotificationSubscription') - # The revert of this migration deletes all NotificationSubscription instances - NotificationSubscription.objects.filter(provider__isnull=False).delete() - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0091_notificationsubscription_provider'), - ] - - operations = [ - migrations.RunPython(populate_provider_notification_subscriptions, revert), - ] diff --git a/osf/migrations/0093_node_subjects.py b/osf/migrations/0093_node_subjects.py deleted file mode 100644 index 0fecfb142b4..00000000000 --- a/osf/migrations/0093_node_subjects.py +++ /dev/null @@ -1,25 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.2 on 2017-08-01 18:33 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0092_populate_notification_subscriptions'), - ] - - operations = [ - migrations.AddField( - model_name='abstractnode', - name='subjects', - field=models.ManyToManyField(blank=True, related_name='abstractnodes', to='osf.Subject'), - ), - migrations.AlterField( - model_name='preprintservice', - name='subjects', - field=models.ManyToManyField(blank=True, related_name='preprintservices', to='osf.Subject'), - ), - ] diff --git a/osf/migrations/0094_update_preprintprovider_group_auth.py b/osf/migrations/0094_update_preprintprovider_group_auth.py deleted file mode 100644 index 5f16ecaf6f6..00000000000 --- a/osf/migrations/0094_update_preprintprovider_group_auth.py +++ /dev/null @@ -1,21 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.9 on 2018-03-28 03:41 -from __future__ import unicode_literals - -from django.db import migrations - - -def noop(*args, **kwargs): - # This migration used to update provider group perms, - # which is now handled by the post_migrate signal - pass - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0093_node_subjects'), - ] - - operations = [ - migrations.RunPython(noop, noop) - ] diff --git a/osf/migrations/0095_abstractprovider_allow_commenting.py b/osf/migrations/0095_abstractprovider_allow_commenting.py deleted file mode 100644 index 33586c36711..00000000000 --- a/osf/migrations/0095_abstractprovider_allow_commenting.py +++ /dev/null @@ -1,20 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.9 on 2018-04-11 13:24 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0094_update_preprintprovider_group_auth'), - ] - - operations = [ - migrations.AddField( - model_name='abstractprovider', - name='allow_commenting', - field=models.BooleanField(default=False), - ), - ] diff --git a/osf/migrations/0095_add_url_to_licenses.py b/osf/migrations/0095_add_url_to_licenses.py deleted file mode 100644 index b1e4c92c1df..00000000000 --- a/osf/migrations/0095_add_url_to_licenses.py +++ /dev/null @@ -1,20 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.11 on 2018-04-17 20:57 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0094_update_preprintprovider_group_auth'), - ] - - operations = [ - migrations.AddField( - model_name='nodelicense', - name='url', - field=models.URLField(blank=True), - ), - ] diff --git a/osf/migrations/0095_collectedguidmetadata_subjects.py b/osf/migrations/0095_collectedguidmetadata_subjects.py deleted file mode 100644 index b93d26eec3c..00000000000 --- a/osf/migrations/0095_collectedguidmetadata_subjects.py +++ /dev/null @@ -1,20 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.9 on 2018-04-05 16:36 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0094_update_preprintprovider_group_auth'), - ] - - operations = [ - migrations.AddField( - model_name='collectedguidmetadata', - name='subjects', - field=models.ManyToManyField(blank=True, related_name='collectedguidmetadatas', to='osf.Subject'), - ), - ] diff --git a/osf/migrations/0095_ensure_licenses.py b/osf/migrations/0095_ensure_licenses.py deleted file mode 100644 index 78f732dfa1c..00000000000 --- a/osf/migrations/0095_ensure_licenses.py +++ /dev/null @@ -1,20 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.11 on 2018-04-06 16:52 -from __future__ import unicode_literals - -import logging - -from django.db import migrations - - -logger = logging.getLogger(__file__) - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0094_update_preprintprovider_group_auth'), - ] - - operations = [ - ] diff --git a/osf/migrations/0095_reset_osf_abstractprovider_licenses_acceptable_id_seq.py b/osf/migrations/0095_reset_osf_abstractprovider_licenses_acceptable_id_seq.py deleted file mode 100644 index e50093b485f..00000000000 --- a/osf/migrations/0095_reset_osf_abstractprovider_licenses_acceptable_id_seq.py +++ /dev/null @@ -1,33 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.9 on 2018-04-12 20:31 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0094_update_preprintprovider_group_auth'), - ] - - operations = [ - migrations.RunSQL( - """ - SELECT setval(pg_get_serial_sequence('"osf_abstractprovider_licenses_acceptable"','id'), - coalesce(max("id"), 1), max("id") IS NOT null) - FROM "osf_abstractprovider_licenses_acceptable"; - - SELECT setval(pg_get_serial_sequence('"osf_abstractprovider"','id'), - coalesce(max("id"), 1), max("id") IS NOT null) - FROM "osf_abstractprovider"; - """, - """ - SELECT setval(pg_get_serial_sequence('"osf_abstractprovider_licenses_acceptable"','id'), 1, max("id") IS NOT null) - FROM "osf_abstractprovider_licenses_acceptable"; - - SELECT setval(pg_get_serial_sequence('"osf_abstractprovider"','id'), 1, max("id") IS NOT null) - FROM "osf_abstractprovider_licenses_acceptable"; - """ - ), - ] diff --git a/osf/migrations/0096_abstractprovider_primary_collection.py b/osf/migrations/0096_abstractprovider_primary_collection.py deleted file mode 100644 index 2dd6ab73548..00000000000 --- a/osf/migrations/0096_abstractprovider_primary_collection.py +++ /dev/null @@ -1,21 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.9 on 2018-04-05 17:11 -from __future__ import unicode_literals - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0095_collectedguidmetadata_subjects'), - ] - - operations = [ - migrations.AddField( - model_name='abstractprovider', - name='primary_collection', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='osf.Collection'), - ), - ] diff --git a/osf/migrations/0096_add_provider_doi_prefixes.py b/osf/migrations/0096_add_provider_doi_prefixes.py deleted file mode 100644 index eb7309bd6c0..00000000000 --- a/osf/migrations/0096_add_provider_doi_prefixes.py +++ /dev/null @@ -1,66 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.11 on 2018-04-20 20:39 -from __future__ import unicode_literals - -import logging -from django.db import migrations, models - -from osf.models import PreprintProvider - -logger = logging.getLogger(__file__) - - -PREPRINT_DOI_NAMESPACE = { - 'osf': '10.31219', - 'agrixiv': '10.31220', - 'arabixiv': '10.31221', - 'bitss': '10.31222', - 'eartharxiv': '10.31223', - 'engrxiv': '10.31224', - 'focusarchive': '10.31225', - 'frenxiv': '10.31226', - 'inarxiv': '10.31227', - 'lawarxiv': '10.31228', - 'lissa': '10.31229', - 'marxiv': '10.31230', - 'mindrxiv': '10.31231', - 'nutrixiv': '10.31232', - 'paleorxiv': '10.31233', - 'psyarxiv': '10.31234', - 'socarxiv': '10.31235', - 'sportrxiv': '10.31236', - 'thesiscommons': '10.31237' -} - - -def add_doi_prefix(*args, **kwargs): - for key, value in PREPRINT_DOI_NAMESPACE.items(): - provider = PreprintProvider.objects.filter(_id=key) - if not provider.exists(): - logger.info('Could not find provider with _id {}, skipping for now...'.format(key)) - continue - provider = provider.get() - provider.doi_prefix = value - provider.save() - - -def remove_doi_prefix(*args, **kwargs): - # Reverse migration not needed, as removing the field - # will remove all values from the field - pass - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0095_add_url_to_licenses'), - ] - - operations = [ - migrations.AddField( - model_name='abstractprovider', - name='doi_prefix', - field=models.CharField(blank=True, max_length=32, null=True), - ), - migrations.RunPython(add_doi_prefix, remove_doi_prefix) - ] diff --git a/osf/migrations/0096_ensure_schemas.py b/osf/migrations/0096_ensure_schemas.py deleted file mode 100644 index ec6d40621db..00000000000 --- a/osf/migrations/0096_ensure_schemas.py +++ /dev/null @@ -1,16 +0,0 @@ -from __future__ import unicode_literals - -import logging - -from django.db import migrations - -logger = logging.getLogger(__file__) - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0095_reset_osf_abstractprovider_licenses_acceptable_id_seq'), - ] - - operations = [] diff --git a/osf/migrations/0096_merge_20180413_1110.py b/osf/migrations/0096_merge_20180413_1110.py deleted file mode 100644 index 1fc940c5084..00000000000 --- a/osf/migrations/0096_merge_20180413_1110.py +++ /dev/null @@ -1,16 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.9 on 2018-04-13 16:10 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0095_abstractprovider_allow_commenting'), - ('osf', '0095_ensure_licenses'), - ] - - operations = [ - ] diff --git a/osf/migrations/0096_modify_noderequestaction_noderequest.py b/osf/migrations/0096_modify_noderequestaction_noderequest.py deleted file mode 100644 index 5844e670291..00000000000 --- a/osf/migrations/0096_modify_noderequestaction_noderequest.py +++ /dev/null @@ -1,41 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.9 on 2018-02-21 19:11 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0095_ensure_licenses'), - ] - - operations = [ - migrations.AddField( - model_name='noderequestaction', - name='permissions', - field=models.CharField(choices=[('admin', 'Admin'), ('read', 'Read'), ('write', 'Write')], default='read', max_length=5), - ), - migrations.AddField( - model_name='noderequestaction', - name='visible', - field=models.BooleanField(default=True), - ), - migrations.AlterUniqueTogether( - name='noderequest', - unique_together=set([]), - ), - migrations.RunSQL( - [ - """ - CREATE UNIQUE INDEX osf_noderequest_target_creator_non_accepted ON osf_noderequest (target_id, creator_id) - WHERE machine_state != 'accepted'; - """ - ], [ - """ - DROP INDEX IF EXISTS osf_noderequest_target_creator_non_accepted RESTRICT; - """ - ] - ), - ] diff --git a/osf/migrations/0097_merge_20180416_1453.py b/osf/migrations/0097_merge_20180416_1453.py deleted file mode 100644 index 6eee71cedf4..00000000000 --- a/osf/migrations/0097_merge_20180416_1453.py +++ /dev/null @@ -1,16 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.11 on 2018-04-16 19:53 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0096_ensure_schemas'), - ('osf', '0096_modify_noderequestaction_noderequest'), - ] - - operations = [ - ] diff --git a/osf/migrations/0097_merge_20180416_1533.py b/osf/migrations/0097_merge_20180416_1533.py deleted file mode 100644 index 9179c169942..00000000000 --- a/osf/migrations/0097_merge_20180416_1533.py +++ /dev/null @@ -1,16 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.11 on 2018-04-16 20:33 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0096_merge_20180413_1110'), - ('osf', '0096_ensure_schemas'), - ] - - operations = [ - ] diff --git a/osf/migrations/0098_auto_20180418_1722.py b/osf/migrations/0098_auto_20180418_1722.py deleted file mode 100644 index db1fccb73af..00000000000 --- a/osf/migrations/0098_auto_20180418_1722.py +++ /dev/null @@ -1,26 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.11 on 2018-04-18 22:22 -from __future__ import unicode_literals - -from django.db import migrations, models -import osf.utils.fields - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0097_merge_20180416_1533'), - ] - - operations = [ - migrations.AddField( - model_name='osfuser', - name='change_password_last_attempt', - field=osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True), - ), - migrations.AddField( - model_name='osfuser', - name='old_password_invalid_attempts', - field=models.PositiveIntegerField(default=0), - ), - ] diff --git a/osf/migrations/0098_merge_20180416_1807.py b/osf/migrations/0098_merge_20180416_1807.py deleted file mode 100644 index 5fd6873d7e2..00000000000 --- a/osf/migrations/0098_merge_20180416_1807.py +++ /dev/null @@ -1,16 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.11 on 2018-04-16 23:07 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0097_merge_20180416_1533'), - ('osf', '0097_merge_20180416_1453'), - ] - - operations = [ - ] diff --git a/osf/migrations/0098_merge_20180424_1329.py b/osf/migrations/0098_merge_20180424_1329.py deleted file mode 100644 index fb9e99d67d1..00000000000 --- a/osf/migrations/0098_merge_20180424_1329.py +++ /dev/null @@ -1,16 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.11 on 2018-04-24 18:29 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0097_merge_20180416_1533'), - ('osf', '0096_abstractprovider_primary_collection'), - ] - - operations = [ - ] diff --git a/osf/migrations/0099_add_default_storage_region.py b/osf/migrations/0099_add_default_storage_region.py deleted file mode 100644 index 8b475a24506..00000000000 --- a/osf/migrations/0099_add_default_storage_region.py +++ /dev/null @@ -1,78 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.9 on 2018-03-07 15:57 -from __future__ import unicode_literals - -import logging - -from django.db import migrations -from django.apps import apps -from django.core.paginator import Paginator - -from addons.osfstorage.settings import DEFAULT_REGION_NAME, DEFAULT_REGION_ID -from website.settings import WATERBUTLER_URL - -logger = logging.getLogger(__file__) - -osfstorage_config = apps.get_app_config('addons_osfstorage') - - -def add_osfstorage_addon(apps, *args): - OSFUser = apps.get_model('osf', 'OSFUser') - Region = apps.get_model('addons_osfstorage', 'Region') - OsfStorageUserSettings = apps.get_model('addons_osfstorage', 'UserSettings') - - default_region, created = Region.objects.get_or_create( - _id=DEFAULT_REGION_ID, - name=DEFAULT_REGION_NAME, - waterbutler_credentials=osfstorage_config.WATERBUTLER_CREDENTIALS, - waterbutler_settings=osfstorage_config.WATERBUTLER_SETTINGS, - waterbutler_url=WATERBUTLER_URL - ) - - if created: - logger.info('Created default region: {}'.format(DEFAULT_REGION_NAME)) - - total_users = OSFUser.objects.all().count() - users_done = 0 - paginator = Paginator(OSFUser.objects.all().order_by('pk'), 1000) - for page_num in paginator.page_range: - page = paginator.page(page_num) - - user_settings_to_update = [] - for user in page: - new_user_settings = OsfStorageUserSettings( - owner=user, - default_region=default_region - ) - user_settings_to_update.append(new_user_settings) - users_done += 1 - - OsfStorageUserSettings.objects.bulk_create(user_settings_to_update) - logger.info('Created {}/{} UserSettings'.format(users_done, total_users)) - - logger.info('Created UserSettings for {} users'.format(total_users)) - - -def remove_osfstorage_addon(apps, *args): - Region = apps.get_model('addons_osfstorage', 'Region') - OsfStorageUserSettings = osfstorage_config.user_settings - - region = Region.objects.filter( - name=DEFAULT_REGION_NAME - ) - - if region: - region.get().delete() - - OsfStorageUserSettings.objects.all().delete() - - -class Migration(migrations.Migration): - - dependencies = [ - ('addons_osfstorage', '0004_storage_region_models'), - ('osf', '0098_merge_20180416_1807'), - ] - - operations = [ - ] diff --git a/osf/migrations/0099_file_version_user_metadata.py b/osf/migrations/0099_file_version_user_metadata.py deleted file mode 100644 index a12637e2803..00000000000 --- a/osf/migrations/0099_file_version_user_metadata.py +++ /dev/null @@ -1,37 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.11 on 2018-04-10 14:19 -from __future__ import unicode_literals - -from django.conf import settings -from django.db import migrations, models -import django.db.models.deletion -import django_extensions.db.fields - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0098_merge_20180416_1807'), - ] - - operations = [ - migrations.CreateModel( - name='FileVersionUserMetadata', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), - ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), - ('file_version', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='osf.FileVersion')), - ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), - ], - ), - migrations.AddField( - model_name='fileversion', - name='seen_by', - field=models.ManyToManyField(related_name='versions_seen', through='osf.FileVersionUserMetadata', to=settings.AUTH_USER_MODEL), - ), - migrations.AlterUniqueTogether( - name='fileversionusermetadata', - unique_together=set([('user', 'file_version')]), - ), - ] diff --git a/osf/migrations/0099_merge_20180426_0930.py b/osf/migrations/0099_merge_20180426_0930.py deleted file mode 100644 index 94130d4cabe..00000000000 --- a/osf/migrations/0099_merge_20180426_0930.py +++ /dev/null @@ -1,16 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.11 on 2018-04-26 14:30 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0098_merge_20180416_1807'), - ('osf', '0096_add_provider_doi_prefixes'), - ] - - operations = [ - ] diff --git a/osf/migrations/0099_merge_20180427_1109.py b/osf/migrations/0099_merge_20180427_1109.py deleted file mode 100644 index b6b45e4d180..00000000000 --- a/osf/migrations/0099_merge_20180427_1109.py +++ /dev/null @@ -1,16 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.11 on 2018-04-27 16:09 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0098_merge_20180416_1807'), - ('osf', '0098_auto_20180418_1722'), - ] - - operations = [ - ] diff --git a/osf/migrations/0099_merge_20180505_1027.py b/osf/migrations/0099_merge_20180505_1027.py deleted file mode 100644 index d99c4fe0fdb..00000000000 --- a/osf/migrations/0099_merge_20180505_1027.py +++ /dev/null @@ -1,16 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.11 on 2018-05-05 15:27 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0085_finalize_file_node_to_target'), - ('osf', '0098_merge_20180416_1807'), - ] - - operations = [ - ] diff --git a/osf/migrations/0099_migrate_comments_on_deleted_objects.py b/osf/migrations/0099_migrate_comments_on_deleted_objects.py deleted file mode 100644 index 87a7d611b4d..00000000000 --- a/osf/migrations/0099_migrate_comments_on_deleted_objects.py +++ /dev/null @@ -1,40 +0,0 @@ -from __future__ import unicode_literals -import logging - -from django.db import migrations -from django_bulk_update.helper import bulk_update - -logger = logging.getLogger(__file__) - - -def update_comment_root_target(state, *args, **kwargs): - Comment = state.get_model('osf', 'comment') - comments = Comment.objects.exclude(is_deleted=True).select_related('root_target') - logger.info('{} comments to check'.format(comments.count())) - comments_to_update = [] - for comment in comments: - if comment.root_target: - root_target_ctype = comment.root_target.content_type - root_target_model_cls = state.get_model(root_target_ctype.app_label, root_target_ctype.model) - root_target = root_target_model_cls.objects.get(pk=comment.root_target.object_id) - if hasattr(root_target, 'is_deleted') and root_target.is_deleted: - logger.info('{} is deleted. Setting Comment {} root_target to None'.format(root_target, comment.pk)) - comment.root_target = None - comments_to_update.append(comment) - if hasattr(root_target, 'deleted') and root_target.deleted: - logger.info('{} is deleted. Setting Comment {} root_target to None'.format(root_target, comment.pk)) - comment.root_target = None - comments_to_update.append(comment) - bulk_update(comments_to_update, update_fields=['root_target']) - logger.info('Total comments migrated: {}'.format(len(comments_to_update))) - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0098_merge_20180416_1807'), - ] - - operations = [ - migrations.RunPython(update_comment_root_target) - ] diff --git a/osf/migrations/0099_whitelistedsharepreprintprovider.py b/osf/migrations/0099_whitelistedsharepreprintprovider.py deleted file mode 100644 index 13f5b1c3929..00000000000 --- a/osf/migrations/0099_whitelistedsharepreprintprovider.py +++ /dev/null @@ -1,28 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.11 on 2018-04-25 20:16 -from __future__ import unicode_literals - -from django.db import migrations, models -import django_extensions.db.fields - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0098_merge_20180424_1329'), - ] - - operations = [ - migrations.CreateModel( - name='WhitelistedSHAREPreprintProvider', - fields=[ - ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), - ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), - ('id', models.AutoField(primary_key=True, serialize=False)), - ('provider_name', models.CharField(max_length=200, unique=True)), - ], - options={ - 'abstract': False, - }, - ), - ] diff --git a/osf/migrations/0100_notificationdigest_provider.py b/osf/migrations/0100_notificationdigest_provider.py deleted file mode 100644 index 6522e16726e..00000000000 --- a/osf/migrations/0100_notificationdigest_provider.py +++ /dev/null @@ -1,21 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.11 on 2018-05-02 13:42 -from __future__ import unicode_literals - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0099_whitelistedsharepreprintprovider'), - ] - - operations = [ - migrations.AddField( - model_name='notificationdigest', - name='provider', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='osf.AbstractProvider'), - ), - ] diff --git a/osf/migrations/0100_set_access_request_enabled.py b/osf/migrations/0100_set_access_request_enabled.py deleted file mode 100644 index 7c4364bac4b..00000000000 --- a/osf/migrations/0100_set_access_request_enabled.py +++ /dev/null @@ -1,49 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.11 on 2018-04-30 18:34 -from __future__ import unicode_literals - -from django.db import migrations, models, connection - -from osf.models import Node - - -class Migration(migrations.Migration): - - # Avoid locking the osf_abstractnode table - atomic = False - - dependencies = [ - ('osf', '0099_merge_20180427_1109'), - ] - - def add_default_access_requests_enabled(self, *args, **kwargs): - # Update nodes in batches - BATCHSIZE = 5000 - - max_pk = Node.objects.aggregate(models.Max('pk'))['pk__max'] - if max_pk is not None: - for offset in range(0, max_pk + 1, BATCHSIZE): - (Node.objects - .filter(pk__gte=offset) - .filter(pk__lt=offset + BATCHSIZE) - .filter(access_requests_enabled__isnull=True) - .update(access_requests_enabled=True)) - - def remove_default_access_requests_enabled(self, *args, **kwargs): - # Get the date the original noderequest migration was applied - sql = "SELECT applied from django_migrations WHERE app = 'osf' AND name = '0077_add_noderequest_model';" - with connection.cursor() as cursor: - cursor.execute(sql) - date_noderequest_migration = cursor.fetchall()[0][0] - - # Get all projects created before that - Node.objects.filter(created__lte=date_noderequest_migration).update(access_requests_enabled=None) - - operations = [ - migrations.AlterField( - model_name='noderequestaction', - name='permissions', - field=models.CharField(choices=[('read', 'Read'), ('write', 'Write'), ('admin', 'Admin')], default='read', max_length=5), - ), - migrations.RunPython(add_default_access_requests_enabled, remove_default_access_requests_enabled), - ] diff --git a/osf/migrations/0101_merge_20180508_1011.py b/osf/migrations/0101_merge_20180508_1011.py deleted file mode 100644 index 5d56c864e9a..00000000000 --- a/osf/migrations/0101_merge_20180508_1011.py +++ /dev/null @@ -1,16 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.11 on 2018-05-08 15:11 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0099_migrate_comments_on_deleted_objects'), - ('osf', '0100_set_access_request_enabled'), - ] - - operations = [ - ] diff --git a/osf/migrations/0101_merge_20180514_1932.py b/osf/migrations/0101_merge_20180514_1932.py deleted file mode 100644 index 955c1605fc0..00000000000 --- a/osf/migrations/0101_merge_20180514_1932.py +++ /dev/null @@ -1,16 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.13 on 2018-05-15 00:32 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0099_merge_20180426_0930'), - ('osf', '0100_set_access_request_enabled'), - ] - - operations = [ - ] diff --git a/osf/migrations/0101_osfuser_accepted_terms_of_service.py b/osf/migrations/0101_osfuser_accepted_terms_of_service.py deleted file mode 100644 index 19f3a792e1d..00000000000 --- a/osf/migrations/0101_osfuser_accepted_terms_of_service.py +++ /dev/null @@ -1,21 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.11 on 2018-05-09 18:55 -from __future__ import unicode_literals - -from django.db import migrations -import osf.utils.fields - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0100_set_access_request_enabled'), - ] - - operations = [ - migrations.AddField( - model_name='osfuser', - name='accepted_terms_of_service', - field=osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True), - ), - ] diff --git a/osf/migrations/0102_merge_20180509_0846.py b/osf/migrations/0102_merge_20180509_0846.py deleted file mode 100644 index 5c200aea987..00000000000 --- a/osf/migrations/0102_merge_20180509_0846.py +++ /dev/null @@ -1,17 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.11 on 2018-05-09 13:46 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0099_add_default_storage_region'), - ('osf', '0099_file_version_user_metadata'), - ('osf', '0101_merge_20180508_1011'), - ] - - operations = [ - ] diff --git a/osf/migrations/0103_set_osf_storage_node_settings_region.py b/osf/migrations/0103_set_osf_storage_node_settings_region.py deleted file mode 100644 index cab42313e05..00000000000 --- a/osf/migrations/0103_set_osf_storage_node_settings_region.py +++ /dev/null @@ -1,71 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.11 on 2018-04-30 18:34 -from __future__ import unicode_literals - -import logging - -from django.apps import apps -from django.db import migrations, models - -from addons.osfstorage.models import NodeSettings, Region -from addons.osfstorage.settings import DEFAULT_REGION_ID, DEFAULT_REGION_NAME - -logger = logging.getLogger(__name__) -osfstorage_config = apps.get_app_config('addons_osfstorage') - -class Migration(migrations.Migration): - - # Avoid locking the addons_osfstorage_nodesettings table - atomic = False - - dependencies = [ - ('osf', '0102_merge_20180509_0846'), - ] - - def add_default_region_to_nodesettings(self, *args, **kwargs): - default_region, created = Region.objects.get_or_create( - _id=DEFAULT_REGION_ID, - name=DEFAULT_REGION_NAME, - ) - if created: - logger.info('Created default region: {}'.format(DEFAULT_REGION_NAME)) - BATCHSIZE = 5000 - - max_pk = NodeSettings.objects.aggregate(models.Max('pk'))['pk__max'] - if max_pk is not None: - for offset in range(0, max_pk + 1, BATCHSIZE): - (NodeSettings.objects - .filter(pk__gte=offset) - .filter(pk__lt=offset + BATCHSIZE) - .filter(region__isnull=True) - .update(region=default_region)) - logger.info( - 'Updated addons_osfstorage_nodesettings {}-{}/{}'.format( - offset, - offset + BATCHSIZE, - max_pk, - ) - ) - - def unset_default_region(self, *args, **kwargs): - BATCHSIZE = 5000 - - max_pk = NodeSettings.objects.aggregate(models.Max('pk'))['pk__max'] - if max_pk is not None: - for offset in range(0, max_pk + 1, BATCHSIZE): - (NodeSettings.objects - .filter(pk__gte=offset) - .filter(pk__lt=offset + BATCHSIZE) - .filter(region__isnull=False) - .update(region=None)) - logger.info( - 'Unset addons_osfstorage_nodesettings {}-{}/{}'.format( - offset, - offset + BATCHSIZE, - max_pk, - ) - ) - - operations = [ - migrations.RunPython(add_default_region_to_nodesettings, unset_default_region), - ] diff --git a/osf/migrations/0104_merge_20180518_1337.py b/osf/migrations/0104_merge_20180518_1337.py deleted file mode 100644 index 75f6c50a169..00000000000 --- a/osf/migrations/0104_merge_20180518_1337.py +++ /dev/null @@ -1,16 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.11 on 2018-05-18 18:37 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0103_set_osf_storage_node_settings_region'), - ('osf', '0101_merge_20180514_1932'), - ] - - operations = [ - ] diff --git a/osf/migrations/0104_merge_20180523_1240.py b/osf/migrations/0104_merge_20180523_1240.py deleted file mode 100644 index 0874344e3a2..00000000000 --- a/osf/migrations/0104_merge_20180523_1240.py +++ /dev/null @@ -1,16 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.13 on 2018-05-23 17:40 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0103_set_osf_storage_node_settings_region'), - ('osf', '0100_notificationdigest_provider'), - ] - - operations = [ - ] diff --git a/osf/migrations/0104_merge_20180524_1257.py b/osf/migrations/0104_merge_20180524_1257.py deleted file mode 100644 index 2af204e0621..00000000000 --- a/osf/migrations/0104_merge_20180524_1257.py +++ /dev/null @@ -1,16 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.11 on 2018-05-24 17:57 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0103_set_osf_storage_node_settings_region'), - ('osf', '0099_merge_20180505_1027'), - ] - - operations = [ - ] diff --git a/osf/migrations/0104_merge_20180524_1621.py b/osf/migrations/0104_merge_20180524_1621.py deleted file mode 100644 index f136b55dde4..00000000000 --- a/osf/migrations/0104_merge_20180524_1621.py +++ /dev/null @@ -1,16 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.13 on 2018-05-24 21:21 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0103_set_osf_storage_node_settings_region'), - ('osf', '0101_osfuser_accepted_terms_of_service'), - ] - - operations = [ - ] diff --git a/osf/migrations/0105_add_identifier_deleted_field.py b/osf/migrations/0105_add_identifier_deleted_field.py deleted file mode 100644 index 7b8cba3a2f9..00000000000 --- a/osf/migrations/0105_add_identifier_deleted_field.py +++ /dev/null @@ -1,21 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.11 on 2018-05-18 19:14 -from __future__ import unicode_literals - -from django.db import migrations -import osf.utils.fields - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0104_merge_20180518_1337'), - ] - - operations = [ - migrations.AddField( - model_name='identifier', - name='deleted', - field=osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True), - ), - ] diff --git a/osf/migrations/0105_merge_20180525_1529.py b/osf/migrations/0105_merge_20180525_1529.py deleted file mode 100644 index 6b95e6f6f6c..00000000000 --- a/osf/migrations/0105_merge_20180525_1529.py +++ /dev/null @@ -1,16 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.13 on 2018-05-25 20:29 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0104_merge_20180523_1240'), - ('osf', '0104_merge_20180524_1621'), - ] - - operations = [ - ] diff --git a/osf/migrations/0106_auto_20180601_1341.py b/osf/migrations/0106_auto_20180601_1341.py deleted file mode 100644 index f8c029acdf2..00000000000 --- a/osf/migrations/0106_auto_20180601_1341.py +++ /dev/null @@ -1,20 +0,0 @@ -from __future__ import unicode_literals - -import logging - -from django.db import migrations -from osf.utils.migrations import ensure_schemas, remove_schemas - - -logger = logging.getLogger(__file__) - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0105_merge_20180525_1529'), - ] - - operations = [ - migrations.RunPython(ensure_schemas, remove_schemas), - ] diff --git a/osf/migrations/0106_citationstyle_parent_style.py b/osf/migrations/0106_citationstyle_parent_style.py deleted file mode 100644 index 56bd7d39229..00000000000 --- a/osf/migrations/0106_citationstyle_parent_style.py +++ /dev/null @@ -1,20 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.7 on 2018-01-12 01:10 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0105_merge_20180525_1529'), - ] - - operations = [ - migrations.AddField( - model_name='citationstyle', - name='parent_style', - field=models.CharField(blank=True, max_length=255, null=True), - ), - ] diff --git a/osf/migrations/0106_merge_20180531_0919.py b/osf/migrations/0106_merge_20180531_0919.py deleted file mode 100644 index 30323d327e5..00000000000 --- a/osf/migrations/0106_merge_20180531_0919.py +++ /dev/null @@ -1,16 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.11 on 2018-05-31 14:19 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0105_merge_20180525_1529'), - ('osf', '0104_merge_20180524_1257'), - ] - - operations = [ - ] diff --git a/osf/migrations/0106_set_preprint_identifier_category.py b/osf/migrations/0106_set_preprint_identifier_category.py deleted file mode 100644 index d1f1f6bf10d..00000000000 --- a/osf/migrations/0106_set_preprint_identifier_category.py +++ /dev/null @@ -1,39 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.11 on 2018-05-29 19:46 -from __future__ import unicode_literals - -from django.db import migrations, models - -from django.contrib.contenttypes.models import ContentType - - -def set_preprint_identifier_catetory_to_legacy(apps, *args, **kwargs): - - PreprintService = apps.get_model('osf', 'PreprintService') - Identifier = apps.get_model('osf', 'Identifier') - - preprint_content_type = ContentType.objects.get_for_model(PreprintService) - Identifier.objects.filter(content_type_id=preprint_content_type.id, category='doi').update(category='legacy_doi') - -def return_preprint_identifier_category_to_doi(apps, *args, **kwargs): - PreprintService = apps.get_model('osf', 'PreprintService') - Identifier = apps.get_model('osf', 'Identifier') - - preprint_content_type = ContentType.objects.get_for_model(PreprintService) - Identifier.objects.filter(content_type_id=preprint_content_type.id, category='legacy_doi').update(category='doi') - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0105_add_identifier_deleted_field'), - ] - - operations = [ - migrations.AlterField( - model_name='identifier', - name='category', - field=models.CharField(max_length=20), - ), - migrations.RunPython(set_preprint_identifier_catetory_to_legacy, return_preprint_identifier_category_to_doi) - ] diff --git a/osf/migrations/0107_add_dependent_styles.py b/osf/migrations/0107_add_dependent_styles.py deleted file mode 100644 index d55db73c45c..00000000000 --- a/osf/migrations/0107_add_dependent_styles.py +++ /dev/null @@ -1,150 +0,0 @@ -import logging -import os - -from django.db import migrations -from lxml import etree - -from website import settings -from future.moves.urllib.parse import urlparse - -logger = logging.getLogger(__file__) - -def get_style_files(path): - files = (os.path.join(path, x) for x in os.listdir(path)) - return (f for f in files if os.path.isfile(f)) - -def update_styles(state, schema): - # drop all styles - CitationStyle = state.get_model('osf', 'citationstyle') - CitationStyle.objects.all().delete() - - for style_file in get_style_files(settings.CITATION_STYLES_PATH): - with open(style_file, 'r') as f: - try: - root = etree.parse(f).getroot() - except etree.XMLSyntaxError: - continue - - namespace = root.nsmap.get(None) - selector = '{{{ns}}}info/{{{ns}}}'.format(ns=namespace) - title = root.find(selector + 'title').text - has_bibliography = 'Bluebook' in title - - if not has_bibliography: - bib = root.find('{{{ns}}}{bib}'.format(ns=namespace, bib='bibliography')) - layout = bib.find('{{{ns}}}{layout}'.format(ns=namespace, layout='layout')) if bib is not None else None - has_bibliography = True - if layout is not None and len(layout.getchildren()) == 1 and 'choose' in layout.getchildren()[0].tag: - choose = layout.find('{{{ns}}}{choose}'.format(ns=namespace, choose='choose')) - else_tag = choose.find('{{{ns}}}{tag}'.format(ns=namespace, tag='else')) - if else_tag is None: - supported_types = [] - match_none = False - for child in choose.getchildren(): - types = child.get('type', None) - match_none = child.get('match', 'any') == 'none' - if types is not None: - types = types.split(' ') - supported_types.extend(types) - - if 'webpage' in types: - break - else: - if len(supported_types) and not match_none: - # has_bibliography set to False now means that either bibliography tag is absent - # or our type (webpage) is not supported by the current version of this style. - has_bibliography = False - - # Required - fields = { - '_id': os.path.splitext(os.path.basename(style_file))[0], - 'title': title, - 'has_bibliography': has_bibliography, - 'parent_style': None - } - - # Optional - try: - fields['short_title'] = root.find(selector + 'title-short').text - except AttributeError: - pass - - try: - fields['summary'] = root.find(selector + 'summary').text - except AttributeError: - pass - - style = CitationStyle(**fields) - style.save() - - # Parse styles under styles/dependent that depend on some styles under styles. - - dependent_dir = os.path.join(settings.CITATION_STYLES_PATH, 'dependent') - for style_file in get_style_files(dependent_dir): - with open(style_file, 'r') as f: - try: - root = etree.parse(f).getroot() - except etree.XMLSyntaxError: - continue - - namespace = root.nsmap.get(None) - selector = '{{{ns}}}info/{{{ns}}}'.format(ns=namespace) - title = root.find(selector + 'title').text - has_bibliography = root.find('{{{ns}}}{tag}'.format(ns=namespace, tag='bibliography')) is not None or 'Bluebook' in title - - style_id = os.path.splitext(os.path.basename(style_file))[0] - links = root.findall(selector + 'link') - for link in links: - if link.get('rel') == 'independent-parent': - parent_style_id = urlparse(link.get('href')).path.split('/')[-1] - parent_style = CitationStyle.objects.get(_id=parent_style_id) - - if parent_style is not None: - parent_has_bibliography = parent_style.has_bibliography - fields = { - '_id': style_id, - 'title': title, - 'has_bibliography': parent_has_bibliography, - 'parent_style': parent_style_id - } - - # Optional - try: - fields['short_title'] = root.find(selector + 'title-short').text - except AttributeError: - pass - - try: - fields['summary'] = root.find(selector + 'summary').text - except AttributeError: - pass - - style = CitationStyle(**fields) - style.save() - break - - else: - logger.debug('Unable to load parent_style object: parent {}, dependent style {}'.format(parent_style_id, style_id)) - else: - fields = { - '_id': style_id, - 'title': title, - 'has_bibliography': has_bibliography, - 'parent_style': None - } - style = CitationStyle(**fields) - style.save() - - -def revert(state, schema): - # The revert of this migration simply removes all CitationStyle instances. - CitationStyle = state.get_model('osf', 'citationstyle') - CitationStyle.objects.all().delete() - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0106_citationstyle_parent_style'), - ] - - operations = [] diff --git a/osf/migrations/0107_merge_20180604_1232.py b/osf/migrations/0107_merge_20180604_1232.py deleted file mode 100644 index 22fe5791233..00000000000 --- a/osf/migrations/0107_merge_20180604_1232.py +++ /dev/null @@ -1,16 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.11 on 2018-06-04 17:32 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0105_merge_20180525_1529'), - ('osf', '0106_set_preprint_identifier_category'), - ] - - operations = [ - ] diff --git a/osf/migrations/0108_auto_20180530_1310.py b/osf/migrations/0108_auto_20180530_1310.py deleted file mode 100644 index b2b0259eb46..00000000000 --- a/osf/migrations/0108_auto_20180530_1310.py +++ /dev/null @@ -1,99 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.13 on 2018-05-30 18:10 -from __future__ import unicode_literals - -from django.conf import settings -from django.db import migrations, models -import django.db.models.deletion -import django_extensions.db.fields -import osf.models.spam -import osf.utils.datetime_aware_jsonfield -import osf.utils.fields - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0107_add_dependent_styles'), - ] - - operations = [ - migrations.CreateModel( - name='DismissedAlert', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), - ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), - ('_id', models.CharField(db_index=True, max_length=255)), - ('location', models.CharField(max_length=255)), - ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='alerts', to=settings.AUTH_USER_MODEL)), - ], - options={ - 'ordering': ['-created'], - 'get_latest_by': 'created', - }, - ), - migrations.CreateModel( - name='ProviderAssetFile', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), - ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), - ('name', models.CharField(max_length=63)), - ('file', models.FileField(upload_to='assets')), - ('providers', models.ManyToManyField(blank=True, related_name='asset_files', to='osf.AbstractProvider')), - ], - options={ - 'abstract': False, - }, - ), - migrations.AddField( - model_name='preprintservice', - name='date_last_reported', - field=osf.utils.fields.NonNaiveDateTimeField(blank=True, db_index=True, default=None, null=True), - ), - migrations.AddField( - model_name='preprintservice', - name='date_retracted', - field=osf.utils.fields.NonNaiveDateTimeField(blank=True, default=None, null=True), - ), - migrations.AddField( - model_name='preprintservice', - name='ever_public', - field=models.BooleanField(default=False), - ), - migrations.AddField( - model_name='preprintservice', - name='reports', - field=osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=dict, encoder=osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONEncoder, validators=[osf.models.spam._validate_reports]), - ), - migrations.AddField( - model_name='preprintservice', - name='retraction_justification', - field=models.TextField(blank=True, default=''), - ), - migrations.AddField( - model_name='preprintservice', - name='spam_data', - field=osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=dict, encoder=osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONEncoder), - ), - migrations.AddField( - model_name='preprintservice', - name='spam_pro_tip', - field=models.CharField(blank=True, default=None, max_length=200, null=True), - ), - migrations.AddField( - model_name='preprintservice', - name='spam_status', - field=models.IntegerField(blank=True, db_index=True, default=None, null=True), - ), - migrations.AddField( - model_name='scheduledbanner', - name='link', - field=models.URLField(blank=True, default='https://www.crowdrise.com/centerforopenscience'), - ), - migrations.AlterUniqueTogether( - name='dismissedalert', - unique_together=set([('_id', 'location')]), - ), - ] diff --git a/osf/migrations/0109_merge_20180611_1410.py b/osf/migrations/0109_merge_20180611_1410.py deleted file mode 100644 index 90227c12290..00000000000 --- a/osf/migrations/0109_merge_20180611_1410.py +++ /dev/null @@ -1,16 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.13 on 2018-06-11 19:10 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0108_auto_20180530_1310'), - ('osf', '0106_auto_20180601_1341'), - ] - - operations = [ - ] diff --git a/osf/migrations/0110_set_ever_public.py b/osf/migrations/0110_set_ever_public.py deleted file mode 100644 index 37392e9f408..00000000000 --- a/osf/migrations/0110_set_ever_public.py +++ /dev/null @@ -1,23 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.13 on 2018-06-08 15:01 -from __future__ import unicode_literals - -from django.db import migrations - -def set_ever_public(state, *args, **kwargs): - state.get_model('osf', 'preprintservice').objects.filter(is_published=True).update(ever_public=True) - -def revert_to_default(state, *args, **kwargs): - state.get_model('osf', 'preprintservice').objects.all().update(ever_public=False) - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0109_merge_20180611_1410'), - ] - - operations = [ - migrations.RunPython( - set_ever_public, revert_to_default - ), - ] diff --git a/osf/migrations/0111_auto_20180605_1240.py b/osf/migrations/0111_auto_20180605_1240.py deleted file mode 100644 index 54487f8b65e..00000000000 --- a/osf/migrations/0111_auto_20180605_1240.py +++ /dev/null @@ -1,69 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.13 on 2018-06-05 17:40 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0110_set_ever_public'), - ] - - operations = [ - migrations.AlterModelOptions( - name='preprintprovider', - options={'permissions': (('view_submissions', 'Can view all submissions to this provider'), ('add_moderator', 'Can add other users as moderators for this provider'), ('update_moderator', 'Can elevate or lower other moderators/admins'), ('view_actions', 'Can view actions on submissions to this provider'), ('add_reviewer', 'Can add other users as reviewers for this provider'), ('review_assigned_submissions', 'Can submit reviews for submissions to this provider which have been assigned to this user'), ('assign_reviewer', 'Can assign reviewers to review specific submissions to this provider'), ('remove_moderator', 'Can remove moderators from this provider. Implicitly granted to self'), ('set_up_moderation', 'Can set up moderation for this provider'), ('view_assigned_submissions', 'Can view submissions to this provider which have been assigned to this user'), ('edit_reviews_settings', 'Can edit reviews settings for this provider'), ('withdraw_submissions', 'Can withdraw submissions from this provider'), ('accept_submissions', 'Can accept submissions to this provider'), ('reject_submissions', 'Can reject submissions to this provider'), ('edit_review_comments', 'Can edit comments on actions for this provider'), ('view_preprintprovider', 'Can view preprint provider details'))}, - ), - migrations.AlterField( - model_name='noderequest', - name='machine_state', - field=models.CharField(choices=[('initial', 'Initial'), ('pending', 'Pending'), ('accepted', 'Accepted'), ('rejected', 'Rejected')], db_index=True, default='initial', max_length=15), - ), - migrations.AlterField( - model_name='noderequestaction', - name='from_state', - field=models.CharField(choices=[('initial', 'Initial'), ('pending', 'Pending'), ('accepted', 'Accepted'), ('rejected', 'Rejected')], max_length=31), - ), - migrations.AlterField( - model_name='noderequestaction', - name='to_state', - field=models.CharField(choices=[('initial', 'Initial'), ('pending', 'Pending'), ('accepted', 'Accepted'), ('rejected', 'Rejected')], max_length=31), - ), - migrations.AlterField( - model_name='noderequestaction', - name='trigger', - field=models.CharField(choices=[('submit', 'Submit'), ('accept', 'Accept'), ('reject', 'Reject'), ('edit_comment', 'Edit_Comment')], max_length=31), - ), - migrations.AlterField( - model_name='preprintservice', - name='machine_state', - field=models.CharField(choices=[('initial', 'Initial'), ('pending', 'Pending'), ('accepted', 'Accepted'), ('rejected', 'Rejected'), ('withdrawn', 'Withdrawn')], db_index=True, default='initial', max_length=15), - ), - migrations.AlterField( - model_name='reviewaction', - name='from_state', - field=models.CharField(choices=[('initial', 'Initial'), ('pending', 'Pending'), ('accepted', 'Accepted'), ('rejected', 'Rejected'), ('withdrawn', 'Withdrawn')], max_length=31), - ), - migrations.AlterField( - model_name='reviewaction', - name='to_state', - field=models.CharField(choices=[('initial', 'Initial'), ('pending', 'Pending'), ('accepted', 'Accepted'), ('rejected', 'Rejected'), ('withdrawn', 'Withdrawn')], max_length=31), - ), - migrations.AlterField( - model_name='reviewaction', - name='trigger', - field=models.CharField(choices=[('submit', 'Submit'), ('accept', 'Accept'), ('reject', 'Reject'), ('edit_comment', 'Edit_Comment'), ('withdraw', 'Withdraw')], max_length=31), - ), - migrations.RenameField( - model_name='preprintservice', - old_name='date_retracted', - new_name='date_withdrawn', - ), - migrations.RenameField( - model_name='preprintservice', - old_name='retraction_justification', - new_name='withdrawal_justification', - ), - ] diff --git a/osf/migrations/0112_alter_collectionprovider_permissions.py b/osf/migrations/0112_alter_collectionprovider_permissions.py deleted file mode 100644 index 0bc295e695e..00000000000 --- a/osf/migrations/0112_alter_collectionprovider_permissions.py +++ /dev/null @@ -1,19 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.11 on 2018-05-09 13:15 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0111_auto_20180605_1240'), - ] - - operations = [ - migrations.AlterModelOptions( - name='collectionprovider', - options={'permissions': (('view_collectionprovider', 'Can view collection provider details'),)}, - ), - ] diff --git a/osf/migrations/0112_ensure_schemas.py b/osf/migrations/0112_ensure_schemas.py deleted file mode 100644 index f28075029e3..00000000000 --- a/osf/migrations/0112_ensure_schemas.py +++ /dev/null @@ -1,16 +0,0 @@ -from __future__ import unicode_literals - -import logging - -from django.db import migrations - -logger = logging.getLogger(__file__) - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0111_auto_20180605_1240'), - ] - - operations = [] diff --git a/osf/migrations/0112_merge_20180614_1454.py b/osf/migrations/0112_merge_20180614_1454.py deleted file mode 100644 index 712461e26d1..00000000000 --- a/osf/migrations/0112_merge_20180614_1454.py +++ /dev/null @@ -1,16 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.13 on 2018-06-14 19:54 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0107_merge_20180604_1232'), - ('osf', '0111_auto_20180605_1240'), - ] - - operations = [ - ] diff --git a/osf/migrations/0113_add_view_collectionprovider_to_admin_perm.py b/osf/migrations/0113_add_view_collectionprovider_to_admin_perm.py deleted file mode 100644 index db4e68a74fc..00000000000 --- a/osf/migrations/0113_add_view_collectionprovider_to_admin_perm.py +++ /dev/null @@ -1,19 +0,0 @@ -from __future__ import unicode_literals - -from django.db import migrations - - -def noop(*args): - # This migration used to update admin group perms, - # This is now handled by the post_migrate signal - pass - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0112_alter_collectionprovider_permissions'), - ] - - operations = [ - migrations.RunPython(noop, noop), - ] diff --git a/osf/migrations/0113_auto_20180615_1308.py b/osf/migrations/0113_auto_20180615_1308.py deleted file mode 100644 index 99c532acf7d..00000000000 --- a/osf/migrations/0113_auto_20180615_1308.py +++ /dev/null @@ -1,47 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.13 on 2018-06-15 18:08 -from __future__ import unicode_literals - -import logging -from django.db import migrations - -from osf.models import PreprintProvider - -logger = logging.getLogger(__file__) - - -PREPRINT_DOI_NAMESPACE = { - 'ecsarxiv': '10.1149' -} - -def add_doi_prefix(*args, **kwargs): - for key, value in PREPRINT_DOI_NAMESPACE.items(): - provider = PreprintProvider.objects.filter(_id=key) - if not provider.exists(): - logger.info('Could not find provider with _id {}, skipping for now...'.format(key)) - continue - provider = provider.get() - provider.doi_prefix = value - provider.save() - - -def remove_doi_prefix(*args, **kwargs): - for key, _ in PREPRINT_DOI_NAMESPACE.items(): - provider = PreprintProvider.objects.filter(_id=key) - if not provider.exists(): - logger.info('Could not find provider with _id {}, skipping for now...'.format(key)) - continue - provider = provider.get() - provider.doi_prefix = '' - provider.save() - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0112_merge_20180614_1454'), - ] - - operations = [ - migrations.RunPython(add_doi_prefix, remove_doi_prefix) - ] diff --git a/osf/migrations/0114_merge_20180621_1322.py b/osf/migrations/0114_merge_20180621_1322.py deleted file mode 100644 index 7fc641ed0a0..00000000000 --- a/osf/migrations/0114_merge_20180621_1322.py +++ /dev/null @@ -1,16 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.13 on 2018-06-21 18:22 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0113_add_view_collectionprovider_to_admin_perm'), - ('osf', '0112_ensure_schemas'), - ] - - operations = [ - ] diff --git a/osf/migrations/0114_merge_20180628_1234.py b/osf/migrations/0114_merge_20180628_1234.py deleted file mode 100644 index e2ce1b6e24a..00000000000 --- a/osf/migrations/0114_merge_20180628_1234.py +++ /dev/null @@ -1,16 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.13 on 2018-06-28 17:34 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0113_auto_20180615_1308'), - ('osf', '0112_ensure_schemas'), - ] - - operations = [ - ] diff --git a/osf/migrations/0115_auto_20180621_1324.py b/osf/migrations/0115_auto_20180621_1324.py deleted file mode 100644 index 3e987710cc1..00000000000 --- a/osf/migrations/0115_auto_20180621_1324.py +++ /dev/null @@ -1,20 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.13 on 2018-06-21 18:24 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0114_merge_20180621_1322'), - ] - - operations = [ - migrations.AlterField( - model_name='providerassetfile', - name='name', - field=models.CharField(choices=[('favicon', 'favicon'), ('powered_by_share', 'powered_by_share'), ('sharing', 'sharing'), ('square_color_no_transparent', 'square_color_no_transparent'), ('square_color_transparent', 'square_color_transparent'), ('style', 'style'), ('wide_black', 'wide_black'), ('wide_color', 'wide_color'), ('wide_white', 'wide_white')], max_length=63), - ), - ] diff --git a/osf/migrations/0115_auto_20180628_1253.py b/osf/migrations/0115_auto_20180628_1253.py deleted file mode 100644 index 5691d4dd683..00000000000 --- a/osf/migrations/0115_auto_20180628_1253.py +++ /dev/null @@ -1,45 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.13 on 2018-06-28 17:53 -from __future__ import unicode_literals - -import logging -from django.db import migrations - -from osf.models import PreprintProvider - -logger = logging.getLogger(__file__) - -PREPRINT_DOI_NAMESPACE = { - 'africarxiv': '10.31730' -} - -def add_doi_prefix(*args, **kwargs): - for key, value in PREPRINT_DOI_NAMESPACE.items(): - provider = PreprintProvider.objects.filter(_id=key) - if not provider.exists(): - logger.info('Could not find provider with _id {}, skipping for now...'.format(key)) - continue - provider = provider.get() - provider.doi_prefix = value - provider.save() - - -def remove_doi_prefix(*args, **kwargs): - for key, _ in PREPRINT_DOI_NAMESPACE.items(): - provider = PreprintProvider.objects.filter(_id=key) - if not provider.exists(): - logger.info('Could not find provider with _id {}, skipping for now...'.format(key)) - continue - provider = provider.get() - provider.doi_prefix = '' - provider.save() - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0114_merge_20180628_1234'), - ] - - operations = [ - migrations.RunPython(add_doi_prefix, remove_doi_prefix) - ] diff --git a/osf/migrations/0116_merge_20180703_2258.py b/osf/migrations/0116_merge_20180703_2258.py deleted file mode 100644 index 07505a7333f..00000000000 --- a/osf/migrations/0116_merge_20180703_2258.py +++ /dev/null @@ -1,16 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.13 on 2018-07-04 03:58 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0115_auto_20180628_1253'), - ('osf', '0115_auto_20180621_1324'), - ] - - operations = [ - ] diff --git a/osf/migrations/0116_merge_20180706_0901.py b/osf/migrations/0116_merge_20180706_0901.py deleted file mode 100644 index 518999213cc..00000000000 --- a/osf/migrations/0116_merge_20180706_0901.py +++ /dev/null @@ -1,16 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.13 on 2018-07-06 14:01 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0115_auto_20180628_1253'), - ('osf', '0106_merge_20180531_0919'), - ] - - operations = [ - ] diff --git a/osf/migrations/0116_osfuser_deleted.py b/osf/migrations/0116_osfuser_deleted.py deleted file mode 100644 index 4df09f93f43..00000000000 --- a/osf/migrations/0116_osfuser_deleted.py +++ /dev/null @@ -1,21 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.13 on 2018-07-10 16:05 -from __future__ import unicode_literals - -from django.db import migrations -import osf.utils.fields - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0115_auto_20180628_1253'), - ] - - operations = [ - migrations.AddField( - model_name='osfuser', - name='deleted', - field=osf.utils.fields.NonNaiveDateTimeField(blank=True, db_index=True, null=True), - ), - ] diff --git a/osf/migrations/0117_auto_20180625_0810.py b/osf/migrations/0117_auto_20180625_0810.py deleted file mode 100644 index 56c9d98231f..00000000000 --- a/osf/migrations/0117_auto_20180625_0810.py +++ /dev/null @@ -1,66 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.13 on 2018-06-25 13:10 -from __future__ import unicode_literals - -from django.conf import settings -from django.db import migrations, models -import django.db.models.deletion -import django_extensions.db.fields -import osf.models.base - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0116_merge_20180703_2258'), - ] - - operations = [ - migrations.CreateModel( - name='PreprintRequest', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), - ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), - ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), - ('machine_state', models.CharField(choices=[('initial', 'Initial'), ('pending', 'Pending'), ('accepted', 'Accepted'), ('rejected', 'Rejected')], db_index=True, default='initial', max_length=15)), - ('date_last_transitioned', models.DateTimeField(blank=True, db_index=True, null=True)), - ('request_type', models.CharField(choices=[('access', 'Access'), ('withdrawal', 'Withdrawal')], max_length=31)), - ('comment', models.TextField(blank=True, null=True)), - ('creator', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='submitted_preprintrequest', to=settings.AUTH_USER_MODEL)), - ('target', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='requests', to='osf.PreprintService')), - ], - options={ - 'abstract': False, - }, - ), - migrations.CreateModel( - name='PreprintRequestAction', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), - ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), - ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), - ('trigger', models.CharField(choices=[('submit', 'Submit'), ('accept', 'Accept'), ('reject', 'Reject'), ('edit_comment', 'Edit_Comment')], max_length=31)), - ('from_state', models.CharField(choices=[('initial', 'Initial'), ('pending', 'Pending'), ('accepted', 'Accepted'), ('rejected', 'Rejected')], max_length=31)), - ('to_state', models.CharField(choices=[('initial', 'Initial'), ('pending', 'Pending'), ('accepted', 'Accepted'), ('rejected', 'Rejected')], max_length=31)), - ('comment', models.TextField(blank=True)), - ('is_deleted', models.BooleanField(default=False)), - ('creator', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='+', to=settings.AUTH_USER_MODEL)), - ('target', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='actions', to='osf.PreprintRequest')), - ], - options={ - 'abstract': False, - }, - ), - migrations.AlterField( - model_name='noderequest', - name='creator', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='submitted_noderequest', to=settings.AUTH_USER_MODEL), - ), - migrations.AlterField( - model_name='noderequest', - name='request_type', - field=models.CharField(choices=[('access', 'Access'), ('withdrawal', 'Withdrawal')], max_length=31), - ), - ] diff --git a/osf/migrations/0117_merge_20180712_1241.py b/osf/migrations/0117_merge_20180712_1241.py deleted file mode 100644 index bf2352596d2..00000000000 --- a/osf/migrations/0117_merge_20180712_1241.py +++ /dev/null @@ -1,16 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.13 on 2018-07-12 17:41 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0116_osfuser_deleted'), - ('osf', '0116_merge_20180703_2258'), - ] - - operations = [ - ] diff --git a/osf/migrations/0117_set_is_root.py b/osf/migrations/0117_set_is_root.py deleted file mode 100644 index 2b2ffbf89ab..00000000000 --- a/osf/migrations/0117_set_is_root.py +++ /dev/null @@ -1,25 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.13 on 2018-07-11 18:05 -from __future__ import unicode_literals - -from django.db import migrations - - -def set_is_root(state, *args, **kwargs): - OsfStorageFolder = state.get_model('osf', 'osfstoragefolder') - OsfStorageFolder.objects.filter(nodesettings__isnull=False, is_root__isnull=True).update(is_root=True) - - -def unset_is_root(state, *args, **kwargs): - state.get_model('osf', 'osfstoragefolder').objects.filter(is_root=True).update(is_root=None) - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0116_merge_20180706_0901'), - ] - - operations = [ - migrations.RunPython(set_is_root, unset_is_root) - ] diff --git a/osf/migrations/0118_auto_20180706_1127.py b/osf/migrations/0118_auto_20180706_1127.py deleted file mode 100644 index 4addac552bc..00000000000 --- a/osf/migrations/0118_auto_20180706_1127.py +++ /dev/null @@ -1,31 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.13 on 2018-07-06 16:27 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0117_auto_20180625_0810'), - ] - - operations = [ - migrations.CreateModel( - name='RegistrationProvider', - fields=[ - ], - options={ - 'indexes': [], - 'proxy': True, - 'permissions': (('view_registrationprovider', 'Can view registration provider details'),), - }, - bases=('osf.abstractprovider',), - ), - migrations.AlterField( - model_name='abstractprovider', - name='type', - field=models.CharField(choices=[('osf.collectionprovider', 'collection provider'), ('osf.registrationprovider', 'registration provider'), ('osf.preprintprovider', 'preprint provider')], db_index=True, max_length=255), - ), - ] diff --git a/osf/migrations/0118_auto_20180716_1216.py b/osf/migrations/0118_auto_20180716_1216.py deleted file mode 100644 index ce19c2e3fa9..00000000000 --- a/osf/migrations/0118_auto_20180716_1216.py +++ /dev/null @@ -1,19 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.13 on 2018-07-16 17:16 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0117_merge_20180712_1241'), - ] - - operations = [ - migrations.AlterModelOptions( - name='providerassetfile', - options={'permissions': (('view_providerassetfile', 'Can view provider asset files'),)}, - ), - ] diff --git a/osf/migrations/0119_add_asset_perms.py b/osf/migrations/0119_add_asset_perms.py deleted file mode 100644 index 7dc854b7b70..00000000000 --- a/osf/migrations/0119_add_asset_perms.py +++ /dev/null @@ -1,19 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.13 on 2018-07-16 17:04 -from django.db import migrations - - -def noop(*args): - # This migration used to update admin permissions - # This is now handled by the post_migrate signal - pass - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0118_auto_20180716_1216'), - ] - - operations = [ - migrations.RunPython(noop, noop), - ] diff --git a/osf/migrations/0119_add_registrationprovider_perms_to_admin.py b/osf/migrations/0119_add_registrationprovider_perms_to_admin.py deleted file mode 100644 index 05070f36546..00000000000 --- a/osf/migrations/0119_add_registrationprovider_perms_to_admin.py +++ /dev/null @@ -1,21 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.13 on 2018-07-10 17:34 -from __future__ import unicode_literals - -from django.db import migrations - - -def noop(*args): - # This migration used to update admin permissions - # This is now handled by the post_migrate signal - pass - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0118_auto_20180706_1127'), - ] - - operations = [ - migrations.RunPython(noop, noop), - ] diff --git a/osf/migrations/0120_merge_20180716_1457.py b/osf/migrations/0120_merge_20180716_1457.py deleted file mode 100644 index 48ce198523f..00000000000 --- a/osf/migrations/0120_merge_20180716_1457.py +++ /dev/null @@ -1,16 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.13 on 2018-07-16 19:57 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0119_add_registrationprovider_perms_to_admin'), - ('osf', '0119_add_asset_perms'), - ] - - operations = [ - ] diff --git a/osf/migrations/0121_add_preprintrequest_perms_to_admin.py b/osf/migrations/0121_add_preprintrequest_perms_to_admin.py deleted file mode 100644 index a188132d7e4..00000000000 --- a/osf/migrations/0121_add_preprintrequest_perms_to_admin.py +++ /dev/null @@ -1,22 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.13 on 2018-07-10 22:19 -from __future__ import unicode_literals - -from django.db import migrations - - -def noop(*args): - # This migration used to handle admin permissions - # This is now handled by the post_migrate signal - pass - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0120_merge_20180716_1457'), - ] - - operations = [ - migrations.RunPython(noop, noop), - ] diff --git a/osf/migrations/0121_generalize_schema_models.py b/osf/migrations/0121_generalize_schema_models.py deleted file mode 100644 index 9112a58eb15..00000000000 --- a/osf/migrations/0121_generalize_schema_models.py +++ /dev/null @@ -1,19 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.13 on 2018-07-23 20:23 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0120_merge_20180716_1457'), - ] - - operations = [ - migrations.RenameModel( - old_name='MetaSchema', - new_name='RegistrationSchema', - ), - ] diff --git a/osf/migrations/0121_merge_20180801_1458.py b/osf/migrations/0121_merge_20180801_1458.py deleted file mode 100644 index feb636e0ac3..00000000000 --- a/osf/migrations/0121_merge_20180801_1458.py +++ /dev/null @@ -1,16 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.13 on 2018-08-01 14:58 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0117_set_is_root'), - ('osf', '0120_merge_20180716_1457'), - ] - - operations = [ - ] diff --git a/osf/migrations/0121_remove_support_page_waffle_flag.py b/osf/migrations/0121_remove_support_page_waffle_flag.py deleted file mode 100644 index db51535e24a..00000000000 --- a/osf/migrations/0121_remove_support_page_waffle_flag.py +++ /dev/null @@ -1,23 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.13 on 2018-07-19 16:51 -from __future__ import unicode_literals -from waffle.models import Flag -from django.db import migrations - - -def reverse_func(state, schema): - flag = Flag(name='ember_support_page', everyone=False) - flag.save() - - -def remove_support_page_waffle_flags(state, schema): - Flag.objects.get(name='ember_support_page').delete() - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0120_merge_20180716_1457'), - ] - - operations = [ - ] diff --git a/osf/migrations/0121_remove_waffle_flags.py b/osf/migrations/0121_remove_waffle_flags.py deleted file mode 100644 index b694d966379..00000000000 --- a/osf/migrations/0121_remove_waffle_flags.py +++ /dev/null @@ -1,34 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.13 on 2018-07-23 13:16 -from __future__ import unicode_literals -from waffle.models import Flag -from django.db import migrations - - -EMBER_WAFFLE_PAGES = [ - 'dashboard', - 'home', -] - -def format_ember_waffle_flag_name(page): - return 'ember_{}_page'.format(page) - -def add_ember_waffle_flags(state, schema): - for page in EMBER_WAFFLE_PAGES: - Flag.objects.get_or_create(name=format_ember_waffle_flag_name(page), everyone=False) - return - -def remove_waffle_flags(state, schema): - pages = [format_ember_waffle_flag_name(page) for page in EMBER_WAFFLE_PAGES] - Flag.objects.filter(name__in=pages).delete() - return - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0120_merge_20180716_1457'), - ] - - operations = [ - ] diff --git a/osf/migrations/0121_remove_wiki_fields_from_node.py b/osf/migrations/0121_remove_wiki_fields_from_node.py deleted file mode 100644 index ffc432420db..00000000000 --- a/osf/migrations/0121_remove_wiki_fields_from_node.py +++ /dev/null @@ -1,23 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.11 on 2018-04-19 22:43 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0120_merge_20180716_1457'), - ] - - operations = [ - migrations.RemoveField( - model_name='abstractnode', - name='wiki_pages_current', - ), - migrations.RemoveField( - model_name='abstractnode', - name='wiki_pages_versions', - ), - ] diff --git a/osf/migrations/0122_auto_20180801_2105.py b/osf/migrations/0122_auto_20180801_2105.py deleted file mode 100644 index 0f2c3318479..00000000000 --- a/osf/migrations/0122_auto_20180801_2105.py +++ /dev/null @@ -1,20 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.13 on 2018-08-01 21:05 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('contenttypes', '0002_remove_content_type_name'), - ('osf', '0121_merge_20180801_1458'), - ] - - operations = [ - migrations.AlterIndexTogether( - name='basefilenode', - index_together=set([('target_content_type', 'target_object_id')]), - ), - ] diff --git a/osf/migrations/0122_unique_provider__id_by_type.py b/osf/migrations/0122_unique_provider__id_by_type.py deleted file mode 100644 index 73240e227f8..00000000000 --- a/osf/migrations/0122_unique_provider__id_by_type.py +++ /dev/null @@ -1,25 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.13 on 2018-07-24 18:11 -from __future__ import unicode_literals - -from django.db import migrations, models -import osf.models.base - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0121_add_preprintrequest_perms_to_admin'), - ] - - operations = [ - migrations.AlterField( - model_name='abstractprovider', - name='_id', - field=models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24), - ), - migrations.AlterUniqueTogether( - name='abstractprovider', - unique_together=set([('_id', 'type')]), - ), - ] diff --git a/osf/migrations/0123_auto_20180726_1546.py b/osf/migrations/0123_auto_20180726_1546.py deleted file mode 100644 index c46d40275e5..00000000000 --- a/osf/migrations/0123_auto_20180726_1546.py +++ /dev/null @@ -1,34 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.13 on 2018-07-26 20:46 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0122_unique_provider__id_by_type'), - ] - - operations = [ - migrations.AlterModelOptions( - name='adminprofile', - options={'permissions': (('mark_spam', 'Can mark comments, projects and registrations as spam'), ('view_spam', 'Can view nodes, comments, and projects marked as spam'), ('view_metrics', 'Can view metrics on the OSF Admin app'), ('view_prereg', 'Can view entries for the preregistration chellenge on the admin'), ('administer_prereg', 'Can update, comment on, and approve entries to the prereg challenge'), ('view_desk', 'Can view details about Desk users'), ('delete_preprintrequest', 'Can delete preprints withdrawal requests'), ('change_preprintrequest', 'Can update preprints withdrawal requests'))}, - ), - migrations.AddField( - model_name='noderequestaction', - name='auto', - field=models.BooleanField(default=False), - ), - migrations.AddField( - model_name='preprintrequestaction', - name='auto', - field=models.BooleanField(default=False), - ), - migrations.AddField( - model_name='reviewaction', - name='auto', - field=models.BooleanField(default=False), - ), - ] diff --git a/osf/migrations/0123_merge_20180802_2004.py b/osf/migrations/0123_merge_20180802_2004.py deleted file mode 100644 index e45ca004a47..00000000000 --- a/osf/migrations/0123_merge_20180802_2004.py +++ /dev/null @@ -1,16 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.13 on 2018-08-02 20:04 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0122_auto_20180801_2105'), - ('osf', '0121_generalize_schema_models'), - ] - - operations = [ - ] diff --git a/osf/migrations/0123_merge_20180803_1346.py b/osf/migrations/0123_merge_20180803_1346.py deleted file mode 100644 index 99718d52eb2..00000000000 --- a/osf/migrations/0123_merge_20180803_1346.py +++ /dev/null @@ -1,16 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.13 on 2018-08-03 13:46 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0122_auto_20180801_2105'), - ('osf', '0121_generalize_schema_models'), - ] - - operations = [ - ] diff --git a/osf/migrations/0124_merge_20180803_1425.py b/osf/migrations/0124_merge_20180803_1425.py deleted file mode 100644 index 29d30edacbb..00000000000 --- a/osf/migrations/0124_merge_20180803_1425.py +++ /dev/null @@ -1,16 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.13 on 2018-08-03 14:25 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0123_auto_20180726_1546'), - ('osf', '0122_auto_20180801_2105'), - ] - - operations = [ - ] diff --git a/osf/migrations/0124_merge_20180808_1451.py b/osf/migrations/0124_merge_20180808_1451.py deleted file mode 100644 index c3038944777..00000000000 --- a/osf/migrations/0124_merge_20180808_1451.py +++ /dev/null @@ -1,16 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.13 on 2018-08-08 14:51 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0123_merge_20180802_2004'), - ('osf', '0123_merge_20180803_1346'), - ] - - operations = [ - ] diff --git a/osf/migrations/0124_merge_20180815_1924.py b/osf/migrations/0124_merge_20180815_1924.py deleted file mode 100644 index 4db57a7fa42..00000000000 --- a/osf/migrations/0124_merge_20180815_1924.py +++ /dev/null @@ -1,16 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.13 on 2018-08-15 19:24 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0123_merge_20180803_1346'), - ('osf', '0121_remove_wiki_fields_from_node'), - ] - - operations = [ - ] diff --git a/osf/migrations/0124_merge_20180816_1229.py b/osf/migrations/0124_merge_20180816_1229.py deleted file mode 100644 index 76359f66eae..00000000000 --- a/osf/migrations/0124_merge_20180816_1229.py +++ /dev/null @@ -1,16 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.13 on 2018-08-16 12:29 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0121_remove_support_page_waffle_flag'), - ('osf', '0123_merge_20180803_1346'), - ] - - operations = [ - ] diff --git a/osf/migrations/0125_auto_20180808_1942.py b/osf/migrations/0125_auto_20180808_1942.py deleted file mode 100644 index 40779229086..00000000000 --- a/osf/migrations/0125_auto_20180808_1942.py +++ /dev/null @@ -1,66 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.13 on 2018-08-08 19:42 -from __future__ import unicode_literals - -from django.conf import settings -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('auth', '0008_alter_user_username_max_length'), - ('osf', '0124_merge_20180803_1425'), - ] - - operations = [ - migrations.CreateModel( - name='AbstractProviderGroupObjectPermission', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('content_object', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='osf.AbstractProvider')), - ('group', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='auth.Group')), - ('permission', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='auth.Permission')), - ], - options={ - 'abstract': False, - }, - ), - migrations.CreateModel( - name='AbstractProviderUserObjectPermission', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('content_object', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='osf.AbstractProvider')), - ('permission', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='auth.Permission')), - ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), - ], - options={ - 'abstract': False, - }, - ), - migrations.AlterModelOptions( - name='abstractprovider', - options={'permissions': (('set_up_moderation', 'Can set up moderation for this provider'), ('view_submissions', 'Can view all submissions to this provider'), ('accept_submissions', 'Can accept submissions to this provider'), ('reject_submissions', 'Can reject submissions to this provider'), ('withdraw_submissions', 'Can withdraw submissions from this provider'), ('edit_review_comments', 'Can edit comments on actions for this provider'), ('view_actions', 'Can view actions on submissions to this provider'), ('add_moderator', 'Can add other users as moderators for this provider'), ('update_moderator', 'Can elevate or lower other moderators/admins'), ('remove_moderator', 'Can remove moderators from this provider. Implicitly granted to self'), ('edit_reviews_settings', 'Can edit reviews settings for this provider'), ('add_reviewer', 'Can add other users as reviewers for this provider'), ('assign_reviewer', 'Can assign reviewers to review specific submissions to this provider'), ('view_assigned_submissions', 'Can view submissions to this provider which have been assigned to this user'), ('review_assigned_submissions', 'Can submit reviews for submissions to this provider which have been assigned to this user'))}, - ), - migrations.AlterModelOptions( - name='collectionprovider', - options={'permissions': (('view_collectionprovider', 'Can view collection provider details'),)}, - ), - migrations.AlterModelOptions( - name='preprintprovider', - options={'permissions': (('view_preprintprovider', 'Can view preprint provider details'),)}, - ), - migrations.AlterModelOptions( - name='registrationprovider', - options={'permissions': (('view_registrationprovider', 'Can view registration provider details'),)}, - ), - migrations.AlterUniqueTogether( - name='abstractprovideruserobjectpermission', - unique_together=set([('user', 'permission', 'content_object')]), - ), - migrations.AlterUniqueTogether( - name='abstractprovidergroupobjectpermission', - unique_together=set([('group', 'permission', 'content_object')]), - ), - ] diff --git a/osf/migrations/0125_merge_20180822_1508.py b/osf/migrations/0125_merge_20180822_1508.py deleted file mode 100644 index 414b1b5868c..00000000000 --- a/osf/migrations/0125_merge_20180822_1508.py +++ /dev/null @@ -1,16 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.13 on 2018-08-22 15:08 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0124_merge_20180816_1229'), - ('osf', '0124_merge_20180808_1451'), - ] - - operations = [ - ] diff --git a/osf/migrations/0125_merge_20180824_1856.py b/osf/migrations/0125_merge_20180824_1856.py deleted file mode 100644 index 7f01f2a2bac..00000000000 --- a/osf/migrations/0125_merge_20180824_1856.py +++ /dev/null @@ -1,16 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.13 on 2018-08-24 18:56 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0124_merge_20180816_1229'), - ('osf', '0121_remove_waffle_flags'), - ] - - operations = [ - ] diff --git a/osf/migrations/0126_update_review_group_names.py b/osf/migrations/0126_update_review_group_names.py deleted file mode 100644 index c40a440fce3..00000000000 --- a/osf/migrations/0126_update_review_group_names.py +++ /dev/null @@ -1,46 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.13 on 2018-08-08 19:45 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0125_auto_20180808_1942'), - ] - - operations = [ - migrations.RunSQL( - [ - """ - UPDATE auth_group AG0 - SET name = ( - SELECT 'reviews_' || - CASE - WHEN P.type = 'osf.preprintprovider' - THEN 'preprint' - WHEN P.type = 'osf.collectionprovider' - THEN 'collection' - WHEN P.type = 'osf.registrationprovider' - THEN 'registration' - END || '_' || id || '_' || split_part(AG0.name, '_', 3) - FROM osf_abstractprovider P - WHERE _id = split_part(AG0.name, '_', 2) - ) - WHERE AG0.name LIKE 'reviews_%'; - """ - ], [ - """ - UPDATE auth_group AG0 - SET name = ( - SELECT 'reviews_' || P._id || '_' || split_part(AG0.name, '_', 4) - FROM osf_abstractprovider P - WHERE id = split_part(AG0.name, '_', 3)::INT - ) - WHERE AG0.name LIKE 'reviews_%'; - """ - ] - ) - ] diff --git a/osf/migrations/0126_update_social_data_format.py b/osf/migrations/0126_update_social_data_format.py deleted file mode 100644 index ce8707d482f..00000000000 --- a/osf/migrations/0126_update_social_data_format.py +++ /dev/null @@ -1,72 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.13 on 2018-07-25 20:39 -from __future__ import unicode_literals - -import logging -from tqdm import tqdm - -from django.db import migrations, connection - - -logger = logging.getLogger(__name__) - - -FIELDS_TO_MIGRATE = [ - 'github', - 'linkedIn', - 'twitter' -] - - -class Migration(migrations.Migration): - - def update_social_fields(state, schema): - for field in FIELDS_TO_MIGRATE: - sql = """ - UPDATE osf_osfuser - SET social = social || json_build_object( - '{0}', CASE WHEN (osf_osfuser.social ->> '{0}') = '' THEN '[]' - WHEN (osf_osfuser.social ->> '{0}') IS NOT NULL - AND json_typeof(osf_osfuser.social::json -> '{0}') != 'array' - THEN json_build_array(osf_osfuser.social ->> '{0}') - ELSE (osf_osfuser.social -> '{0}')::json - END - )::jsonb - WHERE osf_osfuser.social ? '{0}'; - """.format(field) - with connection.cursor() as cursor: - logger.info('Setting social fields for {}...'.format(field)) - cursor.execute(sql) - - def reset_social_fields(state, schema): - OSFUser = state.get_model('osf', 'osfuser') - users_with_social = OSFUser.objects.filter(social__has_any_keys=FIELDS_TO_MIGRATE) - users_to_update = users_with_social.count() - logger.info('Updating social fields for {} users'.format(users_to_update)) - progress_bar = tqdm(total=users_to_update or 100) - - users_updated = 0 - for user in users_with_social: - old_social = {} - for key, value in user.social.items(): - if key in FIELDS_TO_MIGRATE: - if len(value) > 1: - raise ValueError('Current social list field has more than one value, cannot reset to just one value.') - old_social[key] = value[0] - else: - old_social[key] = value - user.social = old_social - user.save() - users_updated += 1 - progress_bar.update(users_updated) - - progress_bar.close() - logger.info('Updated social field for {} users'.format(users_updated)) - - dependencies = [ - ('osf', '0125_merge_20180824_1856'), - ] - - operations = [ - migrations.RunPython(update_social_fields, reset_social_fields) - ] diff --git a/osf/migrations/0127_add_regions_to_all_versions.py b/osf/migrations/0127_add_regions_to_all_versions.py deleted file mode 100644 index 0457bf013ee..00000000000 --- a/osf/migrations/0127_add_regions_to_all_versions.py +++ /dev/null @@ -1,56 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.13 on 2018-08-24 20:20 -from __future__ import unicode_literals - -import logging - -from django.db import migrations, models -from django.apps import apps - -from addons.osfstorage.settings import DEFAULT_REGION_ID, DEFAULT_REGION_NAME - -logger = logging.getLogger(__name__) - -BATCHSIZE = 5000 - - -def add_regions_to_existing_versions(*args, **kwargs): - Region = apps.get_model('addons_osfstorage.region') - FileVersion = apps.get_model('osf.fileversion') - default_region = Region.objects.get( - _id=DEFAULT_REGION_ID, - name=DEFAULT_REGION_NAME, - ) - max_pk = FileVersion.objects.aggregate(models.Max('pk'))['pk__max'] - if max_pk is not None: - for offset in range(0, max_pk + 1, BATCHSIZE): - (FileVersion.objects - .filter(pk__gte=offset) - .filter(pk__lt=offset + BATCHSIZE) - .filter(basefilenode__provider='osfstorage') - .filter(region__isnull=True) - .update(region=default_region)) - logger.info( - 'Updated osf_fileversions {}-{}/{}'.format( - offset, - offset + BATCHSIZE, - max_pk, - ) - ) - -def remove_regions_from_versions(*args, **kwargs): - # Reverse migration will remove fk field, no need to reset manually - pass - - -class Migration(migrations.Migration): - - atomic = False - - dependencies = [ - ('osf', '0130_fileversion_region'), - ] - - operations = [ - migrations.RunPython(add_regions_to_existing_versions, remove_regions_from_versions) - ] diff --git a/osf/migrations/0127_merge_20180822_1927.py b/osf/migrations/0127_merge_20180822_1927.py deleted file mode 100644 index 53ffff13443..00000000000 --- a/osf/migrations/0127_merge_20180822_1927.py +++ /dev/null @@ -1,16 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.13 on 2018-08-22 19:27 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0124_merge_20180816_1229'), - ('osf', '0126_update_review_group_names'), - ] - - operations = [ - ] diff --git a/osf/migrations/0128_merge_20180827_1907.py b/osf/migrations/0128_merge_20180827_1907.py deleted file mode 100644 index 414e5aed1fa..00000000000 --- a/osf/migrations/0128_merge_20180827_1907.py +++ /dev/null @@ -1,16 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.13 on 2018-08-27 19:07 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0127_add_regions_to_all_versions'), - ('osf', '0125_merge_20180824_1856'), - ] - - operations = [ - ] diff --git a/osf/migrations/0128_merge_20180829_0012.py b/osf/migrations/0128_merge_20180829_0012.py deleted file mode 100644 index dcfb4adbdaf..00000000000 --- a/osf/migrations/0128_merge_20180829_0012.py +++ /dev/null @@ -1,16 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.13 on 2018-08-29 00:12 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0127_merge_20180822_1927'), - ('osf', '0125_merge_20180824_1856'), - ] - - operations = [ - ] diff --git a/osf/migrations/0128_rename_collectionsubmission.py b/osf/migrations/0128_rename_collectionsubmission.py deleted file mode 100644 index ab82aeabd64..00000000000 --- a/osf/migrations/0128_rename_collectionsubmission.py +++ /dev/null @@ -1,24 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.13 on 2018-08-24 18:48 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0127_merge_20180822_1927'), - ] - - operations = [ - migrations.RenameModel( - old_name='CollectedGuidMetadata', - new_name='CollectionSubmission', - ), - migrations.AlterField( - model_name='collectionsubmission', - name='subjects', - field=models.ManyToManyField(blank=True, related_name='collectionsubmissions', to='osf.Subject'), - ), - ] diff --git a/osf/migrations/0129_merge_20180831_1412.py b/osf/migrations/0129_merge_20180831_1412.py deleted file mode 100644 index b4b6b886cb4..00000000000 --- a/osf/migrations/0129_merge_20180831_1412.py +++ /dev/null @@ -1,16 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.13 on 2018-08-31 14:12 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0128_merge_20180829_0012'), - ('osf', '0126_update_social_data_format'), - ] - - operations = [ - ] diff --git a/osf/migrations/0129_merge_20180904_2028.py b/osf/migrations/0129_merge_20180904_2028.py deleted file mode 100644 index aa60f4969c0..00000000000 --- a/osf/migrations/0129_merge_20180904_2028.py +++ /dev/null @@ -1,16 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.13 on 2018-09-04 20:28 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0128_merge_20180829_0012'), - ('osf', '0128_merge_20180827_1907'), - ] - - operations = [ - ] diff --git a/osf/migrations/0129_merge_20180910_1926.py b/osf/migrations/0129_merge_20180910_1926.py deleted file mode 100644 index f4c58ca6a36..00000000000 --- a/osf/migrations/0129_merge_20180910_1926.py +++ /dev/null @@ -1,16 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.13 on 2018-09-10 19:26 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0128_merge_20180829_0012'), - ('osf', '0128_rename_collectionsubmission'), - ] - - operations = [ - ] diff --git a/osf/migrations/0129_remove_osfuser_is_claimed.py b/osf/migrations/0129_remove_osfuser_is_claimed.py deleted file mode 100644 index ed1486e3b18..00000000000 --- a/osf/migrations/0129_remove_osfuser_is_claimed.py +++ /dev/null @@ -1,19 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.13 on 2018-08-31 18:08 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0128_merge_20180829_0012'), - ] - - operations = [ - migrations.RemoveField( - model_name='osfuser', - name='is_claimed', - ), - ] diff --git a/osf/migrations/0130_auto_20180912_2039.py b/osf/migrations/0130_auto_20180912_2039.py deleted file mode 100644 index 21b731d7fcc..00000000000 --- a/osf/migrations/0130_auto_20180912_2039.py +++ /dev/null @@ -1,46 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.13 on 2018-09-12 20:39 -from __future__ import unicode_literals - -import django.contrib.postgres.fields -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0129_merge_20180910_1926'), - ] - - operations = [ - migrations.AddField( - model_name='collection', - name='issue_choices', - field=django.contrib.postgres.fields.ArrayField(base_field=models.CharField(max_length=31), blank=True, default=list, size=None), - ), - migrations.AddField( - model_name='collection', - name='program_area_choices', - field=django.contrib.postgres.fields.ArrayField(base_field=models.CharField(max_length=31), blank=True, default=list, size=None), - ), - migrations.AddField( - model_name='collection', - name='volume_choices', - field=django.contrib.postgres.fields.ArrayField(base_field=models.CharField(max_length=31), blank=True, default=list, size=None), - ), - migrations.AddField( - model_name='collectionsubmission', - name='issue', - field=models.CharField(blank=True, max_length=31), - ), - migrations.AddField( - model_name='collectionsubmission', - name='program_area', - field=models.CharField(blank=True, max_length=31), - ), - migrations.AddField( - model_name='collectionsubmission', - name='volume', - field=models.CharField(blank=True, max_length=31), - ), - ] diff --git a/osf/migrations/0130_fileversion_region.py b/osf/migrations/0130_fileversion_region.py deleted file mode 100644 index 5da35983c4a..00000000000 --- a/osf/migrations/0130_fileversion_region.py +++ /dev/null @@ -1,22 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.13 on 2018-09-14 17:43 -from __future__ import unicode_literals - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('addons_osfstorage', '0004_storage_region_models'), - ('osf', '0129_merge_20180910_1926'), - ] - - operations = [ - migrations.AddField( - model_name='fileversion', - name='region', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='addons_osfstorage.Region'), - ), - ] diff --git a/osf/migrations/0130_merge_20180914_1414.py b/osf/migrations/0130_merge_20180914_1414.py deleted file mode 100644 index c02ce65fe7e..00000000000 --- a/osf/migrations/0130_merge_20180914_1414.py +++ /dev/null @@ -1,16 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.13 on 2018-09-14 14:14 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0129_merge_20180910_1926'), - ('osf', '0124_merge_20180815_1924'), - ] - - operations = [ - ] diff --git a/osf/migrations/0131_merge_20180914_1937.py b/osf/migrations/0131_merge_20180914_1937.py deleted file mode 100644 index aad4b6921aa..00000000000 --- a/osf/migrations/0131_merge_20180914_1937.py +++ /dev/null @@ -1,16 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.13 on 2018-09-14 19:37 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0130_fileversion_region'), - ('osf', '0130_merge_20180914_1414'), - ] - - operations = [ - ] diff --git a/osf/migrations/0132_merge_20180914_2001.py b/osf/migrations/0132_merge_20180914_2001.py deleted file mode 100644 index 8ab7aa9c1a2..00000000000 --- a/osf/migrations/0132_merge_20180914_2001.py +++ /dev/null @@ -1,17 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.13 on 2018-09-14 20:01 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0125_merge_20180822_1508'), - ('osf', '0129_merge_20180904_2028'), - ('osf', '0131_merge_20180914_1937'), - ] - - operations = [ - ] diff --git a/osf/migrations/0133_merge_20180920_1604.py b/osf/migrations/0133_merge_20180920_1604.py deleted file mode 100644 index b22006b62a8..00000000000 --- a/osf/migrations/0133_merge_20180920_1604.py +++ /dev/null @@ -1,16 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.13 on 2018-09-20 16:04 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0132_merge_20180914_2001'), - ('osf', '0130_auto_20180912_2039'), - ] - - operations = [ - ] diff --git a/osf/migrations/0133_merge_20180921_0025.py b/osf/migrations/0133_merge_20180921_0025.py deleted file mode 100644 index bddfa698293..00000000000 --- a/osf/migrations/0133_merge_20180921_0025.py +++ /dev/null @@ -1,16 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.13 on 2018-09-21 00:25 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0132_merge_20180914_2001'), - ('osf', '0129_merge_20180831_1412'), - ] - - operations = [ - ] diff --git a/osf/migrations/0134_abstractnode_custom_citation.py b/osf/migrations/0134_abstractnode_custom_citation.py deleted file mode 100644 index a07f0b67197..00000000000 --- a/osf/migrations/0134_abstractnode_custom_citation.py +++ /dev/null @@ -1,20 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.13 on 2018-09-25 15:37 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0133_merge_20180921_0025'), - ] - - operations = [ - migrations.AddField( - model_name='abstractnode', - name='custom_citation', - field=models.TextField(blank=True, null=True), - ), - ] diff --git a/osf/migrations/0134_add_provider_reg_fks.py b/osf/migrations/0134_add_provider_reg_fks.py deleted file mode 100644 index db2c02b889a..00000000000 --- a/osf/migrations/0134_add_provider_reg_fks.py +++ /dev/null @@ -1,26 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.13 on 2018-09-04 14:04 -from __future__ import unicode_literals - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0133_merge_20180920_1604'), - ] - - operations = [ - migrations.AddField( - model_name='abstractnode', - name='provider', - field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='registrations', to='osf.RegistrationProvider'), - ), - migrations.AddField( - model_name='draftregistration', - name='provider', - field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='draft_registrations', to='osf.RegistrationProvider'), - ), - ] diff --git a/osf/migrations/0135_add_file_metadata_models.py b/osf/migrations/0135_add_file_metadata_models.py deleted file mode 100644 index a3a2795737b..00000000000 --- a/osf/migrations/0135_add_file_metadata_models.py +++ /dev/null @@ -1,56 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.13 on 2018-07-27 14:42 -from __future__ import unicode_literals - -from django.db import migrations, models -import django_extensions.db.fields -import osf.models.base -import osf.utils.datetime_aware_jsonfield - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0134_abstractnode_custom_citation'), - ] - - operations = [ - migrations.CreateModel( - name='FileMetadataSchema', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), - ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), - ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), - ('name', models.CharField(max_length=255)), - ('schema', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(default=dict, encoder=osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONEncoder)), - ('category', models.CharField(blank=True, max_length=255, null=True)), - ('active', models.BooleanField(default=True)), - ('schema_version', models.IntegerField()), - ('visible', models.BooleanField(default=True)), - ], - options={ - 'abstract': False, - }, - ), - migrations.AlterUniqueTogether( - name='filemetadataschema', - unique_together=set([('name', 'schema_version')]), - ), - migrations.CreateModel( - name='FileMetadataRecord', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), - ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), - ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), - ('metadata', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=dict, encoder=osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONEncoder)), - ('file', models.ForeignKey(null=True, on_delete=models.deletion.SET_NULL, related_name='records', to='osf.OsfStorageFile')), - ('schema', models.ForeignKey(null=True, on_delete=models.deletion.SET_NULL, related_name='records', to='osf.FileMetadataSchema')), - ], - ), - migrations.AlterUniqueTogether( - name='filemetadatarecord', - unique_together=set([('file', 'schema')]), - ), - ] diff --git a/osf/migrations/0135_migrate_registrations_to_osf_registries_provider.py b/osf/migrations/0135_migrate_registrations_to_osf_registries_provider.py deleted file mode 100644 index 51f17962310..00000000000 --- a/osf/migrations/0135_migrate_registrations_to_osf_registries_provider.py +++ /dev/null @@ -1,56 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.13 on 2018-07-18 13:51 -from __future__ import unicode_literals -import logging - -from django.db import migrations - -logger = logging.getLogger(__file__) - -def migrate_existing_registrations_into_osf_registries(state, schema): - AbstractProvider = state.get_model('osf', 'abstractprovider') - AbstractNode = state.get_model('osf', 'abstractnode') - DraftRegistration = state.get_model('osf', 'draftregistration') - - try: - osf_registries = AbstractProvider.objects.get(_id='osf', type='osf.registrationprovider') - except AbstractProvider.DoesNotExist: - # Allow test / local dev DBs to pass - logger.warn('Unable to find OSF Registries provider - assuming test environment.') - pass - else: - draft_registrations = DraftRegistration.objects.all() - registrations = AbstractNode.objects.filter(type='osf.registration') - - updated_drafts = draft_registrations.update(provider_id=osf_registries.id) - updated_registrations = registrations.update(provider_id=osf_registries.id) - - assert (updated_drafts, updated_registrations) == (draft_registrations.count(), registrations.count()) - logger.info('Successfully migrated {} draft registrations and {} public registrations into OSFRegistries'.format(updated_drafts, updated_registrations)) - -def remove_existing_registrations_from_osf_registries(state, schema): - AbstractProvider = state.get_model('osf', 'abstractprovider') - try: - osf_registries = AbstractProvider.objects.get(_id='osf', type='osf.registrationprovider') - except AbstractProvider.DoesNotExist: - pass - else: - total_registrations = osf_registries.registrations.count() + osf_registries.draft_registrations.count() - - osf_registries.draft_registrations.clear() - osf_registries.registrations.clear() - - logger.info('Successfully removed {} public and draft registrations from OSFRegistries'.format(total_registrations)) - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0134_add_provider_reg_fks'), - ] - - operations = [ - migrations.RunPython( - migrate_existing_registrations_into_osf_registries, - remove_existing_registrations_from_osf_registries - ) - ] diff --git a/osf/migrations/0135_update_preprint_model_for_divorce.py b/osf/migrations/0135_update_preprint_model_for_divorce.py deleted file mode 100644 index 2b96cce26d9..00000000000 --- a/osf/migrations/0135_update_preprint_model_for_divorce.py +++ /dev/null @@ -1,138 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.11 on 2018-05-01 19:24 -from __future__ import unicode_literals - -from django.conf import settings -import django_extensions.db.fields -from django.db import migrations, models -import django.db.models.deletion -import django.utils.timezone -import osf.models.validators -import osf.utils.fields - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0134_abstractnode_custom_citation'), - ] - - operations = [ - migrations.RenameModel('PreprintService', 'Preprint'), - migrations.CreateModel( - name='PreprintLog', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), - ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), - ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), - ('action', models.CharField(db_index=True, max_length=255)), - ('params', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(default=dict)), - ('should_hide', models.BooleanField(default=False)), - ('foreign_user', models.CharField(blank=True, max_length=255, null=True)), - ('preprint', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='logs', to='osf.Preprint')), - ('user', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='preprint_logs', to=settings.AUTH_USER_MODEL)), - ], - options={ - 'ordering': ['-created'], - 'get_latest_by': 'created', - }, - ), - - migrations.CreateModel( - name='PreprintContributor', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('visible', models.BooleanField(default=False)), - ('preprint', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='osf.Preprint')), - ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)) - ], - ), - migrations.AlterModelOptions( - name='preprint', - options={'permissions': (('view_preprint', 'Can view preprint details in the admin app.'), ('read_preprint', 'Can read the preprint'), ('write_preprint', 'Can write the preprint'), ('admin_preprint', 'Can manage the preprint'))}, - ), - migrations.AddField( - model_name='preprint', - name='region', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='addons_osfstorage.Region'), - ), - migrations.AddField( - model_name='preprint', - name='primary_file', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='preprint', to='osf.OsfStorageFile'), - ), - migrations.AlterField( - model_name='preprint', - name='provider', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='preprints', to='osf.PreprintProvider'), - ), - migrations.AlterField( - model_name='preprint', - name='subjects', - field=models.ManyToManyField(blank=True, related_name='preprints', to='osf.Subject'), - ), - migrations.AddField( - model_name='preprint', - name='creator', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='preprints_created', to=settings.AUTH_USER_MODEL), - ), - migrations.AddField( - model_name='preprint', - name='is_public', - field=models.BooleanField(default=True, db_index=True), - ), - migrations.AddField( - model_name='preprint', - name='deleted', - field=osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True), - ), - migrations.AddField( - model_name='preprint', - name='migrated', - field=osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True), - ), - migrations.AddField( - model_name='preprint', - name='description', - field=models.TextField(blank=True, default=''), - ), - migrations.AddField( - model_name='preprint', - name='article_doi', - field=models.CharField(blank=True, max_length=128, null=True, validators=[osf.models.validators.validate_doi]) - ), - migrations.AddField( - model_name='preprint', - name='last_logged', - field=osf.utils.fields.NonNaiveDateTimeField(blank=True, db_index=True, default=django.utils.timezone.now, null=True), - ), - migrations.AddField( - model_name='preprint', - name='tags', - field=models.ManyToManyField(related_name='preprint_tagged', to='osf.Tag'), - ), - migrations.AddField( - model_name='preprint', - name='title', - field=models.TextField(default='Untitled', validators=[osf.models.validators.validate_title]), - preserve_default=False, - ), - migrations.AddField( - model_name='preprint', - name='_contributors', - field=models.ManyToManyField(related_name='preprints', through='osf.PreprintContributor', to=settings.AUTH_USER_MODEL), - ), - migrations.AlterUniqueTogether( - name='preprint', - unique_together=set([]), - ), - migrations.AlterUniqueTogether( - name='preprintcontributor', - unique_together=set([('user', 'preprint')]), - ), - migrations.AlterOrderWithRespectTo( - name='preprintcontributor', - order_with_respect_to='preprint', - ), - ] diff --git a/osf/migrations/0135_user_settings_waffles.py b/osf/migrations/0135_user_settings_waffles.py deleted file mode 100644 index 988cd9c8829..00000000000 --- a/osf/migrations/0135_user_settings_waffles.py +++ /dev/null @@ -1,26 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.13 on 2018-10-03 14:20 -from __future__ import unicode_literals - -from django.db import migrations - -from osf import features - - -USER_SETTINGS_FLAGS = [ - features.EMBER_USER_SETTINGS_ACCOUNTS, - features.EMBER_USER_SETTINGS_ADDONS, - features.EMBER_USER_SETTINGS_APPS, - features.EMBER_USER_SETTINGS_NOTIFICATIONS, - features.EMBER_USER_SETTINGS_TOKENS, -] - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0134_abstractnode_custom_citation'), - ] - - operations = [ - ] diff --git a/osf/migrations/0136_add_datacite_file_metadata_schema.py b/osf/migrations/0136_add_datacite_file_metadata_schema.py deleted file mode 100644 index 906bc058c89..00000000000 --- a/osf/migrations/0136_add_datacite_file_metadata_schema.py +++ /dev/null @@ -1,43 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.13 on 2018-08-16 19:24 -from __future__ import unicode_literals - -import json -import logging - -from django.db import migrations - -logger = logging.getLogger(__file__) - - -def add_datacite_schema(state, schema): - FileMetadataSchema = state.get_model('osf', 'filemetadataschema') - with open('osf/metadata/schemas/datacite.json') as f: - jsonschema = json.load(f) - _, created = FileMetadataSchema.objects.get_or_create( - _id='datacite', - schema_version=1, - defaults={ - 'name': 'datacite', - 'schema': jsonschema - } - - ) - if created: - logger.info('Added datacite schema to the database') - - -def remove_datacite_schema(state, schema): - FileMetadataSchema = state.get_model('osf', 'filemetadataschema') - FileMetadataSchema.objects.get(_id='datacite').delete() - logger.info('Removed datacite schema from the database') - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0135_add_file_metadata_models'), - ] - - operations = [ - ] diff --git a/osf/migrations/0136_add_ember_auth_register_waffle_flag.py b/osf/migrations/0136_add_ember_auth_register_waffle_flag.py deleted file mode 100644 index 4ad3d61c4ba..00000000000 --- a/osf/migrations/0136_add_ember_auth_register_waffle_flag.py +++ /dev/null @@ -1,14 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.13 on 2018-10-08 13:01 -from __future__ import unicode_literals -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0135_user_settings_waffles'), - ] - - operations = [ - ] diff --git a/osf/migrations/0136_merge_20181010_2242.py b/osf/migrations/0136_merge_20181010_2242.py deleted file mode 100644 index c7b0916e962..00000000000 --- a/osf/migrations/0136_merge_20181010_2242.py +++ /dev/null @@ -1,16 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.13 on 2018-10-10 22:42 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0135_migrate_registrations_to_osf_registries_provider'), - ('osf', '0134_abstractnode_custom_citation'), - ] - - operations = [ - ] diff --git a/osf/migrations/0136_preprint_node_divorce.py b/osf/migrations/0136_preprint_node_divorce.py deleted file mode 100644 index 3f11d62cc77..00000000000 --- a/osf/migrations/0136_preprint_node_divorce.py +++ /dev/null @@ -1,420 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.9 on 2018-03-12 18:25 -from __future__ import unicode_literals -import logging - -from django.contrib.auth.models import Group -from django.contrib.contenttypes.models import ContentType -from django.db import migrations -from django.db.models import Func, Value, F, Q -from bulk_update.helper import bulk_update - -logger = logging.getLogger(__name__) - - -def reverse_func(apps, schema_editor): - PreprintContributor = apps.get_model('osf', 'PreprintContributor') - PreprintTags = apps.get_model('osf', 'Preprint_Tags') - NodeSettings = apps.get_model('addons_osfstorage', 'NodeSettings') - AbstractNode = apps.get_model('osf', 'AbstractNode') - Preprint = apps.get_model('osf', 'Preprint') - BaseFileNode = apps.get_model('osf', 'BaseFileNode') - PageCounter = apps.get_model('osf', 'PageCounter') - Guid = apps.get_model('osf', 'Guid') - - preprints = [] - files = [] - nodes = [] - - modified_field = Preprint._meta.get_field('modified') - modified_field.auto_now = False - node_modified_field = AbstractNode._meta.get_field('modified') - node_modified_field.auto_now = False - - for preprint in Preprint.objects.filter(node__isnull=False).select_related('node'): - node = preprint.node - preprint.title = 'Untitled' - preprint.description = '' - preprint.creator = None - preprint.article_doi = '' - preprint.is_public = True - preprint.region_id = None - preprint.spam_status = None - preprint.spam_pro_tip = '' - preprint.spam_data = {} - preprint.date_last_reported = None - preprint.reports = {} - - preprint_file = None - if preprint.primary_file: - preprint_file = BaseFileNode.objects.get(id=preprint.primary_file.id) - preprint_file.target_object_id = node.id - preprint_file.target_content_type_id = ContentType.objects.get_for_model(AbstractNode).id - preprint_file.parent_id = NodeSettings.objects.get(owner_id=node.id).root_node_id - - node_id = Guid.objects.get(content_type=ContentType.objects.get_for_model(AbstractNode).id, object_id=node.id)._id - preprint_id = Guid.objects.get(content_type=ContentType.objects.get_for_model(Preprint).id, object_id=preprint.id)._id - PageCounter.objects.filter(Q(_id__contains=preprint_id) & Q(_id__contains=preprint_file._id)).update( - _id=Func(F('_id'), Value(preprint_id), Value(node_id), function='replace') - ) - - node.preprint_file = preprint_file - preprint.primary_file = None - - preprint.deleted = None - preprint.migrated = None - - preprints.append(preprint) - nodes.append(node) - files.append(preprint_file) - - # Deleting the particular preprint admin/read/write groups will remove the users from the groups - # and their permission to these preprints - Group.objects.get(name=format_group(preprint, 'admin')).delete() - Group.objects.get(name=format_group(preprint, 'write')).delete() - Group.objects.get(name=format_group(preprint, 'read')).delete() - - PreprintContributor.objects.all().delete() - PreprintTags.objects.all().delete() - bulk_update(preprints, update_fields=['title', 'description', 'creator', 'article_doi', 'is_public', 'region_id', 'deleted', 'migrated', 'modified', 'primary_file', 'spam_status', 'spam_pro_tip', 'spam_data', 'date_last_reported', 'reports']) - bulk_update(nodes, update_fields=['preprint_file']) - bulk_update(files) - # Order is important - remove the preprint root folders after the files have been saved back onto the nodes - BaseFileNode.objects.filter(type='osf.osfstoragefolder', is_root=True, target_content_type_id=ContentType.objects.get_for_model(Preprint).id).delete() - modified_field.auto_now = True - node_modified_field.auto_now = True - - -group_format = 'preprint_{self.id}_{group}' - - -def format_group(self, name): - return group_format.format(self=self, group=name) - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0135_update_preprint_model_for_divorce'), - ] - - operations = [ - migrations.RunSQL( - [ - """ - -- Borrowed from https://gist.github.com/jamarparris/6100413 - CREATE OR REPLACE FUNCTION generate_object_id() RETURNS varchar AS $$ - DECLARE - time_component bigint; - machine_id bigint := FLOOR(random() * 16777215); - process_id bigint; - seq_id bigint := FLOOR(random() * 16777215); - result varchar:= ''; - BEGIN - SELECT FLOOR(EXTRACT(EPOCH FROM clock_timestamp())) INTO time_component; - SELECT pg_backend_pid() INTO process_id; - - result := result || lpad(to_hex(time_component), 8, '0'); - result := result || lpad(to_hex(machine_id), 6, '0'); - result := result || lpad(to_hex(process_id), 4, '0'); - result := result || lpad(to_hex(seq_id), 6, '0'); - RETURN result; - END; - $$ LANGUAGE PLPGSQL; - """, - """ - UPDATE osf_preprint P -- Copies basic preprint properties from node - SET title = N.title, - description = N.description, - article_doi = N.preprint_article_doi, - is_public = N.is_public - FROM osf_abstractnode as N - WHERE P.node_id = N.id - AND P.node_id IS NOT NULL; - """, - """ - UPDATE osf_preprint P -- Copies node spam to preprint spam as long as preprint hasn't been confirmed as spam or ham - SET spam_status= N.spam_status, - spam_pro_tip= N.spam_pro_tip, - spam_data = N.spam_data, - date_last_reported = N.date_last_reported, - reports = N.reports - FROM osf_abstractnode as N - WHERE P.node_id = N.id - AND P.node_id IS NOT NULL - AND (P.spam_status is NULL - OR (P.spam_status != 4 - AND P.spam_status != 2)); - """, - """ - -- Creates PreprintContributor records from NodeContributors, except permissions - -- since preprints use django guardian - INSERT INTO osf_preprintcontributor (visible, user_id, preprint_id, _order) - (SELECT C.visible, C.user_id, P.id, C._order - FROM osf_preprint as P - JOIN osf_abstractnode as N on P.node_id = N.id - JOIN osf_contributor as C on N.id = C.node_id); - """, - """ - -- Copy the unclaimed record for the node and add it to the user using the preprint guid as the key - -- This is for preserving unregistered contributor info - CREATE OR REPLACE FUNCTION update_unclaimed_records_for_preprints() - RETURNS SETOF varchar AS - $func$ - DECLARE - rec record; - BEGIN - FOR rec IN - SELECT jsonb_build_object(PG._id, unclaimed_records::jsonb-> NG._id) as newkeyvalue, U.id as user_id - FROM osf_osfuser U, osf_contributor C, osf_abstractnode N, osf_preprint P, django_content_type NCT, django_content_type PCT, osf_guid NG, osf_guid PG - WHERE C.user_id = U.id - AND N.id = C.node_id - AND P.node_id = N.id - AND NCT.model = 'abstractnode' - AND PCT.model = 'preprint' - AND NG.object_id = N.id AND NG.content_type_id = NCT.id - AND PG.object_id = P.id AND PG.content_type_id = PCT.id - AND unclaimed_records::jsonb ? NG._id - - LOOP - -- Loops through every row in temporary table above, and adding a new key/value pair to unclaimed_records, copying the node -> preprint - -- Looping instead of joining to osf_user table because temporary table above has multiple rows with the same user - UPDATE osf_osfuser - SET unclaimed_records = unclaimed_records || rec.newkeyvalue - WHERE osf_osfuser.id = rec.user_id; - END LOOP; - END - $func$ LANGUAGE plpgsql; - SELECT update_unclaimed_records_for_preprints(); - """, - """ - -- Creates Read, Write, and Admin groups for each preprint - INSERT INTO auth_group (name) - (SELECT 'preprint_' || P.id || '_read' FROM osf_preprint AS P WHERE P.node_id IS NOT NULL - UNION - SELECT 'preprint_' || P.id || '_write' FROM osf_preprint AS P WHERE P.node_id IS NOT NULL - UNION - SELECT 'preprint_' || P.id || '_admin' FROM osf_preprint AS P WHERE P.node_id IS NOT NULL); - """, - """ - -- Adds "read_preprint" permissions to all Preprint read groups - INSERT INTO guardian_groupobjectpermission (object_pk, group_id, content_type_id, permission_id) - SELECT P.id as object_pk, G.id as group_id, CT.id AS content_type_id, PERM.id AS permission_id - FROM osf_preprint AS P, auth_group G, django_content_type AS CT, auth_permission AS PERM - WHERE P.node_id IS NOT NULL - AND G.name = 'preprint_' || P.id || '_read' - AND CT.model = 'preprint' AND CT.app_label = 'osf' - AND PERM.codename = 'read_preprint'; - """, - """ - -- Adds "read_preprint" and "write_preprint" permissions to all Preprint write groups - INSERT INTO guardian_groupobjectpermission (object_pk, group_id, content_type_id, permission_id) - SELECT P.id as object_pk, G.id as group_id, CT.id AS content_type_id, PERM.id AS permission_id - FROM osf_preprint AS P, auth_group G, django_content_type AS CT, auth_permission AS PERM - WHERE P.node_id IS NOT NULL - AND G.name = 'preprint_' || P.id || '_write' - AND CT.model = 'preprint' AND CT.app_label = 'osf' - AND PERM.codename = 'read_preprint'; - """, - """ - INSERT INTO guardian_groupobjectpermission (object_pk, group_id, content_type_id, permission_id) - SELECT P.id as object_pk, G.id as group_id, CT.id AS content_type_id, PERM.id AS permission_id - FROM osf_preprint AS P, auth_group G, django_content_type AS CT, auth_permission AS PERM - WHERE P.node_id IS NOT NULL - AND G.name = 'preprint_' || P.id || '_write' - AND CT.model = 'preprint' AND CT.app_label = 'osf' - AND PERM.codename = 'write_preprint'; - """, - """ - -- Adds "read_preprint", "write_preprint", and "admin_preprint" permissions to all Preprint admin groups - INSERT INTO guardian_groupobjectpermission (object_pk, group_id, content_type_id, permission_id) - SELECT P.id as object_pk, G.id as group_id, CT.id AS content_type_id, PERM.id AS permission_id - FROM osf_preprint AS P, auth_group G, django_content_type AS CT, auth_permission AS PERM - WHERE P.node_id IS NOT NULL - AND G.name = 'preprint_' || P.id || '_admin' - AND CT.model = 'preprint' AND CT.app_label = 'osf' - AND PERM.codename = 'read_preprint'; - """, - """ - INSERT INTO guardian_groupobjectpermission (object_pk, group_id, content_type_id, permission_id) - SELECT P.id as object_pk, G.id as group_id, CT.id AS content_type_id, PERM.id AS permission_id - FROM osf_preprint AS P, auth_group G, django_content_type AS CT, auth_permission AS PERM - WHERE P.node_id IS NOT NULL - AND G.name = 'preprint_' || P.id || '_admin' - AND CT.model = 'preprint' AND CT.app_label = 'osf' - AND PERM.codename = 'write_preprint'; - """, - """ - INSERT INTO guardian_groupobjectpermission (object_pk, group_id, content_type_id, permission_id) - SELECT P.id as object_pk, G.id as group_id, CT.id AS content_type_id, PERM.id AS permission_id - FROM osf_preprint AS P, auth_group G, django_content_type AS CT, auth_permission AS PERM - WHERE P.node_id IS NOT NULL - AND G.name = 'preprint_' || P.id || '_admin' - AND CT.model = 'preprint' AND CT.app_label = 'osf' - AND PERM.codename = 'admin_preprint'; - """, - """ - -- Add users with read permissions only on preprint-node to the preprint's read group - INSERT INTO osf_osfuser_groups (osfuser_id, group_id) - SELECT C.user_id as osfuser_id, G.id as group_id - FROM osf_preprint as P, osf_abstractnode as N, osf_contributor as C, auth_group as G - WHERE P.node_id IS NOT NULL - AND P.node_id = N.id - AND C.node_id = N.id - AND C.read = TRUE - AND C.write = FALSE - AND C.admin = FALSE - AND G.name = 'preprint_' || P.id || '_read'; - """, - """ - -- Add users with write permissions on preprint-node to the preprint's write group - INSERT INTO osf_osfuser_groups (osfuser_id, group_id) - SELECT C.user_id as osfuser_id, G.id as group_id - FROM osf_preprint as P, osf_abstractnode as N, osf_contributor as C, auth_group as G - WHERE P.node_id IS NOT NULL - AND P.node_id = N.id - AND C.node_id = N.id - AND C.read = TRUE - AND C.write = TRUE - AND C.admin = FALSE - AND G.name = 'preprint_' || P.id || '_write'; - """, - """ - -- Add users with admin permissions on preprint-node to the preprint's admin group - INSERT INTO osf_osfuser_groups (osfuser_id, group_id) - SELECT C.user_id as osfuser_id, G.id as group_id - FROM osf_preprint as P, osf_abstractnode as N, osf_contributor as C, auth_group as G - WHERE P.node_id IS NOT NULL - AND P.node_id = N.id - AND C.node_id = N.id - AND C.read = TRUE - AND C.write = TRUE - AND C.admin = TRUE - AND G.name = 'preprint_' || P.id || '_admin'; - """, - """ - -- Add all the tags on nodes to their corresponding preprint - INSERT INTO osf_preprint_tags (preprint_id, tag_id) - SELECT P.id, T.tag_id - FROM osf_preprint AS P, osf_abstractnode AS N, osf_abstractnode_tags as T - WHERE P.node_id IS NOT NULL - AND P.node_id = N.id - AND T.abstractnode_id = N.id; - """, - """ - -- Update preprint region to be the same as the node's region - UPDATE osf_preprint - SET region_id = NS.region_id - FROM addons_osfstorage_nodesettings NS - WHERE osf_preprint.node_id = NS.owner_id; - """, - """ - -- Create a root folder for each preprint - INSERT INTO osf_basefilenode - (created, modified, _id, type, target_content_type_id, target_object_id, provider, name, - _path, _materialized_path, is_root, _history) - SELECT current_timestamp, - current_timestamp, - generate_object_id(), - 'osf.osfstoragefolder', - CT.id, - P.id, - 'osfstorage', - '', - '', - '', - true, - '[]' - FROM osf_preprint as P, django_content_type as CT - WHERE P.node_id IS NOT NULL - AND CT.model = 'preprint' and CT.app_label = 'osf'; - """, - """ - -- Move the node's preprint file target from the node -> preprint, and - -- set the file's parent as the preprint's root_folder - UPDATE osf_basefilenode Fi - SET target_object_id = P.id, - target_content_type_id = CT.id, - parent_id = Fo.id - FROM osf_preprint P, osf_abstractnode N, django_content_type CT, osf_basefilenode Fo - WHERE P.node_id = N.id - and P.node_id IS NOT NULL - and N.preprint_file_id = Fi.id - and CT.model = 'preprint' and CT.app_label = 'osf' - and Fo.is_root = TRUE - and Fo.target_object_id = P.id - and Fo.target_content_type_id = CT.id; - """, - """ - -- Set the preprint primary file as the node's preprint file - UPDATE osf_preprint P - SET primary_file_id = N.preprint_file_id - FROM osf_abstractnode N - WHERE P.node_id = N.id - AND P.node_id IS NOT NULL; - """, - """ - -- Set deleted date on preprint, if exists, pulling from attached node's project_deleted log - UPDATE osf_preprint as P - SET deleted = L.date - FROM osf_abstractnode N, osf_nodelog L - WHERE P.node_id = N.id - AND P.node_id IS NOT NULL - AND L.node_id = N.id - AND L.action = 'project_deleted'; - """, - """ - -- Set preprint creator to equal the user attached to the node's preprint initiated log - UPDATE osf_preprint P - SET creator_id = L.user_id - FROM osf_abstractnode N, osf_nodelog L - WHERE P.node_id = N.id - AND L.node_id = N.id - and L.action = 'preprint_initiated'; - """, - """ - -- For preprints whose nodes don't have preprint initiated log, just set preprint creator to equal the node creator - UPDATE osf_preprint P - SET creator_id = N.creator_id - FROM osf_abstractnode N - WHERE P.creator_id IS NULL - AND P.node_id = N.id; - """, - """ - -- Set preprint modified date to be the date of the latest preprint-related nodelog, if date is more recent - -- than the preprint modified date - UPDATE osf_preprint - SET modified = - GREATEST((SELECT L.date - FROM osf_nodelog L - WHERE (L.node_id = (osf_preprint.node_id) - AND L.action IN ('contributor_added', - 'made_contributor_invisible', - 'made_public', - 'made_contributor_visible', - 'edit_description', - 'preprint_file_updated', - 'preprint_initiated', - 'contributor_removed', - 'made_private', - 'edit_title', - 'preprint_license_updated', - 'subjects_updated', - 'tag_removed', - 'permissions_updated', - 'tag_added', - 'contributors_reordered', - 'project_deleted')) - ORDER BY L.date DESC - LIMIT 1), osf_preprint.modified) - WHERE osf_preprint.node_id IS NOT NULL; - """, - """ - -- Final step - set migrated date to current datetime - UPDATE osf_preprint - SET migrated = current_timestamp - WHERE osf_preprint.node_id IS NOT NULL - """ - ], [] - ) - ] diff --git a/osf/migrations/0137_add_fm_record_to_osfstorage_files.py b/osf/migrations/0137_add_fm_record_to_osfstorage_files.py deleted file mode 100644 index 7aa62e71474..00000000000 --- a/osf/migrations/0137_add_fm_record_to_osfstorage_files.py +++ /dev/null @@ -1,57 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.13 on 2018-09-26 15:18 -from __future__ import unicode_literals -from math import ceil -import logging - -from django.db import migrations, connection - -logger = logging.getLogger(__name__) - -increment = 500000 - -def remove_records_from_files(state, schema): - FileMetadataRecord = state.get_model('osf', 'filemetadatarecord') - FileMetadataRecord.objects.all().delete() - -# Batching adapted from strategy in website/search_migration/migrate.py -def add_records_to_files_sql(state, schema): - FileMetadataSchema = state.get_model('osf', 'filemetadataschema') - datacite_schema_id = FileMetadataSchema.objects.filter(_id='datacite').values_list('id', flat=True)[0] - OsfStorageFile = state.get_model('osf', 'osfstoragefile') - max_fid = getattr(OsfStorageFile.objects.last(), 'id', 0) - - sql = """ - INSERT INTO osf_filemetadatarecord (created, modified, _id, metadata, file_id, schema_id) - SELECT NOW(), NOW(), generate_object_id(), '{{}}', OSF_FILE.id, %d - FROM osf_basefilenode OSF_FILE - WHERE (OSF_FILE.type = 'osf.osfstoragefile' - AND OSF_FILE.provider = 'osfstorage' - AND OSF_FILE.id > {} - AND OSF_FILE.id <= {} - ); - """ % (datacite_schema_id) - - total_pages = int(ceil(max_fid / float(increment))) - page_start = 0 - page_end = 0 - page = 0 - while page_end <= (max_fid): - page += 1 - page_end += increment - if page <= total_pages: - logger.info('Updating page {} / {}'.format(page_end / increment, total_pages)) - with connection.cursor() as cursor: - cursor.execute(sql.format( - page_start, - page_end - )) - page_start = page_end - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0136_add_datacite_file_metadata_schema'), - ] - - operations = [] diff --git a/osf/migrations/0137_auto_20181012_1756.py b/osf/migrations/0137_auto_20181012_1756.py deleted file mode 100644 index 71c8aed25ba..00000000000 --- a/osf/migrations/0137_auto_20181012_1756.py +++ /dev/null @@ -1,66 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.13 on 2018-10-12 17:56 -from __future__ import unicode_literals - -import django.contrib.postgres.fields -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0136_merge_20181010_2242'), - ] - - operations = [ - migrations.AlterField( - model_name='collection', - name='collected_type_choices', - field=django.contrib.postgres.fields.ArrayField(base_field=models.CharField(max_length=127), blank=True, default=list, size=None), - ), - migrations.AlterField( - model_name='collection', - name='issue_choices', - field=django.contrib.postgres.fields.ArrayField(base_field=models.CharField(max_length=127), blank=True, default=list, size=None), - ), - migrations.AlterField( - model_name='collection', - name='program_area_choices', - field=django.contrib.postgres.fields.ArrayField(base_field=models.CharField(max_length=127), blank=True, default=list, size=None), - ), - migrations.AlterField( - model_name='collection', - name='status_choices', - field=django.contrib.postgres.fields.ArrayField(base_field=models.CharField(max_length=127), blank=True, default=list, size=None), - ), - migrations.AlterField( - model_name='collection', - name='volume_choices', - field=django.contrib.postgres.fields.ArrayField(base_field=models.CharField(max_length=127), blank=True, default=list, size=None), - ), - migrations.AlterField( - model_name='collectionsubmission', - name='collected_type', - field=models.CharField(blank=True, max_length=127), - ), - migrations.AlterField( - model_name='collectionsubmission', - name='issue', - field=models.CharField(blank=True, max_length=127), - ), - migrations.AlterField( - model_name='collectionsubmission', - name='program_area', - field=models.CharField(blank=True, max_length=127), - ), - migrations.AlterField( - model_name='collectionsubmission', - name='status', - field=models.CharField(blank=True, max_length=127), - ), - migrations.AlterField( - model_name='collectionsubmission', - name='volume', - field=models.CharField(blank=True, max_length=127), - ), - ] diff --git a/osf/migrations/0137_merge_20181011_1525.py b/osf/migrations/0137_merge_20181011_1525.py deleted file mode 100644 index 69f4b3278e6..00000000000 --- a/osf/migrations/0137_merge_20181011_1525.py +++ /dev/null @@ -1,16 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.13 on 2018-10-11 15:25 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0136_merge_20181010_2242'), - ('osf', '0136_add_ember_auth_register_waffle_flag'), - ] - - operations = [ - ] diff --git a/osf/migrations/0137_transfer_preprint_service_permissions.py b/osf/migrations/0137_transfer_preprint_service_permissions.py deleted file mode 100644 index 98a93da98a6..00000000000 --- a/osf/migrations/0137_transfer_preprint_service_permissions.py +++ /dev/null @@ -1,14 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.11 on 2018-05-03 14:47 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0136_preprint_node_divorce'), - ] - - operations = [] diff --git a/osf/migrations/0138_ensure_subjects_and_providers.py b/osf/migrations/0138_ensure_subjects_and_providers.py deleted file mode 100644 index 38ff9c08453..00000000000 --- a/osf/migrations/0138_ensure_subjects_and_providers.py +++ /dev/null @@ -1,100 +0,0 @@ -# -*- coding: utf-8 -*- -# TODO: squashmigrations, replace this with initial_data -from __future__ import unicode_literals -import json -import logging -import os - -from django.conf import settings -from django.db import migrations -logger = logging.getLogger(__name__) -logging.basicConfig(level=logging.INFO) - -from website.settings import DOMAIN, APP_PATH - -OSF_PREPRINTS_DATA = { - '_id': 'osf', - 'type': 'osf.preprintprovider', - 'name': 'Open Science Framework', - 'domain': DOMAIN, - 'share_publish_type': 'Preprint', - 'domain_redirect_enabled': False, -} -OSF_REGISTRIES_DATA = { - '_id': 'osf', - 'type': 'osf.registrationprovider', - 'name': 'OSF Registries', - 'domain': DOMAIN, - 'share_publish_type': 'Registration', - 'domain_redirect_enabled': False, -} - -def _create_provider(cls, data, state): - NodeLicense = state.get_model('osf.nodelicense') - - def get_license(name): - try: - license = NodeLicense.objects.get(name=name) - except NodeLicense.DoesNotExist: - raise Exception('License: "{}" not found'.format(name)) - return license - - licenses = [get_license(name) for name in data.pop('licenses_acceptable', [])] - default_license = data.pop('default_license', False) - provider = cls.objects.create(**data) - if licenses: - provider.licenses_acceptable.set(licenses) - if default_license: - provider.default_license = get_license(default_license) - provider.save() - -def create_osf_preprints(state, schema): - PreprintProvider = state.get_model('osf.preprintprovider') - if not PreprintProvider.objects.filter(_id=OSF_PREPRINTS_DATA['_id'], type=OSF_PREPRINTS_DATA['type']).exists(): - logger.info('Creating PreprintProvider "osf"') - _create_provider(PreprintProvider, OSF_PREPRINTS_DATA, state) - -def create_subjects(state, schema): - Subject = state.get_model('osf.subject') - PreprintProvider = state.get_model('osf.preprintprovider') - if not Subject.objects.exists(): - logger.info('Populating Subjects') - bepress_provider = PreprintProvider.objects.get(type=OSF_PREPRINTS_DATA['type'], _id=OSF_PREPRINTS_DATA['_id']) - # Flat taxonomy is stored locally, read in here - with open( - os.path.join( - APP_PATH, - 'website', 'static', 'bepress_taxonomy.json', - ) - ) as fp: - taxonomy = json.load(fp) - - for subject_path in taxonomy.get('data'): - subjects = subject_path.split('_') - text = subjects[-1] - - # Search for parent subject, get id if it exists - parent = None - if len(subjects) > 1: - parent, _ = Subject.objects.get_or_create(text=subjects[-2], provider=bepress_provider) - subject, _ = Subject.objects.get_or_create(text=text, provider=bepress_provider) - if parent and not subject.parent: - subject.parent = parent - subject.save() - -def create_osf_registries(state, schema): - RegistrationProvider = state.get_model('osf.registrationprovider') - if not RegistrationProvider.objects.filter(_id=OSF_REGISTRIES_DATA['_id'], type=OSF_REGISTRIES_DATA['type']).exists(): - logger.info('Creating RegistrationProvider "osf"') - _create_provider(RegistrationProvider, OSF_REGISTRIES_DATA, state) - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0137_auto_20181012_1756'), - ] - - operations = [ - ] if getattr(settings, 'TEST_ENV', False) else [ - ] diff --git a/osf/migrations/0138_merge_20181012_1944.py b/osf/migrations/0138_merge_20181012_1944.py deleted file mode 100644 index a470016ecc9..00000000000 --- a/osf/migrations/0138_merge_20181012_1944.py +++ /dev/null @@ -1,16 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.13 on 2018-10-12 19:44 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0137_merge_20181011_1525'), - ('osf', '0137_auto_20181012_1756'), - ] - - operations = [ - ] diff --git a/osf/migrations/0138_remove_node_preprint_fields.py b/osf/migrations/0138_remove_node_preprint_fields.py deleted file mode 100644 index 5f12f4caf47..00000000000 --- a/osf/migrations/0138_remove_node_preprint_fields.py +++ /dev/null @@ -1,31 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.13 on 2018-06-08 03:52 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0137_transfer_preprint_service_permissions'), - ] - - operations = [ - migrations.RemoveField( - model_name='abstractnode', - name='_has_abandoned_preprint', - ), - migrations.RemoveField( - model_name='abstractnode', - name='_is_preprint_orphan', - ), - migrations.RemoveField( - model_name='abstractnode', - name='preprint_article_doi', - ), - migrations.RemoveField( - model_name='abstractnode', - name='preprint_file', - ), - ] diff --git a/osf/migrations/0139_merge_20181003_1759.py b/osf/migrations/0139_merge_20181003_1759.py deleted file mode 100644 index 2f7119472c6..00000000000 --- a/osf/migrations/0139_merge_20181003_1759.py +++ /dev/null @@ -1,16 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.13 on 2018-10-03 17:59 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0135_user_settings_waffles'), - ('osf', '0138_remove_node_preprint_fields'), - ] - - operations = [ - ] diff --git a/osf/migrations/0139_merge_20181019_0412.py b/osf/migrations/0139_merge_20181019_0412.py deleted file mode 100644 index 7f0a3cda957..00000000000 --- a/osf/migrations/0139_merge_20181019_0412.py +++ /dev/null @@ -1,16 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.13 on 2018-10-19 04:12 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0138_ensure_subjects_and_providers'), - ('osf', '0138_merge_20181012_1944'), - ] - - operations = [ - ] diff --git a/osf/migrations/0139_rename_aspredicted_schema.py b/osf/migrations/0139_rename_aspredicted_schema.py deleted file mode 100644 index c5dab54cb33..00000000000 --- a/osf/migrations/0139_rename_aspredicted_schema.py +++ /dev/null @@ -1,38 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.15 on 2018-10-16 20:22 -from __future__ import unicode_literals - -from django.db import migrations - -OLD_NAME = 'AsPredicted Preregistration' -NEW_NAME = 'Preregistration Template from AsPredicted.org' - -def rename_schema(model, from_name, to_name): - try: - schema = model.objects.get(name=from_name) - except model.DoesNotExist: - return - - schema.name = to_name - schema.schema['name'] = to_name - schema.schema['title'] = to_name - schema.schema['pages'][0]['title'] = to_name - return schema.save() - -def rename_aspredicted_schema(state, schema): - RegistrationSchema = state.get_model('osf.registrationschema') - return rename_schema(RegistrationSchema, OLD_NAME, NEW_NAME) - -def undo_aspredicted_rename(state, schema): - RegistrationSchema = state.get_model('osf.registrationschema') - return rename_schema(RegistrationSchema, NEW_NAME, OLD_NAME) - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0138_merge_20181012_1944'), - ] - - operations = [ - migrations.RunPython(rename_aspredicted_schema, undo_aspredicted_rename) - ] diff --git a/osf/migrations/0140_merge_20181011_0021.py b/osf/migrations/0140_merge_20181011_0021.py deleted file mode 100644 index b7eac83bf58..00000000000 --- a/osf/migrations/0140_merge_20181011_0021.py +++ /dev/null @@ -1,17 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.13 on 2018-10-11 00:21 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0136_merge_20181010_2242'), - ('osf', '0136_add_ember_auth_register_waffle_flag'), - ('osf', '0139_merge_20181003_1759'), - ] - - operations = [ - ] diff --git a/osf/migrations/0140_merge_20181022_1446.py b/osf/migrations/0140_merge_20181022_1446.py deleted file mode 100644 index dbc97eea5cb..00000000000 --- a/osf/migrations/0140_merge_20181022_1446.py +++ /dev/null @@ -1,16 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.13 on 2018-10-22 14:46 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0129_remove_osfuser_is_claimed'), - ('osf', '0139_merge_20181019_0412'), - ] - - operations = [ - ] diff --git a/osf/migrations/0141_merge_20181011_2016.py b/osf/migrations/0141_merge_20181011_2016.py deleted file mode 100644 index 79a47877be5..00000000000 --- a/osf/migrations/0141_merge_20181011_2016.py +++ /dev/null @@ -1,16 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.13 on 2018-10-11 20:16 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0137_merge_20181011_1525'), - ('osf', '0140_merge_20181011_0021'), - ] - - operations = [ - ] diff --git a/osf/migrations/0141_merge_20181023_1526.py b/osf/migrations/0141_merge_20181023_1526.py deleted file mode 100644 index 9dfab008538..00000000000 --- a/osf/migrations/0141_merge_20181023_1526.py +++ /dev/null @@ -1,16 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.13 on 2018-10-23 15:26 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0139_rename_aspredicted_schema'), - ('osf', '0140_merge_20181022_1446'), - ] - - operations = [ - ] diff --git a/osf/migrations/0142_change_registration_schemas.py b/osf/migrations/0142_change_registration_schemas.py deleted file mode 100644 index 92e76bf97ed..00000000000 --- a/osf/migrations/0142_change_registration_schemas.py +++ /dev/null @@ -1,18 +0,0 @@ -from __future__ import unicode_literals - -import logging - -from django.db import migrations - - -logger = logging.getLogger(__file__) - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0141_merge_20181023_1526'), - ] - - operations = [ - ] diff --git a/osf/migrations/0142_merge_20181015_1554.py b/osf/migrations/0142_merge_20181015_1554.py deleted file mode 100644 index 05f171d2a8e..00000000000 --- a/osf/migrations/0142_merge_20181015_1554.py +++ /dev/null @@ -1,16 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.13 on 2018-10-15 15:54 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0138_merge_20181012_1944'), - ('osf', '0141_merge_20181011_2016'), - ] - - operations = [ - ] diff --git a/osf/migrations/0142_remove_forks_flag.py b/osf/migrations/0142_remove_forks_flag.py deleted file mode 100644 index 1fb41fa5e41..00000000000 --- a/osf/migrations/0142_remove_forks_flag.py +++ /dev/null @@ -1,14 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.15 on 2018-10-29 21:29 -from __future__ import unicode_literals -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0141_merge_20181023_1526'), - ] - - operations = [ - ] diff --git a/osf/migrations/0142_remove_waffle_analytics_flags.py b/osf/migrations/0142_remove_waffle_analytics_flags.py deleted file mode 100644 index 53ab673288d..00000000000 --- a/osf/migrations/0142_remove_waffle_analytics_flags.py +++ /dev/null @@ -1,12 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.15 on 2018-10-30 15:13 -from __future__ import unicode_literals -from django.db import migrations - - -class Migration(migrations.Migration): - dependencies = [ - ('osf', '0142_remove_forks_flag'), - ] - operations = [ - ] diff --git a/osf/migrations/0143_merge_20181023_1807.py b/osf/migrations/0143_merge_20181023_1807.py deleted file mode 100644 index b281d6b6517..00000000000 --- a/osf/migrations/0143_merge_20181023_1807.py +++ /dev/null @@ -1,16 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.13 on 2018-10-23 18:07 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0141_merge_20181023_1526'), - ('osf', '0142_merge_20181015_1554'), - ] - - operations = [ - ] diff --git a/osf/migrations/0143_merge_20181115_1458.py b/osf/migrations/0143_merge_20181115_1458.py deleted file mode 100644 index 17826b964ab..00000000000 --- a/osf/migrations/0143_merge_20181115_1458.py +++ /dev/null @@ -1,16 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.15 on 2018-11-15 14:58 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0142_change_registration_schemas'), - ('osf', '0142_remove_waffle_analytics_flags'), - ] - - operations = [ - ] diff --git a/osf/migrations/0144_add_prereg_winddown_switches.py b/osf/migrations/0144_add_prereg_winddown_switches.py deleted file mode 100644 index e5d2762a580..00000000000 --- a/osf/migrations/0144_add_prereg_winddown_switches.py +++ /dev/null @@ -1,14 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0143_merge_20181115_1458'), - ] - - operations = [ - ] diff --git a/osf/migrations/0144_merge_20181113_1420.py b/osf/migrations/0144_merge_20181113_1420.py deleted file mode 100644 index 4745046f0d1..00000000000 --- a/osf/migrations/0144_merge_20181113_1420.py +++ /dev/null @@ -1,16 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.15 on 2018-11-13 14:20 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0143_merge_20181023_1807'), - ('osf', '0142_remove_waffle_analytics_flags'), - ] - - operations = [ - ] diff --git a/osf/migrations/0145_add_preprint_contenttype_to_collections.py b/osf/migrations/0145_add_preprint_contenttype_to_collections.py deleted file mode 100644 index b033a070563..00000000000 --- a/osf/migrations/0145_add_preprint_contenttype_to_collections.py +++ /dev/null @@ -1,37 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.15 on 2018-11-08 16:56 -from __future__ import unicode_literals - -from django.db import migrations -from django.contrib.contenttypes.models import ContentType - - -def reverse_func(state, schema): - Collection = state.get_model('osf.collection') - preprint_content_type = ContentType.objects.get(app_label='osf', model='preprint') - ThroughModel = Collection.collected_types.through - ThroughModel.objects.filter(contenttype_id=preprint_content_type.id).delete() - - -def add_preprint_type_to_collections(state, schema): - Collection = state.get_model('osf.collection') - ThroughModel = Collection.collected_types.through - preprint_ct_id = ContentType.objects.get(app_label='osf', model='preprint').id - - through_objects = [] - collections = Collection.objects.exclude(collected_types__in=[preprint_ct_id]) - for collection in collections: - through_objects.append(ThroughModel(collection_id=collection.id, contenttype_id=preprint_ct_id)) - - ThroughModel.objects.bulk_create(through_objects) - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0144_merge_20181113_1420'), - ] - - operations = [ - migrations.RunPython(add_preprint_type_to_collections, reverse_func) - ] diff --git a/osf/migrations/0145_add_visible_to_registrationschema.py b/osf/migrations/0145_add_visible_to_registrationschema.py deleted file mode 100644 index 60444a901d7..00000000000 --- a/osf/migrations/0145_add_visible_to_registrationschema.py +++ /dev/null @@ -1,19 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0144_add_prereg_winddown_switches'), - ] - - operations = [ - migrations.AddField( - model_name='registrationschema', - name='visible', - field=models.BooleanField(default=True), - ), - ] diff --git a/osf/migrations/0146_merge_20181119_2236.py b/osf/migrations/0146_merge_20181119_2236.py deleted file mode 100644 index 160a0ecf2e4..00000000000 --- a/osf/migrations/0146_merge_20181119_2236.py +++ /dev/null @@ -1,16 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.15 on 2018-11-19 22:36 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0143_merge_20181115_1458'), - ('osf', '0145_add_preprint_contenttype_to_collections'), - ] - - operations = [ - ] diff --git a/osf/migrations/0146_update_registration_schemas.py b/osf/migrations/0146_update_registration_schemas.py deleted file mode 100644 index e19427ec592..00000000000 --- a/osf/migrations/0146_update_registration_schemas.py +++ /dev/null @@ -1,45 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.db import migrations - -from osf.utils.migrations import UpdateRegistrationSchemas - -V2_INVISIBLE_SCHEMAS = [ - 'EGAP Project', - 'OSF Preregistration', - 'Confirmatory - General', - 'RIDIE Registration - Study Complete', - 'RIDIE Registration - Study Initiation', -] - -V2_INACTIVE_SCHEMAS = V2_INVISIBLE_SCHEMAS + [ - 'Election Research Preacceptance Competition', -] - -def remove_version_1_schemas(state, schema): - RegistrationSchema = state.get_model('osf', 'registrationschema') - assert RegistrationSchema.objects.filter(schema_version=1, abstractnode__isnull=False).count() == 0 - assert RegistrationSchema.objects.filter(schema_version=1, draftregistration__isnull=False).count() == 0 - RegistrationSchema.objects.filter(schema_version=1).delete() - -def update_v2_schemas(state, schema): - RegistrationSchema = state.get_model('osf', 'registrationschema') - RegistrationSchema.objects.filter(name__in=V2_INVISIBLE_SCHEMAS).update(visible=False) - RegistrationSchema.objects.filter(name__in=V2_INACTIVE_SCHEMAS).update(active=False) - -def noop(*args, **kwargs): - pass - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0145_add_visible_to_registrationschema'), - ] - - operations = [ - migrations.RunPython(remove_version_1_schemas, noop), - UpdateRegistrationSchemas(), - migrations.RunPython(update_v2_schemas, noop), - ] diff --git a/osf/migrations/0147_blacklistedemaildomain.py b/osf/migrations/0147_blacklistedemaildomain.py deleted file mode 100644 index 406cf498e83..00000000000 --- a/osf/migrations/0147_blacklistedemaildomain.py +++ /dev/null @@ -1,42 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.15 on 2018-12-13 16:02 -from __future__ import unicode_literals - -from django.db import migrations, models -import django_extensions.db.fields -import osf.utils.fields -from website import settings - -def populate_blacklisted_domains(state, *args, **kwargs): - BlacklistedEmailDomain = state.get_model('osf', 'BlacklistedEmailDomain') - blacklisted_domains = getattr(settings, 'BLACKLISTED_DOMAINS') - BlacklistedEmailDomain.objects.bulk_create([ - BlacklistedEmailDomain(domain=domain) - for domain in blacklisted_domains - ]) - -def remove_blacklisted_domains(state, *args, **kwargs): - BlacklistedEmailDomain = state.get_model('osf', 'BlacklistedEmailDomain') - BlacklistedEmailDomain.objects.all().delete() - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0146_update_registration_schemas'), - ] - - operations = [ - migrations.CreateModel( - name='BlacklistedEmailDomain', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), - ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), - ('domain', osf.utils.fields.LowercaseCharField(db_index=True, max_length=255, unique=True)), - ], - options={ - 'abstract': False, - }, - ), - ] diff --git a/osf/migrations/0147_repoint_preprint_pagecounters.py b/osf/migrations/0147_repoint_preprint_pagecounters.py deleted file mode 100644 index 590a43524c7..00000000000 --- a/osf/migrations/0147_repoint_preprint_pagecounters.py +++ /dev/null @@ -1,48 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.15 on 2018-12-06 15:44 -from __future__ import unicode_literals - -from bulk_update.helper import bulk_update -from django.contrib.contenttypes.models import ContentType -from django.db import migrations -from tqdm import tqdm - - -def noop(*args, **kwargs): - # No brakes on the NPD train - pass - -def rekey_pagecounters(state, schema): - AbstractNode = state.get_model('osf', 'AbstractNode') - Guid = state.get_model('osf', 'Guid') - Preprint = state.get_model('osf', 'Preprint') - PageCounter = state.get_model('osf', 'PageCounter') - nct = ContentType.objects.get_for_model(AbstractNode).id - pct = ContentType.objects.get_for_model(Preprint).id - - preprints = Preprint.objects.select_related('node').exclude(primary_file_id__isnull=True).exclude(node_id__isnull=True) - progress_bar = tqdm(total=preprints.count() or 1) - batch = [] - for i, preprint in enumerate(preprints, 1): - node_id = Guid.objects.get(content_type=nct, object_id=preprint.node_id)._id - file_id = preprint.primary_file._id - if node_id and file_id: - preprint_id = Guid.objects.filter(content_type=pct, object_id=preprint.id).values_list('_id', flat=True).first() - if not preprint_id: - assert False - for page_counter in PageCounter.objects.filter(_id__startswith='download:{}:{}'.format(node_id, file_id)): - page_counter._id = page_counter._id.replace(node_id, preprint_id) - batch.append(page_counter) - progress_bar.update(i) - bulk_update(batch, update_fields=['_id'], batch_size=10000) - progress_bar.close() - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0146_merge_20181119_2236'), - ] - - operations = [ - migrations.RunPython(rekey_pagecounters, noop) - ] diff --git a/osf/migrations/0148_merge_20181213_2253.py b/osf/migrations/0148_merge_20181213_2253.py deleted file mode 100644 index 77a1b454a81..00000000000 --- a/osf/migrations/0148_merge_20181213_2253.py +++ /dev/null @@ -1,16 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.15 on 2018-12-13 22:53 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0147_blacklistedemaildomain'), - ('osf', '0147_repoint_preprint_pagecounters'), - ] - - operations = [ - ] diff --git a/osf/migrations/0149_add_datacite_doi_switch.py b/osf/migrations/0149_add_datacite_doi_switch.py deleted file mode 100644 index 278a277ad18..00000000000 --- a/osf/migrations/0149_add_datacite_doi_switch.py +++ /dev/null @@ -1,14 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0148_merge_20181213_2253'), - ] - - operations = [ - ] diff --git a/osf/migrations/0150_fix_deleted_preprints.py b/osf/migrations/0150_fix_deleted_preprints.py deleted file mode 100644 index 05b642955b9..00000000000 --- a/osf/migrations/0150_fix_deleted_preprints.py +++ /dev/null @@ -1,45 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.15 on 2018-12-14 19:31 -from __future__ import unicode_literals -import datetime as dt - -from django.db import connection -from django.db import migrations -import pytz - -dummy_datetime = dt.datetime(1970, 1, 1, tzinfo=pytz.UTC) - -def forward(state, *args, **kwargs): - Preprint = state.get_model('osf', 'Preprint') - with connection.cursor() as cursor: - cursor.execute(""" - SELECT applied FROM django_migrations - WHERE name = '0136_preprint_node_divorce' - AND app = 'osf' - """) - npd_release_date = cursor.fetchone()[0] - preprints = ( - Preprint.objects - .filter(created__lt=npd_release_date) - .filter(node__is_deleted=True, deleted__isnull=True) - ) - preprints.update(deleted=dummy_datetime) - - -def backward(state, *args, **kwargs): - Preprint = state.get_model('osf', 'Preprint') - preprints = ( - Preprint.objects - .filter(deleted=dummy_datetime) - ) - preprints.update(deleted=None) - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0149_add_datacite_doi_switch'), - ] - - operations = [ - migrations.RunPython(forward, backward) - ] diff --git a/osf/migrations/0151_auto_20181215_1911.py b/osf/migrations/0151_auto_20181215_1911.py deleted file mode 100644 index 2440403bbdd..00000000000 --- a/osf/migrations/0151_auto_20181215_1911.py +++ /dev/null @@ -1,19 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.15 on 2018-12-15 19:11 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0150_fix_deleted_preprints'), - ] - - operations = [ - migrations.AlterModelOptions( - name='preprint', - options={'permissions': (('view_preprint', 'Can view preprint details in the admin app'), ('read_preprint', 'Can read the preprint'), ('write_preprint', 'Can write the preprint'), ('admin_preprint', 'Can manage the preprint'))}, - ), - ] diff --git a/osf/migrations/0152_ensure_schemas.py b/osf/migrations/0152_ensure_schemas.py deleted file mode 100644 index 6d3a65183c0..00000000000 --- a/osf/migrations/0152_ensure_schemas.py +++ /dev/null @@ -1,12 +0,0 @@ -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0151_auto_20181215_1911'), - ] - - operations = [] diff --git a/osf/migrations/0152_remove_doi_switches.py b/osf/migrations/0152_remove_doi_switches.py deleted file mode 100644 index 55a86601b6e..00000000000 --- a/osf/migrations/0152_remove_doi_switches.py +++ /dev/null @@ -1,17 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.db import migrations - -from osf.utils.migrations import DeleteWaffleSwitches - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0151_auto_20181215_1911'), - ] - - operations = [ - DeleteWaffleSwitches(['disable_datacite_dois', 'ezid_switch']), - ] diff --git a/osf/migrations/0153_merge_20181221_1842.py b/osf/migrations/0153_merge_20181221_1842.py deleted file mode 100644 index 845116467d4..00000000000 --- a/osf/migrations/0153_merge_20181221_1842.py +++ /dev/null @@ -1,16 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.15 on 2018-12-21 18:42 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0152_remove_doi_switches'), - ('osf', '0152_ensure_schemas'), - ] - - operations = [ - ] diff --git a/osf/migrations/0154_remove_ember_project_registrations_flag.py b/osf/migrations/0154_remove_ember_project_registrations_flag.py deleted file mode 100644 index 8c9f09a9eaa..00000000000 --- a/osf/migrations/0154_remove_ember_project_registrations_flag.py +++ /dev/null @@ -1,15 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.15 on 2018-12-12 18:52 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0153_merge_20181221_1842'), - ] - - operations = [ - ] diff --git a/osf/migrations/0155_merge_20190115_1437.py b/osf/migrations/0155_merge_20190115_1437.py deleted file mode 100644 index 7f3fa959550..00000000000 --- a/osf/migrations/0155_merge_20190115_1437.py +++ /dev/null @@ -1,16 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.15 on 2019-01-15 14:37 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0137_add_fm_record_to_osfstorage_files'), - ('osf', '0154_remove_ember_project_registrations_flag'), - ] - - operations = [ - ] diff --git a/osf/migrations/0156_abstractnode_article_doi.py b/osf/migrations/0156_abstractnode_article_doi.py deleted file mode 100644 index 7be950b2068..00000000000 --- a/osf/migrations/0156_abstractnode_article_doi.py +++ /dev/null @@ -1,21 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.15 on 2019-01-31 01:44 -from __future__ import unicode_literals - -from django.db import migrations, models -import osf.models.validators - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0155_merge_20190115_1437'), - ] - - operations = [ - migrations.AddField( - model_name='abstractnode', - name='article_doi', - field=models.CharField(blank=True, max_length=128, null=True, validators=[osf.models.validators.validate_doi]), - ), - ] diff --git a/osf/migrations/0156_auto_20190306_1648.py b/osf/migrations/0156_auto_20190306_1648.py deleted file mode 100644 index 57208fb48fc..00000000000 --- a/osf/migrations/0156_auto_20190306_1648.py +++ /dev/null @@ -1,62 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.15 on 2019-03-06 16:48 -from __future__ import unicode_literals - -from django.conf import settings -from django.db import migrations, models -import django.db.models.deletion -import django_extensions.db.fields -import osf.utils.datetime_aware_jsonfield - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0155_merge_20190115_1437'), - ] - - operations = [ - migrations.CreateModel( - name='ChronosJournal', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), - ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), - ('name', models.TextField()), - ('title', models.TextField()), - ('journal_id', models.TextField(unique=True)), - ('raw_response', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(encoder=osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONEncoder)), - ], - options={ - 'abstract': False, - }, - ), - migrations.CreateModel( - name='ChronosSubmission', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), - ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), - ('publication_id', models.TextField(unique=True)), - ('status', models.IntegerField(blank=True, choices=[(1, '1'), (2, '2'), (3, '3'), (4, '4'), (5, '5')], default=None, null=True)), - ('raw_response', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(encoder=osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONEncoder)), - ('submission_url', models.TextField()), - ('journal', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='osf.ChronosJournal')), - ('preprint', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='osf.Preprint')), - ], - ), - migrations.AddField( - model_name='osfuser', - name='chronos_user_id', - field=models.TextField(blank=True, db_index=True, null=True), - ), - migrations.AddField( - model_name='chronossubmission', - name='submitter', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL), - ), - migrations.AlterUniqueTogether( - name='chronossubmission', - unique_together=set([('preprint', 'journal')]), - ), - ] diff --git a/osf/migrations/0156_create_cache_table.py b/osf/migrations/0156_create_cache_table.py deleted file mode 100644 index e3cb3126d11..00000000000 --- a/osf/migrations/0156_create_cache_table.py +++ /dev/null @@ -1,11 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals -from django.db import migrations - - -class Migration(migrations.Migration): - dependencies = [ - ('osf', '0155_merge_20190115_1437'), - ] - operations = [ - ] diff --git a/osf/migrations/0157_add_storage_usage_flag.py b/osf/migrations/0157_add_storage_usage_flag.py deleted file mode 100644 index 57b9fbadc3d..00000000000 --- a/osf/migrations/0157_add_storage_usage_flag.py +++ /dev/null @@ -1,12 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals -from django.db import migrations - - -class Migration(migrations.Migration): - dependencies = [ - ('osf', '0156_create_cache_table'), - ] - - operations = [ - ] diff --git a/osf/migrations/0158_fix_fork_last_logged.py b/osf/migrations/0158_fix_fork_last_logged.py deleted file mode 100644 index db58828fde0..00000000000 --- a/osf/migrations/0158_fix_fork_last_logged.py +++ /dev/null @@ -1,48 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.15 on 2018-10-29 17:01 -from __future__ import unicode_literals - -from django.db import migrations -from django.db.models import OuterRef, Subquery -from osf.models import NodeLog -from django_bulk_update.helper import bulk_update - - -def untransfer_forked_date(state, schema): - """ - Reverse mig. - - Revert the last logged date of nodes whose last log is forking to the previous log's date - """ - AbstractNode = state.get_model('osf', 'abstractnode') - newest = NodeLog.objects.filter(node=OuterRef('pk')).order_by('-date') - nodes = AbstractNode.objects.filter(is_fork=True, type='osf.node').annotate(latest_log=Subquery(newest.values('action')[:1])).filter(latest_log='node_forked') - for node in nodes: - node.last_logged = node.logs.order_by('-date')[1].date - - bulk_update(nodes, update_fields=['last_logged']) - -def transfer_forked_date(state, schema): - """ - If the most recent node log is forking, transfer that log's date to the node's last_logged field - """ - AbstractNode = state.get_model('osf', 'abstractnode') - newest = NodeLog.objects.filter(node=OuterRef('pk')).order_by('-date') - nodes = AbstractNode.objects.filter(is_fork=True, type='osf.node').annotate(latest_log=Subquery(newest.values('action')[:1])).filter(latest_log='node_forked') - for node in nodes: - node.last_logged = node.logs.first().date - - bulk_update(nodes, update_fields=['last_logged']) - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0157_add_storage_usage_flag'), - ] - - operations = [ - migrations.RunPython( - transfer_forked_date, untransfer_forked_date - ), - ] diff --git a/osf/migrations/0159_merge_20190331_2301.py b/osf/migrations/0159_merge_20190331_2301.py deleted file mode 100644 index 62c73ec8159..00000000000 --- a/osf/migrations/0159_merge_20190331_2301.py +++ /dev/null @@ -1,16 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.15 on 2019-03-31 23:01 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0158_fix_fork_last_logged'), - ('osf', '0156_auto_20190306_1648'), - ] - - operations = [ - ] diff --git a/osf/migrations/0160_add_permissions_to_node.py b/osf/migrations/0160_add_permissions_to_node.py deleted file mode 100644 index b23f4cfe74c..00000000000 --- a/osf/migrations/0160_add_permissions_to_node.py +++ /dev/null @@ -1,23 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.13 on 2018-08-18 17:10 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0159_merge_20190331_2301'), - ] - - operations = [ - migrations.AlterModelOptions( - name='abstractnode', - options={'base_manager_name': 'objects', 'permissions': (('view_node', 'Can view node details'), ('read_node', 'Can read the node'), ('write_node', 'Can edit the node'), ('admin_node', 'Can manage the node'))}, - ), - migrations.AlterModelOptions( - name='node', - options={}, - ), - ] diff --git a/osf/migrations/0160_merge_20190408_1618.py b/osf/migrations/0160_merge_20190408_1618.py deleted file mode 100644 index e9efe7e231c..00000000000 --- a/osf/migrations/0160_merge_20190408_1618.py +++ /dev/null @@ -1,16 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.15 on 2019-04-08 16:18 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0159_merge_20190331_2301'), - ('osf', '0156_abstractnode_article_doi'), - ] - - operations = [ - ] diff --git a/osf/migrations/0161_add_spam_fields_to_user.py b/osf/migrations/0161_add_spam_fields_to_user.py deleted file mode 100644 index 64a15e13267..00000000000 --- a/osf/migrations/0161_add_spam_fields_to_user.py +++ /dev/null @@ -1,68 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.15 on 2018-10-24 17:50 -from __future__ import unicode_literals - -from django.db import migrations, models -from bulk_update.helper import bulk_update -import osf.models.spam -import osf.utils.datetime_aware_jsonfield -import osf.utils.fields - - -TAG_MAP = { - 'spam_flagged': osf.models.spam.SpamStatus.FLAGGED, - 'spam_confirmed': osf.models.spam.SpamStatus.SPAM, - 'ham_confirmed': osf.models.spam.SpamStatus.HAM -} - -def add_spam_status_to_tagged_users(state, schema): - OSFUser = state.get_model('osf', 'osfuser') - users_with_tag = OSFUser.objects.filter(tags__name__in=TAG_MAP.keys()).prefetch_related('tags') - users_to_update = [] - for user in users_with_tag: - for tag, value in TAG_MAP.items(): - if user.tags.filter(system=True, name=tag).exists(): - user.spam_status = value - users_to_update.append(user) - bulk_update(users_to_update, update_fields=['spam_status']) - -def remove_spam_status_from_tagged_users(state, schema): - OSFUser = state.get_model('osf', 'osfuser') - users_with_tag = OSFUser.objects.filter(tags__name__in=TAG_MAP.keys()) - users_with_tag.update(spam_status=None) - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0160_merge_20190408_1618'), - ] - - operations = [ - migrations.AddField( - model_name='osfuser', - name='date_last_reported', - field=osf.utils.fields.NonNaiveDateTimeField(blank=True, db_index=True, default=None, null=True), - ), - migrations.AddField( - model_name='osfuser', - name='reports', - field=osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=dict, encoder=osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONEncoder, validators=[osf.models.spam._validate_reports]), - ), - migrations.AddField( - model_name='osfuser', - name='spam_data', - field=osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=dict, encoder=osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONEncoder), - ), - migrations.AddField( - model_name='osfuser', - name='spam_pro_tip', - field=models.CharField(blank=True, default=None, max_length=200, null=True), - ), - migrations.AddField( - model_name='osfuser', - name='spam_status', - field=models.IntegerField(blank=True, db_index=True, default=None, null=True), - ), - migrations.RunPython(add_spam_status_to_tagged_users, remove_spam_status_from_tagged_users), - ] diff --git a/osf/migrations/0161_guardian_direct_fks.py b/osf/migrations/0161_guardian_direct_fks.py deleted file mode 100644 index 847ab4cead7..00000000000 --- a/osf/migrations/0161_guardian_direct_fks.py +++ /dev/null @@ -1,82 +0,0 @@ - -# -*- coding: utf-8 -*- -# Generated by Django 1.11.13 on 2018-09-05 01:56 -from __future__ import unicode_literals - -from django.conf import settings -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0160_add_permissions_to_node'), - ] - - operations = [ - migrations.CreateModel( - name='NodeGroupObjectPermission', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('content_object', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='osf.AbstractNode')), - ('group', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='auth.Group')), - ('permission', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='auth.Permission')), - ], - options={ - 'abstract': False, - }, - ), - migrations.CreateModel( - name='NodeUserObjectPermission', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('content_object', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='osf.AbstractNode')), - ('permission', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='auth.Permission')), - ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), - ], - options={ - 'abstract': False, - }, - ), - migrations.CreateModel( - name='PreprintGroupObjectPermission', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('content_object', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='osf.Preprint')), - ('group', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='auth.Group')), - ('permission', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='auth.Permission')), - ], - options={ - 'abstract': False, - }, - ), - migrations.CreateModel( - name='PreprintUserObjectPermission', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('content_object', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='osf.Preprint')), - ('permission', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='auth.Permission')), - ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), - ], - options={ - 'abstract': False, - }, - ), - migrations.AlterUniqueTogether( - name='preprintuserobjectpermission', - unique_together=set([('user', 'permission', 'content_object')]), - ), - migrations.AlterUniqueTogether( - name='preprintgroupobjectpermission', - unique_together=set([('group', 'permission', 'content_object')]), - ), - migrations.AlterUniqueTogether( - name='nodeuserobjectpermission', - unique_together=set([('user', 'permission', 'content_object')]), - ), - migrations.AlterUniqueTogether( - name='nodegroupobjectpermission', - unique_together=set([('group', 'permission', 'content_object')]), - ), - ] diff --git a/osf/migrations/0162_conference_submissions.py b/osf/migrations/0162_conference_submissions.py deleted file mode 100644 index b332414a360..00000000000 --- a/osf/migrations/0162_conference_submissions.py +++ /dev/null @@ -1,24 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.15 on 2019-06-08 15:11 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0161_add_spam_fields_to_user'), - ] - - operations = [ - migrations.AddField( - model_name='conference', - name='submissions', - field=models.ManyToManyField(related_name='conferences', to='osf.AbstractNode'), - ), - migrations.RemoveField( - model_name='conference', - name='num_submissions', - ), - ] diff --git a/osf/migrations/0162_post_migrate.py b/osf/migrations/0162_post_migrate.py deleted file mode 100644 index f82ae7f9a28..00000000000 --- a/osf/migrations/0162_post_migrate.py +++ /dev/null @@ -1,18 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.13 on 2018-08-27 21:07 -from __future__ import unicode_literals - -import logging -from django.db import migrations - -logger = logging.getLogger(__name__) - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0161_guardian_direct_fks'), - ] - - operations = [ - ] diff --git a/osf/migrations/0163_migrate_preprints_to_direct_fks.py b/osf/migrations/0163_migrate_preprints_to_direct_fks.py deleted file mode 100644 index aa0b28f2702..00000000000 --- a/osf/migrations/0163_migrate_preprints_to_direct_fks.py +++ /dev/null @@ -1,90 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.15 on 2019-03-25 02:05 -from __future__ import unicode_literals -from math import ceil - -import logging -from django.contrib.contenttypes.models import ContentType -from django.db import migrations, connection - -logger = logging.getLogger(__name__) - -increment = 100000 - -""" -PREPRINT MIGRATION (we were already using guardian for preprints, but weren't using direct foreign keys) -1) For each guardian GroupObjectPermission table entry that is related to a preprint, add entry to the -PreprintGroupObjectPermission table -""" - -# DELETE FROM guardian_groupobjectpermission present in both forward and reverse migrations because forward migration had already been -# completed on staging environment and reverse migration needed to delete old rows before restoring out of the box guardian rows -def reverse_migrate_preprints(state, schema): - sql = """ - DELETE FROM guardian_groupobjectpermission GO - USING django_content_type CT - WHERE CT.model = 'preprint' AND CT.app_label = 'osf' - AND GO.content_type_id = CT.id; - - -- Reverse migration - Repopulating out of the box guardian table - INSERT INTO guardian_groupobjectpermission (object_pk, content_type_id, group_id, permission_id) - SELECT CAST(PG.content_object_id AS INT), CAST(CT.id AS INT), CAST(PG.group_id AS INT), CAST(PG.permission_id AS INT) - FROM osf_preprintgroupobjectpermission PG, django_content_type CT - WHERE CT.model = 'preprint' AND CT.app_label = 'osf'; - - -- Reverse migration - dropping custom PreprintGroupObject permission table - DELETE FROM osf_preprintgroupobjectpermission; - """ - - with connection.cursor() as cursor: - cursor.execute(sql) - -# Forward migration - moving preprints to dfks -def migrate_preprints_to_direct_fks(state, schema): - GroupObjectPermission = state.get_model('guardian', 'groupobjectpermission') - Preprint = state.get_model('osf', 'preprint') - preprint_ct_id = ContentType.objects.get_for_model(Preprint).id - max_pid = getattr(GroupObjectPermission.objects.filter(content_type_id=preprint_ct_id).last(), 'id', 0) - - total_pages = int(ceil(max_pid / float(increment))) - page_start = 0 - page_end = 0 - page = 0 - - logger.info('{}'.format('Migrating preprints to use direct foreign keys to speed up permission checks.')) - while page_end <= (max_pid): - page += 1 - page_end += increment - if page <= total_pages: - logger.info('Updating page {} / {}'.format(page_end / increment, total_pages)) - - with connection.cursor() as cursor: - cursor.execute(""" - INSERT INTO osf_preprintgroupobjectpermission (content_object_id, group_id, permission_id) - SELECT CAST(GO.object_pk AS INT), CAST(GO.group_id AS INT), CAST(GO.permission_id AS INT) - FROM guardian_groupobjectpermission GO, django_content_type CT - WHERE CT.model = 'preprint' AND CT.app_label = 'osf' - AND GO.content_type_id = CT.id - AND CAST(GO.object_pk AS INT) > %s - AND CAST(GO.object_pk AS INT) <= %s; - - DELETE FROM guardian_groupobjectpermission GO - USING django_content_type CT - WHERE CT.model = 'preprint' AND CT.app_label = 'osf' - AND GO.content_type_id = CT.id - AND CAST(GO.object_pk AS INT) > %s - AND CAST(GO.object_pk AS INT) <= %s; - """ % (page_start, page_end, page_start, page_end) - ) - page_start = page_end - logger.info('Finished preprint direct foreign key migration.') - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0162_post_migrate'), - ] - - operations = [ - migrations.RunPython(migrate_preprints_to_direct_fks, reverse_migrate_preprints) - ] diff --git a/osf/migrations/0163_populate_conference_submissions.py b/osf/migrations/0163_populate_conference_submissions.py deleted file mode 100644 index a2b28602b95..00000000000 --- a/osf/migrations/0163_populate_conference_submissions.py +++ /dev/null @@ -1,43 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.15 on 2019-06-08 15:12 -from __future__ import unicode_literals -import logging -from django.db import migrations -logger = logging.getLogger(__file__) - - -def forward(state, *args, **kwargs): - """ - For every conference, fetches all AbstractNodes with a case-insensitive matching Tag - to the conference endpoint. Adds these nodes to conference.submissions. - """ - Conference = state.get_model('osf', 'Conference') - AbstractNode = state.get_model('osf', 'AbstractNode') - Tag = state.get_model('osf', 'Tag') - - # Small number of conferences - for conference in Conference.objects.all(): - tags = Tag.objects.filter(system=False, name__iexact=conference.endpoint).values_list('pk', flat=True) - # Not restricting on public/deleted here, just adding all nodes with meeting tags - # and then API will restrict to only public, non-deleted nodes - for node in AbstractNode.objects.filter(tags__in=tags): - conference.submissions.add(node) - logger.info('Finished adding submissions to conferences.') - -def backward(state, *args, **kwargs): - Conference = state.get_model('osf', 'Conference') - for conference in Conference.objects.all(): - for submission in conference.submissions.all(): - conference.submissions.remove(submission) - logger.info('Finished clearing submissions from conferences.') - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0162_conference_submissions'), - ] - - operations = [ - migrations.RunPython(forward, backward) - ] diff --git a/osf/migrations/0164_add_guardian_to_nodes.py b/osf/migrations/0164_add_guardian_to_nodes.py deleted file mode 100644 index b7998388775..00000000000 --- a/osf/migrations/0164_add_guardian_to_nodes.py +++ /dev/null @@ -1,352 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.13 on 2018-08-27 21:07 -from __future__ import unicode_literals - -import logging -from django.db import migrations, connection -from osf.utils.migrations import batch_node_migrations - -logger = logging.getLogger(__name__) - -""" -NODE MIGRATION -1) Creates three django groups for each existing abstract node (admin/write/read) -2) Gives admin groups admin/write/read perms, write groups write/read, and read: read - - Populates osf NodeGroupObjectPermission (DFK) table instead of out-of-the-box guardian GroupObjectPermission table -3) Adds node contributors to corresponding django groups - a node write contributor is added to the node's write django group - - Populates OSFUserGroups table with group id/user id pair -""" - -increment = 100000 - -# Reverse migration - contributor read/write/admin columns preserved during forward migration. -# If reversing data that's been sitting for awhile, the old contributor columns could differ -# from what's being repopulated -reset_contributor_perms = """ - -- Resetting contributor table permissions to all false, so updates afterwards - -- only flip fields that should be TRUE - UPDATE osf_contributor - SET admin = FALSE, write = FALSE, read = FALSE - WHERE node_id > {start} AND node_id <= {end}; - """ - -# Reverse migration - Repopulate contributor table with read permissions -repopulate_read_perms = """ - -- Repopulate contributor table with read perms - UPDATE osf_contributor C - SET read = TRUE - FROM osf_osfuser_groups UG, osf_nodegroupobjectpermission NG, auth_permission AS PERM - WHERE UG.group_id = NG.group_id - AND C.node_id = NG.content_object_id - AND PERM.codename='read_node' - AND NG.permission_id = PERM.id - AND C.user_id = UG.osfuser_id - AND NG.content_object_id > {start} AND NG.content_object_id <= {end}; - """ - -# Reverse migration - Repopulate contributor table with write permissions -repopulate_write_perms = """ - -- Repopulate contributor table with write perms - UPDATE osf_contributor C - SET write = TRUE - FROM osf_osfuser_groups UG, osf_nodegroupobjectpermission NG, auth_permission AS PERM - WHERE UG.group_id = NG.group_id - AND C.node_id = NG.content_object_id - AND PERM.codename='write_node' - AND NG.permission_id = PERM.id - AND C.user_id = UG.osfuser_id - AND NG.content_object_id > {start} AND NG.content_object_id <= {end}; - """ - -# Reverse migration - Repopulate contributor table with admin permissions -repopulate_admin_perms = """ - -- Repopulate contributor table with admin perms - UPDATE osf_contributor C - SET admin = TRUE - FROM osf_osfuser_groups UG, osf_nodegroupobjectpermission NG, auth_permission AS PERM - WHERE UG.group_id = NG.group_id - AND C.node_id = NG.content_object_id - AND PERM.codename='admin_node' - AND NG.permission_id = PERM.id - AND C.user_id = UG.osfuser_id - AND NG.content_object_id > {start} AND NG.content_object_id <= {end}; - """ - -# Reverse migration - Remove all rows from NodeGroupObjectPermission table - table gives node django groups -# permissions to node -drop_node_group_object_permission_table = """ - DELETE FROM osf_nodegroupobjectpermission; - """ - -# Reverse migration - Remove user membership in Node read/write/admin Django groups -remove_users_from_node_django_groups = """ - DELETE FROM osf_osfuser_groups - WHERE group_id IN ( - SELECT id FROM auth_group WHERE name LIKE '%node_%' - ); - """ - -# Reverse migration - creates new auth_group table, we're going to swap the new with the old -# Removing the majority of the rows in the auth_group table is a very time-consuming operation -# due to the large number of foreign keys pointing to this, so we're doing this for speed. We -# are just going to create a new auth_group table with only the rows that we want to keep. -create_temporary_auth_group_table = """ - CREATE TABLE auth_group_copy (LIKE auth_group INCLUDING ALL); - INSERT INTO auth_group_copy - SELECT * FROM auth_group - WHERE name NOT LIKE '%node_%'; - """ - -# Reverse migration create group id column -create_group_id_column = """ - ALTER TABLE {table} - ADD column group_id_copy INTEGER; - """ - -# Reverse migration create group id column -create_group_id_column_with_constraint = """ - ALTER TABLE {table} - ADD column group_id_copy INTEGER - REFERENCES auth_group_copy(id); - """ - -# Reverse migration - repoints tables with FK's to auth_group to the new auth_group table -repoint_auth_group_foreign_keys = """ - UPDATE {table} - SET group_id_copy = group_id; - - ALTER TABLE {table} DROP COLUMN group_id; - - ALTER TABLE {table} RENAME group_id_copy TO group_id; -""" - -# Reverse migration - -set_not_null_constraint = """ - ALTER TABLE {table} ALTER COLUMN group_id SET NOT NULL; -""" - -# Reverse migration - -create_index_on_group_id = """ - CREATE INDEX {table}_group_id ON {table} (group_id); -""" - -select_auth_group_permissions_auth_group_constraint = """ - SELECT conname - FROM pg_constraint - WHERE conrelid = 'auth_group_permissions'::regclass::oid - AND confrelid = 'auth_group'::regclass::oid; -""" - -# Reverse migration - _ -set_deferred_initially_deferred = """ - ALTER TABLE auth_group_permissions - ALTER CONSTRAINT {} - DEFERRABLE INITIALLY DEFERRED; -""" - -# List of tables that have foreign keys to auth_group -related_auth_group_tables = [ - 'auth_group_permissions', - 'osf_osfuser_groups', - 'guardian_groupobjectpermission', - 'waffle_flag_groups', - 'osf_collectiongroupobjectpermission', - 'osf_abstractprovidergroupobjectpermission', - 'osf_nodegroupobjectpermission', - 'osf_preprintgroupobjectpermission', -] - -group_id_constraints = [ - 'auth_group_permissions', - 'osf_osfuser_groups', - 'osf_collectiongroupobjectpermission', - 'osf_nodegroupobjectpermission', - 'osf_preprintgroupobjectpermission', -] - -# Reverse migration - replaces old auth_group table with new auth_group table -swap_old_auth_group_table_with_new_auth_group_table = """ - ALTER TABLE auth_group RENAME TO auth_group_deleted; - ALTER TABLE auth_group_copy RENAME TO auth_group; - ALTER SEQUENCE auth_group_id_seq OWNED BY NONE; - DROP TABLE auth_group_deleted; - ALTER SEQUENCE auth_group_id_seq OWNED BY auth_group.id; - - ALTER TABLE auth_group_permissions ADD CONSTRAINT auth_group_permissions_group_id_permission_id UNIQUE ("group_id", "permission_id"); - ALTER TABLE osf_nodegroupobjectpermission ADD CONSTRAINT unique_node_group_object_permission UNIQUE ("group_id", "permission_id", "content_object_id"); - ALTER TABLE osf_preprintgroupobjectpermission ADD CONSTRAINT unique_preprint_group_object_permission UNIQUE ("group_id", "permission_id", "content_object_id"); -""" - -def get_constraint_name(): - with connection.cursor() as cursor: - cursor.execute(select_auth_group_permissions_auth_group_constraint) - constraint_name = cursor.fetchone()[0] - return constraint_name - -# Reverse migration -def finalize_reverse_node_guardian_migration(): - """ - After restoring contributor permissions, this runs to finalize removing rows to tables - that were added for guardian. - - Creates new auth_group table that only contains groups not added with node guardian work - """ - - with connection.cursor() as cursor: - cursor.execute(drop_node_group_object_permission_table) - logger.info('Finished deleting records from NodeGroupObjectPermission table.') - cursor.execute(remove_users_from_node_django_groups) - logger.info('Finished removing users from guardian node django groups.') - cursor.execute(create_temporary_auth_group_table) - logger.info('Created new auth_group_table.') - - # Treating some of the tables that point to auth_group differently - for table_name in related_auth_group_tables: - if table_name in group_id_constraints: - cursor.execute(create_group_id_column_with_constraint.format(table=table_name)) - else: - cursor.execute(create_group_id_column.format(table=table_name)) - - cursor.execute(repoint_auth_group_foreign_keys.format(table=table_name)) - - if table_name == 'auth_group_permissions': - cursor.execute(set_not_null_constraint.format(table=table_name)) - cursor.execute(create_index_on_group_id.format(table=table_name)) - - logger.info('Repointed foreign keys to new auth_group_table.') - - cursor.execute(swap_old_auth_group_table_with_new_auth_group_table) - logger.info('Swapped old auth_group table with new auth_group table.') - - # Altering foreign key constraint on auth_group_permission table to match existing configuration - constraint_name = get_constraint_name() - with connection.cursor() as cursor: - cursor.execute(set_deferred_initially_deferred.format(constraint_name)) - - -def reverse_guardian_migration(state, schema): - migrations = [ - {'sql': reset_contributor_perms, 'description': 'Resetting contributor permissions.'}, - {'sql': repopulate_read_perms, 'description': 'Repopulating read columns on Contributor table'}, - {'sql': repopulate_write_perms, 'description': 'Repopulating write columns on Contributor table.'}, - {'sql': repopulate_admin_perms, 'description': 'Repopulating admin columns on Contributor table.'}, - ] - - batch_node_migrations(state, migrations) - logger.info('Finished restoring Contributor permissions.') - finalize_reverse_node_guardian_migration() - return - -# Forward migration - for each node, create a read, write, and admin Django group -add_node_read_write_admin_auth_groups = """ - INSERT INTO auth_group (name) - SELECT regexp_split_to_table('node_' || N.id || '_read,node_' || N.id || '_write,node_' || N.id || '_admin', ',') - FROM osf_abstractnode N - WHERE N.id > {start} AND N.id <= {end}; - """ - -# Forward migration - add read permissions to all node django read groups, add read/write perms -# to all node django write groups, and add read/write/admin perms to all node django admin groups -add_permissions_to_node_groups = """ - -- Adds "read_node" permissions to all Node read groups - uses NodeGroupObjectPermission table - INSERT INTO osf_nodegroupobjectpermission (content_object_id, group_id, permission_id) - SELECT N.id as content_object_id, G.id as group_id, PERM.id AS permission_id - FROM osf_abstractnode AS N, auth_group G, auth_permission AS PERM - WHERE G.name = 'node_' || N.id || '_read' - AND PERM.codename = 'read_node' - AND N.id > {start} - AND N.id <= {end}; - - -- Adds "read_node" and "write_node" permissions to all Node write groups - INSERT INTO osf_nodegroupobjectpermission (content_object_id, group_id, permission_id) - SELECT N.id as object_pk, G.id as group_id, PERM.id AS permission_id - FROM osf_abstractnode AS N, auth_group G, auth_permission AS PERM - WHERE G.name = 'node_' || N.id || '_write' - AND (PERM.codename = 'read_node' OR PERM.codename = 'write_node') - AND N.id > {start} - AND N.id <= {end}; - - -- Adds "read_node", "write_node", and "admin_node" permissions to all Node admin groups - INSERT INTO osf_nodegroupobjectpermission (content_object_id, group_id, permission_id) - SELECT N.id as object_pk, G.id as group_id, PERM.id AS permission_id - FROM osf_abstractnode AS N, auth_group G, auth_permission AS PERM - WHERE G.name = 'node_' || N.id || '_admin' - AND (PERM.codename = 'read_node' OR PERM.codename = 'write_node' OR PERM.codename = 'admin_node') - AND N.id > {start} - AND N.id <= {end}; - """ - -# Forward migration - for every contributor that has read perms only to a node, -# add that contributor to the node's read group - this allows us to start using -# guardian to track which permissions a contributor has. -add_read_contribs_to_read_groups = """ - -- Add users with read permissions only on the node to the node's read group - INSERT INTO osf_osfuser_groups (osfuser_id, group_id) - SELECT C.user_id as osfuser_id, G.id as group_id - FROM osf_abstractnode as N, osf_contributor as C, auth_group as G - WHERE C.node_id = N.id - AND C.read = TRUE - AND C.write = FALSE - AND C.admin = FALSE - AND G.name = 'node_' || N.id || '_read' - AND N.id > {start} - AND N.id <= {end}; - """ - -# Forward migration - for every contributor that has write and read perms to a node, -# add that contributor to the node's write group - this allows us to start using -# guardian to track which permissions a contributor has. -add_write_contribs_to_write_groups = """ - -- Add users with write permissions on node to the node's write group - INSERT INTO osf_osfuser_groups (osfuser_id, group_id) - SELECT C.user_id as osfuser_id, G.id as group_id - FROM osf_abstractnode as N, osf_contributor as C, auth_group as G - WHERE C.node_id = N.id - AND C.read = TRUE - AND C.write = TRUE - AND C.admin = FALSE - AND G.name = 'node_' || N.id || '_write' - AND N.id > {start} - AND N.id <= {end}; - """ - -# Forward migration - for every contributor that has admin/write/read perms to a node, -# add that contributor to the node's admin group - this allows us to start using -# guardian to track which permissions a contributor has. -add_admin_contribs_to_admin_groups = """ - -- Add users with admin permissions on the node to the node's admin group - INSERT INTO osf_osfuser_groups (osfuser_id, group_id) - SELECT C.user_id as osfuser_id, G.id as group_id - FROM osf_abstractnode as N, osf_contributor as C, auth_group as G - WHERE C.node_id = N.id - AND C.read = TRUE - AND C.write = TRUE - AND C.admin = TRUE - AND G.name = 'node_' || N.id || '_admin' - AND N.id > {start} - AND N.id <= {end}; - """ - -def migrate_nodes_to_guardian(state, schema): - migrations = [ - {'sql': add_node_read_write_admin_auth_groups, 'description': 'Creating node admin/write/read django groups:'}, - {'sql': add_permissions_to_node_groups, 'description': 'Adding permissions to node django groups:'}, - {'sql': add_read_contribs_to_read_groups, 'description': 'Adding node read contribs to read django groups:'}, - {'sql': add_write_contribs_to_write_groups, 'description': 'Adding node write contribs to write django groups:'}, - {'sql': add_admin_contribs_to_admin_groups, 'description': 'Adding node admin contribs to admin django groups:'} - ] - - batch_node_migrations(state, migrations) - logger.info('Finished adding guardian to nodes.') - return - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0163_migrate_preprints_to_direct_fks'), - ] - - operations = [ - migrations.RunPython(migrate_nodes_to_guardian, reverse_guardian_migration), - ] diff --git a/osf/migrations/0165_osfgroup.py b/osf/migrations/0165_osfgroup.py deleted file mode 100644 index 2b76af42d50..00000000000 --- a/osf/migrations/0165_osfgroup.py +++ /dev/null @@ -1,106 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.13 on 2018-08-28 21:02 -from __future__ import unicode_literals - -from django.conf import settings -from django.db import migrations, models -import django.db.models.deletion -import django_extensions.db.fields -import osf.models.base - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0164_add_guardian_to_nodes'), - ] - - operations = [ - migrations.CreateModel( - name='OSFGroup', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), - ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), - ('name', models.TextField()), - ('creator', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='osfgroups_created', to=settings.AUTH_USER_MODEL)), - ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), - ], - options={ - 'permissions': (('view_group', 'Can view group details'), ('member_group', 'Has group membership'), ('manage_group', 'Can manage group membership'),), - }, - ), - migrations.CreateModel( - name='OSFGroupGroupObjectPermission', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('content_object', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='osf.OSFGroup')), - ('group', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='auth.Group')), - ('permission', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='auth.Permission')), - ], - options={ - 'abstract': False, - }, - ), - migrations.CreateModel( - name='OSFGroupUserObjectPermission', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('content_object', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='osf.OSFGroup')), - ('permission', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='auth.Permission')), - ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), - ], - options={ - 'abstract': False, - }, - ), - migrations.AlterUniqueTogether( - name='osfgroupgroupobjectpermission', - unique_together=set([('group', 'permission', 'content_object')]), - ), - migrations.AlterUniqueTogether( - name='osfgroupuserobjectpermission', - unique_together=set([('user', 'permission', 'content_object')]), - ), - migrations.CreateModel( - name='OSFGroupLog', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), - ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), - ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), - ('action', models.CharField(db_index=True, max_length=255)), - ('params', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(default=dict, encoder=osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONEncoder)), - ('should_hide', models.BooleanField(default=False)), - ], - options={ - 'ordering': ['-created'], - 'get_latest_by': 'created', - }, - ), - migrations.AddField( - model_name='osfgroup', - name='last_logged', - field=osf.utils.fields.NonNaiveDateTimeField(blank=True, db_index=True, default=django.utils.timezone.now, null=True), - ), - migrations.AddField( - model_name='osfgrouplog', - name='group', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='logs', to='osf.OSFGroup'), - ), - migrations.AddField( - model_name='osfgrouplog', - name='user', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='group_logs', to=settings.AUTH_USER_MODEL), - ), - migrations.AddField( - model_name='osfuser', - name='group_connected_email_records', - field=osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=dict, encoder=osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONEncoder), - ), - migrations.AddField( - model_name='osfuser', - name='member_added_email_records', - field=osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=dict, encoder=osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONEncoder), - ), - ] diff --git a/osf/migrations/0166_merge_20190429_1632.py b/osf/migrations/0166_merge_20190429_1632.py deleted file mode 100644 index 14af6365d8b..00000000000 --- a/osf/migrations/0166_merge_20190429_1632.py +++ /dev/null @@ -1,16 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.15 on 2019-04-29 16:32 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0160_merge_20190408_1618'), - ('osf', '0165_osfgroup'), - ] - - operations = [ - ] diff --git a/osf/migrations/0167_auto_20190506_1556.py b/osf/migrations/0167_auto_20190506_1556.py deleted file mode 100644 index 2145ec2fa31..00000000000 --- a/osf/migrations/0167_auto_20190506_1556.py +++ /dev/null @@ -1,12 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals -from django.db import migrations - - -class Migration(migrations.Migration): - dependencies = [ - ('osf', '0166_merge_20190429_1632'), - ] - - operations = [ - ] diff --git a/osf/migrations/0168_merge_20190610_2308.py b/osf/migrations/0168_merge_20190610_2308.py deleted file mode 100644 index 744dd933d73..00000000000 --- a/osf/migrations/0168_merge_20190610_2308.py +++ /dev/null @@ -1,16 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.15 on 2019-06-10 23:08 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0161_add_spam_fields_to_user'), - ('osf', '0167_auto_20190506_1556'), - ] - - operations = [ - ] diff --git a/osf/migrations/0169_merge_20190618_1429.py b/osf/migrations/0169_merge_20190618_1429.py deleted file mode 100644 index 3f64fabbc12..00000000000 --- a/osf/migrations/0169_merge_20190618_1429.py +++ /dev/null @@ -1,16 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.15 on 2019-06-18 14:29 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0163_populate_conference_submissions'), - ('osf', '0168_merge_20190610_2308'), - ] - - operations = [ - ] diff --git a/osf/migrations/0170_ensure_schemas.py b/osf/migrations/0170_ensure_schemas.py deleted file mode 100644 index d38a9e34a06..00000000000 --- a/osf/migrations/0170_ensure_schemas.py +++ /dev/null @@ -1,13 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.15 on 2019-04-25 01:05 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - dependencies = [ - ('osf', '0169_merge_20190618_1429'), - ] - - operations = [] diff --git a/osf/migrations/0171_add_registration_files_count.py b/osf/migrations/0171_add_registration_files_count.py deleted file mode 100644 index 5dcb23a1881..00000000000 --- a/osf/migrations/0171_add_registration_files_count.py +++ /dev/null @@ -1,55 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.15 on 2019-01-18 14:43 -from __future__ import unicode_literals -import logging - -from django.db import migrations, models -from django_bulk_update.helper import bulk_update - -logger = logging.getLogger(__file__) - -def add_registration_files_count(state, *args, **kwargs): - """ - Caches registration files count on Registration object. - Importing Registration model outside of this method to take advantage of files - relationship for speed purposes in this migration. If this model changes significantly, - this migration may have to be modified in the future so it runs on an empty db. - """ - Registration = state.get_model('osf', 'registration') - registrations = Registration.objects.filter(is_deleted=False, files_count__isnull=True) - BaseFileNode = state.get_model('osf', 'BaseFileNode') - ContentType = state.get_model('contenttypes', 'ContentType') - content_type = ContentType.objects.get(app_label='osf', model='abstractnode') - registrations_to_update = [] - - for registration in registrations: - registration_files = BaseFileNode.objects.filter( - target_object_id=registration.id, - target_content_type=content_type, - type='osf.osfstoragefile', - deleted_on__isnull=True, - ) - registration.files_count = registration_files.count() - registrations_to_update.append(registration) - - bulk_update(registrations_to_update, update_fields=['files_count'], batch_size=5000) - logger.info('Populated `files_count` on a total of {} registrations'.format(len(registrations_to_update))) - - -def noop(*args, **kwargs): - pass - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0170_ensure_schemas'), - ] - - operations = [ - migrations.AddField( - model_name='abstractnode', - name='files_count', - field=models.PositiveIntegerField(blank=True, null=True), - ), - migrations.RunPython(add_registration_files_count, noop) - ] diff --git a/osf/migrations/0172_ensure_schemas.py b/osf/migrations/0172_ensure_schemas.py deleted file mode 100644 index fc51538cdcd..00000000000 --- a/osf/migrations/0172_ensure_schemas.py +++ /dev/null @@ -1,14 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.15 on 2019-07-11 13:52 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0171_add_registration_files_count'), - ] - - operations = [] diff --git a/osf/migrations/0173_ensure_schemas.py b/osf/migrations/0173_ensure_schemas.py deleted file mode 100644 index afa5fbf7988..00000000000 --- a/osf/migrations/0173_ensure_schemas.py +++ /dev/null @@ -1,14 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.15 on 2019-07-11 19:28 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0172_ensure_schemas'), - ] - - operations = [] diff --git a/osf/migrations/0174_add_ab_testing_home_page_version_b_flag.py b/osf/migrations/0174_add_ab_testing_home_page_version_b_flag.py deleted file mode 100644 index fd714e6bf8c..00000000000 --- a/osf/migrations/0174_add_ab_testing_home_page_version_b_flag.py +++ /dev/null @@ -1,14 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.13 on 2019-07-23 14:26 -from __future__ import unicode_literals -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0173_ensure_schemas'), - ] - - operations = [ - ] diff --git a/osf/migrations/0175_pagecounter_schema.py b/osf/migrations/0175_pagecounter_schema.py deleted file mode 100644 index 6255da91a52..00000000000 --- a/osf/migrations/0175_pagecounter_schema.py +++ /dev/null @@ -1,36 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.15 on 2018-11-10 18:12 -from __future__ import unicode_literals - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0174_add_ab_testing_home_page_version_b_flag'), - ] - - operations = [ - migrations.AddField( - model_name='pagecounter', - name='action', - field=models.CharField(blank=True, null=True, max_length=128), - ), - migrations.AddField( - model_name='pagecounter', - name='file', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='pagecounters', to='osf.BaseFileNode'), - ), - migrations.AddField( - model_name='pagecounter', - name='resource', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='pagecounters', to='osf.Guid'), - ), - migrations.AddField( - model_name='pagecounter', - name='version', - field=models.IntegerField(blank=True, null=True), - ), - ] diff --git a/osf/migrations/0176_pagecounter_data.py b/osf/migrations/0176_pagecounter_data.py deleted file mode 100644 index e0b10724208..00000000000 --- a/osf/migrations/0176_pagecounter_data.py +++ /dev/null @@ -1,29 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.15 on 2018-11-12 17:18 -from __future__ import unicode_literals - -import logging - -from django.db import migrations - -from osf.management.commands.migrate_pagecounter_data import FORWARD_SQL, REVERSE_SQL -from website.settings import DEBUG_MODE - -logger = logging.getLogger(__name__) - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0175_pagecounter_schema'), - ] - - if DEBUG_MODE: - operations = [ - migrations.RunSQL(FORWARD_SQL, REVERSE_SQL) - ] - else: - operations = [] - logger.info( - 'The automatic migration only runs in DEBUG_MODE. Use management command migrate_pagecount_data instead' - ) diff --git a/osf/migrations/0177_pagecounter_index.py b/osf/migrations/0177_pagecounter_index.py deleted file mode 100644 index dbe63d2714c..00000000000 --- a/osf/migrations/0177_pagecounter_index.py +++ /dev/null @@ -1,21 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.15 on 2018-11-12 17:10 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - atomic = False # CREATE INDEX CONCURRENTLY cannot be run in a txn - - dependencies = [ - ('osf', '0176_pagecounter_data'), - ] - - operations = [ - migrations.RunSQL([ - 'CREATE INDEX CONCURRENTLY page_counter_idx ON osf_pagecounter (action, resource_id, file_id, version);', - ], [ - 'DROP INDEX IF EXISTS page_counter_idx, RESTRICT;' - ]) - ] diff --git a/osf/migrations/0178_apioauth2scope_is_public.py b/osf/migrations/0178_apioauth2scope_is_public.py deleted file mode 100644 index c4b5c0af59b..00000000000 --- a/osf/migrations/0178_apioauth2scope_is_public.py +++ /dev/null @@ -1,20 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.15 on 2018-10-18 14:34 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0177_pagecounter_index'), - ] - - operations = [ - migrations.AddField( - model_name='apioauth2scope', - name='is_public', - field=models.BooleanField(db_index=True, default=True), - ), - ] diff --git a/osf/migrations/0179_apioauth2personaltoken_scopes_temp.py b/osf/migrations/0179_apioauth2personaltoken_scopes_temp.py deleted file mode 100644 index 89923bc04d0..00000000000 --- a/osf/migrations/0179_apioauth2personaltoken_scopes_temp.py +++ /dev/null @@ -1,78 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.15 on 2018-10-17 23:30 -from __future__ import unicode_literals - -from django.db import migrations, models - -""" -2-part migration to make scopes an m2m field instead of a charfield on tokens - -This migration: -1. Makes scopes field nullable -2. Adds a scopes_temp field -3. Copies scopes information from scopes field to scopes temp (char -> m2m) - -0171_finalize_token_scopes_mig: -1. Removes old scopes field (charfield) -2. Renames scopes_temp -> scopes - -""" -""" -Some tokens have the following scopes on staging, existing prior to -https://github.com/CenterForOpenScience/osf.io/pull/5959. -Also, some staging scopes aren't public scopes, and would have to be loaded -in with public=False. -""" -old_scope_mapping = { - 'osf.users.all_read': 'osf.users.profile_read', - 'osf.users.all_write': 'osf.users.profile_write', - 'osf.nodes.all_read': 'osf.nodes.full_read', - 'osf.nodes.all_write': 'osf.nodes.full_write' -} - -def remove_m2m_scopes(state, schema): - ApiOAuth2PersonalToken = state.get_model('osf', 'apioauth2personaltoken') - tokens = ApiOAuth2PersonalToken.objects.all() - for token in tokens: - token.scopes = ' '.join([scope.name for scope in token.scopes_temp.all()]) - token.scopes_temp.clear() - token.save() - -def migrate_scopes_from_char_to_m2m(state, schema): - ApiOAuth2PersonalToken = state.get_model('osf', 'apioauth2personaltoken') - ApiOAuth2Scope = state.get_model('osf', 'apioauth2scope') - - tokens = ApiOAuth2PersonalToken.objects.all() - for token in tokens: - string_scopes = token.scopes.split(' ') - for scope in string_scopes: - loaded_scope = ApiOAuth2Scope.objects.get(name=old_scope_mapping.get(scope, scope)) - token.scopes_temp.add(loaded_scope) - token.save() - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0178_apioauth2scope_is_public'), - ] - - # AlterField migration added to set null=True because when reverting 0171_finalize_token_scopes_mig, - # scopes will be renamed to scopes_temp, and a scopes field will be restored. That scopes - # field would be empty until this migration was run, but null needs to be True to all this. - operations = [ - migrations.AlterField( - model_name='apioauth2personaltoken', - name='scopes', - field=models.CharField(blank=False, null=True, max_length=300) - ), - - migrations.AddField( - model_name='apioauth2personaltoken', - name='scopes_temp', - field=models.ManyToManyField(related_name='tokens', to='osf.ApiOAuth2Scope'), - ), - migrations.RunPython( - migrate_scopes_from_char_to_m2m, - remove_m2m_scopes - ) - ] diff --git a/osf/migrations/0180_finalize_token_scopes_mig.py b/osf/migrations/0180_finalize_token_scopes_mig.py deleted file mode 100644 index dbf1c185afd..00000000000 --- a/osf/migrations/0180_finalize_token_scopes_mig.py +++ /dev/null @@ -1,24 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.15 on 2018-10-18 00:08 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0179_apioauth2personaltoken_scopes_temp'), - ] - - operations = [ - migrations.RemoveField( - model_name='apioauth2personaltoken', - name='scopes', - ), - migrations.RenameField( - model_name='apioauth2personaltoken', - old_name='scopes_temp', - new_name='scopes', - ), - ] diff --git a/osf/migrations/0181_osfuser_contacted_deactivation.py b/osf/migrations/0181_osfuser_contacted_deactivation.py deleted file mode 100644 index 046f2fe968b..00000000000 --- a/osf/migrations/0181_osfuser_contacted_deactivation.py +++ /dev/null @@ -1,20 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.15 on 2019-06-13 15:32 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0180_finalize_token_scopes_mig'), - ] - - operations = [ - migrations.AddField( - model_name='osfuser', - name='contacted_deactivation', - field=models.BooleanField(default=False), - ), - ] diff --git a/osf/migrations/0182_add_custom_file_versions_through.py b/osf/migrations/0182_add_custom_file_versions_through.py deleted file mode 100644 index e4d5f1b19b6..00000000000 --- a/osf/migrations/0182_add_custom_file_versions_through.py +++ /dev/null @@ -1,33 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.15 on 2019-04-07 23:20 -from __future__ import unicode_literals - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0181_osfuser_contacted_deactivation'), - ] - - operations = [ - migrations.CreateModel( - name='BaseFileVersionsThrough', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('version_name', models.TextField(blank=True)), - ('basefilenode', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='osf.BaseFileNode')), - ('fileversion', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='osf.FileVersion')), - ], - ), - migrations.AlterUniqueTogether( - name='basefileversionsthrough', - unique_together=set([('basefilenode', 'fileversion')]), - ), - migrations.AlterIndexTogether( - name='basefileversionsthrough', - index_together=set([('basefilenode', 'fileversion')]), - ), - ] diff --git a/osf/migrations/0183_populate_file_versions_through.py b/osf/migrations/0183_populate_file_versions_through.py deleted file mode 100644 index 703c2767588..00000000000 --- a/osf/migrations/0183_populate_file_versions_through.py +++ /dev/null @@ -1,98 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.15 on 2019-03-03 17:52 -from __future__ import unicode_literals - -import logging - -from django.db import migrations, connection - -logger = logging.getLogger(__file__) - - -def restore_default_through_table(state, schema): - sql = """ - DROP TABLE osf_basefilenode_versions; - CREATE TABLE osf_basefilenode_versions AS - SELECT - new_thru.basefilenode_id, - new_thru.fileversion_id - FROM - osf_basefileversionsthrough AS new_thru; - - ALTER TABLE osf_basefilenode_versions ADD COLUMN id SERIAL PRIMARY KEY; - ALTER TABLE osf_basefilenode_versions ADD CONSTRAINT osf_basefilenod_basefilenode_id_b0knah27_fk_osf_basefilenode_id FOREIGN KEY (basefilenode_id) REFERENCES osf_basefilenode DEFERRABLE INITIALLY DEFERRED; - ALTER TABLE osf_basefilenode_versions ALTER COLUMN basefilenode_id - SET - DATA TYPE INTEGER; - ALTER TABLE osf_basefilenode_versions ALTER COLUMN fileversion_id - SET - NOT NULL; - ALTER TABLE osf_basefilenode_versions ALTER COLUMN fileversion_id - SET - DATA TYPE INTEGER; - ALTER TABLE osf_basefilenode_versions ALTER COLUMN basefilenode_id - SET - NOT NULL; - ALTER TABLE osf_basefilenode_versions ADD CONSTRAINT osf_basefilenode__fileversion_id_93etanfc_fk_osf_fileversion_id FOREIGN KEY (fileversion_id) REFERENCES osf_fileversion DEFERRABLE INITIALLY DEFERRED; - ALTER TABLE osf_basefilenode_versions ADD CONSTRAINT osf_basefilenode__fileversion_uniq564 UNIQUE (basefilenode_id, fileversion_id); - CREATE INDEX - ON osf_basefilenode_versions (basefilenode_id, fileversion_id); - CREATE INDEX - ON osf_basefilenode_versions (basefilenode_id); - CREATE INDEX - ON osf_basefilenode_versions (fileversion_id); - """ - with connection.cursor() as cursor: - cursor.execute(sql) - - -def populate_fileversion_name(state, schema): - - sql = """ - DROP TABLE osf_basefileversionsthrough; - CREATE TABLE osf_basefileversionsthrough AS - SELECT - obfv.basefilenode_id, - obfv.fileversion_id, - ob.name as version_name - FROM - osf_basefilenode_versions obfv - LEFT JOIN - osf_basefilenode ob - ON obfv.basefilenode_id = ob.id; - ALTER TABLE osf_basefileversionsthrough ADD COLUMN id SERIAL PRIMARY KEY; - ALTER TABLE osf_basefileversionsthrough ADD CONSTRAINT osf_basefilenod_basefilenode_id_b0nwad27_fk_osf_basefilenode_id FOREIGN KEY (basefilenode_id) REFERENCES osf_basefilenode DEFERRABLE INITIALLY DEFERRED; - ALTER TABLE osf_basefileversionsthrough ALTER COLUMN basefilenode_id - SET - DATA TYPE INTEGER; - ALTER TABLE osf_basefileversionsthrough ALTER COLUMN fileversion_id - SET - NOT NULL; - ALTER TABLE osf_basefileversionsthrough ALTER COLUMN fileversion_id - SET - DATA TYPE INTEGER; - ALTER TABLE osf_basefileversionsthrough ALTER COLUMN basefilenode_id - SET - NOT NULL; - ALTER TABLE osf_basefileversionsthrough ADD CONSTRAINT osf_basefilenode__fileversion_id_93nwadfc_fk_osf_fileversion_id FOREIGN KEY (fileversion_id) REFERENCES osf_fileversion DEFERRABLE INITIALLY DEFERRED; - ALTER TABLE osf_basefileversionsthrough ADD CONSTRAINT osf_basefilenode__fileversion_uniq UNIQUE (basefilenode_id, fileversion_id); - CREATE INDEX - ON osf_basefileversionsthrough (basefilenode_id, fileversion_id); - CREATE INDEX - ON osf_basefileversionsthrough (basefilenode_id); - CREATE INDEX - ON osf_basefileversionsthrough (fileversion_id); - """ - - with connection.cursor() as cursor: - cursor.execute(sql) - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0182_add_custom_file_versions_through'), - ] - - operations = [ - migrations.RunPython(populate_fileversion_name, restore_default_through_table) - ] diff --git a/osf/migrations/0184_remove_basefilenode_versions.py b/osf/migrations/0184_remove_basefilenode_versions.py deleted file mode 100644 index 7218a83c71a..00000000000 --- a/osf/migrations/0184_remove_basefilenode_versions.py +++ /dev/null @@ -1,19 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.15 on 2019-04-08 00:51 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0183_populate_file_versions_through'), - ] - - operations = [ - migrations.RemoveField( - model_name='basefilenode', - name='versions', - ), - ] diff --git a/osf/migrations/0185_basefilenode_versions.py b/osf/migrations/0185_basefilenode_versions.py deleted file mode 100644 index c910787a7c4..00000000000 --- a/osf/migrations/0185_basefilenode_versions.py +++ /dev/null @@ -1,20 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.15 on 2019-04-08 00:52 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0184_remove_basefilenode_versions'), - ] - - operations = [ - migrations.AddField( - model_name='basefilenode', - name='versions', - field=models.ManyToManyField(through='osf.BaseFileVersionsThrough', to='osf.FileVersion'), - ), - ] diff --git a/osf/migrations/0186_make_pagecounter_fields_nonnull.py b/osf/migrations/0186_make_pagecounter_fields_nonnull.py deleted file mode 100644 index 7476afdb923..00000000000 --- a/osf/migrations/0186_make_pagecounter_fields_nonnull.py +++ /dev/null @@ -1,31 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.15 on 2019-08-28 20:09 -from __future__ import unicode_literals - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0185_basefilenode_versions'), - ] - - operations = [ - migrations.AlterField( - model_name='pagecounter', - name='action', - field=models.CharField(max_length=128), - ), - migrations.AlterField( - model_name='pagecounter', - name='file', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='pagecounters', to='osf.BaseFileNode'), - ), - migrations.AlterField( - model_name='pagecounter', - name='resource', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='pagecounters', to='osf.Guid'), - ), - ] diff --git a/osf/migrations/0187_remove_outdated_contributor_permissions.py b/osf/migrations/0187_remove_outdated_contributor_permissions.py deleted file mode 100644 index 0b5f746b77b..00000000000 --- a/osf/migrations/0187_remove_outdated_contributor_permissions.py +++ /dev/null @@ -1,39 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.15 on 2019-09-25 20:07 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0186_make_pagecounter_fields_nonnull'), - ] - - operations = [ - migrations.RemoveField( - model_name='contributor', - name='admin', - ), - migrations.RemoveField( - model_name='contributor', - name='read', - ), - migrations.RemoveField( - model_name='contributor', - name='write', - ), - migrations.RemoveField( - model_name='institutionalcontributor', - name='admin', - ), - migrations.RemoveField( - model_name='institutionalcontributor', - name='read', - ), - migrations.RemoveField( - model_name='institutionalcontributor', - name='write', - ), - ] diff --git a/osf/migrations/0188_deleted_field_mig.py b/osf/migrations/0188_deleted_field_mig.py deleted file mode 100644 index 142bdc7b1db..00000000000 --- a/osf/migrations/0188_deleted_field_mig.py +++ /dev/null @@ -1,41 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.15 on 2019-06-27 20:29 -from __future__ import unicode_literals - -from django.db import migrations -import osf.utils.fields - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0187_remove_outdated_contributor_permissions'), - ] - - operations = [ - migrations.AddField( - model_name='abstractnode', - name='deleted', - field=osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True), - ), - migrations.AddField( - model_name='basefilenode', - name='deleted', - field=osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True), - ), - migrations.AddField( - model_name='comment', - name='deleted', - field=osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True), - ), - migrations.AddField( - model_name='privatelink', - name='deleted', - field=osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True), - ), - migrations.AddField( - model_name='institution', - name='deleted', - field=osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True), - ), - ] diff --git a/osf/migrations/0189_deleted_field_data.py b/osf/migrations/0189_deleted_field_data.py deleted file mode 100644 index ec000aa196f..00000000000 --- a/osf/migrations/0189_deleted_field_data.py +++ /dev/null @@ -1,44 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.15 on 2018-11-12 17:18 -from __future__ import unicode_literals - -import logging - -from django.db import migrations - -from osf.management.commands.migrate_deleted_date import ( - FORWARD_BASE_FILE, - FORWARD_ABSTRACT_NODE, - FORWARD_COMMENT, - FORWARD_INSTITUTION, - FORWARD_PRIVATE_LINK, - REVERSE_BASE_FILE, - REVERSE_ABSTRACT_NODE, - REVERSE_COMMENT, - REVERSE_INSTITUTION, - REVERSE_PRIVATE_LINK, -) -from website.settings import DEBUG_MODE - -logger = logging.getLogger(__name__) - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0188_deleted_field_mig'), - ] - - if DEBUG_MODE: - operations = [ - migrations.RunSQL(FORWARD_BASE_FILE, REVERSE_BASE_FILE), - migrations.RunSQL(FORWARD_INSTITUTION, REVERSE_INSTITUTION), - migrations.RunSQL(FORWARD_ABSTRACT_NODE, REVERSE_ABSTRACT_NODE), - migrations.RunSQL(FORWARD_PRIVATE_LINK, REVERSE_PRIVATE_LINK), - migrations.RunSQL(FORWARD_COMMENT, REVERSE_COMMENT) - ] - else: - operations = [] - logger.info( - 'The automatic migration only runs in DEBUG_MODE. Use management command migrate_deleted_date instead' - ) diff --git a/osf/migrations/0190_add_schema_block_models.py b/osf/migrations/0190_add_schema_block_models.py deleted file mode 100644 index 0d7b4e86e3b..00000000000 --- a/osf/migrations/0190_add_schema_block_models.py +++ /dev/null @@ -1,58 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.15 on 2019-08-13 20:20 -from __future__ import unicode_literals - -from django.db import migrations, models -import django.db.models.deletion -import django_extensions.db.fields -import osf.models.base -import osf.utils.datetime_aware_jsonfield - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0189_deleted_field_data') - ] - - operations = [ - migrations.CreateModel( - name='RegistrationSchemaBlock', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), - ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), - ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), - ('help_text', models.TextField()), - ('example_text', models.TextField(null=True)), - ('registration_response_key', models.CharField(blank=True, db_index=True, max_length=255, null=True)), - ('schema_block_group_key', models.CharField(db_index=True, max_length=24, null=True)), - ('block_type', models.CharField(choices=[('page-heading', 'page-heading'), ('section-heading', 'section-heading'), ('subsection-heading', 'subsection-heading'), ('paragraph', 'paragraph'), ('question-label', 'question-label'), ('short-text-input', 'short-text-input'), ('long-text-input', 'long-text-input'), ('file-input', 'file-input'), ('contributors-input', 'contributors-input'), ('single-select-input', 'single-select-input'), ('multi-select-input', 'multi-select-input'), ('select-input-option', 'select-input-option'), ('select-other-option', 'select-other-option')], db_index=True, max_length=31)), - ('display_text', models.TextField()), - ('required', models.BooleanField(default=False)), - ], - ), - migrations.AddField( - model_name='registrationschema', - name='config', - field=osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=dict, encoder=osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONEncoder), - ), - migrations.AddField( - model_name='registrationschema', - name='description', - field=models.TextField(blank=True, null=True), - ), - migrations.AddField( - model_name='registrationschemablock', - name='schema', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='schema_blocks', to='osf.RegistrationSchema'), - ), - migrations.AlterUniqueTogether( - name='registrationschemablock', - unique_together=set([('schema', 'registration_response_key')]), - ), - migrations.AlterOrderWithRespectTo( - name='registrationschemablock', - order_with_respect_to='schema', - ), - ] diff --git a/osf/migrations/0191_abstractnode_external_registered_date.py b/osf/migrations/0191_abstractnode_external_registered_date.py deleted file mode 100644 index ea3735ed21c..00000000000 --- a/osf/migrations/0191_abstractnode_external_registered_date.py +++ /dev/null @@ -1,21 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.15 on 2019-10-21 18:50 -from __future__ import unicode_literals - -from django.db import migrations -import osf.utils.fields - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0189_deleted_field_data'), - ] - - operations = [ - migrations.AddField( - model_name='abstractnode', - name='external_registered_date', - field=osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True), - ), - ] diff --git a/osf/migrations/0191_migrate_schemas_to_schemablocks.py b/osf/migrations/0191_migrate_schemas_to_schemablocks.py deleted file mode 100644 index 9acce22f8b1..00000000000 --- a/osf/migrations/0191_migrate_schemas_to_schemablocks.py +++ /dev/null @@ -1,19 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.13 on 2018-09-26 20:08 -from __future__ import unicode_literals - -import logging -from django.db import migrations - -logger = logging.getLogger(__file__) - -def noop(*args, **kwargs): - pass - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0190_add_schema_block_models') - ] - - operations = [] diff --git a/osf/migrations/0192_abstractnode_external_registration_boolean.py b/osf/migrations/0192_abstractnode_external_registration_boolean.py deleted file mode 100644 index 63e14b93daa..00000000000 --- a/osf/migrations/0192_abstractnode_external_registration_boolean.py +++ /dev/null @@ -1,24 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.15 on 2019-11-19 19:48 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0191_abstractnode_external_registered_date'), - ] - - operations = [ - migrations.RemoveField( - model_name='abstractnode', - name='external_registered_date', - ), - migrations.AddField( - model_name='abstractnode', - name='external_registration', - field=models.NullBooleanField(default=False), - ), - ] diff --git a/osf/migrations/0192_add_registation_responses_fields.py b/osf/migrations/0192_add_registation_responses_fields.py deleted file mode 100644 index 3568c9af4e1..00000000000 --- a/osf/migrations/0192_add_registation_responses_fields.py +++ /dev/null @@ -1,46 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.15 on 2019-09-01 23:15 -from __future__ import unicode_literals - -from django.db import migrations, models -import osf.utils.datetime_aware_jsonfield - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0191_migrate_schemas_to_schemablocks'), - ] - - operations = [ - migrations.AddField( - model_name='abstractnode', - name='registration_responses', - field=osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=dict, encoder=osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONEncoder) - ), - migrations.AddField( - model_name='abstractnode', - name='registration_responses_migrated', - field=models.NullBooleanField(db_index=True), - ), - migrations.AddField( - model_name='draftregistration', - name='registration_responses', - field=osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=dict, encoder=osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONEncoder), - ), - migrations.AddField( - model_name='draftregistration', - name='registration_responses_migrated', - field=models.NullBooleanField(db_index=True), - ), - migrations.AlterField( - model_name='abstractnode', - name='registration_responses_migrated', - field=models.NullBooleanField(db_index=True, default=True), - ), - migrations.AlterField( - model_name='draftregistration', - name='registration_responses_migrated', - field=models.NullBooleanField(db_index=True, default=True), - ), - ] diff --git a/osf/migrations/0193_migrate_registered_meta.py b/osf/migrations/0193_migrate_registered_meta.py deleted file mode 100644 index 2360afdf991..00000000000 --- a/osf/migrations/0193_migrate_registered_meta.py +++ /dev/null @@ -1,66 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.15 on 2019-08-15 18:42 -from __future__ import unicode_literals - -import logging - -from django.db import migrations -from osf.management.commands.migrate_registration_responses import ( - migrate_draft_registrations, - migrate_registrations -) -from website.settings import DEBUG_MODE - -logger = logging.getLogger(__name__) - - -def clear_draft_registration_responses(state, schema): - """ - Reverse migration - """ - DraftRegistration = state.get_model('osf', 'draftregistration') - DraftRegistration.objects.update( - registration_responses={}, - registration_responses_migrated=False - ) - -def clear_registration_responses(state, schema): - """ - Reverse migration - """ - Registration = state.get_model('osf', 'registration') - Registration.objects.update( - registration_responses={}, - registration_responses_migrated=False - ) - -def migrate_draft_registration_metadata(state, schema): - migrate_draft_registrations( - dry_run=False, - rows='all', - DraftRegistrationModel=state.get_model('osf', 'draftregistration') - ) - -def migrate_registration_registered_meta(state, schema): - migrate_registrations( - dry_run=False, - rows='all', - AbstractNodeModel=state.get_model('osf', 'abstractnode') - ) - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0192_add_registation_responses_fields'), - ] - - if DEBUG_MODE: - operations = [ - migrations.RunPython(migrate_draft_registration_metadata, clear_draft_registration_responses), - migrations.RunPython(migrate_registration_registered_meta, clear_registration_responses), - ] - else: - operations = [] - logger.info( - 'The automatic migration only runs in DEBUG_MODE. Use management command migrate_registration_responses instead' - ) diff --git a/osf/migrations/0194_merge_20191113_1611.py b/osf/migrations/0194_merge_20191113_1611.py deleted file mode 100644 index f6827409890..00000000000 --- a/osf/migrations/0194_merge_20191113_1611.py +++ /dev/null @@ -1,16 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.15 on 2019-11-13 16:11 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0192_abstractnode_external_registration_boolean'), - ('osf', '0193_migrate_registered_meta'), - ] - - operations = [ - ] diff --git a/osf/migrations/0195_add_enable_chronos_waffle_flag.py b/osf/migrations/0195_add_enable_chronos_waffle_flag.py deleted file mode 100644 index 42eeb83446c..00000000000 --- a/osf/migrations/0195_add_enable_chronos_waffle_flag.py +++ /dev/null @@ -1,14 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.15 on 2019-12-05 12:24 -from __future__ import unicode_literals -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0194_merge_20191113_1611'), - ] - - operations = [ - ] diff --git a/osf/migrations/0196_update_schemas.py b/osf/migrations/0196_update_schemas.py deleted file mode 100644 index 7413dcce658..00000000000 --- a/osf/migrations/0196_update_schemas.py +++ /dev/null @@ -1,11 +0,0 @@ -from __future__ import unicode_literals - -from django.db import migrations - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0195_add_enable_chronos_waffle_flag'), - ] - - operations = [] diff --git a/osf/migrations/0197_add_ab_testing_home_page_hero_text_version_b_flag.py b/osf/migrations/0197_add_ab_testing_home_page_hero_text_version_b_flag.py deleted file mode 100644 index 323cc0dc960..00000000000 --- a/osf/migrations/0197_add_ab_testing_home_page_hero_text_version_b_flag.py +++ /dev/null @@ -1,14 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.13 on 2019-07-23 14:26 -from __future__ import unicode_literals -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0196_update_schemas'), - ] - - operations = [ - ] diff --git a/osf/migrations/0198_draft_node_models.py b/osf/migrations/0198_draft_node_models.py deleted file mode 100644 index 3f418b4a974..00000000000 --- a/osf/migrations/0198_draft_node_models.py +++ /dev/null @@ -1,186 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.15 on 2019-11-15 15:34 -from __future__ import unicode_literals - -from django.conf import settings -from django.db import migrations, models -import django.db.models.deletion -import django.utils.timezone -import osf.models.validators -import osf.utils.datetime_aware_jsonfield -import osf.utils.fields - - -class Migration(migrations.Migration): - - dependencies = [ - ('auth', '0008_alter_user_username_max_length'), - ('osf', '0197_add_ab_testing_home_page_hero_text_version_b_flag'), - ] - - operations = [ - migrations.CreateModel( - name='DraftRegistrationContributor', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('visible', models.BooleanField(default=False)), - ], - ), - migrations.CreateModel( - name='DraftRegistrationGroupObjectPermission', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ], - options={ - 'abstract': False, - }, - ), - migrations.CreateModel( - name='DraftRegistrationUserObjectPermission', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ], - options={ - 'abstract': False, - }, - ), - migrations.CreateModel( - name='DraftNode', - fields=[ - ], - options={ - 'proxy': True, - 'indexes': [], - }, - bases=('osf.abstractnode',), - ), - migrations.AlterModelOptions( - name='draftregistration', - options={'permissions': (('read_draft_registration', 'Can read the draft registration'), ('write_draft_registration', 'Can edit the draft registration'), ('admin_draft_registration', 'Can manage the draft registration'))}, - ), - migrations.AlterModelOptions( - name='draftregistrationlog', - options={'get_latest_by': 'created', 'ordering': ['-created']}, - ), - migrations.AddField( - model_name='draftregistration', - name='affiliated_institutions', - field=models.ManyToManyField(related_name='draft_registrations', to='osf.Institution'), - ), - migrations.AddField( - model_name='draftregistration', - name='category', - field=models.CharField(blank=True, choices=[(b'', b'Uncategorized'), (b'communication', b'Communication'), (b'hypothesis', b'Hypothesis'), (b'data', b'Data'), (b'instrumentation', b'Instrumentation'), (b'methods and measures', b'Methods and Measures'), (b'analysis', b'Analysis'), (b'project', b'Project'), (b'other', b'Other'), (b'procedure', b'Procedure'), (b'software', b'Software')], default=b'', max_length=255), - ), - migrations.AddField( - model_name='draftregistration', - name='description', - field=models.TextField(blank=True, default=b''), - ), - migrations.AddField( - model_name='draftregistration', - name='last_logged', - field=osf.utils.fields.NonNaiveDateTimeField(blank=True, db_index=True, default=django.utils.timezone.now, null=True), - ), - migrations.AddField( - model_name='draftregistration', - name='node_license', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='draft_registrations', to='osf.NodeLicenseRecord'), - ), - migrations.AddField( - model_name='draftregistration', - name='subjects', - field=models.ManyToManyField(blank=True, related_name='draftregistrations', to='osf.Subject'), - ), - migrations.AddField( - model_name='draftregistration', - name='tags', - field=models.ManyToManyField(related_name='draftregistration_tagged', to='osf.Tag'), - ), - migrations.AddField( - model_name='draftregistration', - name='title', - field=models.TextField(blank=True, default=b'', validators=[osf.models.validators.validate_title]), - ), - migrations.AddField( - model_name='draftregistrationlog', - name='params', - field=osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(default=dict, encoder=osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONEncoder), - ), - migrations.AlterField( - model_name='abstractnode', - name='type', - field=models.CharField(choices=[('osf.node', 'node'), ('osf.draftnode', 'draft node'), ('osf.registration', 'registration'), ('osf.quickfilesnode', 'quick files node')], db_index=True, max_length=255), - ), - migrations.AlterField( - model_name='draftregistration', - name='branched_from', - field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='registered_draft', to='osf.AbstractNode'), - ), - migrations.AlterField( - model_name='draftregistrationlog', - name='user', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL), - ), - migrations.AddField( - model_name='draftregistrationuserobjectpermission', - name='content_object', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='osf.DraftRegistration'), - ), - migrations.AddField( - model_name='draftregistrationuserobjectpermission', - name='permission', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='auth.Permission'), - ), - migrations.AddField( - model_name='draftregistrationuserobjectpermission', - name='user', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL), - ), - migrations.AddField( - model_name='draftregistrationgroupobjectpermission', - name='content_object', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='osf.DraftRegistration'), - ), - migrations.AddField( - model_name='draftregistrationgroupobjectpermission', - name='group', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='auth.Group'), - ), - migrations.AddField( - model_name='draftregistrationgroupobjectpermission', - name='permission', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='auth.Permission'), - ), - migrations.AddField( - model_name='draftregistrationcontributor', - name='draft_registration', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='osf.DraftRegistration'), - ), - migrations.AddField( - model_name='draftregistrationcontributor', - name='user', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL), - ), - migrations.AddField( - model_name='draftregistration', - name='_contributors', - field=models.ManyToManyField(related_name='draft_registrations', through='osf.DraftRegistrationContributor', to=settings.AUTH_USER_MODEL), - ), - migrations.AlterUniqueTogether( - name='draftregistrationuserobjectpermission', - unique_together=set([('user', 'permission', 'content_object')]), - ), - migrations.AlterUniqueTogether( - name='draftregistrationgroupobjectpermission', - unique_together=set([('group', 'permission', 'content_object')]), - ), - migrations.AlterUniqueTogether( - name='draftregistrationcontributor', - unique_together=set([('user', 'draft_registration')]), - ), - migrations.AlterOrderWithRespectTo( - name='draftregistrationcontributor', - order_with_respect_to='draft_registration', - ), - ] diff --git a/osf/migrations/0199_draft_node_permissions.py b/osf/migrations/0199_draft_node_permissions.py deleted file mode 100644 index a927fe08654..00000000000 --- a/osf/migrations/0199_draft_node_permissions.py +++ /dev/null @@ -1,16 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.15 on 2019-07-14 19:04 -from __future__ import unicode_literals -import logging -from django.db import migrations - -logger = logging.getLogger(__name__) - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0198_draft_node_models'), - ] - - operations = [] diff --git a/osf/migrations/0200_auto_20200214_1518.py b/osf/migrations/0200_auto_20200214_1518.py deleted file mode 100644 index b4136b110b4..00000000000 --- a/osf/migrations/0200_auto_20200214_1518.py +++ /dev/null @@ -1,31 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.15 on 2020-02-14 15:18 -from __future__ import unicode_literals - -from django.db import migrations, models -import osf.models.validators - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0199_draft_node_permissions'), - ] - - operations = [ - migrations.AlterField( - model_name='draftregistration', - name='category', - field=models.CharField(blank=True, choices=[('analysis', 'Analysis'), ('communication', 'Communication'), ('data', 'Data'), ('hypothesis', 'Hypothesis'), ('instrumentation', 'Instrumentation'), ('methods and measures', 'Methods and Measures'), ('procedure', 'Procedure'), ('project', 'Project'), ('software', 'Software'), ('other', 'Other'), ('', 'Uncategorized')], default='', max_length=255), - ), - migrations.AlterField( - model_name='draftregistration', - name='description', - field=models.TextField(blank=True, default=''), - ), - migrations.AlterField( - model_name='draftregistration', - name='title', - field=models.TextField(blank=True, default='', validators=[osf.models.validators.validate_title]), - ), - ] diff --git a/osf/migrations/0201_add_egap_flag.py b/osf/migrations/0201_add_egap_flag.py deleted file mode 100644 index f93c9d41177..00000000000 --- a/osf/migrations/0201_add_egap_flag.py +++ /dev/null @@ -1,14 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.13 on 2019-07-23 14:26 -from __future__ import unicode_literals -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0200_auto_20200214_1518'), - ] - - operations = [ - ] diff --git a/osf/migrations/0202_add_sloan.py b/osf/migrations/0202_add_sloan.py deleted file mode 100644 index 5fe39592971..00000000000 --- a/osf/migrations/0202_add_sloan.py +++ /dev/null @@ -1,70 +0,0 @@ -from __future__ import unicode_literals - -import django.contrib.postgres.fields -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0201_add_egap_flag'), - ] - - operations = [ - migrations.AddField( - model_name='abstractprovider', - name='in_sloan_study', - field=models.NullBooleanField(default=True), - ), - migrations.AddField( - model_name='preprint', - name='conflict_of_interest_statement', - field=models.TextField(blank=True, null=True), - ), - migrations.AddField( - model_name='preprint', - name='data_links', - field=django.contrib.postgres.fields.ArrayField(base_field=models.URLField(blank=True, null=True), - blank=True, null=True, size=None), - ), - migrations.AddField( - model_name='preprint', - name='has_coi', - field=models.NullBooleanField(), - ), - migrations.AddField( - model_name='preprint', - name='has_data_links', - field=models.NullBooleanField(), - ), - migrations.AddField( - model_name='preprint', - name='has_prereg_links', - field=models.NullBooleanField(), - ), - migrations.AddField( - model_name='preprint', - name='prereg_link_info', - field=models.TextField(blank=True, choices=[('prereg_designs', 'Pre-registration of study designs'), - ('prereg_analysis', 'Pre-registration of study analysis'), ( - 'prereg_both', - 'Pre-registration of study designs and study analysis')], - null=True), - ), - migrations.AddField( - model_name='preprint', - name='prereg_links', - field=django.contrib.postgres.fields.ArrayField(base_field=models.URLField(blank=True, null=True), - blank=True, null=True, size=None), - ), - migrations.AddField( - model_name='preprint', - name='why_no_data', - field=models.TextField(blank=True, null=True), - ), - migrations.AddField( - model_name='preprint', - name='why_no_prereg', - field=models.TextField(blank=True, null=True), - ), - ] diff --git a/osf/migrations/0203_auto_20200312_1435.py b/osf/migrations/0203_auto_20200312_1435.py deleted file mode 100644 index 00e62f27bae..00000000000 --- a/osf/migrations/0203_auto_20200312_1435.py +++ /dev/null @@ -1,25 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.15 on 2020-03-12 14:35 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0202_add_sloan'), - ] - - operations = [ - migrations.AlterField( - model_name='preprint', - name='has_data_links', - field=models.TextField(blank=True, choices=[('available', 'Available'), ('no', 'No'), ('not_applicable', 'Not applicable')], null=True), - ), - migrations.AlterField( - model_name='preprint', - name='has_prereg_links', - field=models.TextField(blank=True, choices=[('available', 'Available'), ('no', 'No'), ('not_applicable', 'Not applicable')], null=True), - ), - ] diff --git a/osf/migrations/0204_ensure_schemas.py b/osf/migrations/0204_ensure_schemas.py deleted file mode 100644 index 75da61c15e5..00000000000 --- a/osf/migrations/0204_ensure_schemas.py +++ /dev/null @@ -1,11 +0,0 @@ -from __future__ import unicode_literals - -from django.db import migrations - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0203_auto_20200312_1435'), - ] - - operations = [] diff --git a/osf/migrations/0205_auto_20200323_1850.py b/osf/migrations/0205_auto_20200323_1850.py deleted file mode 100644 index 158a34ce5fa..00000000000 --- a/osf/migrations/0205_auto_20200323_1850.py +++ /dev/null @@ -1,24 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.15 on 2020-03-23 18:50 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0204_ensure_schemas'), - ] - - operations = [ - migrations.AlterModelOptions( - name='institution', - options={'permissions': (('view_institution', 'Can view institution details'), ('view_institutional_metrics', 'Can access metrics endpoints for their Institution'))}, - ), - migrations.AddField( - model_name='osfuser', - name='department', - field=models.TextField(blank=True, null=True), - ), - ] diff --git a/osf/migrations/0206_auto_20200528_1319.py b/osf/migrations/0206_auto_20200528_1319.py deleted file mode 100644 index ac803c60825..00000000000 --- a/osf/migrations/0206_auto_20200528_1319.py +++ /dev/null @@ -1,21 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.15 on 2020-05-28 13:19 -from __future__ import unicode_literals - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0205_auto_20200323_1850'), - ] - - operations = [ - migrations.AlterField( - model_name='abstractnode', - name='provider', - field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='registrations', to='osf.RegistrationProvider'), - ), - ] diff --git a/osf/migrations/0207_ensure_schemas.py b/osf/migrations/0207_ensure_schemas.py deleted file mode 100644 index 5b2b6cf7287..00000000000 --- a/osf/migrations/0207_ensure_schemas.py +++ /dev/null @@ -1,11 +0,0 @@ -from __future__ import unicode_literals - -from django.db import migrations - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0206_auto_20200528_1319'), - ] - - operations = [] diff --git a/osf/migrations/0207_update_schemas2.py b/osf/migrations/0207_update_schemas2.py deleted file mode 100644 index c6417621367..00000000000 --- a/osf/migrations/0207_update_schemas2.py +++ /dev/null @@ -1,15 +0,0 @@ -from __future__ import unicode_literals - -from django.db import migrations - - -def noop(*args, **kwargs): - pass - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0207_ensure_schemas'), - ] - - operations = [] diff --git a/osf/migrations/0208_update_EGAP_schema.py b/osf/migrations/0208_update_EGAP_schema.py deleted file mode 100644 index 16fb699eb2b..00000000000 --- a/osf/migrations/0208_update_EGAP_schema.py +++ /dev/null @@ -1,12 +0,0 @@ -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0207_update_schemas2'), - ] - - operations = [] diff --git a/osf/migrations/0209_conference_auto_check_spam.py b/osf/migrations/0209_conference_auto_check_spam.py deleted file mode 100644 index bc54464093b..00000000000 --- a/osf/migrations/0209_conference_auto_check_spam.py +++ /dev/null @@ -1,20 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.28 on 2020-07-06 13:30 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0208_update_EGAP_schema'), - ] - - operations = [ - migrations.AddField( - model_name='conference', - name='auto_check_spam', - field=models.BooleanField(default=True), - ), - ] diff --git a/osf/migrations/0210_branded_registries.py b/osf/migrations/0210_branded_registries.py deleted file mode 100644 index b190b731101..00000000000 --- a/osf/migrations/0210_branded_registries.py +++ /dev/null @@ -1,60 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.15 on 2020-04-02 13:44 -from __future__ import unicode_literals - -from django.db import migrations, models -import django.db.models.deletion -import django_extensions.db.fields -import osf.models.base - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0209_conference_auto_check_spam'), - ] - - operations = [ - migrations.CreateModel( - name='Brand', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), - ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), - ('name', models.CharField(blank=True, max_length=30, null=True)), - ('hero_logo_image', models.URLField()), - ('topnav_logo_image', models.URLField()), - ('hero_background_image', models.URLField()), - ('primary_color', models.CharField(max_length=7)), - ('secondary_color', models.CharField(max_length=7)), - ], - options={ - 'abstract': False, - }, - bases=(models.Model, osf.models.base.QuerySetExplainMixin), - ), - migrations.AddField( - model_name='abstractprovider', - name='advertises_on_discovery', - field=models.BooleanField(default=True), - ), - migrations.AddField( - model_name='abstractprovider', - name='branded_discovery_page', - field=models.BooleanField(default=True), - ), - migrations.AddField( - model_name='abstractprovider', - name='has_landing_page', - field=models.BooleanField(default=False), - ), - migrations.AddField( - model_name='abstractprovider', - name='brand', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='providers', to='osf.Brand'), - ), - migrations.AlterModelOptions( - name='brand', - options={'permissions': (('view_brand', 'Can view brand details'), ('modify_brand', 'Can modify brands'))}, - ), - ] diff --git a/osf/migrations/0211_auto_20200709_1320.py b/osf/migrations/0211_auto_20200709_1320.py deleted file mode 100644 index cf5c994e12a..00000000000 --- a/osf/migrations/0211_auto_20200709_1320.py +++ /dev/null @@ -1,21 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.28 on 2020-07-09 13:20 -from __future__ import unicode_literals - -from django.db import migrations -import osf.utils.fields - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0210_branded_registries'), - ] - - operations = [ - migrations.AlterField( - model_name='osfuser', - name='date_last_login', - field=osf.utils.fields.NonNaiveDateTimeField(blank=True, db_index=True, null=True), - ), - ] diff --git a/osf/migrations/0212_registrationschema_providers.py b/osf/migrations/0212_registrationschema_providers.py deleted file mode 100644 index ebabf2d8c43..00000000000 --- a/osf/migrations/0212_registrationschema_providers.py +++ /dev/null @@ -1,20 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.28 on 2020-07-23 15:49 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0211_auto_20200709_1320'), - ] - - operations = [ - migrations.AddField( - model_name='registrationschema', - name='providers', - field=models.ManyToManyField(blank=True, related_name='schemas', to='osf.RegistrationProvider'), - ), - ] diff --git a/osf/migrations/0213_auto_20200728_1609.py b/osf/migrations/0213_auto_20200728_1609.py deleted file mode 100644 index c0971fbde32..00000000000 --- a/osf/migrations/0213_auto_20200728_1609.py +++ /dev/null @@ -1,22 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.28 on 2020-07-28 16:09 -from __future__ import unicode_literals - -from django.db import migrations, models -import django.db.models.deletion -import osf.models.registrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0212_registrationschema_providers'), - ] - - operations = [ - migrations.AlterField( - model_name='draftregistration', - name='provider', - field=models.ForeignKey(default=osf.models.registrations.get_default_id, on_delete=django.db.models.deletion.CASCADE, related_name='draft_registrations', to='osf.RegistrationProvider'), - ), - ] diff --git a/osf/migrations/0214_auto_20200701_1658.py b/osf/migrations/0214_auto_20200701_1658.py deleted file mode 100644 index e3cbe4c1104..00000000000 --- a/osf/migrations/0214_auto_20200701_1658.py +++ /dev/null @@ -1,30 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.28 on 2020-07-01 16:58 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0213_auto_20200728_1609'), - ] - - operations = [ - migrations.AlterField( - model_name='abstractprovider', - name='share_publish_type', - field=models.CharField(choices=[('Preprint', 'Preprint'), ('Thesis', 'Thesis'), ('Registration', 'Registration')], default='Thesis', help_text='This SHARE type will be used when pushing publications to SHARE', max_length=32), - ), - migrations.AlterField( - model_name='abstractprovider', - name='share_source', - field=models.CharField(blank=True, default='', max_length=200), - ), - migrations.AlterField( - model_name='abstractprovider', - name='share_title', - field=models.TextField(blank=True, default=''), - ), - ] diff --git a/osf/migrations/0215_auto_20200819_1942.py b/osf/migrations/0215_auto_20200819_1942.py deleted file mode 100644 index 0a8b95b1668..00000000000 --- a/osf/migrations/0215_auto_20200819_1942.py +++ /dev/null @@ -1,26 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.28 on 2020-08-19 19:42 -from __future__ import unicode_literals - -from django.db import migrations -import osf.utils.fields - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0214_auto_20200701_1658'), - ] - - operations = [ - migrations.AddField( - model_name='basefilenode', - name='purged', - field=osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True), - ), - migrations.AddField( - model_name='fileversion', - name='purged', - field=osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True), - ), - ] diff --git a/osf/migrations/0216_auto_20200910_1259.py b/osf/migrations/0216_auto_20200910_1259.py deleted file mode 100644 index 487e7a2404e..00000000000 --- a/osf/migrations/0216_auto_20200910_1259.py +++ /dev/null @@ -1,25 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.28 on 2020-09-10 12:59 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0215_auto_20200819_1942'), - ] - - operations = [ - migrations.AddField( - model_name='abstractnode', - name='custom_storage_usage_limit_private', - field=models.DecimalField(blank=True, decimal_places=9, max_digits=100, null=True), - ), - migrations.AddField( - model_name='abstractnode', - name='custom_storage_usage_limit_public', - field=models.DecimalField(blank=True, decimal_places=9, max_digits=100, null=True), - ), - ] diff --git a/osf/migrations/0217_auto_20200901_1344.py b/osf/migrations/0217_auto_20200901_1344.py deleted file mode 100644 index 6f7b590c2e6..00000000000 --- a/osf/migrations/0217_auto_20200901_1344.py +++ /dev/null @@ -1,54 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.28 on 2020-09-01 13:44 -from __future__ import unicode_literals - -from django.conf import settings -from django.db import migrations, models -import django.db.models.deletion -import django_extensions.db.fields -import osf.models.base - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0216_auto_20200910_1259'), - ] - - operations = [ - migrations.CreateModel( - name='RegistrationRequestAction', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), - ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), - ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), - ('trigger', models.CharField(choices=[('submit', 'Submit'), ('accept', 'Accept'), ('reject', 'Reject'), ('edit_comment', 'Edit_Comment')], max_length=31)), - ('from_state', models.CharField(choices=[('initial', 'Initial'), ('pending', 'Pending'), ('accepted', 'Accepted'), ('rejected', 'Rejected')], max_length=31)), - ('to_state', models.CharField(choices=[('initial', 'Initial'), ('pending', 'Pending'), ('accepted', 'Accepted'), ('rejected', 'Rejected')], max_length=31)), - ('comment', models.TextField(blank=True)), - ('is_deleted', models.BooleanField(default=False)), - ('auto', models.BooleanField(default=False)), - ('creator', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='+', to=settings.AUTH_USER_MODEL)), - ], - options={ - 'abstract': False, - }, - bases=(models.Model, osf.models.base.QuerySetExplainMixin), - ), - migrations.AddField( - model_name='draftregistration', - name='date_last_transitioned', - field=models.DateTimeField(blank=True, db_index=True, null=True), - ), - migrations.AddField( - model_name='draftregistration', - name='machine_state', - field=models.CharField(choices=[('initial', 'Initial'), ('pending', 'Pending'), ('accepted', 'Accepted'), ('rejected', 'Rejected'), ('withdrawn', 'Withdrawn'), ('pending_embargo', 'Pending_Embargo'), ('embargo', 'Embargo'), ('pending_embargo_termination', 'Pending_Embargo_Termination'), ('pending_withdraw', 'Pending_Withdraw')], db_index=True, default='initial', max_length=30), - ), - migrations.AddField( - model_name='registrationrequestaction', - name='target', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='registration_actions', to='osf.DraftRegistration'), - ), - ] diff --git a/osf/migrations/0218_auto_20200929_1850.py b/osf/migrations/0218_auto_20200929_1850.py deleted file mode 100644 index 3cbef3b4c94..00000000000 --- a/osf/migrations/0218_auto_20200929_1850.py +++ /dev/null @@ -1,51 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.28 on 2020-09-29 18:50 -from __future__ import unicode_literals - -from django.conf import settings -from django.db import migrations, models -import django.db.models.deletion -import django_extensions.db.fields -import osf.models.base - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0217_auto_20200901_1344'), - ] - - operations = [ - migrations.CreateModel( - name='RegistrationAction', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), - ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), - ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), - ('comment', models.TextField(blank=True)), - ('is_deleted', models.BooleanField(default=False)), - ('auto', models.BooleanField(default=False)), - ('trigger', models.CharField(choices=[('submit', 'Submit'), ('accept', 'Accept'), ('reject', 'Reject'), ('edit_comment', 'Edit_Comment'), ('embargo', 'Embargo'), ('withdraw', 'Withdraw'), ('request_withdraw', 'Request_Withdraw'), ('reject_withdraw', 'Reject_Withdraw'), ('force_withdraw', 'Force_Withdraw'), ('request_embargo', 'Request_Embargo'), ('request_embargo_termination', 'Request_Embargo_Termination'), ('terminate_embargo', 'Terminate_Embargo')], max_length=31)), - ('from_state', models.CharField(choices=[('initial', 'Initial'), ('pending', 'Pending'), ('accepted', 'Accepted'), ('rejected', 'Rejected'), ('withdrawn', 'Withdrawn'), ('pending_embargo', 'Pending_Embargo'), ('embargo', 'Embargo'), ('pending_embargo_termination', 'Pending_Embargo_Termination'), ('pending_withdraw', 'Pending_Withdraw')], max_length=31)), - ('to_state', models.CharField(choices=[('initial', 'Initial'), ('pending', 'Pending'), ('accepted', 'Accepted'), ('rejected', 'Rejected'), ('withdrawn', 'Withdrawn'), ('pending_embargo', 'Pending_Embargo'), ('embargo', 'Embargo'), ('pending_embargo_termination', 'Pending_Embargo_Termination'), ('pending_withdraw', 'Pending_Withdraw')], max_length=31)), - ('creator', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='+', to=settings.AUTH_USER_MODEL)), - ('target', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='actions', to='osf.Registration')), - ], - options={ - 'abstract': False, - }, - bases=(models.Model, osf.models.base.QuerySetExplainMixin), - ), - migrations.RemoveField( - model_name='registrationrequestaction', - name='creator', - ), - migrations.RemoveField( - model_name='registrationrequestaction', - name='target', - ), - migrations.DeleteModel( - name='RegistrationRequestAction', - ), - ] diff --git a/osf/migrations/0219_auto_20201020_1836.py b/osf/migrations/0219_auto_20201020_1836.py deleted file mode 100644 index e5c919b1d2a..00000000000 --- a/osf/migrations/0219_auto_20201020_1836.py +++ /dev/null @@ -1,35 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.28 on 2020-10-20 18:36 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0218_auto_20200929_1850'), - ] - - operations = [ - migrations.AlterField( - model_name='draftregistration', - name='machine_state', - field=models.CharField(choices=[('initial', 'Initial'), ('pending', 'Pending'), ('accepted', 'Accepted'), ('rejected', 'Rejected'), ('withdrawn', 'Withdrawn'), ('pending_embargo', 'Pending_Embargo'), ('embargo', 'Embargo'), ('pending_embargo_termination', 'Pending_Embargo_Termination'), ('pending_withdraw_request', 'Pending_Withdraw_Request'), ('pending_withdraw', 'Pending_Withdraw')], db_index=True, default='initial', max_length=30), - ), - migrations.AlterField( - model_name='registrationaction', - name='from_state', - field=models.CharField(choices=[('initial', 'Initial'), ('pending', 'Pending'), ('accepted', 'Accepted'), ('rejected', 'Rejected'), ('withdrawn', 'Withdrawn'), ('pending_embargo', 'Pending_Embargo'), ('embargo', 'Embargo'), ('pending_embargo_termination', 'Pending_Embargo_Termination'), ('pending_withdraw_request', 'Pending_Withdraw_Request'), ('pending_withdraw', 'Pending_Withdraw')], max_length=31), - ), - migrations.AlterField( - model_name='registrationaction', - name='to_state', - field=models.CharField(choices=[('initial', 'Initial'), ('pending', 'Pending'), ('accepted', 'Accepted'), ('rejected', 'Rejected'), ('withdrawn', 'Withdrawn'), ('pending_embargo', 'Pending_Embargo'), ('embargo', 'Embargo'), ('pending_embargo_termination', 'Pending_Embargo_Termination'), ('pending_withdraw_request', 'Pending_Withdraw_Request'), ('pending_withdraw', 'Pending_Withdraw')], max_length=31), - ), - migrations.AlterField( - model_name='registrationaction', - name='trigger', - field=models.CharField(choices=[('submit', 'Submit'), ('accept', 'Accept'), ('reject', 'Reject'), ('edit_comment', 'Edit_Comment'), ('embargo', 'Embargo'), ('withdraw', 'Withdraw'), ('request_withdraw', 'Request_Withdraw'), ('withdraw_request_fails', 'Withdraw_Request_Fails'), ('withdraw_request_pass', 'Withdraw_Request_Pass'), ('reject_withdraw', 'Reject_Withdraw'), ('force_withdraw', 'Force_Withdraw'), ('request_embargo', 'Request_Embargo'), ('request_embargo_termination', 'Request_Embargo_Termination'), ('terminate_embargo', 'Terminate_Embargo')], max_length=31), - ), - ] diff --git a/osf/migrations/0221_add_schemas.py b/osf/migrations/0221_add_schemas.py deleted file mode 100644 index a1f871c130e..00000000000 --- a/osf/migrations/0221_add_schemas.py +++ /dev/null @@ -1,14 +0,0 @@ -import logging - -from django.db import migrations - -logger = logging.getLogger(__file__) - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0219_auto_20201020_1836'), - ] - - operations = [] diff --git a/osf/migrations/0222_auto_20201023_2033.py b/osf/migrations/0222_auto_20201023_2033.py deleted file mode 100644 index fe8052da57c..00000000000 --- a/osf/migrations/0222_auto_20201023_2033.py +++ /dev/null @@ -1,68 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.28 on 2020-10-23 20:33 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0221_add_schemas'), - ] - - operations = [ - migrations.RemoveField( - model_name='draftregistration', - name='date_last_transitioned', - ), - migrations.RemoveField( - model_name='draftregistration', - name='machine_state', - ), - migrations.AddField( - model_name='abstractnode', - name='moderation_state', - field=models.CharField(choices=[('undefined', 'Undefined'), ('initial', 'Initial'), ('reverted', 'Reverted'), ('pending', 'Pending'), ('rejected', 'Rejected'), ('accepted', 'Accepted'), ('embargo', 'Embargo'), ('pending_embargo_termination', 'PendingEmbargoTermination'), ('pending_withdraw_request', 'PendingWithdrawRequest'), ('pending_withdraw', 'PendingWithdraw'), ('withdrawn', 'Withdrawn')], default='initial', max_length=30, null=True), - ), - migrations.AddField( - model_name='draftregistrationapproval', - name='sanction_state', - field=models.CharField(choices=[('undefined', 'Undefined'), ('pending_admin_approval', 'PendingAdminApproval'), ('pending_moderator_approval', 'PendingModeratorApproval'), ('accepted', 'Accepted'), ('admin_rejected', 'AdminRejected'), ('moderator_rejected', 'ModeratorRejected'), ('complete', 'Complete')], default='pending_admin_approval', max_length=30), - ), - migrations.AddField( - model_name='embargo', - name='sanction_state', - field=models.CharField(choices=[('undefined', 'Undefined'), ('pending_admin_approval', 'PendingAdminApproval'), ('pending_moderator_approval', 'PendingModeratorApproval'), ('accepted', 'Accepted'), ('admin_rejected', 'AdminRejected'), ('moderator_rejected', 'ModeratorRejected'), ('complete', 'Complete')], default='pending_admin_approval', max_length=30), - ), - migrations.AddField( - model_name='embargoterminationapproval', - name='sanction_state', - field=models.CharField(choices=[('undefined', 'Undefined'), ('pending_admin_approval', 'PendingAdminApproval'), ('pending_moderator_approval', 'PendingModeratorApproval'), ('accepted', 'Accepted'), ('admin_rejected', 'AdminRejected'), ('moderator_rejected', 'ModeratorRejected'), ('complete', 'Complete')], default='pending_admin_approval', max_length=30), - ), - migrations.AddField( - model_name='registrationapproval', - name='sanction_state', - field=models.CharField(choices=[('undefined', 'Undefined'), ('pending_admin_approval', 'PendingAdminApproval'), ('pending_moderator_approval', 'PendingModeratorApproval'), ('accepted', 'Accepted'), ('admin_rejected', 'AdminRejected'), ('moderator_rejected', 'ModeratorRejected'), ('complete', 'Complete')], default='pending_admin_approval', max_length=30), - ), - migrations.AddField( - model_name='retraction', - name='sanction_state', - field=models.CharField(choices=[('undefined', 'Undefined'), ('pending_admin_approval', 'PendingAdminApproval'), ('pending_moderator_approval', 'PendingModeratorApproval'), ('accepted', 'Accepted'), ('admin_rejected', 'AdminRejected'), ('moderator_rejected', 'ModeratorRejected'), ('complete', 'Complete')], default='pending_admin_approval', max_length=30), - ), - migrations.AlterField( - model_name='registrationaction', - name='from_state', - field=models.CharField(choices=[('undefined', 'Undefined'), ('initial', 'Initial'), ('reverted', 'Reverted'), ('pending', 'Pending'), ('rejected', 'Rejected'), ('accepted', 'Accepted'), ('embargo', 'Embargo'), ('pending_embargo_termination', 'PendingEmbargoTermination'), ('pending_withdraw_request', 'PendingWithdrawRequest'), ('pending_withdraw', 'PendingWithdraw'), ('withdrawn', 'Withdrawn')], max_length=31), - ), - migrations.AlterField( - model_name='registrationaction', - name='to_state', - field=models.CharField(choices=[('undefined', 'Undefined'), ('initial', 'Initial'), ('reverted', 'Reverted'), ('pending', 'Pending'), ('rejected', 'Rejected'), ('accepted', 'Accepted'), ('embargo', 'Embargo'), ('pending_embargo_termination', 'PendingEmbargoTermination'), ('pending_withdraw_request', 'PendingWithdrawRequest'), ('pending_withdraw', 'PendingWithdraw'), ('withdrawn', 'Withdrawn')], max_length=31), - ), - migrations.AlterField( - model_name='registrationaction', - name='trigger', - field=models.CharField(choices=[('submit', 'Submit'), ('accept_submission', 'AcceptSubmission'), ('reject_submission', 'RejectSubmission'), ('request_withdrawal', 'RequestWithdrawal'), ('accept_withdrawal', 'AcceptWithdrawal'), ('reject_withdrawal', 'RejectWithdrawal'), ('force_withdraw', 'ForceWithdraw')], max_length=31), - ), - ] diff --git a/osf/migrations/0223_auto_20201026_1843.py b/osf/migrations/0223_auto_20201026_1843.py deleted file mode 100644 index bae350fb7d6..00000000000 --- a/osf/migrations/0223_auto_20201026_1843.py +++ /dev/null @@ -1,28 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.28 on 2020-10-26 18:43 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0222_auto_20201023_2033'), - ] - - operations = [ - migrations.AlterField( - model_name='notificationsubscription', - name='_id', - field=models.CharField(db_index=True, max_length=100), - ), - migrations.AlterUniqueTogether( - name='notificationsubscription', - unique_together=set([('_id', 'provider')]), - ), - migrations.AlterUniqueTogether( - name='notificationsubscription', - unique_together=set([('_id', 'provider')]), - ), - ] diff --git a/osf/migrations/0224_population_registration_subscription_notifications.py b/osf/migrations/0224_population_registration_subscription_notifications.py deleted file mode 100644 index 49d7536a536..00000000000 --- a/osf/migrations/0224_population_registration_subscription_notifications.py +++ /dev/null @@ -1,34 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.28 on 2020-10-26 18:43 -from __future__ import unicode_literals - -from django.db import migrations, models - -from osf.management.commands.add_notification_subscription import add_reviews_notification_setting -from osf.management.commands.populate_registration_provider_notification_subscriptions import populate_registration_provider_notification_subscriptions - - -def revert(apps, schema_editor): - NotificationSubscription = apps.get_model('osf', 'NotificationSubscription') - # The revert of this migration deletes all NotificationSubscription instances - NotificationSubscription.objects.filter(provider__isnull=False, provider__type='osf.registrationprovider').delete() - - -def populate_subscriptions(*args, **kwargs): - add_reviews_notification_setting('global_reviews') - populate_registration_provider_notification_subscriptions() - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0223_auto_20201026_1843'), - ] - - operations = [ - migrations.AlterField( - model_name='notificationsubscription', - name='event_name', - field=models.CharField(max_length=100), - ) - ] diff --git a/osf/migrations/0225_auto_20201119_2027.py b/osf/migrations/0225_auto_20201119_2027.py deleted file mode 100644 index 2a09fbab159..00000000000 --- a/osf/migrations/0225_auto_20201119_2027.py +++ /dev/null @@ -1,60 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.28 on 2020-11-19 20:27 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0224_population_registration_subscription_notifications'), - ] - - operations = [ - migrations.RemoveField( - model_name='draftregistrationapproval', - name='sanction_state', - ), - migrations.RemoveField( - model_name='embargo', - name='sanction_state', - ), - migrations.RemoveField( - model_name='embargoterminationapproval', - name='sanction_state', - ), - migrations.RemoveField( - model_name='registrationapproval', - name='sanction_state', - ), - migrations.RemoveField( - model_name='retraction', - name='sanction_state', - ), - migrations.AlterField( - model_name='draftregistrationapproval', - name='state', - field=models.CharField(choices=[('undefined', 'Undefined'), ('unapproved', 'Unapproved'), ('pending_moderation', 'PendingModeration'), ('approved', 'Approved'), ('rejected', 'Rejected'), ('moderator_rejected', 'ModeratorRejected'), ('completed', 'Completed')], default='unapproved', max_length=255), - ), - migrations.AlterField( - model_name='embargo', - name='state', - field=models.CharField(choices=[('undefined', 'Undefined'), ('unapproved', 'Unapproved'), ('pending_moderation', 'PendingModeration'), ('approved', 'Approved'), ('rejected', 'Rejected'), ('moderator_rejected', 'ModeratorRejected'), ('completed', 'Completed')], default='unapproved', max_length=255), - ), - migrations.AlterField( - model_name='embargoterminationapproval', - name='state', - field=models.CharField(choices=[('undefined', 'Undefined'), ('unapproved', 'Unapproved'), ('pending_moderation', 'PendingModeration'), ('approved', 'Approved'), ('rejected', 'Rejected'), ('moderator_rejected', 'ModeratorRejected'), ('completed', 'Completed')], default='unapproved', max_length=255), - ), - migrations.AlterField( - model_name='registrationapproval', - name='state', - field=models.CharField(choices=[('undefined', 'Undefined'), ('unapproved', 'Unapproved'), ('pending_moderation', 'PendingModeration'), ('approved', 'Approved'), ('rejected', 'Rejected'), ('moderator_rejected', 'ModeratorRejected'), ('completed', 'Completed')], default='unapproved', max_length=255), - ), - migrations.AlterField( - model_name='retraction', - name='state', - field=models.CharField(choices=[('undefined', 'Undefined'), ('unapproved', 'Unapproved'), ('pending_moderation', 'PendingModeration'), ('approved', 'Approved'), ('rejected', 'Rejected'), ('moderator_rejected', 'ModeratorRejected'), ('completed', 'Completed')], default='unapproved', max_length=255), - ), - ] diff --git a/osf/migrations/0226_auto_20210224_1610.py b/osf/migrations/0226_auto_20210224_1610.py deleted file mode 100644 index 1ee6b92b3ea..00000000000 --- a/osf/migrations/0226_auto_20210224_1610.py +++ /dev/null @@ -1,41 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.28 on 2021-02-24 16:10 -from __future__ import unicode_literals - -import django.contrib.postgres.fields -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0225_auto_20201119_2027'), - ] - - operations = [ - migrations.AlterField( - model_name='nodelicense', - name='license_id', - field=models.CharField(help_text='A unique id for the license. for example', max_length=128, unique=True), - ), - migrations.AlterField( - model_name='nodelicense', - name='name', - field=models.CharField(help_text='The name of the license', max_length=256, unique=True), - ), - migrations.AlterField( - model_name='nodelicense', - name='properties', - field=django.contrib.postgres.fields.ArrayField(base_field=models.CharField(max_length=128), blank=True, default=list, help_text="The custom elements in a license's text surrounded with curly brackets for example: {year,copyrightHolders}", size=None), - ), - migrations.AlterField( - model_name='nodelicense', - name='text', - field=models.TextField(help_text='The text of the license with custom properties surround by curly brackets, for example: Copyright (c) {{year}}, {{copyrightHolders}} All rights reserved.'), - ), - migrations.AlterField( - model_name='nodelicense', - name='url', - field=models.URLField(blank=True, help_text="The license's url for example: http://opensource.org/licenses/BSD-3-Clause"), - ), - ] diff --git a/osf/migrations/0227_add_secondary_data.py b/osf/migrations/0227_add_secondary_data.py deleted file mode 100644 index ea9e80679cb..00000000000 --- a/osf/migrations/0227_add_secondary_data.py +++ /dev/null @@ -1,14 +0,0 @@ -import logging - -from django.db import migrations - -logger = logging.getLogger(__file__) - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0226_auto_20210224_1610'), - ] - - operations = [] diff --git a/osf/migrations/0228_abstractnode_branched_from_node.py b/osf/migrations/0228_abstractnode_branched_from_node.py deleted file mode 100644 index 76c72d57d3c..00000000000 --- a/osf/migrations/0228_abstractnode_branched_from_node.py +++ /dev/null @@ -1,20 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.28 on 2020-06-29 17:55 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0227_add_secondary_data'), - ] - - operations = [ - migrations.AddField( - model_name='abstractnode', - name='branched_from_node', - field=models.NullBooleanField(), - ), - ] diff --git a/osf/migrations/0229_auto_20210317_2013.py b/osf/migrations/0229_auto_20210317_2013.py deleted file mode 100644 index c6c433731ef..00000000000 --- a/osf/migrations/0229_auto_20210317_2013.py +++ /dev/null @@ -1,26 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.28 on 2021-03-17 20:13 -from __future__ import unicode_literals - -from django.db import migrations -import osf.utils.datetime_aware_jsonfield - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0228_abstractnode_branched_from_node'), - ] - - operations = [ - migrations.AddField( - model_name='abstractnode', - name='additional_metadata', - field=osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, encoder=osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONEncoder, null=True), - ), - migrations.AddField( - model_name='abstractprovider', - name='additional_metadata_fields', - field=osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, encoder=osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONEncoder, null=True), - ), - ] diff --git a/osf/migrations/0230_make_run_management_perm.py b/osf/migrations/0230_make_run_management_perm.py deleted file mode 100644 index 763d43ba872..00000000000 --- a/osf/migrations/0230_make_run_management_perm.py +++ /dev/null @@ -1,15 +0,0 @@ -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0229_auto_20210317_2013'), - ] - - operations = [ - migrations.AlterModelOptions( - name='adminprofile', - options={'permissions': (('view_management', 'Can view and run management commands in the admin app.'),)}, - ), - ] diff --git a/osf/migrations/0231_abstractprovider_default_schema.py b/osf/migrations/0231_abstractprovider_default_schema.py deleted file mode 100644 index 0397cd3ca0e..00000000000 --- a/osf/migrations/0231_abstractprovider_default_schema.py +++ /dev/null @@ -1,21 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.28 on 2021-04-26 16:10 -from __future__ import unicode_literals - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0230_make_run_management_perm'), - ] - - operations = [ - migrations.AddField( - model_name='abstractprovider', - name='default_schema', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='default_schema', to='osf.RegistrationSchema'), - ), - ] diff --git a/osf/migrations/0232_abstractnode_ia_url.py b/osf/migrations/0232_abstractnode_ia_url.py deleted file mode 100644 index 66e47ef69f0..00000000000 --- a/osf/migrations/0232_abstractnode_ia_url.py +++ /dev/null @@ -1,20 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.28 on 2021-03-11 13:36 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0231_abstractprovider_default_schema'), - ] - - operations = [ - migrations.AddField( - model_name='abstractnode', - name='ia_url', - field=models.URLField(blank=True, help_text='Where the archive.org data for the registration is stored', null=True), - ), - ] diff --git a/osf/migrations/0233_auto_20210608_1816.py b/osf/migrations/0233_auto_20210608_1816.py deleted file mode 100644 index 7da13cfff4a..00000000000 --- a/osf/migrations/0233_auto_20210608_1816.py +++ /dev/null @@ -1,36 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.28 on 2021-06-08 18:16 -from __future__ import unicode_literals - -import django.contrib.postgres.fields -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0232_abstractnode_ia_url'), - ] - - operations = [ - migrations.AddField( - model_name='collection', - name='school_type_choices', - field=django.contrib.postgres.fields.ArrayField(base_field=models.CharField(max_length=127), blank=True, default=list, size=None), - ), - migrations.AddField( - model_name='collection', - name='study_design_choices', - field=django.contrib.postgres.fields.ArrayField(base_field=models.CharField(max_length=127), blank=True, default=list, size=None), - ), - migrations.AddField( - model_name='collectionsubmission', - name='school_type', - field=models.CharField(blank=True, max_length=127), - ), - migrations.AddField( - model_name='collectionsubmission', - name='study_design', - field=models.CharField(blank=True, max_length=127), - ), - ] diff --git a/osf/migrations/0234_auto_20210610_1812.py b/osf/migrations/0234_auto_20210610_1812.py deleted file mode 100644 index f75d4946497..00000000000 --- a/osf/migrations/0234_auto_20210610_1812.py +++ /dev/null @@ -1,21 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.28 on 2021-06-10 18:12 -from __future__ import unicode_literals - -from django.db import migrations -import osf.utils.fields - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0233_auto_20210608_1816'), - ] - - operations = [ - migrations.AddField( - model_name='institution', - name='deactivated', - field=osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True), - ), - ] diff --git a/osf/migrations/0235_auto_20210823_1310.py b/osf/migrations/0235_auto_20210823_1310.py deleted file mode 100644 index d655252fa07..00000000000 --- a/osf/migrations/0235_auto_20210823_1310.py +++ /dev/null @@ -1,73 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.28 on 2021-08-23 13:10 -from __future__ import unicode_literals - -from django.conf import settings -from django.db import migrations, models -import django.db.models.deletion -import django_extensions.db.fields -import osf.models.base -import osf.utils.datetime_aware_jsonfield -import osf.utils.fields - - -class Migration(migrations.Migration): - - dependencies = [ - ('contenttypes', '0002_remove_content_type_name'), - ('osf', '0234_auto_20210610_1812'), - ] - - operations = [ - migrations.CreateModel( - name='SchemaResponse', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), - ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), - ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), - ('revision_justification', models.CharField(max_length=2048, null=True)), - ('submitted_timestamp', osf.utils.fields.NonNaiveDateTimeField(null=True)), - ('object_id', models.PositiveIntegerField()), - ('content_type', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='contenttypes.ContentType')), - ('initiator', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), - ('previous_response', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='updated_response', to='osf.SchemaResponse', null=True)), - ], - options={ - 'abstract': False, - }, - bases=(models.Model, osf.models.base.QuerySetExplainMixin), - ), - migrations.CreateModel( - name='SchemaResponseBlock', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), - ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), - ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), - ('schema_key', models.CharField(max_length=255)), - ('response', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, encoder=osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONEncoder, null=True)), - ('source_schema_block', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='osf.RegistrationSchemaBlock')), - ('source_schema_response', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='updated_response_blocks', to='osf.SchemaResponse')), - ], - bases=(models.Model, osf.models.base.QuerySetExplainMixin), - ), - migrations.AlterModelOptions( - name='adminprofile', - options={'permissions': (('mark_spam', 'Can mark comments, projects and registrations as spam'), ('view_spam', 'Can view nodes, comments, and projects marked as spam'), ('view_metrics', 'Can view metrics on the OSF Admin app'), ('view_prereg', 'Can view entries for the preregistration chellenge on the admin'), ('administer_prereg', 'Can update, comment on, and approve entries to the prereg challenge'), ('view_desk', 'Can view details about Desk users'), ('delete_preprintrequest', 'Can delete preprints withdrawal requests'), ('change_preprintrequest', 'Can update preprints withdrawal requests'))}, - ), - migrations.AddField( - model_name='schemaresponse', - name='response_blocks', - field=models.ManyToManyField(to='osf.SchemaResponseBlock'), - ), - migrations.AddField( - model_name='schemaresponse', - name='schema', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='osf.RegistrationSchema'), - ), - migrations.AlterUniqueTogether( - name='schemaresponseblock', - unique_together=set([('source_schema_response', 'source_schema_block')]), - ), - ] diff --git a/osf/migrations/0236_auto_20210913_2008.py b/osf/migrations/0236_auto_20210913_2008.py deleted file mode 100644 index d2951350fdb..00000000000 --- a/osf/migrations/0236_auto_20210913_2008.py +++ /dev/null @@ -1,107 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.28 on 2021-09-13 20:08 -from __future__ import unicode_literals - -from django.conf import settings -from django.db import migrations, models -import django.db.models.deletion -import django_extensions.db.fields -import osf.models.base -import osf.utils.fields - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0235_auto_20210823_1310'), - ] - - operations = [ - migrations.CreateModel( - name='SchemaResponseAction', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), - ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), - ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), - ('comment', models.TextField(blank=True)), - ('is_deleted', models.BooleanField(default=False)), - ('auto', models.BooleanField(default=False)), - ('trigger', models.CharField(choices=[('submit', 'Submit'), ('approve', 'Approve'), ('accept', 'Accept'), ('admin_reject', 'AdminReject'), ('moderator_reject', 'ModeratorReject')], max_length=31)), - ('from_state', models.CharField(choices=[('undefined', 'Undefined'), ('unapproved', 'Unapproved'), ('pending_moderation', 'PendingModeration'), ('approved', 'Approved'), ('rejected', 'Rejected'), ('moderator_rejected', 'ModeratorRejected'), ('completed', 'Completed'), ('in_progress', 'InProgress')], max_length=31)), - ('to_state', models.CharField(choices=[('undefined', 'Undefined'), ('unapproved', 'Unapproved'), ('pending_moderation', 'PendingModeration'), ('approved', 'Approved'), ('rejected', 'Rejected'), ('moderator_rejected', 'ModeratorRejected'), ('completed', 'Completed'), ('in_progress', 'InProgress')], max_length=31)), - ], - options={ - 'abstract': False, - }, - bases=(models.Model, osf.models.base.QuerySetExplainMixin), - ), - migrations.AlterModelOptions( - name='schemaresponse', - options={'ordering': ['-created']}, - ), - migrations.AddField( - model_name='schemaresponse', - name='pending_approvers', - field=models.ManyToManyField(related_name='pending_submissions', to=settings.AUTH_USER_MODEL), - ), - migrations.AddField( - model_name='schemaresponse', - name='reviews_state', - field=models.CharField(choices=[('undefined', 'Undefined'), ('unapproved', 'Unapproved'), ('pending_moderation', 'PendingModeration'), ('approved', 'Approved'), ('rejected', 'Rejected'), ('moderator_rejected', 'ModeratorRejected'), ('completed', 'Completed'), ('in_progress', 'InProgress')], default='in_progress', max_length=255), - ), - migrations.AlterField( - model_name='draftregistrationapproval', - name='state', - field=models.CharField(choices=[('undefined', 'Undefined'), ('unapproved', 'Unapproved'), ('pending_moderation', 'PendingModeration'), ('approved', 'Approved'), ('rejected', 'Rejected'), ('moderator_rejected', 'ModeratorRejected'), ('completed', 'Completed'), ('in_progress', 'InProgress')], default='unapproved', max_length=255), - ), - migrations.AlterField( - model_name='embargo', - name='state', - field=models.CharField(choices=[('undefined', 'Undefined'), ('unapproved', 'Unapproved'), ('pending_moderation', 'PendingModeration'), ('approved', 'Approved'), ('rejected', 'Rejected'), ('moderator_rejected', 'ModeratorRejected'), ('completed', 'Completed'), ('in_progress', 'InProgress')], default='unapproved', max_length=255), - ), - migrations.AlterField( - model_name='embargoterminationapproval', - name='state', - field=models.CharField(choices=[('undefined', 'Undefined'), ('unapproved', 'Unapproved'), ('pending_moderation', 'PendingModeration'), ('approved', 'Approved'), ('rejected', 'Rejected'), ('moderator_rejected', 'ModeratorRejected'), ('completed', 'Completed'), ('in_progress', 'InProgress')], default='unapproved', max_length=255), - ), - migrations.AlterField( - model_name='registrationapproval', - name='state', - field=models.CharField(choices=[('undefined', 'Undefined'), ('unapproved', 'Unapproved'), ('pending_moderation', 'PendingModeration'), ('approved', 'Approved'), ('rejected', 'Rejected'), ('moderator_rejected', 'ModeratorRejected'), ('completed', 'Completed'), ('in_progress', 'InProgress')], default='unapproved', max_length=255), - ), - migrations.AlterField( - model_name='retraction', - name='state', - field=models.CharField(choices=[('undefined', 'Undefined'), ('unapproved', 'Unapproved'), ('pending_moderation', 'PendingModeration'), ('approved', 'Approved'), ('rejected', 'Rejected'), ('moderator_rejected', 'ModeratorRejected'), ('completed', 'Completed'), ('in_progress', 'InProgress')], default='unapproved', max_length=255), - ), - migrations.AlterField( - model_name='schemaresponse', - name='previous_response', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='updated_response', to='osf.SchemaResponse'), - ), - migrations.AlterField( - model_name='schemaresponse', - name='revision_justification', - field=models.CharField(blank=True, max_length=2048, null=True), - ), - migrations.AlterField( - model_name='schemaresponse', - name='submitted_timestamp', - field=osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True), - ), - migrations.AddIndex( - model_name='schemaresponse', - index=models.Index(fields=['reviews_state'], name='osf_schemar_reviews_c361bc_idx'), - ), - migrations.AddField( - model_name='schemaresponseaction', - name='creator', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='+', to=settings.AUTH_USER_MODEL), - ), - migrations.AddField( - model_name='schemaresponseaction', - name='target', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='actions', to='osf.SchemaResponse'), - ), - ] diff --git a/osf/migrations/0237_auto_20210929_1529.py b/osf/migrations/0237_auto_20210929_1529.py deleted file mode 100644 index 151e039d124..00000000000 --- a/osf/migrations/0237_auto_20210929_1529.py +++ /dev/null @@ -1,64 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.28 on 2021-09-29 15:29 -from __future__ import unicode_literals - -from django.conf import settings -from django.db import migrations, models -import django.db.models.deletion -import django_extensions.db.fields -import osf.models.base -import osf.models.registration_bulk_upload_job -import osf.utils.datetime_aware_jsonfield -import osf.utils.fields - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0236_auto_20210913_2008'), - ] - - operations = [ - migrations.CreateModel( - name='RegistrationBulkUploadJob', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), - ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), - ('payload_hash', models.CharField(max_length=255, unique=True)), - ('state', models.IntegerField(choices=[(osf.models.registration_bulk_upload_job.JobState(0), 'PENDING'), (osf.models.registration_bulk_upload_job.JobState(1), 'INITIALIZED'), (osf.models.registration_bulk_upload_job.JobState(2), 'PICKED_UP'), (osf.models.registration_bulk_upload_job.JobState(3), 'DONE_FULL'), (osf.models.registration_bulk_upload_job.JobState(4), 'DONE_PARTIAL'), (osf.models.registration_bulk_upload_job.JobState(5), 'DONE_ERROR')], default=osf.models.registration_bulk_upload_job.JobState(0))), - ('email_sent', osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True)), - ('initiator', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), - ('provider', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='osf.RegistrationProvider')), - ('schema', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='osf.RegistrationSchema')), - ], - options={ - 'abstract': False, - }, - bases=(models.Model, osf.models.base.QuerySetExplainMixin), - ), - migrations.CreateModel( - name='RegistrationBulkUploadRow', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), - ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), - ('is_completed', models.BooleanField(default=False)), - ('is_picked_up', models.BooleanField(default=False)), - ('csv_raw', models.TextField(default='')), - ('csv_parsed', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(default=dict, encoder=osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONEncoder)), - ('row_hash', models.CharField(default='', max_length=255, unique=True)), - ('draft_registration', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='osf.DraftRegistration')), - ('upload', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='osf.RegistrationBulkUploadJob')), - ], - options={ - 'abstract': False, - }, - bases=(models.Model, osf.models.base.QuerySetExplainMixin), - ), - migrations.AddField( - model_name='abstractprovider', - name='bulk_upload_auto_approval', - field=models.NullBooleanField(default=False), - ), - ] diff --git a/osf/migrations/0238_abstractprovider_allow_updates.py b/osf/migrations/0238_abstractprovider_allow_updates.py deleted file mode 100644 index 302ac4dee66..00000000000 --- a/osf/migrations/0238_abstractprovider_allow_updates.py +++ /dev/null @@ -1,20 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.28 on 2021-10-04 18:28 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0237_auto_20210929_1529'), - ] - - operations = [ - migrations.AddField( - model_name='abstractprovider', - name='allow_updates', - field=models.NullBooleanField(default=False), - ), - ] diff --git a/osf/migrations/0239_auto_20211110_1921.py b/osf/migrations/0239_auto_20211110_1921.py deleted file mode 100644 index b8160a59ecd..00000000000 --- a/osf/migrations/0239_auto_20211110_1921.py +++ /dev/null @@ -1,19 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.28 on 2021-11-10 19:21 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0238_abstractprovider_allow_updates'), - ] - - operations = [ - migrations.AddIndex( - model_name='schemaresponse', - index=models.Index(fields=['object_id', 'content_type'], name='osf_schemar_object__8cc95e_idx'), - ), - ] diff --git a/osf/migrations/0239_notable_email_domains.py b/osf/migrations/0239_notable_email_domains.py deleted file mode 100644 index 0ceed917ac0..00000000000 --- a/osf/migrations/0239_notable_email_domains.py +++ /dev/null @@ -1,21 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.28 on 2021-08-23 14:32 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0238_abstractprovider_allow_updates'), - ] - - operations = [ - migrations.RenameModel('BlacklistedEmailDomain', 'NotableEmailDomain'), - migrations.AddField( - model_name='notableemaildomain', - name='note', - field=models.IntegerField(choices=[(0, 'EXCLUDE_FROM_ACCOUNT_CREATION'), (1, 'ASSUME_HAM_UNTIL_REPORTED')], default=0), - ), - ] diff --git a/osf/migrations/0240_merge_20211110_2051.py b/osf/migrations/0240_merge_20211110_2051.py deleted file mode 100644 index 7111d583ca5..00000000000 --- a/osf/migrations/0240_merge_20211110_2051.py +++ /dev/null @@ -1,16 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.28 on 2021-11-10 20:51 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0239_auto_20211110_1921'), - ('osf', '0239_notable_email_domains'), - ] - - operations = [ - ] diff --git a/osf/migrations/0241_abstractprovider_allow_bulk_uploads.py b/osf/migrations/0241_abstractprovider_allow_bulk_uploads.py deleted file mode 100644 index 98fdb0f654e..00000000000 --- a/osf/migrations/0241_abstractprovider_allow_bulk_uploads.py +++ /dev/null @@ -1,20 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.28 on 2021-12-16 18:18 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0240_merge_20211110_2051'), - ] - - operations = [ - migrations.AddField( - model_name='abstractprovider', - name='allow_bulk_uploads', - field=models.NullBooleanField(default=False), - ), - ] diff --git a/osf/migrations/0242_auto_20220125_1604.py b/osf/migrations/0242_auto_20220125_1604.py deleted file mode 100644 index aa2a6fdf693..00000000000 --- a/osf/migrations/0242_auto_20220125_1604.py +++ /dev/null @@ -1,23 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.28 on 2022-01-25 16:04 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0241_abstractprovider_allow_bulk_uploads'), - ] - - operations = [ - migrations.AlterUniqueTogether( - name='schemaresponseblock', - unique_together=set([('source_schema_response', 'schema_key')]), - ), - migrations.RemoveField( - model_name='schemaresponseblock', - name='source_schema_block', - ), - ] diff --git a/osf/migrations/0243_auto_20211025_1353.py b/osf/migrations/0243_auto_20211025_1353.py deleted file mode 100644 index 3081ba71c4e..00000000000 --- a/osf/migrations/0243_auto_20211025_1353.py +++ /dev/null @@ -1,30 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.29 on 2021-10-25 13:53 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0242_auto_20220125_1604'), - ] - - operations = [ - migrations.AlterModelOptions( - name='adminprofile', - options={'permissions': (('mark_spam', 'Can mark comments, projects and registrations as spam'), ('view_spam', 'Can view nodes, comments, and projects marked as spam'), ('view_metrics', 'Can view metrics on the OSF Admin app'), ('view_desk', 'Can view details about Desk users'), ('delete_preprintrequest', 'Can delete preprints withdrawal requests'), ('change_preprintrequest', 'Can update preprints withdrawal requests'))}, - ), - migrations.RemoveField( - model_name='abstractprovider', - name='in_sloan_study', - ), - migrations.RemoveField( - model_name='draftregistration', - name='approval', - ), - migrations.DeleteModel( - name='DraftRegistrationApproval', - ), - ] diff --git a/osf/migrations/0244_auto_20220517_1718.py b/osf/migrations/0244_auto_20220517_1718.py deleted file mode 100644 index bdcbbe0de09..00000000000 --- a/osf/migrations/0244_auto_20220517_1718.py +++ /dev/null @@ -1,25 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.29 on 2022-05-17 17:18 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0243_auto_20211025_1353'), - ] - - operations = [ - migrations.AddField( - model_name='institution', - name='identifier_domain', - field=models.URLField(blank=True, help_text='The full domain this institutions that will appear in DOI metadata.', max_length=500, null=True), - ), - migrations.AddField( - model_name='institution', - name='ror_uri', - field=models.URLField(blank=True, help_text='The full URI for the this institutions ROR.', max_length=500, null=True), - ), - ] diff --git a/osf/migrations/0245_auto_20220621_1950.py b/osf/migrations/0245_auto_20220621_1950.py deleted file mode 100644 index 0cfc0b6d7da..00000000000 --- a/osf/migrations/0245_auto_20220621_1950.py +++ /dev/null @@ -1,25 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.29 on 2022-06-21 19:50 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0244_auto_20220517_1718'), - ] - - operations = [ - migrations.AddField( - model_name='institution', - name='orcid_record_verified_source', - field=models.CharField(blank=True, default='', max_length=255), - ), - migrations.AlterField( - model_name='institution', - name='delegation_protocol', - field=models.CharField(blank=True, choices=[('saml-shib', 'SAML_SHIBBOLETH'), ('cas-pac4j', 'CAS_PAC4J'), ('oauth-pac4j', 'OAUTH_PAC4J'), ('via-orcid', 'AFFILIATION_VIA_ORCID'), ('', 'NONE')], default='', max_length=15), - ), - ] diff --git a/osf/migrations/0246_add_outcomes_and_artifacts.py b/osf/migrations/0246_add_outcomes_and_artifacts.py deleted file mode 100644 index 586fcbff75b..00000000000 --- a/osf/migrations/0246_add_outcomes_and_artifacts.py +++ /dev/null @@ -1,83 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.29 on 2022-07-14 18:50 -from __future__ import unicode_literals - -from django.db import migrations, models -import django.db.models.deletion -import django_extensions.db.fields -import osf.models.base -import osf.models.validators -import osf.utils.outcomes - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0245_auto_20220621_1950'), - ] - - operations = [ - migrations.CreateModel( - name='Outcome', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), - ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), - ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), - ('title', models.TextField(validators=[osf.models.validators.validate_title])), - ('description', models.TextField(blank=True, default='')), - ('category', models.CharField(blank=True, choices=[('analysis', 'Analysis'), ('communication', 'Communication'), ('data', 'Data'), ('hypothesis', 'Hypothesis'), ('instrumentation', 'Instrumentation'), ('methods and measures', 'Methods and Measures'), ('procedure', 'Procedure'), ('project', 'Project'), ('software', 'Software'), ('other', 'Other'), ('', 'Uncategorized')], default='', max_length=255)), - ('affiliated_institutions', models.ManyToManyField(related_name='outcomes', to='osf.Institution')), - ], - options={ - 'abstract': False, - }, - bases=(models.Model, osf.models.base.QuerySetExplainMixin), - ), - migrations.CreateModel( - name='OutcomeArtifact', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), - ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), - ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), - ('artifact_type', models.IntegerField(choices=[(0, 'UNDEFINED'), (1, 'DATA'), (11, 'CODE'), (21, 'MATERIALS'), (31, 'PAPERS'), (41, 'SUPPLEMENTS'), (1001, 'PRIMARY')], default=osf.utils.outcomes.ArtifactTypes(0))), - ('title', models.TextField()), - ('description', models.TextField()), - ('identifier', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='artifact_metadata', to='osf.Identifier')), - ('outcome', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='artifact_metadata', to='osf.Outcome')), - ], - options={ - 'ordering': ['artifact_type', 'title'], - }, - bases=(models.Model, osf.models.base.QuerySetExplainMixin), - ), - migrations.AddField( - model_name='outcome', - name='artifacts', - field=models.ManyToManyField(through='osf.OutcomeArtifact', to='osf.Identifier'), - ), - migrations.AddField( - model_name='outcome', - name='node_license', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='outcomes', to='osf.NodeLicenseRecord'), - ), - migrations.AddField( - model_name='outcome', - name='subjects', - field=models.ManyToManyField(blank=True, related_name='outcomes', to='osf.Subject'), - ), - migrations.AddField( - model_name='outcome', - name='tags', - field=models.ManyToManyField(related_name='outcome_tagged', to='osf.Tag'), - ), - migrations.AddIndex( - model_name='outcomeartifact', - index=models.Index(fields=['outcome', 'artifact_type'], name='osf_outcome_outcome_a62f5c_idx'), - ), - migrations.AlterUniqueTogether( - name='outcomeartifact', - unique_together=set([('outcome', 'identifier', 'artifact_type')]), - ), - ] diff --git a/osf/migrations/0247_artifact_finalized_and_deleted.py b/osf/migrations/0247_artifact_finalized_and_deleted.py deleted file mode 100644 index 24f4a19fe26..00000000000 --- a/osf/migrations/0247_artifact_finalized_and_deleted.py +++ /dev/null @@ -1,41 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.29 on 2022-07-25 15:39 -from __future__ import unicode_literals - -from django.db import migrations, models -import osf.utils.fields - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0246_add_outcomes_and_artifacts'), - ] - - operations = [ - migrations.AddField( - model_name='outcomeartifact', - name='deleted', - field=osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True), - ), - migrations.AddField( - model_name='outcomeartifact', - name='finalized', - field=models.BooleanField(default=False), - ), - migrations.AlterField( - model_name='outcomeartifact', - name='description', - field=models.TextField(blank=True), - ), - migrations.AlterField( - model_name='outcomeartifact', - name='title', - field=models.TextField(blank=True), - ), - migrations.AlterField( - model_name='outcomeartifact', - name='artifact_type', - field=models.IntegerField(choices=[(0, 'UNDEFINED'), (1, 'DATA'), (11, 'ANALYTIC_CODE'), (21, 'MATERIALS'), (31, 'PAPERS'), (41, 'SUPPLEMENTS'), (1001, 'PRIMARY')], default=osf.utils.outcomes.ArtifactTypes(0)), - ), - ] diff --git a/osf/migrations/0248_artifact_tweaks.py b/osf/migrations/0248_artifact_tweaks.py deleted file mode 100644 index 95d8aed2029..00000000000 --- a/osf/migrations/0248_artifact_tweaks.py +++ /dev/null @@ -1,33 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.29 on 2022-08-01 19:37 -from __future__ import unicode_literals - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0247_artifact_finalized_and_deleted'), - ] - - operations = [ - migrations.RemoveIndex( - model_name='outcomeartifact', - name='osf_outcome_outcome_a62f5c_idx', - ), - migrations.AlterField( - model_name='outcomeartifact', - name='identifier', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='artifact_metadata', to='osf.Identifier'), - ), - migrations.AlterUniqueTogether( - name='outcomeartifact', - unique_together=set([]), - ), - migrations.AddIndex( - model_name='outcomeartifact', - index=models.Index(fields=['artifact_type', 'outcome'], name='osf_outcome_artifac_5eb92d_idx'), - ), - ] diff --git a/osf/migrations/0249_schema_response_justification_to_text_field.py b/osf/migrations/0249_schema_response_justification_to_text_field.py deleted file mode 100644 index 846dd5bd9ef..00000000000 --- a/osf/migrations/0249_schema_response_justification_to_text_field.py +++ /dev/null @@ -1,20 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.29 on 2022-08-03 13:47 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0248_artifact_tweaks'), - ] - - operations = [ - migrations.AlterField( - model_name='schemaresponse', - name='revision_justification', - field=models.TextField(blank=True, null=True), - ), - ] From f971149da7c14bd1dbdb37bae403e1cb81377c15 Mon Sep 17 00:00:00 2001 From: Longze Chen Date: Wed, 17 Aug 2022 15:13:24 -0400 Subject: [PATCH 22/72] Remove addon migrations --- addons/bitbucket/migrations/0001_initial.py | 56 -- .../migrations/0002_auto_20170808_1140.py | 40 -- .../migrations/0003_rename_deleted_field.py | 36 -- addons/box/migrations/0001_initial.py | 44 -- .../box/migrations/0002_auto_20170323_1534.py | 41 -- .../box/migrations/0003_auto_20170713_1125.py | 40 -- .../migrations/0004_rename_deleted_field.py | 36 -- addons/dataverse/migrations/0001_initial.py | 46 -- .../migrations/0002_auto_20170323_1534.py | 41 -- .../migrations/0003_auto_20170713_1125.py | 40 -- .../migrations/0004_rename_deleted_field.py | 36 -- addons/dropbox/migrations/0001_initial.py | 42 -- .../migrations/0002_auto_20170323_1534.py | 41 -- .../migrations/0003_auto_20170713_1125.py | 40 -- .../migrations/0004_rename_deleted_field.py | 36 -- addons/figshare/migrations/0001_initial.py | 44 -- .../migrations/0002_auto_20170323_1534.py | 41 -- .../migrations/0003_auto_20170713_1125.py | 40 -- .../migrations/0004_rename_deleted_field.py | 36 -- addons/forward/migrations/0001_initial.py | 33 -- .../migrations/0002_nodesettings_owner.py | 24 - .../migrations/0003_auto_20170713_1125.py | 29 - .../migrations/0004_rename_deleted_field.py | 26 - addons/github/migrations/0001_initial.py | 46 -- .../migrations/0002_auto_20170323_1534.py | 41 -- .../migrations/0003_auto_20170713_1125.py | 40 -- .../migrations/0004_rename_deleted_field.py | 36 -- addons/gitlab/migrations/0001_initial.py | 58 -- .../migrations/0002_auto_20171121_1426.py | 40 -- .../0003_add_schemes_to_schemeless_hosts.py | 32 -- .../migrations/0004_auto_20190627_2029.py | 36 -- addons/googledrive/migrations/0001_initial.py | 43 -- .../migrations/0002_auto_20170323_1534.py | 41 -- .../migrations/0003_auto_20170713_1125.py | 40 -- .../migrations/0004_rename_deleted_field.py | 36 -- addons/mendeley/migrations/0001_initial.py | 42 -- .../migrations/0002_auto_20170323_1534.py | 41 -- .../migrations/0003_auto_20170713_1125.py | 40 -- .../migrations/0004_rename_deleted_field.py | 36 -- addons/onedrive/migrations/0001_initial.py | 55 -- .../migrations/0002_auto_20171121_1426.py | 40 -- .../migrations/0003_rename_deleted_field.py | 36 -- .../migrations/0004_nodesettings_drive_id.py | 20 - addons/osfstorage/migrations/0001_initial.py | 28 - .../migrations/0002_auto_20170323_1534.py | 29 - .../migrations/0003_auto_20170713_1125.py | 29 - .../migrations/0004_storage_region_models.py | 63 --- .../migrations/0005_region_mfr_url.py | 21 - .../migrations/0006_rename_deleted_field.py | 36 -- addons/owncloud/migrations/0001_initial.py | 42 -- .../migrations/0002_auto_20170323_1534.py | 41 -- ..._trailing_slash_back_to_implict_folders.py | 33 -- .../migrations/0003_auto_20170713_1125.py | 40 -- .../migrations/0004_merge_20171203_1325.py | 16 - .../migrations/0005_rename_deleted_field.py | 36 -- addons/s3/migrations/0001_initial.py | 44 -- .../s3/migrations/0002_auto_20170323_1534.py | 41 -- .../s3/migrations/0003_auto_20170713_1125.py | 40 -- .../migrations/0004_rename_deleted_field.py | 36 -- addons/twofactor/migrations/0001_initial.py | 31 -- .../migrations/0002_usersettings_owner.py | 25 - .../migrations/0003_auto_20170713_1125.py | 29 - .../migrations/0004_rename_deleted_field.py | 26 - addons/wiki/migrations/0001_initial.py | 48 -- .../migrations/0002_auto_20170323_1534.py | 36 -- .../migrations/0003_auto_20170403_2228.py | 21 - .../0004_remove_nodewikipage_guid_string.py | 19 - .../migrations/0005_auto_20170713_1125.py | 40 -- .../migrations/0006_wikipage_wikiversion.py | 55 -- .../0007_nodewikipage_former_guid.py | 20 - .../0008_store_guid_on_nodewikipage.py | 40 -- .../migrations/0009_auto_20180302_1404.py | 19 - .../0010_migrate_node_wiki_pages.py | 510 ------------------ .../migrations/0011_auto_20180415_1649.py | 26 - .../migrations/0012_rename_deleted_field.py | 26 - addons/zotero/migrations/0001_initial.py | 42 -- .../migrations/0002_auto_20170323_1534.py | 41 -- .../migrations/0003_auto_20170713_1125.py | 40 -- .../0003_nodesettings_library_id.py | 20 - .../migrations/0004_merge_20180112_0836.py | 16 - ...zotero_personal_libraries_20180216_0849.py | 58 -- .../migrations/0006_rename_deleted_field.py | 36 -- 82 files changed, 3486 deletions(-) delete mode 100644 addons/bitbucket/migrations/0001_initial.py delete mode 100644 addons/bitbucket/migrations/0002_auto_20170808_1140.py delete mode 100644 addons/bitbucket/migrations/0003_rename_deleted_field.py delete mode 100644 addons/box/migrations/0001_initial.py delete mode 100644 addons/box/migrations/0002_auto_20170323_1534.py delete mode 100644 addons/box/migrations/0003_auto_20170713_1125.py delete mode 100644 addons/box/migrations/0004_rename_deleted_field.py delete mode 100644 addons/dataverse/migrations/0001_initial.py delete mode 100644 addons/dataverse/migrations/0002_auto_20170323_1534.py delete mode 100644 addons/dataverse/migrations/0003_auto_20170713_1125.py delete mode 100644 addons/dataverse/migrations/0004_rename_deleted_field.py delete mode 100644 addons/dropbox/migrations/0001_initial.py delete mode 100644 addons/dropbox/migrations/0002_auto_20170323_1534.py delete mode 100644 addons/dropbox/migrations/0003_auto_20170713_1125.py delete mode 100644 addons/dropbox/migrations/0004_rename_deleted_field.py delete mode 100644 addons/figshare/migrations/0001_initial.py delete mode 100644 addons/figshare/migrations/0002_auto_20170323_1534.py delete mode 100644 addons/figshare/migrations/0003_auto_20170713_1125.py delete mode 100644 addons/figshare/migrations/0004_rename_deleted_field.py delete mode 100644 addons/forward/migrations/0001_initial.py delete mode 100644 addons/forward/migrations/0002_nodesettings_owner.py delete mode 100644 addons/forward/migrations/0003_auto_20170713_1125.py delete mode 100644 addons/forward/migrations/0004_rename_deleted_field.py delete mode 100644 addons/github/migrations/0001_initial.py delete mode 100644 addons/github/migrations/0002_auto_20170323_1534.py delete mode 100644 addons/github/migrations/0003_auto_20170713_1125.py delete mode 100644 addons/github/migrations/0004_rename_deleted_field.py delete mode 100644 addons/gitlab/migrations/0001_initial.py delete mode 100644 addons/gitlab/migrations/0002_auto_20171121_1426.py delete mode 100644 addons/gitlab/migrations/0003_add_schemes_to_schemeless_hosts.py delete mode 100644 addons/gitlab/migrations/0004_auto_20190627_2029.py delete mode 100644 addons/googledrive/migrations/0001_initial.py delete mode 100644 addons/googledrive/migrations/0002_auto_20170323_1534.py delete mode 100644 addons/googledrive/migrations/0003_auto_20170713_1125.py delete mode 100644 addons/googledrive/migrations/0004_rename_deleted_field.py delete mode 100644 addons/mendeley/migrations/0001_initial.py delete mode 100644 addons/mendeley/migrations/0002_auto_20170323_1534.py delete mode 100644 addons/mendeley/migrations/0003_auto_20170713_1125.py delete mode 100644 addons/mendeley/migrations/0004_rename_deleted_field.py delete mode 100644 addons/onedrive/migrations/0001_initial.py delete mode 100644 addons/onedrive/migrations/0002_auto_20171121_1426.py delete mode 100644 addons/onedrive/migrations/0003_rename_deleted_field.py delete mode 100644 addons/onedrive/migrations/0004_nodesettings_drive_id.py delete mode 100644 addons/osfstorage/migrations/0001_initial.py delete mode 100644 addons/osfstorage/migrations/0002_auto_20170323_1534.py delete mode 100644 addons/osfstorage/migrations/0003_auto_20170713_1125.py delete mode 100644 addons/osfstorage/migrations/0004_storage_region_models.py delete mode 100644 addons/osfstorage/migrations/0005_region_mfr_url.py delete mode 100644 addons/osfstorage/migrations/0006_rename_deleted_field.py delete mode 100644 addons/owncloud/migrations/0001_initial.py delete mode 100644 addons/owncloud/migrations/0002_auto_20170323_1534.py delete mode 100644 addons/owncloud/migrations/0003_add_trailing_slash_back_to_implict_folders.py delete mode 100644 addons/owncloud/migrations/0003_auto_20170713_1125.py delete mode 100644 addons/owncloud/migrations/0004_merge_20171203_1325.py delete mode 100644 addons/owncloud/migrations/0005_rename_deleted_field.py delete mode 100644 addons/s3/migrations/0001_initial.py delete mode 100644 addons/s3/migrations/0002_auto_20170323_1534.py delete mode 100644 addons/s3/migrations/0003_auto_20170713_1125.py delete mode 100644 addons/s3/migrations/0004_rename_deleted_field.py delete mode 100644 addons/twofactor/migrations/0001_initial.py delete mode 100644 addons/twofactor/migrations/0002_usersettings_owner.py delete mode 100644 addons/twofactor/migrations/0003_auto_20170713_1125.py delete mode 100644 addons/twofactor/migrations/0004_rename_deleted_field.py delete mode 100644 addons/wiki/migrations/0001_initial.py delete mode 100644 addons/wiki/migrations/0002_auto_20170323_1534.py delete mode 100644 addons/wiki/migrations/0003_auto_20170403_2228.py delete mode 100644 addons/wiki/migrations/0004_remove_nodewikipage_guid_string.py delete mode 100644 addons/wiki/migrations/0005_auto_20170713_1125.py delete mode 100644 addons/wiki/migrations/0006_wikipage_wikiversion.py delete mode 100644 addons/wiki/migrations/0007_nodewikipage_former_guid.py delete mode 100644 addons/wiki/migrations/0008_store_guid_on_nodewikipage.py delete mode 100644 addons/wiki/migrations/0009_auto_20180302_1404.py delete mode 100644 addons/wiki/migrations/0010_migrate_node_wiki_pages.py delete mode 100644 addons/wiki/migrations/0011_auto_20180415_1649.py delete mode 100644 addons/wiki/migrations/0012_rename_deleted_field.py delete mode 100644 addons/zotero/migrations/0001_initial.py delete mode 100644 addons/zotero/migrations/0002_auto_20170323_1534.py delete mode 100644 addons/zotero/migrations/0003_auto_20170713_1125.py delete mode 100644 addons/zotero/migrations/0003_nodesettings_library_id.py delete mode 100644 addons/zotero/migrations/0004_merge_20180112_0836.py delete mode 100644 addons/zotero/migrations/0005_zotero_personal_libraries_20180216_0849.py delete mode 100644 addons/zotero/migrations/0006_rename_deleted_field.py diff --git a/addons/bitbucket/migrations/0001_initial.py b/addons/bitbucket/migrations/0001_initial.py deleted file mode 100644 index 9ee184730e4..00000000000 --- a/addons/bitbucket/migrations/0001_initial.py +++ /dev/null @@ -1,56 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.2 on 2017-07-07 15:19 -from __future__ import unicode_literals - -from django.conf import settings -from django.db import migrations, models -import django.db.models.deletion -import osf.models.base -import osf.utils.datetime_aware_jsonfield - - -class Migration(migrations.Migration): - - initial = True - - dependencies = [ - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ('osf', '0042_auto_20170707_1019'), - ] - - operations = [ - migrations.CreateModel( - name='NodeSettings', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), - ('deleted', models.BooleanField(default=False)), - ('user', models.TextField(blank=True, null=True)), - ('repo', models.TextField(blank=True, null=True)), - ('hook_id', models.TextField(blank=True, null=True)), - ('external_account', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='addons_bitbucket_node_settings', to='osf.ExternalAccount')), - ('owner', models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='addons_bitbucket_node_settings', to='osf.AbstractNode')), - ], - options={ - 'abstract': False, - }, - ), - migrations.CreateModel( - name='UserSettings', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), - ('deleted', models.BooleanField(default=False)), - ('oauth_grants', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=dict, encoder=osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONEncoder)), - ('owner', models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='addons_bitbucket_user_settings', to=settings.AUTH_USER_MODEL)), - ], - options={ - 'abstract': False, - }, - ), - migrations.AddField( - model_name='nodesettings', - name='user_settings', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='addons_bitbucket.UserSettings'), - ), - ] diff --git a/addons/bitbucket/migrations/0002_auto_20170808_1140.py b/addons/bitbucket/migrations/0002_auto_20170808_1140.py deleted file mode 100644 index de53c330e55..00000000000 --- a/addons/bitbucket/migrations/0002_auto_20170808_1140.py +++ /dev/null @@ -1,40 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.2 on 2017-08-08 16:40 -from __future__ import unicode_literals -import datetime -import pytz - -from django.db import migrations -import django_extensions.db.fields - - -class Migration(migrations.Migration): - - dependencies = [ - ('addons_bitbucket', '0001_initial'), - ] - - operations = [ - migrations.AddField( - model_name='nodesettings', - name='created', - field=django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, default=datetime.datetime(1970, 1, 1, 0, 0, tzinfo=pytz.utc), verbose_name='created'), - preserve_default=False, - ), - migrations.AddField( - model_name='nodesettings', - name='modified', - field=django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified'), - ), - migrations.AddField( - model_name='usersettings', - name='created', - field=django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, default=datetime.datetime(1970, 1, 1, 0, 0, tzinfo=pytz.utc), verbose_name='created'), - preserve_default=False, - ), - migrations.AddField( - model_name='usersettings', - name='modified', - field=django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified'), - ), - ] diff --git a/addons/bitbucket/migrations/0003_rename_deleted_field.py b/addons/bitbucket/migrations/0003_rename_deleted_field.py deleted file mode 100644 index 7d109973199..00000000000 --- a/addons/bitbucket/migrations/0003_rename_deleted_field.py +++ /dev/null @@ -1,36 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.15 on 2019-06-27 20:29 -from __future__ import unicode_literals - -from django.db import migrations -import osf.utils.fields - - -class Migration(migrations.Migration): - - dependencies = [ - ('addons_bitbucket', '0002_auto_20170808_1140'), - ] - - operations = [ - migrations.RenameField( - model_name='nodesettings', - new_name='is_deleted', - old_name='deleted', - ), - migrations.RenameField( - model_name='usersettings', - new_name='is_deleted', - old_name='deleted', - ), - migrations.AddField( - model_name='nodesettings', - name='deleted', - field=osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True), - ), - migrations.AddField( - model_name='usersettings', - name='deleted', - field=osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True), - ), - ] diff --git a/addons/box/migrations/0001_initial.py b/addons/box/migrations/0001_initial.py deleted file mode 100644 index 3bc2dd525ce..00000000000 --- a/addons/box/migrations/0001_initial.py +++ /dev/null @@ -1,44 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9 on 2017-03-23 20:34 -from __future__ import unicode_literals - -from django.db import migrations, models -import osf.models.base -import osf.utils.datetime_aware_jsonfield - - -class Migration(migrations.Migration): - - initial = True - - dependencies = [ - ] - - operations = [ - migrations.CreateModel( - name='NodeSettings', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), - ('deleted', models.BooleanField(default=False)), - ('folder_id', models.TextField(blank=True, null=True)), - ('folder_name', models.TextField(blank=True, null=True)), - ('folder_path', models.TextField(blank=True, null=True)), - ], - options={ - 'abstract': False, - }, - ), - migrations.CreateModel( - name='UserSettings', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), - ('deleted', models.BooleanField(default=False)), - ('oauth_grants', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=dict)), - ], - options={ - 'abstract': False, - }, - ), - ] diff --git a/addons/box/migrations/0002_auto_20170323_1534.py b/addons/box/migrations/0002_auto_20170323_1534.py deleted file mode 100644 index c0a358d0734..00000000000 --- a/addons/box/migrations/0002_auto_20170323_1534.py +++ /dev/null @@ -1,41 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9 on 2017-03-23 20:34 -from __future__ import unicode_literals - -from django.conf import settings -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - initial = True - - dependencies = [ - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ('osf', '0001_initial'), - ('addons_box', '0001_initial'), - ] - - operations = [ - migrations.AddField( - model_name='usersettings', - name='owner', - field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='addons_box_user_settings', to=settings.AUTH_USER_MODEL), - ), - migrations.AddField( - model_name='nodesettings', - name='external_account', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='addons_box_node_settings', to='osf.ExternalAccount'), - ), - migrations.AddField( - model_name='nodesettings', - name='owner', - field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='addons_box_node_settings', to='osf.AbstractNode'), - ), - migrations.AddField( - model_name='nodesettings', - name='user_settings', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='addons_box.UserSettings'), - ), - ] diff --git a/addons/box/migrations/0003_auto_20170713_1125.py b/addons/box/migrations/0003_auto_20170713_1125.py deleted file mode 100644 index 9dab29b4df2..00000000000 --- a/addons/box/migrations/0003_auto_20170713_1125.py +++ /dev/null @@ -1,40 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.2 on 2017-07-13 16:25 -from __future__ import unicode_literals -import pytz - -import datetime -from django.db import migrations -import django_extensions.db.fields - - -class Migration(migrations.Migration): - - dependencies = [ - ('addons_box', '0002_auto_20170323_1534'), - ] - - operations = [ - migrations.AddField( - model_name='nodesettings', - name='created', - field=django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, default=datetime.datetime(1970, 1, 1, 0, 0, tzinfo=pytz.utc), verbose_name='created'), - preserve_default=False, - ), - migrations.AddField( - model_name='nodesettings', - name='modified', - field=django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified'), - ), - migrations.AddField( - model_name='usersettings', - name='created', - field=django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, default=datetime.datetime(1970, 1, 1, 0, 0, tzinfo=pytz.utc), verbose_name='created'), - preserve_default=False, - ), - migrations.AddField( - model_name='usersettings', - name='modified', - field=django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified'), - ), - ] diff --git a/addons/box/migrations/0004_rename_deleted_field.py b/addons/box/migrations/0004_rename_deleted_field.py deleted file mode 100644 index c4a358452d6..00000000000 --- a/addons/box/migrations/0004_rename_deleted_field.py +++ /dev/null @@ -1,36 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.15 on 2019-06-27 20:29 -from __future__ import unicode_literals - -from django.db import migrations -import osf.utils.fields - - -class Migration(migrations.Migration): - - dependencies = [ - ('addons_box', '0003_auto_20170713_1125'), - ] - - operations = [ - migrations.RenameField( - model_name='nodesettings', - new_name='is_deleted', - old_name='deleted', - ), - migrations.RenameField( - model_name='usersettings', - new_name='is_deleted', - old_name='deleted', - ), - migrations.AddField( - model_name='nodesettings', - name='deleted', - field=osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True), - ), - migrations.AddField( - model_name='usersettings', - name='deleted', - field=osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True), - ), - ] diff --git a/addons/dataverse/migrations/0001_initial.py b/addons/dataverse/migrations/0001_initial.py deleted file mode 100644 index 9ecb0eae070..00000000000 --- a/addons/dataverse/migrations/0001_initial.py +++ /dev/null @@ -1,46 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9 on 2017-03-23 20:34 -from __future__ import unicode_literals - -from django.db import migrations, models -import osf.models.base -import osf.utils.datetime_aware_jsonfield - - -class Migration(migrations.Migration): - - initial = True - - dependencies = [ - ] - - operations = [ - migrations.CreateModel( - name='NodeSettings', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), - ('deleted', models.BooleanField(default=False)), - ('dataverse_alias', models.TextField(blank=True, null=True)), - ('dataverse', models.TextField(blank=True, null=True)), - ('dataset_doi', models.TextField(blank=True, null=True)), - ('_dataset_id', models.TextField(blank=True, null=True)), - ('dataset', models.TextField(blank=True, null=True)), - ], - options={ - 'abstract': False, - }, - ), - migrations.CreateModel( - name='UserSettings', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), - ('deleted', models.BooleanField(default=False)), - ('oauth_grants', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=dict)), - ], - options={ - 'abstract': False, - }, - ), - ] diff --git a/addons/dataverse/migrations/0002_auto_20170323_1534.py b/addons/dataverse/migrations/0002_auto_20170323_1534.py deleted file mode 100644 index 9d61c2effcc..00000000000 --- a/addons/dataverse/migrations/0002_auto_20170323_1534.py +++ /dev/null @@ -1,41 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9 on 2017-03-23 20:34 -from __future__ import unicode_literals - -from django.conf import settings -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - initial = True - - dependencies = [ - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ('osf', '0001_initial'), - ('addons_dataverse', '0001_initial'), - ] - - operations = [ - migrations.AddField( - model_name='usersettings', - name='owner', - field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='addons_dataverse_user_settings', to=settings.AUTH_USER_MODEL), - ), - migrations.AddField( - model_name='nodesettings', - name='external_account', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='addons_dataverse_node_settings', to='osf.ExternalAccount'), - ), - migrations.AddField( - model_name='nodesettings', - name='owner', - field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='addons_dataverse_node_settings', to='osf.AbstractNode'), - ), - migrations.AddField( - model_name='nodesettings', - name='user_settings', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='addons_dataverse.UserSettings'), - ), - ] diff --git a/addons/dataverse/migrations/0003_auto_20170713_1125.py b/addons/dataverse/migrations/0003_auto_20170713_1125.py deleted file mode 100644 index e17632303bd..00000000000 --- a/addons/dataverse/migrations/0003_auto_20170713_1125.py +++ /dev/null @@ -1,40 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.2 on 2017-07-13 16:25 -from __future__ import unicode_literals -import pytz - -import datetime -from django.db import migrations -import django_extensions.db.fields - - -class Migration(migrations.Migration): - - dependencies = [ - ('addons_dataverse', '0002_auto_20170323_1534'), - ] - - operations = [ - migrations.AddField( - model_name='nodesettings', - name='created', - field=django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, default=datetime.datetime(1970, 1, 1, 0, 0, tzinfo=pytz.utc), verbose_name='created'), - preserve_default=False, - ), - migrations.AddField( - model_name='nodesettings', - name='modified', - field=django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified'), - ), - migrations.AddField( - model_name='usersettings', - name='created', - field=django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, default=datetime.datetime(1970, 1, 1, 0, 0, tzinfo=pytz.utc), verbose_name='created'), - preserve_default=False, - ), - migrations.AddField( - model_name='usersettings', - name='modified', - field=django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified'), - ), - ] diff --git a/addons/dataverse/migrations/0004_rename_deleted_field.py b/addons/dataverse/migrations/0004_rename_deleted_field.py deleted file mode 100644 index 893865fad4d..00000000000 --- a/addons/dataverse/migrations/0004_rename_deleted_field.py +++ /dev/null @@ -1,36 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.15 on 2019-06-27 20:29 -from __future__ import unicode_literals - -from django.db import migrations -import osf.utils.fields - - -class Migration(migrations.Migration): - - dependencies = [ - ('addons_dataverse', '0003_auto_20170713_1125'), - ] - - operations = [ - migrations.RenameField( - model_name='nodesettings', - new_name='is_deleted', - old_name='deleted', - ), - migrations.RenameField( - model_name='usersettings', - new_name='is_deleted', - old_name='deleted', - ), - migrations.AddField( - model_name='nodesettings', - name='deleted', - field=osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True), - ), - migrations.AddField( - model_name='usersettings', - name='deleted', - field=osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True), - ), - ] diff --git a/addons/dropbox/migrations/0001_initial.py b/addons/dropbox/migrations/0001_initial.py deleted file mode 100644 index 21c6ac8494c..00000000000 --- a/addons/dropbox/migrations/0001_initial.py +++ /dev/null @@ -1,42 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9 on 2017-03-23 20:34 -from __future__ import unicode_literals - -from django.db import migrations, models -import osf.models.base -import osf.utils.datetime_aware_jsonfield - - -class Migration(migrations.Migration): - - initial = True - - dependencies = [ - ] - - operations = [ - migrations.CreateModel( - name='NodeSettings', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), - ('deleted', models.BooleanField(default=False)), - ('folder', models.TextField(blank=True, null=True)), - ], - options={ - 'abstract': False, - }, - ), - migrations.CreateModel( - name='UserSettings', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), - ('deleted', models.BooleanField(default=False)), - ('oauth_grants', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=dict)), - ], - options={ - 'abstract': False, - }, - ), - ] diff --git a/addons/dropbox/migrations/0002_auto_20170323_1534.py b/addons/dropbox/migrations/0002_auto_20170323_1534.py deleted file mode 100644 index 4f8c0c7f0ec..00000000000 --- a/addons/dropbox/migrations/0002_auto_20170323_1534.py +++ /dev/null @@ -1,41 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9 on 2017-03-23 20:34 -from __future__ import unicode_literals - -from django.conf import settings -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - initial = True - - dependencies = [ - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ('osf', '0001_initial'), - ('addons_dropbox', '0001_initial'), - ] - - operations = [ - migrations.AddField( - model_name='usersettings', - name='owner', - field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='addons_dropbox_user_settings', to=settings.AUTH_USER_MODEL), - ), - migrations.AddField( - model_name='nodesettings', - name='external_account', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='addons_dropbox_node_settings', to='osf.ExternalAccount'), - ), - migrations.AddField( - model_name='nodesettings', - name='owner', - field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='addons_dropbox_node_settings', to='osf.AbstractNode'), - ), - migrations.AddField( - model_name='nodesettings', - name='user_settings', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='addons_dropbox.UserSettings'), - ), - ] diff --git a/addons/dropbox/migrations/0003_auto_20170713_1125.py b/addons/dropbox/migrations/0003_auto_20170713_1125.py deleted file mode 100644 index ce0fcbb8958..00000000000 --- a/addons/dropbox/migrations/0003_auto_20170713_1125.py +++ /dev/null @@ -1,40 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.2 on 2017-07-13 16:25 -from __future__ import unicode_literals -import pytz - -import datetime -from django.db import migrations -import django_extensions.db.fields - - -class Migration(migrations.Migration): - - dependencies = [ - ('addons_dropbox', '0002_auto_20170323_1534'), - ] - - operations = [ - migrations.AddField( - model_name='nodesettings', - name='created', - field=django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, default=datetime.datetime(1970, 1, 1, 0, 0, tzinfo=pytz.utc), verbose_name='created'), - preserve_default=False, - ), - migrations.AddField( - model_name='nodesettings', - name='modified', - field=django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified'), - ), - migrations.AddField( - model_name='usersettings', - name='created', - field=django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, default=datetime.datetime(1970, 1, 1, 0, 0, tzinfo=pytz.utc), verbose_name='created'), - preserve_default=False, - ), - migrations.AddField( - model_name='usersettings', - name='modified', - field=django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified'), - ), - ] diff --git a/addons/dropbox/migrations/0004_rename_deleted_field.py b/addons/dropbox/migrations/0004_rename_deleted_field.py deleted file mode 100644 index 5a0c8aa1f71..00000000000 --- a/addons/dropbox/migrations/0004_rename_deleted_field.py +++ /dev/null @@ -1,36 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.15 on 2019-06-27 20:29 -from __future__ import unicode_literals - -from django.db import migrations -import osf.utils.fields - - -class Migration(migrations.Migration): - - dependencies = [ - ('addons_dropbox', '0003_auto_20170713_1125'), - ] - - operations = [ - migrations.RenameField( - model_name='nodesettings', - new_name='is_deleted', - old_name='deleted', - ), - migrations.RenameField( - model_name='usersettings', - new_name='is_deleted', - old_name='deleted', - ), - migrations.AddField( - model_name='nodesettings', - name='deleted', - field=osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True), - ), - migrations.AddField( - model_name='usersettings', - name='deleted', - field=osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True), - ), - ] diff --git a/addons/figshare/migrations/0001_initial.py b/addons/figshare/migrations/0001_initial.py deleted file mode 100644 index 3bc2dd525ce..00000000000 --- a/addons/figshare/migrations/0001_initial.py +++ /dev/null @@ -1,44 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9 on 2017-03-23 20:34 -from __future__ import unicode_literals - -from django.db import migrations, models -import osf.models.base -import osf.utils.datetime_aware_jsonfield - - -class Migration(migrations.Migration): - - initial = True - - dependencies = [ - ] - - operations = [ - migrations.CreateModel( - name='NodeSettings', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), - ('deleted', models.BooleanField(default=False)), - ('folder_id', models.TextField(blank=True, null=True)), - ('folder_name', models.TextField(blank=True, null=True)), - ('folder_path', models.TextField(blank=True, null=True)), - ], - options={ - 'abstract': False, - }, - ), - migrations.CreateModel( - name='UserSettings', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), - ('deleted', models.BooleanField(default=False)), - ('oauth_grants', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=dict)), - ], - options={ - 'abstract': False, - }, - ), - ] diff --git a/addons/figshare/migrations/0002_auto_20170323_1534.py b/addons/figshare/migrations/0002_auto_20170323_1534.py deleted file mode 100644 index efb602d67ca..00000000000 --- a/addons/figshare/migrations/0002_auto_20170323_1534.py +++ /dev/null @@ -1,41 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9 on 2017-03-23 20:34 -from __future__ import unicode_literals - -from django.conf import settings -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - initial = True - - dependencies = [ - ('addons_figshare', '0001_initial'), - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ('osf', '0001_initial'), - ] - - operations = [ - migrations.AddField( - model_name='usersettings', - name='owner', - field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='addons_figshare_user_settings', to=settings.AUTH_USER_MODEL), - ), - migrations.AddField( - model_name='nodesettings', - name='external_account', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='addons_figshare_node_settings', to='osf.ExternalAccount'), - ), - migrations.AddField( - model_name='nodesettings', - name='owner', - field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='addons_figshare_node_settings', to='osf.AbstractNode'), - ), - migrations.AddField( - model_name='nodesettings', - name='user_settings', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='addons_figshare.UserSettings'), - ), - ] diff --git a/addons/figshare/migrations/0003_auto_20170713_1125.py b/addons/figshare/migrations/0003_auto_20170713_1125.py deleted file mode 100644 index a132859a90b..00000000000 --- a/addons/figshare/migrations/0003_auto_20170713_1125.py +++ /dev/null @@ -1,40 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.2 on 2017-07-13 16:25 -from __future__ import unicode_literals -import pytz - -import datetime -from django.db import migrations -import django_extensions.db.fields - - -class Migration(migrations.Migration): - - dependencies = [ - ('addons_figshare', '0002_auto_20170323_1534'), - ] - - operations = [ - migrations.AddField( - model_name='nodesettings', - name='created', - field=django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, default=datetime.datetime(1970, 1, 1, 0, 0, tzinfo=pytz.utc), verbose_name='created'), - preserve_default=False, - ), - migrations.AddField( - model_name='nodesettings', - name='modified', - field=django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified'), - ), - migrations.AddField( - model_name='usersettings', - name='created', - field=django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, default=datetime.datetime(1970, 1, 1, 0, 0, tzinfo=pytz.utc), verbose_name='created'), - preserve_default=False, - ), - migrations.AddField( - model_name='usersettings', - name='modified', - field=django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified'), - ), - ] diff --git a/addons/figshare/migrations/0004_rename_deleted_field.py b/addons/figshare/migrations/0004_rename_deleted_field.py deleted file mode 100644 index e801ec2efd3..00000000000 --- a/addons/figshare/migrations/0004_rename_deleted_field.py +++ /dev/null @@ -1,36 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.15 on 2019-06-27 20:29 -from __future__ import unicode_literals - -from django.db import migrations -import osf.utils.fields - - -class Migration(migrations.Migration): - - dependencies = [ - ('addons_figshare', '0003_auto_20170713_1125'), - ] - - operations = [ - migrations.RenameField( - model_name='nodesettings', - new_name='is_deleted', - old_name='deleted', - ), - migrations.RenameField( - model_name='usersettings', - new_name='is_deleted', - old_name='deleted', - ), - migrations.AddField( - model_name='nodesettings', - name='deleted', - field=osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True), - ), - migrations.AddField( - model_name='usersettings', - name='deleted', - field=osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True), - ), - ] diff --git a/addons/forward/migrations/0001_initial.py b/addons/forward/migrations/0001_initial.py deleted file mode 100644 index 312bd3f6bc6..00000000000 --- a/addons/forward/migrations/0001_initial.py +++ /dev/null @@ -1,33 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9 on 2017-03-23 20:34 -from __future__ import unicode_literals - -import dirtyfields.dirtyfields -from django.db import migrations, models -import osf.models.base -import osf.models.validators - - -class Migration(migrations.Migration): - - initial = True - - dependencies = [ - ] - - operations = [ - migrations.CreateModel( - name='NodeSettings', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), - ('deleted', models.BooleanField(default=False)), - ('url', models.URLField(blank=True, max_length=255, null=True)), - ('label', models.TextField(blank=True, null=True, validators=[osf.models.validators.validate_no_html])), - ], - options={ - 'abstract': False, - }, - bases=(dirtyfields.dirtyfields.DirtyFieldsMixin, models.Model), - ), - ] diff --git a/addons/forward/migrations/0002_nodesettings_owner.py b/addons/forward/migrations/0002_nodesettings_owner.py deleted file mode 100644 index 3f54ddcea69..00000000000 --- a/addons/forward/migrations/0002_nodesettings_owner.py +++ /dev/null @@ -1,24 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9 on 2017-03-23 20:34 -from __future__ import unicode_literals - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - initial = True - - dependencies = [ - ('osf', '0001_initial'), - ('addons_forward', '0001_initial'), - ] - - operations = [ - migrations.AddField( - model_name='nodesettings', - name='owner', - field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='addons_forward_node_settings', to='osf.AbstractNode'), - ), - ] diff --git a/addons/forward/migrations/0003_auto_20170713_1125.py b/addons/forward/migrations/0003_auto_20170713_1125.py deleted file mode 100644 index add7aa751da..00000000000 --- a/addons/forward/migrations/0003_auto_20170713_1125.py +++ /dev/null @@ -1,29 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.2 on 2017-07-13 16:25 -from __future__ import unicode_literals -import pytz - -import datetime -from django.db import migrations -import django_extensions.db.fields - - -class Migration(migrations.Migration): - - dependencies = [ - ('addons_forward', '0002_nodesettings_owner'), - ] - - operations = [ - migrations.AddField( - model_name='nodesettings', - name='created', - field=django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, default=datetime.datetime(1970, 1, 1, 0, 0, tzinfo=pytz.utc), verbose_name='created'), - preserve_default=False, - ), - migrations.AddField( - model_name='nodesettings', - name='modified', - field=django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified'), - ), - ] diff --git a/addons/forward/migrations/0004_rename_deleted_field.py b/addons/forward/migrations/0004_rename_deleted_field.py deleted file mode 100644 index 5156df292bf..00000000000 --- a/addons/forward/migrations/0004_rename_deleted_field.py +++ /dev/null @@ -1,26 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.15 on 2019-06-27 20:29 -from __future__ import unicode_literals - -from django.db import migrations -import osf.utils.fields - - -class Migration(migrations.Migration): - - dependencies = [ - ('addons_forward', '0003_auto_20170713_1125'), - ] - - operations = [ - migrations.RenameField( - model_name='nodesettings', - new_name='is_deleted', - old_name='deleted', - ), - migrations.AddField( - model_name='nodesettings', - name='deleted', - field=osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True), - ), - ] diff --git a/addons/github/migrations/0001_initial.py b/addons/github/migrations/0001_initial.py deleted file mode 100644 index 57883b46fd6..00000000000 --- a/addons/github/migrations/0001_initial.py +++ /dev/null @@ -1,46 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9 on 2017-03-23 20:34 -from __future__ import unicode_literals - -from django.db import migrations, models -import osf.models.base -import osf.utils.datetime_aware_jsonfield - - -class Migration(migrations.Migration): - - initial = True - - dependencies = [ - ] - - operations = [ - migrations.CreateModel( - name='NodeSettings', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), - ('deleted', models.BooleanField(default=False)), - ('user', models.TextField(blank=True, null=True)), - ('repo', models.TextField(blank=True, null=True)), - ('hook_id', models.TextField(blank=True, null=True)), - ('hook_secret', models.TextField(blank=True, null=True)), - ('registration_data', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=dict, null=True)), - ], - options={ - 'abstract': False, - }, - ), - migrations.CreateModel( - name='UserSettings', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), - ('deleted', models.BooleanField(default=False)), - ('oauth_grants', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=dict)), - ], - options={ - 'abstract': False, - }, - ), - ] diff --git a/addons/github/migrations/0002_auto_20170323_1534.py b/addons/github/migrations/0002_auto_20170323_1534.py deleted file mode 100644 index 2eaa4a76de9..00000000000 --- a/addons/github/migrations/0002_auto_20170323_1534.py +++ /dev/null @@ -1,41 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9 on 2017-03-23 20:34 -from __future__ import unicode_literals - -from django.conf import settings -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - initial = True - - dependencies = [ - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ('osf', '0001_initial'), - ('addons_github', '0001_initial'), - ] - - operations = [ - migrations.AddField( - model_name='usersettings', - name='owner', - field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='addons_github_user_settings', to=settings.AUTH_USER_MODEL), - ), - migrations.AddField( - model_name='nodesettings', - name='external_account', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='addons_github_node_settings', to='osf.ExternalAccount'), - ), - migrations.AddField( - model_name='nodesettings', - name='owner', - field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='addons_github_node_settings', to='osf.AbstractNode'), - ), - migrations.AddField( - model_name='nodesettings', - name='user_settings', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='addons_github.UserSettings'), - ), - ] diff --git a/addons/github/migrations/0003_auto_20170713_1125.py b/addons/github/migrations/0003_auto_20170713_1125.py deleted file mode 100644 index 084e1b73a7d..00000000000 --- a/addons/github/migrations/0003_auto_20170713_1125.py +++ /dev/null @@ -1,40 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.2 on 2017-07-13 16:25 -from __future__ import unicode_literals -import pytz - -import datetime -from django.db import migrations -import django_extensions.db.fields - - -class Migration(migrations.Migration): - - dependencies = [ - ('addons_github', '0002_auto_20170323_1534'), - ] - - operations = [ - migrations.AddField( - model_name='nodesettings', - name='created', - field=django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, default=datetime.datetime(1970, 1, 1, 0, 0, tzinfo=pytz.utc), verbose_name='created'), - preserve_default=False, - ), - migrations.AddField( - model_name='nodesettings', - name='modified', - field=django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified'), - ), - migrations.AddField( - model_name='usersettings', - name='created', - field=django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, default=datetime.datetime(1970, 1, 1, 0, 0, tzinfo=pytz.utc), verbose_name='created'), - preserve_default=False, - ), - migrations.AddField( - model_name='usersettings', - name='modified', - field=django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified'), - ), - ] diff --git a/addons/github/migrations/0004_rename_deleted_field.py b/addons/github/migrations/0004_rename_deleted_field.py deleted file mode 100644 index 21852a0dbdd..00000000000 --- a/addons/github/migrations/0004_rename_deleted_field.py +++ /dev/null @@ -1,36 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.15 on 2019-06-27 20:29 -from __future__ import unicode_literals - -from django.db import migrations -import osf.utils.fields - - -class Migration(migrations.Migration): - - dependencies = [ - ('addons_github', '0003_auto_20170713_1125'), - ] - - operations = [ - migrations.RenameField( - model_name='nodesettings', - new_name='is_deleted', - old_name='deleted', - ), - migrations.RenameField( - model_name='usersettings', - new_name='is_deleted', - old_name='deleted', - ), - migrations.AddField( - model_name='nodesettings', - name='deleted', - field=osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True), - ), - migrations.AddField( - model_name='usersettings', - name='deleted', - field=osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True), - ), - ] diff --git a/addons/gitlab/migrations/0001_initial.py b/addons/gitlab/migrations/0001_initial.py deleted file mode 100644 index ea4946e463e..00000000000 --- a/addons/gitlab/migrations/0001_initial.py +++ /dev/null @@ -1,58 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.4 on 2017-10-24 18:30 -from __future__ import unicode_literals - -from django.conf import settings -from django.db import migrations, models -import django.db.models.deletion -import osf.models.base -import osf.utils.datetime_aware_jsonfield - - -class Migration(migrations.Migration): - - initial = True - - dependencies = [ - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ('osf', '0065_auto_20171024_1330'), - ] - - operations = [ - migrations.CreateModel( - name='NodeSettings', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), - ('deleted', models.BooleanField(default=False)), - ('user', models.TextField(blank=True, null=True)), - ('repo', models.TextField(blank=True, null=True)), - ('repo_id', models.TextField(blank=True, null=True)), - ('hook_id', models.TextField(blank=True, null=True)), - ('hook_secret', models.TextField(blank=True, null=True)), - ('external_account', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='addons_gitlab_node_settings', to='osf.ExternalAccount')), - ('owner', models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='addons_gitlab_node_settings', to='osf.AbstractNode')), - ], - options={ - 'abstract': False, - }, - ), - migrations.CreateModel( - name='UserSettings', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), - ('deleted', models.BooleanField(default=False)), - ('oauth_grants', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=dict, encoder=osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONEncoder)), - ('owner', models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='addons_gitlab_user_settings', to=settings.AUTH_USER_MODEL)), - ], - options={ - 'abstract': False, - }, - ), - migrations.AddField( - model_name='nodesettings', - name='user_settings', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='addons_gitlab.UserSettings'), - ), - ] diff --git a/addons/gitlab/migrations/0002_auto_20171121_1426.py b/addons/gitlab/migrations/0002_auto_20171121_1426.py deleted file mode 100644 index 3f0839bfb6c..00000000000 --- a/addons/gitlab/migrations/0002_auto_20171121_1426.py +++ /dev/null @@ -1,40 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.7 on 2017-11-21 20:26 -from __future__ import unicode_literals -import datetime -import pytz - -from django.db import migrations -import django_extensions.db.fields - - -class Migration(migrations.Migration): - - dependencies = [ - ('addons_gitlab', '0001_initial'), - ] - - operations = [ - migrations.AddField( - model_name='nodesettings', - name='created', - field=django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, default=datetime.datetime(1970, 1, 1, 0, 0, tzinfo=pytz.utc), verbose_name='created'), - preserve_default=False, - ), - migrations.AddField( - model_name='nodesettings', - name='modified', - field=django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified'), - ), - migrations.AddField( - model_name='usersettings', - name='created', - field=django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, default=datetime.datetime(1970, 1, 1, 0, 0, tzinfo=pytz.utc), verbose_name='created'), - preserve_default=False, - ), - migrations.AddField( - model_name='usersettings', - name='modified', - field=django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified'), - ), - ] diff --git a/addons/gitlab/migrations/0003_add_schemes_to_schemeless_hosts.py b/addons/gitlab/migrations/0003_add_schemes_to_schemeless_hosts.py deleted file mode 100644 index a173beb0be5..00000000000 --- a/addons/gitlab/migrations/0003_add_schemes_to_schemeless_hosts.py +++ /dev/null @@ -1,32 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.13 on 2018-07-16 18:14 -from __future__ import unicode_literals - -import logging - -from django.db import migrations - -logger = logging.getLogger(__name__) - -def add_http_scheme_to_gitlab_host(apps, schema_editor): - ExternalAccount = apps.get_model('osf', 'ExternalAccount') - gitlab_accounts = ExternalAccount.objects.filter(provider='gitlab') - for gitlab_account in gitlab_accounts: - if not gitlab_account.oauth_secret.startswith('https://'): - gitlab_account.oauth_secret = 'https://{}'.format(gitlab_account.oauth_secret) - gitlab_account.save() - - -def revert_add_http_scheme_to_gitlab_host(apps, schema_editor): - logger.warning('No reverse migration for 0003_add_schemes_to_schemeless_hosts.py because we can\'t identify' - ' hostnames that were contained schemes before the initial migration.') - -class Migration(migrations.Migration): - - dependencies = [ - ('addons_gitlab', '0002_auto_20171121_1426'), - ] - - operations = [ - migrations.RunPython(add_http_scheme_to_gitlab_host, revert_add_http_scheme_to_gitlab_host) - ] diff --git a/addons/gitlab/migrations/0004_auto_20190627_2029.py b/addons/gitlab/migrations/0004_auto_20190627_2029.py deleted file mode 100644 index b8294b8472b..00000000000 --- a/addons/gitlab/migrations/0004_auto_20190627_2029.py +++ /dev/null @@ -1,36 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.15 on 2019-06-27 20:29 -from __future__ import unicode_literals - -from django.db import migrations -import osf.utils.fields - - -class Migration(migrations.Migration): - - dependencies = [ - ('addons_gitlab', '0003_add_schemes_to_schemeless_hosts'), - ] - - operations = [ - migrations.RenameField( - model_name='nodesettings', - new_name='is_deleted', - old_name='deleted', - ), - migrations.RenameField( - model_name='usersettings', - new_name='is_deleted', - old_name='deleted', - ), - migrations.AddField( - model_name='nodesettings', - name='deleted', - field=osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True), - ), - migrations.AddField( - model_name='usersettings', - name='deleted', - field=osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True), - ), - ] diff --git a/addons/googledrive/migrations/0001_initial.py b/addons/googledrive/migrations/0001_initial.py deleted file mode 100644 index 7dee99b2bac..00000000000 --- a/addons/googledrive/migrations/0001_initial.py +++ /dev/null @@ -1,43 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9 on 2017-03-23 20:34 -from __future__ import unicode_literals - -from django.db import migrations, models -import osf.models.base -import osf.utils.datetime_aware_jsonfield - - -class Migration(migrations.Migration): - - initial = True - - dependencies = [ - ] - - operations = [ - migrations.CreateModel( - name='NodeSettings', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), - ('deleted', models.BooleanField(default=False)), - ('folder_id', models.TextField(blank=True, null=True)), - ('folder_path', models.TextField(blank=True, null=True)), - ], - options={ - 'abstract': False, - }, - ), - migrations.CreateModel( - name='UserSettings', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), - ('deleted', models.BooleanField(default=False)), - ('oauth_grants', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=dict)), - ], - options={ - 'abstract': False, - }, - ), - ] diff --git a/addons/googledrive/migrations/0002_auto_20170323_1534.py b/addons/googledrive/migrations/0002_auto_20170323_1534.py deleted file mode 100644 index 44ec1e16540..00000000000 --- a/addons/googledrive/migrations/0002_auto_20170323_1534.py +++ /dev/null @@ -1,41 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9 on 2017-03-23 20:34 -from __future__ import unicode_literals - -from django.conf import settings -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - initial = True - - dependencies = [ - ('addons_googledrive', '0001_initial'), - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ('osf', '0001_initial'), - ] - - operations = [ - migrations.AddField( - model_name='usersettings', - name='owner', - field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='addons_googledrive_user_settings', to=settings.AUTH_USER_MODEL), - ), - migrations.AddField( - model_name='nodesettings', - name='external_account', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='addons_googledrive_node_settings', to='osf.ExternalAccount'), - ), - migrations.AddField( - model_name='nodesettings', - name='owner', - field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='addons_googledrive_node_settings', to='osf.AbstractNode'), - ), - migrations.AddField( - model_name='nodesettings', - name='user_settings', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='addons_googledrive.UserSettings'), - ), - ] diff --git a/addons/googledrive/migrations/0003_auto_20170713_1125.py b/addons/googledrive/migrations/0003_auto_20170713_1125.py deleted file mode 100644 index 8dde20244ca..00000000000 --- a/addons/googledrive/migrations/0003_auto_20170713_1125.py +++ /dev/null @@ -1,40 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.2 on 2017-07-13 16:25 -from __future__ import unicode_literals -import pytz - -import datetime -from django.db import migrations -import django_extensions.db.fields - - -class Migration(migrations.Migration): - - dependencies = [ - ('addons_googledrive', '0002_auto_20170323_1534'), - ] - - operations = [ - migrations.AddField( - model_name='nodesettings', - name='created', - field=django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, default=datetime.datetime(1970, 1, 1, 0, 0, tzinfo=pytz.utc), verbose_name='created'), - preserve_default=False, - ), - migrations.AddField( - model_name='nodesettings', - name='modified', - field=django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified'), - ), - migrations.AddField( - model_name='usersettings', - name='created', - field=django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, default=datetime.datetime(1970, 1, 1, 0, 0, tzinfo=pytz.utc), verbose_name='created'), - preserve_default=False, - ), - migrations.AddField( - model_name='usersettings', - name='modified', - field=django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified'), - ), - ] diff --git a/addons/googledrive/migrations/0004_rename_deleted_field.py b/addons/googledrive/migrations/0004_rename_deleted_field.py deleted file mode 100644 index 7b20e7504c7..00000000000 --- a/addons/googledrive/migrations/0004_rename_deleted_field.py +++ /dev/null @@ -1,36 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.15 on 2019-06-27 20:29 -from __future__ import unicode_literals - -from django.db import migrations -import osf.utils.fields - - -class Migration(migrations.Migration): - - dependencies = [ - ('addons_googledrive', '0003_auto_20170713_1125'), - ] - - operations = [ - migrations.RenameField( - model_name='nodesettings', - new_name='is_deleted', - old_name='deleted', - ), - migrations.RenameField( - model_name='usersettings', - new_name='is_deleted', - old_name='deleted', - ), - migrations.AddField( - model_name='nodesettings', - name='deleted', - field=osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True), - ), - migrations.AddField( - model_name='usersettings', - name='deleted', - field=osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True), - ), - ] diff --git a/addons/mendeley/migrations/0001_initial.py b/addons/mendeley/migrations/0001_initial.py deleted file mode 100644 index 6b11be81ce9..00000000000 --- a/addons/mendeley/migrations/0001_initial.py +++ /dev/null @@ -1,42 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9 on 2017-03-23 20:34 -from __future__ import unicode_literals - -from django.db import migrations, models -import osf.models.base -import osf.utils.datetime_aware_jsonfield - - -class Migration(migrations.Migration): - - initial = True - - dependencies = [ - ] - - operations = [ - migrations.CreateModel( - name='NodeSettings', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), - ('deleted', models.BooleanField(default=False)), - ('list_id', models.TextField(blank=True, null=True)), - ], - options={ - 'abstract': False, - }, - ), - migrations.CreateModel( - name='UserSettings', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), - ('deleted', models.BooleanField(default=False)), - ('oauth_grants', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=dict)), - ], - options={ - 'abstract': False, - }, - ), - ] diff --git a/addons/mendeley/migrations/0002_auto_20170323_1534.py b/addons/mendeley/migrations/0002_auto_20170323_1534.py deleted file mode 100644 index a9a3592f1ff..00000000000 --- a/addons/mendeley/migrations/0002_auto_20170323_1534.py +++ /dev/null @@ -1,41 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9 on 2017-03-23 20:34 -from __future__ import unicode_literals - -from django.conf import settings -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - initial = True - - dependencies = [ - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ('addons_mendeley', '0001_initial'), - ('osf', '0001_initial'), - ] - - operations = [ - migrations.AddField( - model_name='usersettings', - name='owner', - field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='addons_mendeley_user_settings', to=settings.AUTH_USER_MODEL), - ), - migrations.AddField( - model_name='nodesettings', - name='external_account', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='addons_mendeley_node_settings', to='osf.ExternalAccount'), - ), - migrations.AddField( - model_name='nodesettings', - name='owner', - field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='addons_mendeley_node_settings', to='osf.AbstractNode'), - ), - migrations.AddField( - model_name='nodesettings', - name='user_settings', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='addons_mendeley.UserSettings'), - ), - ] diff --git a/addons/mendeley/migrations/0003_auto_20170713_1125.py b/addons/mendeley/migrations/0003_auto_20170713_1125.py deleted file mode 100644 index 89b92735338..00000000000 --- a/addons/mendeley/migrations/0003_auto_20170713_1125.py +++ /dev/null @@ -1,40 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.2 on 2017-07-13 16:25 -from __future__ import unicode_literals -import pytz - -import datetime -from django.db import migrations -import django_extensions.db.fields - - -class Migration(migrations.Migration): - - dependencies = [ - ('addons_mendeley', '0002_auto_20170323_1534'), - ] - - operations = [ - migrations.AddField( - model_name='nodesettings', - name='created', - field=django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, default=datetime.datetime(1970, 1, 1, 0, 0, tzinfo=pytz.utc), verbose_name='created'), - preserve_default=False, - ), - migrations.AddField( - model_name='nodesettings', - name='modified', - field=django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified'), - ), - migrations.AddField( - model_name='usersettings', - name='created', - field=django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, default=datetime.datetime(1970, 1, 1, 0, 0, tzinfo=pytz.utc), verbose_name='created'), - preserve_default=False, - ), - migrations.AddField( - model_name='usersettings', - name='modified', - field=django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified'), - ), - ] diff --git a/addons/mendeley/migrations/0004_rename_deleted_field.py b/addons/mendeley/migrations/0004_rename_deleted_field.py deleted file mode 100644 index 03811701516..00000000000 --- a/addons/mendeley/migrations/0004_rename_deleted_field.py +++ /dev/null @@ -1,36 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.15 on 2019-06-27 20:29 -from __future__ import unicode_literals - -from django.db import migrations -import osf.utils.fields - - -class Migration(migrations.Migration): - - dependencies = [ - ('addons_mendeley', '0003_auto_20170713_1125'), - ] - - operations = [ - migrations.RenameField( - model_name='nodesettings', - new_name='is_deleted', - old_name='deleted', - ), - migrations.RenameField( - model_name='usersettings', - new_name='is_deleted', - old_name='deleted', - ), - migrations.AddField( - model_name='nodesettings', - name='deleted', - field=osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True), - ), - migrations.AddField( - model_name='usersettings', - name='deleted', - field=osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True), - ), - ] diff --git a/addons/onedrive/migrations/0001_initial.py b/addons/onedrive/migrations/0001_initial.py deleted file mode 100644 index 3f2d62da419..00000000000 --- a/addons/onedrive/migrations/0001_initial.py +++ /dev/null @@ -1,55 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.7 on 2017-11-21 16:50 -from __future__ import unicode_literals - -from django.conf import settings -from django.db import migrations, models -import django.db.models.deletion -import osf.models.base -import osf.utils.datetime_aware_jsonfield - - -class Migration(migrations.Migration): - - initial = True - - dependencies = [ - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ('osf', '0067_auto_20171121_1050'), - ] - - operations = [ - migrations.CreateModel( - name='NodeSettings', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), - ('deleted', models.BooleanField(default=False)), - ('folder_id', models.TextField(blank=True, null=True)), - ('folder_path', models.TextField(blank=True, null=True)), - ('external_account', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='addons_onedrive_node_settings', to='osf.ExternalAccount')), - ('owner', models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='addons_onedrive_node_settings', to='osf.AbstractNode')), - ], - options={ - 'abstract': False, - }, - ), - migrations.CreateModel( - name='UserSettings', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), - ('deleted', models.BooleanField(default=False)), - ('oauth_grants', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=dict, encoder=osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONEncoder)), - ('owner', models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='addons_onedrive_user_settings', to=settings.AUTH_USER_MODEL)), - ], - options={ - 'abstract': False, - }, - ), - migrations.AddField( - model_name='nodesettings', - name='user_settings', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='addons_onedrive.UserSettings'), - ), - ] diff --git a/addons/onedrive/migrations/0002_auto_20171121_1426.py b/addons/onedrive/migrations/0002_auto_20171121_1426.py deleted file mode 100644 index df83d82562a..00000000000 --- a/addons/onedrive/migrations/0002_auto_20171121_1426.py +++ /dev/null @@ -1,40 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.7 on 2017-11-21 20:26 -from __future__ import unicode_literals -import datetime -import pytz - -from django.db import migrations -import django_extensions.db.fields - - -class Migration(migrations.Migration): - - dependencies = [ - ('addons_onedrive', '0001_initial'), - ] - - operations = [ - migrations.AddField( - model_name='nodesettings', - name='created', - field=django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, default=datetime.datetime(1970, 1, 1, 0, 0, tzinfo=pytz.utc), verbose_name='created'), - preserve_default=False, - ), - migrations.AddField( - model_name='nodesettings', - name='modified', - field=django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified'), - ), - migrations.AddField( - model_name='usersettings', - name='created', - field=django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, default=datetime.datetime(1970, 1, 1, 0, 0, tzinfo=pytz.utc), verbose_name='created'), - preserve_default=False, - ), - migrations.AddField( - model_name='usersettings', - name='modified', - field=django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified'), - ), - ] diff --git a/addons/onedrive/migrations/0003_rename_deleted_field.py b/addons/onedrive/migrations/0003_rename_deleted_field.py deleted file mode 100644 index c95df4ccfa1..00000000000 --- a/addons/onedrive/migrations/0003_rename_deleted_field.py +++ /dev/null @@ -1,36 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.15 on 2019-06-27 20:29 -from __future__ import unicode_literals - -from django.db import migrations -import osf.utils.fields - - -class Migration(migrations.Migration): - - dependencies = [ - ('addons_onedrive', '0002_auto_20171121_1426'), - ] - - operations = [ - migrations.RenameField( - model_name='nodesettings', - new_name='is_deleted', - old_name='deleted', - ), - migrations.RenameField( - model_name='usersettings', - new_name='is_deleted', - old_name='deleted', - ), - migrations.AddField( - model_name='nodesettings', - name='deleted', - field=osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True), - ), - migrations.AddField( - model_name='usersettings', - name='deleted', - field=osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True), - ), - ] diff --git a/addons/onedrive/migrations/0004_nodesettings_drive_id.py b/addons/onedrive/migrations/0004_nodesettings_drive_id.py deleted file mode 100644 index 04934b4a9bc..00000000000 --- a/addons/onedrive/migrations/0004_nodesettings_drive_id.py +++ /dev/null @@ -1,20 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.28 on 2021-05-21 17:28 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('addons_onedrive', '0003_rename_deleted_field'), - ] - - operations = [ - migrations.AddField( - model_name='nodesettings', - name='drive_id', - field=models.TextField(blank=True, null=True), - ), - ] diff --git a/addons/osfstorage/migrations/0001_initial.py b/addons/osfstorage/migrations/0001_initial.py deleted file mode 100644 index 1fd3437c84a..00000000000 --- a/addons/osfstorage/migrations/0001_initial.py +++ /dev/null @@ -1,28 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9 on 2017-03-23 20:34 -from __future__ import unicode_literals - -from django.db import migrations, models -import osf.models.base - - -class Migration(migrations.Migration): - - initial = True - - dependencies = [ - ] - - operations = [ - migrations.CreateModel( - name='NodeSettings', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), - ('deleted', models.BooleanField(default=False)), - ], - options={ - 'abstract': False, - }, - ), - ] diff --git a/addons/osfstorage/migrations/0002_auto_20170323_1534.py b/addons/osfstorage/migrations/0002_auto_20170323_1534.py deleted file mode 100644 index 25499c3e985..00000000000 --- a/addons/osfstorage/migrations/0002_auto_20170323_1534.py +++ /dev/null @@ -1,29 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9 on 2017-03-23 20:34 -from __future__ import unicode_literals - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - initial = True - - dependencies = [ - ('addons_osfstorage', '0001_initial'), - ('osf', '0001_initial'), - ] - - operations = [ - migrations.AddField( - model_name='nodesettings', - name='owner', - field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='addons_osfstorage_node_settings', to='osf.AbstractNode'), - ), - migrations.AddField( - model_name='nodesettings', - name='root_node', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='osf.OsfStorageFolder'), - ), - ] diff --git a/addons/osfstorage/migrations/0003_auto_20170713_1125.py b/addons/osfstorage/migrations/0003_auto_20170713_1125.py deleted file mode 100644 index 4805d3e8a47..00000000000 --- a/addons/osfstorage/migrations/0003_auto_20170713_1125.py +++ /dev/null @@ -1,29 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.2 on 2017-07-13 16:25 -from __future__ import unicode_literals -import pytz - -import datetime -from django.db import migrations -import django_extensions.db.fields - - -class Migration(migrations.Migration): - - dependencies = [ - ('addons_osfstorage', '0002_auto_20170323_1534'), - ] - - operations = [ - migrations.AddField( - model_name='nodesettings', - name='created', - field=django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, default=datetime.datetime(1970, 1, 1, 0, 0, tzinfo=pytz.utc), verbose_name='created'), - preserve_default=False, - ), - migrations.AddField( - model_name='nodesettings', - name='modified', - field=django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified'), - ), - ] diff --git a/addons/osfstorage/migrations/0004_storage_region_models.py b/addons/osfstorage/migrations/0004_storage_region_models.py deleted file mode 100644 index 4c66148e63d..00000000000 --- a/addons/osfstorage/migrations/0004_storage_region_models.py +++ /dev/null @@ -1,63 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.9 on 2018-03-15 19:37 -from __future__ import unicode_literals - -from django.conf import settings -from django.db import migrations, models -import django.db.models.deletion -import django_extensions.db.fields -import osf.models.base -import osf.utils.fields -import osf.utils.datetime_aware_jsonfield -from website.settings import WATERBUTLER_URL - - -class Migration(migrations.Migration): - - dependencies = [ - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ('addons_osfstorage', '0003_auto_20170713_1125'), - ] - - operations = [ - migrations.CreateModel( - name='Region', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('_id', models.CharField(db_index=True, max_length=255)), - ('name', models.CharField(max_length=200)), - ('waterbutler_credentials', osf.utils.fields.EncryptedJSONField(default=dict)), - ('waterbutler_url', models.URLField(default=WATERBUTLER_URL)), - ('waterbutler_settings', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(default=dict, encoder=osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONEncoder)), - ], - ), - migrations.CreateModel( - name='UserSettings', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), - ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), - ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), - ('deleted', models.BooleanField(default=False)), - ('default_region', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='addons_osfstorage.Region')), - ('owner', models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='addons_osfstorage_user_settings', to=settings.AUTH_USER_MODEL)), - ], - options={ - 'abstract': False, - }, - ), - migrations.AlterUniqueTogether( - name='region', - unique_together=set([('_id', 'name')]), - ), - migrations.AddField( - model_name='nodesettings', - name='region', - field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='addons_osfstorage.Region'), - ), - migrations.AddField( - model_name='nodesettings', - name='user_settings', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='addons_osfstorage.UserSettings'), - ), - ] diff --git a/addons/osfstorage/migrations/0005_region_mfr_url.py b/addons/osfstorage/migrations/0005_region_mfr_url.py deleted file mode 100644 index 1f91da25668..00000000000 --- a/addons/osfstorage/migrations/0005_region_mfr_url.py +++ /dev/null @@ -1,21 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.13 on 2018-08-09 17:29 -from __future__ import unicode_literals - -from django.db import migrations, models -from website.settings import MFR_SERVER_URL - - -class Migration(migrations.Migration): - - dependencies = [ - ('addons_osfstorage', '0004_storage_region_models'), - ] - - operations = [ - migrations.AddField( - model_name='region', - name='mfr_url', - field=models.URLField(default=MFR_SERVER_URL), - ), - ] diff --git a/addons/osfstorage/migrations/0006_rename_deleted_field.py b/addons/osfstorage/migrations/0006_rename_deleted_field.py deleted file mode 100644 index 814e92eb2da..00000000000 --- a/addons/osfstorage/migrations/0006_rename_deleted_field.py +++ /dev/null @@ -1,36 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.15 on 2019-06-27 20:29 -from __future__ import unicode_literals - -from django.db import migrations -import osf.utils.fields - - -class Migration(migrations.Migration): - - dependencies = [ - ('addons_osfstorage', '0005_region_mfr_url'), - ] - - operations = [ - migrations.RenameField( - model_name='nodesettings', - new_name='is_deleted', - old_name='deleted', - ), - migrations.RenameField( - model_name='usersettings', - new_name='is_deleted', - old_name='deleted', - ), - migrations.AddField( - model_name='nodesettings', - name='deleted', - field=osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True), - ), - migrations.AddField( - model_name='usersettings', - name='deleted', - field=osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True), - ), - ] diff --git a/addons/owncloud/migrations/0001_initial.py b/addons/owncloud/migrations/0001_initial.py deleted file mode 100644 index 230eeaff0bb..00000000000 --- a/addons/owncloud/migrations/0001_initial.py +++ /dev/null @@ -1,42 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9 on 2017-03-23 20:34 -from __future__ import unicode_literals - -from django.db import migrations, models -import osf.models.base -import osf.utils.datetime_aware_jsonfield - - -class Migration(migrations.Migration): - - initial = True - - dependencies = [ - ] - - operations = [ - migrations.CreateModel( - name='NodeSettings', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), - ('deleted', models.BooleanField(default=False)), - ('folder_id', models.TextField(blank=True, null=True)), - ], - options={ - 'abstract': False, - }, - ), - migrations.CreateModel( - name='UserSettings', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), - ('deleted', models.BooleanField(default=False)), - ('oauth_grants', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=dict)), - ], - options={ - 'abstract': False, - }, - ), - ] diff --git a/addons/owncloud/migrations/0002_auto_20170323_1534.py b/addons/owncloud/migrations/0002_auto_20170323_1534.py deleted file mode 100644 index e42dd4c8683..00000000000 --- a/addons/owncloud/migrations/0002_auto_20170323_1534.py +++ /dev/null @@ -1,41 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9 on 2017-03-23 20:34 -from __future__ import unicode_literals - -from django.conf import settings -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - initial = True - - dependencies = [ - ('addons_owncloud', '0001_initial'), - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ('osf', '0001_initial'), - ] - - operations = [ - migrations.AddField( - model_name='usersettings', - name='owner', - field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='addons_owncloud_user_settings', to=settings.AUTH_USER_MODEL), - ), - migrations.AddField( - model_name='nodesettings', - name='external_account', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='addons_owncloud_node_settings', to='osf.ExternalAccount'), - ), - migrations.AddField( - model_name='nodesettings', - name='owner', - field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='addons_owncloud_node_settings', to='osf.AbstractNode'), - ), - migrations.AddField( - model_name='nodesettings', - name='user_settings', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='addons_owncloud.UserSettings'), - ), - ] diff --git a/addons/owncloud/migrations/0003_add_trailing_slash_back_to_implict_folders.py b/addons/owncloud/migrations/0003_add_trailing_slash_back_to_implict_folders.py deleted file mode 100644 index 06f07376d72..00000000000 --- a/addons/owncloud/migrations/0003_add_trailing_slash_back_to_implict_folders.py +++ /dev/null @@ -1,33 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.1 on 2017-06-02 14:23 -from __future__ import unicode_literals - -from django.db import migrations - -def add_slash_to_implict_folders(apps, schema_editor): - NodeLog = apps.get_model('osf', 'NodeLog') - logs = NodeLog.objects.raw("""select * from osf_nodelog where osf_nodelog.action = 'owncloud_file_removed';""") - for log in logs: - if not ('.' in log.params['path'] and len(log.params['path'].split('.')[-1]) <= 5): # if it has ext we assume its a file. - log.params['path'] += '/' - log.save() - - -def remove_slash_to_implict_folders(apps, schema_editor): - NodeLog = apps.get_model('osf', 'NodeLog') - logs = NodeLog.objects.raw("""select * from osf_nodelog where osf_nodelog.action = 'owncloud_file_removed';""") - for log in logs: - if '.' in log.params['path'] and len(log.params['path'].split('.')[-1]) <= 5: # if it has ext we assume its a file. - log.params['path'] = log.params['path'].strip('/') - log.save() - - -class Migration(migrations.Migration): - - dependencies = [ - ('addons_owncloud', '0002_auto_20170323_1534'), - ] - - operations = [ - migrations.RunPython(add_slash_to_implict_folders, remove_slash_to_implict_folders) - ] diff --git a/addons/owncloud/migrations/0003_auto_20170713_1125.py b/addons/owncloud/migrations/0003_auto_20170713_1125.py deleted file mode 100644 index e67eedf6af8..00000000000 --- a/addons/owncloud/migrations/0003_auto_20170713_1125.py +++ /dev/null @@ -1,40 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.2 on 2017-07-13 16:25 -from __future__ import unicode_literals -import pytz - -import datetime -from django.db import migrations -import django_extensions.db.fields - - -class Migration(migrations.Migration): - - dependencies = [ - ('addons_owncloud', '0002_auto_20170323_1534'), - ] - - operations = [ - migrations.AddField( - model_name='nodesettings', - name='created', - field=django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, default=datetime.datetime(1970, 1, 1, 0, 0, tzinfo=pytz.utc), verbose_name='created'), - preserve_default=False, - ), - migrations.AddField( - model_name='nodesettings', - name='modified', - field=django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified'), - ), - migrations.AddField( - model_name='usersettings', - name='created', - field=django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, default=datetime.datetime(1970, 1, 1, 0, 0, tzinfo=pytz.utc), verbose_name='created'), - preserve_default=False, - ), - migrations.AddField( - model_name='usersettings', - name='modified', - field=django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified'), - ), - ] diff --git a/addons/owncloud/migrations/0004_merge_20171203_1325.py b/addons/owncloud/migrations/0004_merge_20171203_1325.py deleted file mode 100644 index 852b7d6843d..00000000000 --- a/addons/owncloud/migrations/0004_merge_20171203_1325.py +++ /dev/null @@ -1,16 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.7 on 2017-12-03 19:25 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('addons_owncloud', '0003_add_trailing_slash_back_to_implict_folders'), - ('addons_owncloud', '0003_auto_20170713_1125'), - ] - - operations = [ - ] diff --git a/addons/owncloud/migrations/0005_rename_deleted_field.py b/addons/owncloud/migrations/0005_rename_deleted_field.py deleted file mode 100644 index c77f3212e10..00000000000 --- a/addons/owncloud/migrations/0005_rename_deleted_field.py +++ /dev/null @@ -1,36 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.15 on 2019-06-27 20:29 -from __future__ import unicode_literals - -from django.db import migrations -import osf.utils.fields - - -class Migration(migrations.Migration): - - dependencies = [ - ('addons_owncloud', '0004_merge_20171203_1325'), - ] - - operations = [ - migrations.RenameField( - model_name='nodesettings', - new_name='is_deleted', - old_name='deleted', - ), - migrations.RenameField( - model_name='usersettings', - new_name='is_deleted', - old_name='deleted', - ), - migrations.AddField( - model_name='nodesettings', - name='deleted', - field=osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True), - ), - migrations.AddField( - model_name='usersettings', - name='deleted', - field=osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True), - ), - ] diff --git a/addons/s3/migrations/0001_initial.py b/addons/s3/migrations/0001_initial.py deleted file mode 100644 index e50e0ec97f6..00000000000 --- a/addons/s3/migrations/0001_initial.py +++ /dev/null @@ -1,44 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9 on 2017-03-23 20:34 -from __future__ import unicode_literals - -from django.db import migrations, models -import osf.models.base -import osf.utils.datetime_aware_jsonfield - - -class Migration(migrations.Migration): - - initial = True - - dependencies = [ - ] - - operations = [ - migrations.CreateModel( - name='NodeSettings', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), - ('deleted', models.BooleanField(default=False)), - ('folder_id', models.TextField(blank=True, null=True)), - ('folder_name', models.TextField(blank=True, null=True)), - ('encrypt_uploads', models.BooleanField(default=True)), - ], - options={ - 'abstract': False, - }, - ), - migrations.CreateModel( - name='UserSettings', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), - ('deleted', models.BooleanField(default=False)), - ('oauth_grants', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=dict)), - ], - options={ - 'abstract': False, - }, - ), - ] diff --git a/addons/s3/migrations/0002_auto_20170323_1534.py b/addons/s3/migrations/0002_auto_20170323_1534.py deleted file mode 100644 index 3edb4ed6308..00000000000 --- a/addons/s3/migrations/0002_auto_20170323_1534.py +++ /dev/null @@ -1,41 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9 on 2017-03-23 20:34 -from __future__ import unicode_literals - -from django.conf import settings -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - initial = True - - dependencies = [ - ('addons_s3', '0001_initial'), - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ('osf', '0001_initial'), - ] - - operations = [ - migrations.AddField( - model_name='usersettings', - name='owner', - field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='addons_s3_user_settings', to=settings.AUTH_USER_MODEL), - ), - migrations.AddField( - model_name='nodesettings', - name='external_account', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='addons_s3_node_settings', to='osf.ExternalAccount'), - ), - migrations.AddField( - model_name='nodesettings', - name='owner', - field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='addons_s3_node_settings', to='osf.AbstractNode'), - ), - migrations.AddField( - model_name='nodesettings', - name='user_settings', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='addons_s3.UserSettings'), - ), - ] diff --git a/addons/s3/migrations/0003_auto_20170713_1125.py b/addons/s3/migrations/0003_auto_20170713_1125.py deleted file mode 100644 index c7dbe0dda5c..00000000000 --- a/addons/s3/migrations/0003_auto_20170713_1125.py +++ /dev/null @@ -1,40 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.2 on 2017-07-13 16:25 -from __future__ import unicode_literals -import pytz - -import datetime -from django.db import migrations -import django_extensions.db.fields - - -class Migration(migrations.Migration): - - dependencies = [ - ('addons_s3', '0002_auto_20170323_1534'), - ] - - operations = [ - migrations.AddField( - model_name='nodesettings', - name='created', - field=django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, default=datetime.datetime(1970, 1, 1, 0, 0, tzinfo=pytz.utc), verbose_name='created'), - preserve_default=False, - ), - migrations.AddField( - model_name='nodesettings', - name='modified', - field=django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified'), - ), - migrations.AddField( - model_name='usersettings', - name='created', - field=django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, default=datetime.datetime(1970, 1, 1, 0, 0, tzinfo=pytz.utc), verbose_name='created'), - preserve_default=False, - ), - migrations.AddField( - model_name='usersettings', - name='modified', - field=django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified'), - ), - ] diff --git a/addons/s3/migrations/0004_rename_deleted_field.py b/addons/s3/migrations/0004_rename_deleted_field.py deleted file mode 100644 index 94011347ad3..00000000000 --- a/addons/s3/migrations/0004_rename_deleted_field.py +++ /dev/null @@ -1,36 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.15 on 2019-06-27 20:29 -from __future__ import unicode_literals - -from django.db import migrations -import osf.utils.fields - - -class Migration(migrations.Migration): - - dependencies = [ - ('addons_s3', '0003_auto_20170713_1125'), - ] - - operations = [ - migrations.RenameField( - model_name='nodesettings', - new_name='is_deleted', - old_name='deleted', - ), - migrations.RenameField( - model_name='usersettings', - new_name='is_deleted', - old_name='deleted', - ), - migrations.AddField( - model_name='nodesettings', - name='deleted', - field=osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True), - ), - migrations.AddField( - model_name='usersettings', - name='deleted', - field=osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True), - ), - ] diff --git a/addons/twofactor/migrations/0001_initial.py b/addons/twofactor/migrations/0001_initial.py deleted file mode 100644 index 7b74365b7b7..00000000000 --- a/addons/twofactor/migrations/0001_initial.py +++ /dev/null @@ -1,31 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9 on 2017-03-23 20:34 -from __future__ import unicode_literals - -from django.db import migrations, models -import osf.models.base - - -class Migration(migrations.Migration): - - initial = True - - dependencies = [ - ] - - operations = [ - migrations.CreateModel( - name='UserSettings', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), - ('deleted', models.BooleanField(default=False)), - ('totp_secret', models.TextField(blank=True, null=True)), - ('totp_drift', models.IntegerField()), - ('is_confirmed', models.BooleanField(default=False)), - ], - options={ - 'abstract': False, - }, - ), - ] diff --git a/addons/twofactor/migrations/0002_usersettings_owner.py b/addons/twofactor/migrations/0002_usersettings_owner.py deleted file mode 100644 index 4b20b60e2cf..00000000000 --- a/addons/twofactor/migrations/0002_usersettings_owner.py +++ /dev/null @@ -1,25 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9 on 2017-03-23 20:34 -from __future__ import unicode_literals - -from django.conf import settings -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - initial = True - - dependencies = [ - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ('addons_twofactor', '0001_initial'), - ] - - operations = [ - migrations.AddField( - model_name='usersettings', - name='owner', - field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='addons_twofactor_user_settings', to=settings.AUTH_USER_MODEL), - ), - ] diff --git a/addons/twofactor/migrations/0003_auto_20170713_1125.py b/addons/twofactor/migrations/0003_auto_20170713_1125.py deleted file mode 100644 index bdadf69975d..00000000000 --- a/addons/twofactor/migrations/0003_auto_20170713_1125.py +++ /dev/null @@ -1,29 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.2 on 2017-07-13 16:25 -from __future__ import unicode_literals -import pytz - -import datetime -from django.db import migrations -import django_extensions.db.fields - - -class Migration(migrations.Migration): - - dependencies = [ - ('addons_twofactor', '0002_usersettings_owner'), - ] - - operations = [ - migrations.AddField( - model_name='usersettings', - name='created', - field=django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, default=datetime.datetime(1970, 1, 1, 0, 0, tzinfo=pytz.utc), verbose_name='created'), - preserve_default=False, - ), - migrations.AddField( - model_name='usersettings', - name='modified', - field=django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified'), - ), - ] diff --git a/addons/twofactor/migrations/0004_rename_deleted_field.py b/addons/twofactor/migrations/0004_rename_deleted_field.py deleted file mode 100644 index 399c87961a1..00000000000 --- a/addons/twofactor/migrations/0004_rename_deleted_field.py +++ /dev/null @@ -1,26 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.15 on 2019-06-27 20:29 -from __future__ import unicode_literals - -from django.db import migrations -import osf.utils.fields - - -class Migration(migrations.Migration): - - dependencies = [ - ('addons_twofactor', '0003_auto_20170713_1125'), - ] - - operations = [ - migrations.RenameField( - model_name='usersettings', - new_name='is_deleted', - old_name='deleted', - ), - migrations.AddField( - model_name='usersettings', - name='deleted', - field=osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True), - ), - ] diff --git a/addons/wiki/migrations/0001_initial.py b/addons/wiki/migrations/0001_initial.py deleted file mode 100644 index 2c0ffa8e791..00000000000 --- a/addons/wiki/migrations/0001_initial.py +++ /dev/null @@ -1,48 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9 on 2017-03-23 20:34 -from __future__ import unicode_literals - -import addons.wiki.models -import django.contrib.postgres.fields -from django.db import migrations, models -import django.utils.timezone -import osf.models.base -import osf.utils.fields - - -class Migration(migrations.Migration): - - initial = True - - dependencies = [ - ] - - operations = [ - migrations.CreateModel( - name='NodeSettings', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), - ('deleted', models.BooleanField(default=False)), - ('is_publicly_editable', models.BooleanField(db_index=True, default=False)), - ], - options={ - 'abstract': False, - }, - ), - migrations.CreateModel( - name='NodeWikiPage', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('guid_string', django.contrib.postgres.fields.ArrayField(base_field=models.CharField(blank=True, max_length=255, null=True), blank=True, null=True, size=None)), - ('content_type_pk', models.PositiveIntegerField(blank=True, null=True)), - ('page_name', models.CharField(max_length=200, validators=[addons.wiki.models.validate_page_name])), - ('version', models.IntegerField(default=1)), - ('date', osf.utils.fields.NonNaiveDateTimeField(default=django.utils.timezone.now)), - ('content', models.TextField(blank=True, default='')), - ], - options={ - 'abstract': False, - }, - ), - ] diff --git a/addons/wiki/migrations/0002_auto_20170323_1534.py b/addons/wiki/migrations/0002_auto_20170323_1534.py deleted file mode 100644 index ec2fddab78a..00000000000 --- a/addons/wiki/migrations/0002_auto_20170323_1534.py +++ /dev/null @@ -1,36 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9 on 2017-03-23 20:34 -from __future__ import unicode_literals - -from django.conf import settings -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - initial = True - - dependencies = [ - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ('osf', '0001_initial'), - ('addons_wiki', '0001_initial'), - ] - - operations = [ - migrations.AddField( - model_name='nodewikipage', - name='node', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='osf.AbstractNode'), - ), - migrations.AddField( - model_name='nodewikipage', - name='user', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL), - ), - migrations.AddField( - model_name='nodesettings', - name='owner', - field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='addons_wiki_node_settings', to='osf.AbstractNode'), - ), - ] diff --git a/addons/wiki/migrations/0003_auto_20170403_2228.py b/addons/wiki/migrations/0003_auto_20170403_2228.py deleted file mode 100644 index 2d86fd2dc38..00000000000 --- a/addons/wiki/migrations/0003_auto_20170403_2228.py +++ /dev/null @@ -1,21 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9 on 2017-04-04 03:28 -from __future__ import unicode_literals - -from django.db import migrations -import osf.utils.fields - - -class Migration(migrations.Migration): - - dependencies = [ - ('addons_wiki', '0002_auto_20170323_1534'), - ] - - operations = [ - migrations.AlterField( - model_name='nodewikipage', - name='date', - field=osf.utils.fields.NonNaiveDateTimeField(auto_now_add=True), - ), - ] diff --git a/addons/wiki/migrations/0004_remove_nodewikipage_guid_string.py b/addons/wiki/migrations/0004_remove_nodewikipage_guid_string.py deleted file mode 100644 index bc241d0a80f..00000000000 --- a/addons/wiki/migrations/0004_remove_nodewikipage_guid_string.py +++ /dev/null @@ -1,19 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11 on 2017-04-24 21:09 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('addons_wiki', '0003_auto_20170403_2228'), - ] - - operations = [ - migrations.RemoveField( - model_name='nodewikipage', - name='guid_string', - ), - ] diff --git a/addons/wiki/migrations/0005_auto_20170713_1125.py b/addons/wiki/migrations/0005_auto_20170713_1125.py deleted file mode 100644 index ebbef480b7c..00000000000 --- a/addons/wiki/migrations/0005_auto_20170713_1125.py +++ /dev/null @@ -1,40 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.2 on 2017-07-13 16:25 -from __future__ import unicode_literals -import pytz - -import datetime -from django.db import migrations -import django_extensions.db.fields - - -class Migration(migrations.Migration): - - dependencies = [ - ('addons_wiki', '0004_remove_nodewikipage_guid_string'), - ] - - operations = [ - migrations.AddField( - model_name='nodesettings', - name='created', - field=django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, default=datetime.datetime(1970, 1, 1, 0, 0, tzinfo=pytz.utc), verbose_name='created'), - preserve_default=False, - ), - migrations.AddField( - model_name='nodesettings', - name='modified', - field=django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified'), - ), - migrations.AddField( - model_name='nodewikipage', - name='created', - field=django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, default=datetime.datetime(1970, 1, 1, 0, 0, tzinfo=pytz.utc), verbose_name='created'), - preserve_default=False, - ), - migrations.AddField( - model_name='nodewikipage', - name='modified', - field=django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified'), - ), - ] diff --git a/addons/wiki/migrations/0006_wikipage_wikiversion.py b/addons/wiki/migrations/0006_wikipage_wikiversion.py deleted file mode 100644 index 594d3ef6e57..00000000000 --- a/addons/wiki/migrations/0006_wikipage_wikiversion.py +++ /dev/null @@ -1,55 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.9 on 2018-02-20 17:30 -from __future__ import unicode_literals - -import addons.wiki.models -from django.conf import settings -from django.db import migrations, models -import django.db.models.deletion -import django_extensions.db.fields -import osf.models.base -import osf.utils.fields - - -class Migration(migrations.Migration): - - dependencies = [ - ('osf', '0077_add_maintenance_permissions'), - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ('addons_wiki', '0005_auto_20170713_1125'), - ] - - operations = [ - migrations.CreateModel( - name='WikiPage', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), - ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), - ('content_type_pk', models.PositiveIntegerField(blank=True, null=True)), - ('page_name', models.CharField(max_length=200, validators=[addons.wiki.models.validate_page_name])), - ('deleted', osf.utils.fields.NonNaiveDateTimeField(blank=True, db_index=True, null=True)), - ('node', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='wikis', to='osf.AbstractNode')), - ('user', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), - ], - options={ - 'abstract': False, - }, - ), - migrations.CreateModel( - name='WikiVersion', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), - ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), - ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), - ('content', models.TextField(blank=True, default='')), - ('identifier', models.IntegerField(default=1)), - ('user', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), - ('wiki_page', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='versions', to='addons_wiki.WikiPage')), - ], - options={ - 'abstract': False, - }, - ), - ] diff --git a/addons/wiki/migrations/0007_nodewikipage_former_guid.py b/addons/wiki/migrations/0007_nodewikipage_former_guid.py deleted file mode 100644 index aa9a0b6a389..00000000000 --- a/addons/wiki/migrations/0007_nodewikipage_former_guid.py +++ /dev/null @@ -1,20 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.9 on 2018-02-22 20:15 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('addons_wiki', '0006_wikipage_wikiversion'), - ] - - operations = [ - migrations.AddField( - model_name='nodewikipage', - name='former_guid', - field=models.CharField(blank=True, max_length=100, null=True, db_index=True), - ), - ] diff --git a/addons/wiki/migrations/0008_store_guid_on_nodewikipage.py b/addons/wiki/migrations/0008_store_guid_on_nodewikipage.py deleted file mode 100644 index 48004e9b1e3..00000000000 --- a/addons/wiki/migrations/0008_store_guid_on_nodewikipage.py +++ /dev/null @@ -1,40 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.9 on 2018-02-22 20:16 -from __future__ import unicode_literals -from django.db import migrations -from django.db import connection -from django.contrib.contenttypes.models import ContentType - -def reverse_func(state, schema): - NodeWikiPage = state.get_model('addons_wiki', 'nodewikipage') - return NodeWikiPage.objects.update(former_guid=None) - -def add_guid_field(state, schema): - NodeWikiPage = state.get_model('addons_wiki', 'nodewikipage') - content_type_id = ContentType.objects.get_for_model(NodeWikiPage).id - with connection.cursor() as cursor: - cursor.execute( - """ - UPDATE addons_wiki_nodewikipage as nwp - SET former_guid=( - SELECT _id - FROM osf_guid - WHERE object_id = nwp2.id and content_type_id = %s - LIMIT 1 - ) - FROM addons_wiki_nodewikipage as nwp2 - WHERE nwp.id = nwp2.id - """, [content_type_id] - ) - return - - -class Migration(migrations.Migration): - - dependencies = [ - ('addons_wiki', '0007_nodewikipage_former_guid'), - ] - - operations = [ - migrations.RunPython(add_guid_field, reverse_func) - ] diff --git a/addons/wiki/migrations/0009_auto_20180302_1404.py b/addons/wiki/migrations/0009_auto_20180302_1404.py deleted file mode 100644 index 79a133d362a..00000000000 --- a/addons/wiki/migrations/0009_auto_20180302_1404.py +++ /dev/null @@ -1,19 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.9 on 2018-03-02 20:04 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('addons_wiki', '0008_store_guid_on_nodewikipage'), - ] - - operations = [ - migrations.AddIndex( - model_name='wikipage', - index=models.Index(fields=['page_name', 'node'], name='addons_wiki_page_na_6d5d96_idx'), - ), - ] diff --git a/addons/wiki/migrations/0010_migrate_node_wiki_pages.py b/addons/wiki/migrations/0010_migrate_node_wiki_pages.py deleted file mode 100644 index b9f3c6466ce..00000000000 --- a/addons/wiki/migrations/0010_migrate_node_wiki_pages.py +++ /dev/null @@ -1,510 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.9 on 2018-02-22 20:39 -from __future__ import unicode_literals - -import time -import logging -from tqdm import tqdm -from django.db import connection, migrations -from django.db.models import Q -from django.contrib.contenttypes.models import ContentType -from bulk_update.helper import bulk_update -from addons.wiki.models import WikiPage, WikiVersion -from osf.models import Comment, Guid - -logger = logging.getLogger(__name__) - - -def reverse_func(state, schema): - """ - Reverses NodeWikiPage migration. Repoints guids back to each NodeWikiPage, - repoints comment_targets, comments_viewed_timestamps, and deletes all WikiVersions and WikiPages - """ - NodeWikiPage = state.get_model('addons_wiki', 'nodewikipage') - AbstractNode = state.get_model('osf', 'AbstractNode') - - nwp_content_type_id = ContentType.objects.get_for_model(NodeWikiPage).id - - nodes = AbstractNode.objects.exclude(wiki_pages_versions={}) - progress_bar = tqdm(total=nodes.count() or 100) - for i, node in enumerate(nodes, 1): - progress_bar.update(i) - for wiki_key, version_list in node.wiki_pages_versions.items(): - if version_list: - for index, version in enumerate(version_list): - nwp = NodeWikiPage.objects.filter(former_guid=version).include(None)[0] - # All NodeWikiPages associated with a certain wiki key on a node point to the same WikiPage. - wp = WikiPage.load(version) - guid = migrate_guid_referent(Guid.load(version), nwp, nwp_content_type_id) - guid.save() - nwp = guid.referent - # Moved only for last item in wiki_pages_versions array for every page_name, NWP->WP is a many-to-one mapping. NWP->WV is a one-to-one mapping. - move_comment_target(Guid.load(wp._id), nwp) - update_comments_viewed_timestamp(node, wp._id, nwp) - progress_bar.close() - WikiVersion.objects.all().delete() - WikiPage.objects.all().delete() - logger.info('NodeWikiPages restored and WikiVersions and WikiPages removed.') - - -def move_comment_target(current_guid, desired_target): - """ - Move the comment's target from the current target to the desired target - Specifically for repointing WikiPage comments -> NodeWikiPage comments - """ - desired_target_guid_id = Guid.load(desired_target.former_guid).id - if Comment.objects.filter(Q(root_target=current_guid) | Q(target=current_guid)).exists(): - Comment.objects.filter(root_target=current_guid).update(root_target_id=desired_target_guid_id) - Comment.objects.filter(target=current_guid).update(target_id=desired_target_guid_id) - return - -def update_comments_viewed_timestamp(node, current_wiki_guid, desired_wiki_object): - """Replace the current_wiki_object keys in the comments_viewed_timestamp dict with the desired wiki_object_id """ - users_pending_save = [] - # We iterate over .contributor_set instead of .contributors in order - # to take advantage of .include('contributor__user') - for contrib in node.contributor_set.all(): - user = contrib.user - if user.comments_viewed_timestamp.get(current_wiki_guid, None): - timestamp = user.comments_viewed_timestamp[current_wiki_guid] - user.comments_viewed_timestamp[desired_wiki_object._id] = timestamp - del user.comments_viewed_timestamp[current_wiki_guid] - users_pending_save.append(user) - if users_pending_save: - bulk_update(users_pending_save, update_fields=['comments_viewed_timestamp']) - return users_pending_save - -def migrate_guid_referent(guid, desired_referent, content_type_id): - """ - Point the guid towards the desired_referent. - Pointing the NodeWikiPage guid towards the WikiPage will still allow links to work. - """ - guid.content_type_id = content_type_id - guid.object_id = desired_referent.id - return guid - -def migrate_node_wiki_pages(state, schema): - create_wiki_pages_sql(state, schema) - create_guids(state, schema) - create_wiki_versions_and_repoint_comments_sql(state, schema) - migrate_comments_viewed_timestamp_sql(state, schema) - migrate_guid_referent_sql(state, schema) - -def create_wiki_pages_sql(state, schema): - NodeWikiPage = state.get_model('addons_wiki', 'nodewikipage') - - then = time.time() - logger.info('Starting migration of WikiPages [SQL]:') - wikipage_content_type_id = ContentType.objects.get_for_model(WikiPage).id - nodewikipage_content_type_id = ContentType.objects.get_for_model(NodeWikiPage).id - with connection.cursor() as cursor: - cursor.execute( - """ - CREATE TEMPORARY TABLE temp_wikipages - ( - node_id INTEGER, - user_id INTEGER, - page_name_key TEXT, - latest_page_name_guid TEXT, - first_page_name_guid TEXT, - page_name_display TEXT, - created TIMESTAMP, - modified TIMESTAMP - ) - ON COMMIT DROP; - - -- Flatten out the wiki_page_versions json keys - INSERT INTO temp_wikipages (node_id, page_name_key) - SELECT - oan.id AS node_id - , jsonb_object_keys(oan.wiki_pages_versions) as page_name_key - FROM osf_abstractnode AS oan; - - -- Retrieve the latest guid for the json key - UPDATE temp_wikipages AS twp - SET - latest_page_name_guid = ( - SELECT trim(v::text, '"') - FROM osf_abstractnode ioan - , jsonb_array_elements(oan.wiki_pages_versions->twp.page_name_key) WITH ORDINALITY v(v, rn) - WHERE ioan.id = oan.id - ORDER BY v.rn DESC - LIMIT 1 - ) - FROM osf_abstractnode AS oan - WHERE oan.id = twp.node_id; - - -- Retrieve the first guid for the json key - UPDATE temp_wikipages AS twp - SET - first_page_name_guid = ( - SELECT trim(v::text, '"') - FROM osf_abstractnode ioan - , jsonb_array_elements(oan.wiki_pages_versions->twp.page_name_key) WITH ORDINALITY v(v, rn) - WHERE ioan.id = oan.id - ORDER BY v.rn ASC - LIMIT 1 - ) - FROM osf_abstractnode AS oan - WHERE oan.id = twp.node_id; - - -- Remove any json keys that reference empty arrays (bad data? e.g. abstract_node id=232092) - DELETE FROM temp_wikipages AS twp - WHERE twp.latest_page_name_guid IS NULL; - - -- Retrieve page_name nodewikipage field for the latest wiki page guid - UPDATE temp_wikipages AS twp - SET - page_name_display = anwp.page_name - FROM osf_guid AS og INNER JOIN addons_wiki_nodewikipage AS anwp ON (og.object_id = anwp.id AND og.content_type_id = %s) - WHERE og._id = twp.latest_page_name_guid; - - -- Retrieve user_id, created, and modified nodewikipage field for the first wiki page guid - UPDATE temp_wikipages AS twp - SET - user_id = anwp.user_id - , created = anwp.date - , modified = anwp.modified - FROM osf_guid AS og INNER JOIN addons_wiki_nodewikipage AS anwp ON (og.object_id = anwp.id AND og.content_type_id = %s) - WHERE og._id = twp.first_page_name_guid; - - -- Populate the wikipage table - INSERT INTO addons_wiki_wikipage (node_id, user_id, content_type_pk, page_name, created, modified) - SELECT - twp.node_id - , twp.user_id - , %s - , twp.page_name_display - , twp.created - , twp.modified - FROM temp_wikipages AS twp; - """, [nodewikipage_content_type_id, nodewikipage_content_type_id, wikipage_content_type_id] - ) - now = time.time() - logger.info('Finished migration of WikiPages [SQL]: {:.5} seconds'.format(now - then)) - -def create_guids(state, schema): - then = time.time() - content_type = ContentType.objects.get_for_model(WikiPage) - progress_bar = tqdm(total=WikiPage.objects.count() or 100) - logger.info('Creating new guids for all WikiPages:') - for i, wiki_page_id in enumerate(WikiPage.objects.values_list('id', flat=True), 1): - # looping instead of bulk_create, so _id's are not the same - progress_bar.update(i) - Guid.objects.create(object_id=wiki_page_id, content_type_id=content_type.id) - progress_bar.close() - now = time.time() - logger.info('WikiPage guids created: {:.5} seconds'.format(now - then)) - return - -def create_wiki_versions_and_repoint_comments_sql(state, schema): - NodeWikiPage = state.get_model('addons_wiki', 'nodewikipage') - - then = time.time() - logger.info('Starting migration of WikiVersions [SQL]:') - nodewikipage_content_type_id = ContentType.objects.get_for_model(NodeWikiPage).id - wikipage_content_type_id = ContentType.objects.get_for_model(WikiPage).id - with connection.cursor() as cursor: - cursor.execute( - """ - CREATE TEMPORARY TABLE temp_wikiversions - ( - node_id INTEGER, - user_id INTEGER, - page_name_key TEXT, - wiki_page_id INTEGER, - content TEXT, - identifier INTEGER, - created TIMESTAMP, - modified TIMESTAMP, - nwp_guid TEXT, - latest_page_name_guid TEXT, - page_name_display TEXT - ) - ON COMMIT DROP; - - CREATE INDEX ON temp_wikiversions (nwp_guid ASC); - CREATE INDEX ON temp_wikiversions (wiki_page_id ASC); - - -- Flatten out the wiki_page_versions arrays for each key - INSERT INTO temp_wikiversions (node_id, page_name_key, nwp_guid, content, user_id, modified, identifier, created) - SELECT - oan.id as node_id, - wiki_pages_versions.key, - trim(nwp_guid::text, '"') as node_wiki_page_guid, - nwp.content, - nwp.user_id, - nwp.modified, - nwp.version as identifier, - nwp.date as created - FROM osf_abstractnode as oan, - jsonb_each(oan.wiki_pages_versions) as wiki_pages_versions, - jsonb_array_elements(wiki_pages_versions->wiki_pages_versions.key) as nwp_guid - INNER JOIN addons_wiki_nodewikipage as nwp ON nwp.former_guid = trim(nwp_guid::text, '"'); - - -- Retrieve the latest guid for the json key - UPDATE temp_wikiversions AS twp - SET - latest_page_name_guid = ( - SELECT trim(v::text, '"') - FROM osf_abstractnode ioan - , jsonb_array_elements(oan.wiki_pages_versions->twp.page_name_key) WITH ORDINALITY v(v, rn) - WHERE ioan.id = oan.id - ORDER BY v.rn DESC - LIMIT 1 - ) - FROM osf_abstractnode AS oan - WHERE oan.id = twp.node_id; - - - -- Retrieve page_name nodewikipage field for the latest wiki page guid - UPDATE temp_wikiversions AS twb - SET - page_name_display = anwp.page_name - FROM osf_guid AS og INNER JOIN addons_wiki_nodewikipage AS anwp ON (og.object_id = anwp.id AND og.content_type_id = %s) - WHERE og._id = twb.latest_page_name_guid; - - -- Retrieve wiki page id - UPDATE temp_wikiversions AS twc - SET - wiki_page_id = ( - SELECT awp.id - FROM addons_wiki_wikipage as awp - WHERE (awp.node_id = twc.node_id - AND awp.page_name = twc.page_name_display) - LIMIT 1 - ); - - -- Borrowed from https://gist.github.com/jamarparris/6100413 - CREATE OR REPLACE FUNCTION generate_object_id() RETURNS varchar AS $$ - DECLARE - time_component bigint; - machine_id bigint := FLOOR(random() * 16777215); - process_id bigint; - seq_id bigint := FLOOR(random() * 16777215); - result varchar:= ''; - BEGIN - SELECT FLOOR(EXTRACT(EPOCH FROM clock_timestamp())) INTO time_component; - SELECT pg_backend_pid() INTO process_id; - - result := result || lpad(to_hex(time_component), 8, '0'); - result := result || lpad(to_hex(machine_id), 6, '0'); - result := result || lpad(to_hex(process_id), 4, '0'); - result := result || lpad(to_hex(seq_id), 6, '0'); - RETURN result; - END; - $$ LANGUAGE PLPGSQL; - - -- Populate the wiki_version table - INSERT INTO addons_wiki_wikiversion (user_id, wiki_page_id, content, identifier, created, modified, _id) - SELECT - twv.user_id - , twv.wiki_page_id - , twv.content - , twv.identifier - , twv.created - , twv.modified - , generate_object_id() - FROM temp_wikiversions AS twv; - - -- Migrate Comments on NodeWikiPages to point to WikiPages - - -- Create temporary view to store mapping of NodeWikiPage's Guid.pk => WikiPage.id - CREATE OR REPLACE TEMPORARY VIEW nwp_guids_to_wp_id AS ( - SELECT - osf_guid.id as nwp_guid_id, - twv.wiki_page_id - FROM osf_guid - INNER JOIN temp_wikiversions twv ON (osf_guid._id = twv.nwp_guid) - WHERE osf_guid._id = twv.nwp_guid - ); - - -- Use above view to construct a mapping between NodeWikiPage GUID pk => WikiPage GUID pk - CREATE OR REPLACE TEMPORARY VIEW nwp_guids_to_wiki_page_guids as ( - SELECT - nwp_guids_to_wp_id.nwp_guid_id as nwp_guid_id, - osf_guid.id as wiki_page_guid_id - FROM osf_guid - INNER JOIN nwp_guids_to_wp_id ON (osf_guid.object_id = nwp_guids_to_wp_id.wiki_page_id) - WHERE osf_guid.object_id = nwp_guids_to_wp_id.wiki_page_id AND osf_guid.content_type_id = %s - ); - - -- Change Comment.root_target from NodeWikiPages to their corresponding WikiPage - UPDATE osf_comment - SET - root_target_id = ( - SELECT nwp_guids_to_wiki_page_guids.wiki_page_guid_id - FROM nwp_guids_to_wiki_page_guids - WHERE osf_comment.root_target_id = nwp_guids_to_wiki_page_guids.nwp_guid_id - LIMIT 1 - ) - WHERE root_target_id IN (SELECT nwp_guid_id FROM nwp_guids_to_wiki_page_guids); - - -- Change Comment.target from NodeWikiPages to their corresponding WikiPage - UPDATE osf_comment - SET - target_id = ( - SELECT nwp_guids_to_wiki_page_guids.wiki_page_guid_id - FROM nwp_guids_to_wiki_page_guids - WHERE osf_comment.target_id = nwp_guids_to_wiki_page_guids.nwp_guid_id - LIMIT 1 - ) - WHERE target_id IN (SELECT nwp_guid_id FROM nwp_guids_to_wiki_page_guids); - """, [nodewikipage_content_type_id, wikipage_content_type_id] - ) - now = time.time() - logger.info('Finished migration of WikiVersions [SQL]: {:.5} seconds'.format(now - then)) - -def migrate_comments_viewed_timestamp_sql(state, schema): - then = time.time() - logger.info('Starting migration of user comments_viewed_timestamp [SQL]:') - wikipage_content_type_id = ContentType.objects.get_for_model(WikiPage).id - with connection.cursor() as cursor: - cursor.execute( - """ - CREATE FUNCTION key_exists(json_field json, dictionary_key text) - RETURNS boolean AS $$ - BEGIN - RETURN (json_field->dictionary_key) IS NOT NULL; - END; - $$ LANGUAGE plpgsql; - - -- Defining a temporary table that has every update that needs to happen to users. - -- Obsolete NodeWikiPage guids in comments_viewed_timestamp need to be replaced with - -- corresponding new WikiPage guid - -- Table has node_id, user_id, nwp_guid (old NodeWikiPage guid) and wp_guid (WikiPage guid) - CREATE OR REPLACE FUNCTION update_comments_viewed_timestamp_sql() - RETURNS SETOF varchar AS - $func$ - DECLARE - rec record; - BEGIN - FOR rec IN - SELECT - oan.id as node_id, - osf_contributor.user_id as user_id, - (SELECT U0._id - FROM osf_guid AS U0 - WHERE U0.object_id=wp.id AND U0.content_type_id = %s) AS wp_guid, - nwp_guid - FROM osf_abstractnode as oan - -- Joins contributor to node on contributor.node_id - JOIN osf_contributor ON (oan.id = osf_contributor.node_id) - JOIN osf_osfuser ON (osf_osfuser.id = user_id) - -- Joins each of the wiki page key/version list from wiki_pages_versions - LEFT JOIN LATERAL jsonb_each(oan.wiki_pages_versions) AS wiki_pages_versions ON TRUE - -- Adds the last NWP id - LEFT JOIN LATERAL cast( - ( - SELECT trim(v::text, '"') - FROM osf_abstractnode ioan, jsonb_array_elements(wiki_pages_versions->wiki_pages_versions.key) WITH ORDINALITY v(v, rn) - WHERE ioan.id = oan.id - ORDER BY v.rn DESC - LIMIT 1 - ) AS text) AS nwp_guid ON TRUE - -- Joins the wiki page object, by finding the wiki page object on the node that has a page name similar to the key stored on wiki-pages versions - -- Should work most of the time, there is some bad data though - JOIN addons_wiki_wikipage AS wp ON (wp.node_id = oan.id) AND UPPER(wp.page_name::text) LIKE UPPER(wiki_pages_versions.key::text) - WHERE oan.wiki_pages_versions != '{}' AND osf_osfuser.comments_viewed_timestamp != '{}' AND key_exists(osf_osfuser.comments_viewed_timestamp::json, nwp_guid) - - LOOP - -- Loops through every row in temporary table above, and deletes old nwp_guid key and replaces with wp_guid key. - -- Looping instead of joining to osf_user table because temporary table above has multiple rows with the same user - UPDATE osf_osfuser - SET comments_viewed_timestamp = comments_viewed_timestamp - rec.nwp_guid || jsonb_build_object(rec.wp_guid, comments_viewed_timestamp->rec.nwp_guid) - WHERE osf_osfuser.id = rec.user_id; - END LOOP; - END - $func$ LANGUAGE plpgsql; - - SELECT update_comments_viewed_timestamp_sql(); - """, [wikipage_content_type_id] - ) - now = time.time() - logger.info('Finished migration of comments_viewed_timestamp [SQL]: {:.5} seconds'.format(now - then)) - -def migrate_guid_referent_sql(state, schema): - NodeWikiPage = state.get_model('addons_wiki', 'nodewikipage') - - then = time.time() - logger.info('Starting migration of Node Wiki Page guids, repointing them to Wiki Page guids [SQL]:') - wikipage_content_type_id = ContentType.objects.get_for_model(WikiPage).id - nodewikipage_content_type_id = ContentType.objects.get_for_model(NodeWikiPage).id - with connection.cursor() as cursor: - cursor.execute( - """ - CREATE TEMPORARY TABLE repoint_guids - ( - node_id INTEGER, - page_name_key TEXT, - nwp_guid TEXT, - latest_page_name_guid TEXT, - wiki_page_id INTEGER, - page_name_display TEXT - ) - ON COMMIT DROP; - - -- Flatten out the wiki_page_versions arrays for each key - INSERT INTO repoint_guids (node_id, page_name_key, nwp_guid) - SELECT - oan.id as node_id, - wiki_pages_versions.key, - trim(nwp_guid::text, '"') as node_wiki_page_guid - FROM osf_abstractnode as oan, - jsonb_each(oan.wiki_pages_versions) as wiki_pages_versions, - jsonb_array_elements(wiki_pages_versions->wiki_pages_versions.key) as nwp_guid - INNER JOIN addons_wiki_nodewikipage as nwp ON nwp.former_guid = trim(nwp_guid::text, '"'); - - -- Retrieve the latest guid for the json key - -- For example, if you have {'home': ['abcde', '12345', 'zyxwv']}, I need to preserve 'zyxwv' - UPDATE repoint_guids AS twp - SET - latest_page_name_guid = ( - SELECT trim(v::text, '"') - FROM osf_abstractnode ioan - , jsonb_array_elements(oan.wiki_pages_versions->twp.page_name_key) WITH ORDINALITY v(v, rn) - WHERE ioan.id = oan.id - ORDER BY v.rn DESC - LIMIT 1 - ) - FROM osf_abstractnode AS oan - WHERE oan.id = twp.node_id; - - -- Retrieve page_name nodewikipage field for the latest wiki page guid (The latest one is most current because wikis can be renamed) - UPDATE repoint_guids AS twb - SET - page_name_display = anwp.page_name - FROM osf_guid AS og INNER JOIN addons_wiki_nodewikipage AS anwp ON (og.object_id = anwp.id AND og.content_type_id = %s) - WHERE og._id = twb.latest_page_name_guid; - - -- Retrieve wiki page id using the node id and page name - UPDATE repoint_guids AS twc - SET - wiki_page_id = ( - SELECT awp.id - FROM addons_wiki_wikipage as awp - WHERE (awp.node_id = twc.node_id - AND awp.page_name = twc.page_name_display) - LIMIT 1 - ); - - -- Update osf_guid by joining with temporary table repoint_guids. - UPDATE osf_guid - SET content_type_id = %s, object_id = wiki_page_id - FROM repoint_guids - WHERE repoint_guids.nwp_guid = osf_guid._id; - """, [nodewikipage_content_type_id, wikipage_content_type_id] - ) - now = time.time() - logger.info('Finished repointing Node Wiki Page guids to Wiki Pages [SQL]: {:.5} seconds'.format(now - then)) - - -class Migration(migrations.Migration): - - dependencies = [ - ('addons_wiki', '0009_auto_20180302_1404'), - ] - - operations = [ - migrations.RunPython(migrate_node_wiki_pages, reverse_func), - ] diff --git a/addons/wiki/migrations/0011_auto_20180415_1649.py b/addons/wiki/migrations/0011_auto_20180415_1649.py deleted file mode 100644 index b3f0601b225..00000000000 --- a/addons/wiki/migrations/0011_auto_20180415_1649.py +++ /dev/null @@ -1,26 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.11 on 2018-04-15 21:49 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('addons_wiki', '0010_migrate_node_wiki_pages'), - ] - - operations = [ - migrations.RemoveField( - model_name='nodewikipage', - name='node', - ), - migrations.RemoveField( - model_name='nodewikipage', - name='user', - ), - migrations.DeleteModel( - name='NodeWikiPage', - ), - ] diff --git a/addons/wiki/migrations/0012_rename_deleted_field.py b/addons/wiki/migrations/0012_rename_deleted_field.py deleted file mode 100644 index cf8b69560fb..00000000000 --- a/addons/wiki/migrations/0012_rename_deleted_field.py +++ /dev/null @@ -1,26 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.15 on 2019-06-27 20:29 -from __future__ import unicode_literals - -from django.db import migrations -import osf.utils.fields - - -class Migration(migrations.Migration): - - dependencies = [ - ('addons_wiki', '0011_auto_20180415_1649'), - ] - - operations = [ - migrations.RenameField( - model_name='nodesettings', - new_name='is_deleted', - old_name='deleted', - ), - migrations.AddField( - model_name='nodesettings', - name='deleted', - field=osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True), - ), - ] diff --git a/addons/zotero/migrations/0001_initial.py b/addons/zotero/migrations/0001_initial.py deleted file mode 100644 index 6b11be81ce9..00000000000 --- a/addons/zotero/migrations/0001_initial.py +++ /dev/null @@ -1,42 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9 on 2017-03-23 20:34 -from __future__ import unicode_literals - -from django.db import migrations, models -import osf.models.base -import osf.utils.datetime_aware_jsonfield - - -class Migration(migrations.Migration): - - initial = True - - dependencies = [ - ] - - operations = [ - migrations.CreateModel( - name='NodeSettings', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), - ('deleted', models.BooleanField(default=False)), - ('list_id', models.TextField(blank=True, null=True)), - ], - options={ - 'abstract': False, - }, - ), - migrations.CreateModel( - name='UserSettings', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), - ('deleted', models.BooleanField(default=False)), - ('oauth_grants', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=dict)), - ], - options={ - 'abstract': False, - }, - ), - ] diff --git a/addons/zotero/migrations/0002_auto_20170323_1534.py b/addons/zotero/migrations/0002_auto_20170323_1534.py deleted file mode 100644 index a28d0e109cd..00000000000 --- a/addons/zotero/migrations/0002_auto_20170323_1534.py +++ /dev/null @@ -1,41 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9 on 2017-03-23 20:34 -from __future__ import unicode_literals - -from django.conf import settings -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - initial = True - - dependencies = [ - ('addons_zotero', '0001_initial'), - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ('osf', '0001_initial'), - ] - - operations = [ - migrations.AddField( - model_name='usersettings', - name='owner', - field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='addons_zotero_user_settings', to=settings.AUTH_USER_MODEL), - ), - migrations.AddField( - model_name='nodesettings', - name='external_account', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='addons_zotero_node_settings', to='osf.ExternalAccount'), - ), - migrations.AddField( - model_name='nodesettings', - name='owner', - field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='addons_zotero_node_settings', to='osf.AbstractNode'), - ), - migrations.AddField( - model_name='nodesettings', - name='user_settings', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='addons_zotero.UserSettings'), - ), - ] diff --git a/addons/zotero/migrations/0003_auto_20170713_1125.py b/addons/zotero/migrations/0003_auto_20170713_1125.py deleted file mode 100644 index 48e9ab82886..00000000000 --- a/addons/zotero/migrations/0003_auto_20170713_1125.py +++ /dev/null @@ -1,40 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.2 on 2017-07-13 16:25 -from __future__ import unicode_literals -import pytz - -import datetime -from django.db import migrations -import django_extensions.db.fields - - -class Migration(migrations.Migration): - - dependencies = [ - ('addons_zotero', '0002_auto_20170323_1534'), - ] - - operations = [ - migrations.AddField( - model_name='nodesettings', - name='created', - field=django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, default=datetime.datetime(1970, 1, 1, 0, 0, tzinfo=pytz.utc), verbose_name='created'), - preserve_default=False, - ), - migrations.AddField( - model_name='nodesettings', - name='modified', - field=django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified'), - ), - migrations.AddField( - model_name='usersettings', - name='created', - field=django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, default=datetime.datetime(1970, 1, 1, 0, 0, tzinfo=pytz.utc), verbose_name='created'), - preserve_default=False, - ), - migrations.AddField( - model_name='usersettings', - name='modified', - field=django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified'), - ), - ] diff --git a/addons/zotero/migrations/0003_nodesettings_library_id.py b/addons/zotero/migrations/0003_nodesettings_library_id.py deleted file mode 100644 index d31fd2f415a..00000000000 --- a/addons/zotero/migrations/0003_nodesettings_library_id.py +++ /dev/null @@ -1,20 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.4 on 2017-10-11 23:10 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('addons_zotero', '0002_auto_20170323_1534'), - ] - - operations = [ - migrations.AddField( - model_name='nodesettings', - name='library_id', - field=models.TextField(blank=True, null=True), - ), - ] diff --git a/addons/zotero/migrations/0004_merge_20180112_0836.py b/addons/zotero/migrations/0004_merge_20180112_0836.py deleted file mode 100644 index 3e59e90ea82..00000000000 --- a/addons/zotero/migrations/0004_merge_20180112_0836.py +++ /dev/null @@ -1,16 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.7 on 2018-01-12 14:36 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('addons_zotero', '0003_auto_20170713_1125'), - ('addons_zotero', '0003_nodesettings_library_id'), - ] - - operations = [ - ] diff --git a/addons/zotero/migrations/0005_zotero_personal_libraries_20180216_0849.py b/addons/zotero/migrations/0005_zotero_personal_libraries_20180216_0849.py deleted file mode 100644 index 7f1a6d29a5b..00000000000 --- a/addons/zotero/migrations/0005_zotero_personal_libraries_20180216_0849.py +++ /dev/null @@ -1,58 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.9 on 2018-02-16 14:49 -from __future__ import unicode_literals - -from bulk_update.helper import bulk_update -from django.db import migrations - -def reverse_func(state, schema): - modify_node_settings(state, None) - modify_user_settings(state, False, None) - -def modify_node_settings(state, library_name): - """ - Updates the library_id for all ZoteroNodeSettings - """ - ZoteroNodeSettings = state.get_model('addons_zotero', 'NodeSettings') - ZoteroNodeSettings.objects.all().update(library_id=library_name) - -def modify_user_settings(state, add, library_name): - """ - For all zotero user settings, - :params state: app_state - :params library_name: library name to add or remove from user settings oauth metadata - :params add: True for adding library, False for removing it. - """ - ZoteroUserSettings = state.get_model('addons_zotero', 'UserSettings') - user_settings_pending_save = [] - - for user_setting in ZoteroUserSettings.objects.all(): - for node, ext_accounts in user_setting.oauth_grants.items(): - for ext_account in ext_accounts.keys(): - if add: - user_setting.oauth_grants[node][ext_account]['library'] = library_name - else: - user_setting.oauth_grants[node][ext_account].pop('library', None) - user_settings_pending_save.append(user_setting) - bulk_update(user_settings_pending_save) - -def migrate_zotero_libraries(state, schema): - """ - 1) For all zotero NodeSettings, mark library_id as 'personal', which has been the only - option prior to zotero group libraries being added - 2) For all zotero usersettings, add 'personal' library value to the nodes that have been given permission - to use zotero external accounts. - """ - modify_node_settings(state, 'personal') - modify_user_settings(state, True, 'personal') - - -class Migration(migrations.Migration): - - dependencies = [ - ('addons_zotero', '0004_merge_20180112_0836'), - ] - - operations = [ - migrations.RunPython(migrate_zotero_libraries, reverse_func) - ] diff --git a/addons/zotero/migrations/0006_rename_deleted_field.py b/addons/zotero/migrations/0006_rename_deleted_field.py deleted file mode 100644 index 16927d94cdb..00000000000 --- a/addons/zotero/migrations/0006_rename_deleted_field.py +++ /dev/null @@ -1,36 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.15 on 2019-06-27 20:29 -from __future__ import unicode_literals - -from django.db import migrations -import osf.utils.fields - - -class Migration(migrations.Migration): - - dependencies = [ - ('addons_zotero', '0005_zotero_personal_libraries_20180216_0849'), - ] - - operations = [ - migrations.RenameField( - model_name='nodesettings', - new_name='is_deleted', - old_name='deleted', - ), - migrations.RenameField( - model_name='usersettings', - new_name='is_deleted', - old_name='deleted', - ), - migrations.AddField( - model_name='nodesettings', - name='deleted', - field=osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True), - ), - migrations.AddField( - model_name='usersettings', - name='deleted', - field=osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True), - ), - ] From f41eb8a1b616b63e69e863c1881176dc82cefcb3 Mon Sep 17 00:00:00 2001 From: Longze Chen Date: Wed, 17 Aug 2022 15:16:01 -0400 Subject: [PATCH 23/72] Init migrations - osf --- osf/migrations/0001_initial.py | 2810 ++++++++++++++++++++++++++++++++ 1 file changed, 2810 insertions(+) create mode 100644 osf/migrations/0001_initial.py diff --git a/osf/migrations/0001_initial.py b/osf/migrations/0001_initial.py new file mode 100644 index 00000000000..28fa6e36265 --- /dev/null +++ b/osf/migrations/0001_initial.py @@ -0,0 +1,2810 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.29 on 2022-08-17 19:15 +from __future__ import unicode_literals + +import dirtyfields.dirtyfields +from django.conf import settings +import django.contrib.postgres.fields +from django.db import migrations, models +import django.db.models.deletion +import django.db.models.manager +import django.utils.timezone +import django_extensions.db.fields +import osf.models.admin_log_entry +import osf.models.base +import osf.models.conference +import osf.models.mixins +import osf.models.notable_email_domain +import osf.models.oauth +import osf.models.registration_bulk_upload_job +import osf.models.registrations +import osf.models.sanctions +import osf.models.spam +import osf.models.user +import osf.models.validators +import osf.utils.datetime_aware_jsonfield +import osf.utils.fields +import osf.utils.outcomes +import osf.utils.storage + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('auth', '0008_alter_user_username_max_length'), + ('admin', '0002_logentry_remove_auto_add'), + ('contenttypes', '0002_remove_content_type_name'), + ('addons_osfstorage', '0001_initial'), + ] + + operations = [ + migrations.CreateModel( + name='OSFUser', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('password', models.CharField(max_length=128, verbose_name='password')), + ('last_login', models.DateTimeField(blank=True, null=True, verbose_name='last login')), + ('is_superuser', models.BooleanField(default=False, help_text='Designates that this user has all permissions without explicitly assigning them.', verbose_name='superuser status')), + ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), + ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), + ('content_type_pk', models.PositiveIntegerField(blank=True, null=True)), + ('spam_status', models.IntegerField(blank=True, db_index=True, default=None, null=True)), + ('spam_pro_tip', models.CharField(blank=True, default=None, max_length=200, null=True)), + ('spam_data', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=dict, encoder=osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONEncoder)), + ('date_last_reported', osf.utils.fields.NonNaiveDateTimeField(blank=True, db_index=True, default=None, null=True)), + ('reports', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=dict, encoder=osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONEncoder, validators=[osf.models.spam._validate_reports])), + ('username', models.CharField(db_index=True, max_length=255, unique=True)), + ('fullname', models.CharField(max_length=255)), + ('is_registered', models.BooleanField(db_index=True, default=False)), + ('security_messages', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=dict, encoder=osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONEncoder)), + ('is_invited', models.BooleanField(db_index=True, default=False)), + ('unclaimed_records', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=dict, encoder=osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONEncoder)), + ('contributor_added_email_records', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=dict, encoder=osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONEncoder)), + ('member_added_email_records', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=dict, encoder=osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONEncoder)), + ('group_connected_email_records', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=dict, encoder=osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONEncoder)), + ('verification_key', models.CharField(blank=True, max_length=255, null=True)), + ('verification_key_v2', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=dict, encoder=osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONEncoder, null=True)), + ('email_last_sent', osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True)), + ('change_password_last_attempt', osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True)), + ('old_password_invalid_attempts', models.PositiveIntegerField(default=0)), + ('email_verifications', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=dict, encoder=osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONEncoder)), + ('mailchimp_mailing_lists', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=dict, encoder=osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONEncoder)), + ('osf_mailing_lists', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=osf.models.user.get_default_mailing_lists, encoder=osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONEncoder)), + ('date_registered', osf.utils.fields.NonNaiveDateTimeField(auto_now_add=True, db_index=True)), + ('given_name', models.CharField(blank=True, max_length=255)), + ('middle_names', models.CharField(blank=True, max_length=255)), + ('family_name', models.CharField(blank=True, max_length=255)), + ('suffix', models.CharField(blank=True, max_length=255)), + ('external_identity', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=dict, encoder=osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONEncoder)), + ('jobs', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=list, encoder=osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONEncoder, validators=[osf.models.validators.validate_history_item])), + ('schools', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=list, encoder=osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONEncoder, validators=[osf.models.validators.validate_history_item])), + ('social', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=dict, encoder=osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONEncoder, validators=[osf.models.validators.validate_social])), + ('date_last_login', osf.utils.fields.NonNaiveDateTimeField(blank=True, db_index=True, null=True)), + ('date_confirmed', osf.utils.fields.NonNaiveDateTimeField(blank=True, db_index=True, null=True)), + ('date_disabled', osf.utils.fields.NonNaiveDateTimeField(blank=True, db_index=True, null=True)), + ('deleted', osf.utils.fields.NonNaiveDateTimeField(blank=True, db_index=True, null=True)), + ('comments_viewed_timestamp', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=dict, encoder=osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONEncoder)), + ('timezone', models.CharField(blank=True, default='Etc/UTC', max_length=255)), + ('locale', models.CharField(blank=True, default='en_US', max_length=255)), + ('requested_deactivation', models.BooleanField(default=False)), + ('contacted_deactivation', models.BooleanField(default=False)), + ('notifications_configured', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=dict, encoder=osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONEncoder)), + ('accepted_terms_of_service', osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True)), + ('chronos_user_id', models.TextField(blank=True, db_index=True, null=True)), + ('department', models.TextField(blank=True, null=True)), + ('is_active', models.BooleanField(default=False)), + ('is_staff', models.BooleanField(default=False)), + ], + options={ + 'permissions': (('view_osfuser', 'Can view user details'),), + }, + bases=(dirtyfields.dirtyfields.DirtyFieldsMixin, models.Model, osf.models.base.QuerySetExplainMixin), + ), + migrations.CreateModel( + name='AbstractNode', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), + ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), + ('content_type_pk', models.PositiveIntegerField(blank=True, null=True)), + ('spam_status', models.IntegerField(blank=True, db_index=True, default=None, null=True)), + ('spam_pro_tip', models.CharField(blank=True, default=None, max_length=200, null=True)), + ('spam_data', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=dict, encoder=osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONEncoder)), + ('date_last_reported', osf.utils.fields.NonNaiveDateTimeField(blank=True, db_index=True, default=None, null=True)), + ('reports', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=dict, encoder=osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONEncoder, validators=[osf.models.spam._validate_reports])), + ('last_logged', osf.utils.fields.NonNaiveDateTimeField(blank=True, db_index=True, default=django.utils.timezone.now, null=True)), + ('title', models.TextField(validators=[osf.models.validators.validate_title])), + ('description', models.TextField(blank=True, default='')), + ('category', models.CharField(blank=True, choices=[('analysis', 'Analysis'), ('communication', 'Communication'), ('data', 'Data'), ('hypothesis', 'Hypothesis'), ('instrumentation', 'Instrumentation'), ('methods and measures', 'Methods and Measures'), ('procedure', 'Procedure'), ('project', 'Project'), ('software', 'Software'), ('other', 'Other'), ('', 'Uncategorized')], default='', max_length=255)), + ('registration_responses', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=dict, encoder=osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONEncoder)), + ('registration_responses_migrated', models.NullBooleanField(db_index=True, default=True)), + ('type', models.CharField(choices=[('osf.node', 'node'), ('osf.draftnode', 'draft node'), ('osf.registration', 'registration'), ('osf.quickfilesnode', 'quick files node')], db_index=True, max_length=255)), + ('child_node_subscriptions', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=dict, encoder=osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONEncoder)), + ('deleted_date', osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True)), + ('deleted', osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True)), + ('file_guid_to_share_uuids', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=dict, encoder=osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONEncoder)), + ('forked_date', osf.utils.fields.NonNaiveDateTimeField(blank=True, db_index=True, null=True)), + ('is_fork', models.BooleanField(db_index=True, default=False)), + ('is_public', models.BooleanField(db_index=True, default=False)), + ('is_deleted', models.BooleanField(db_index=True, default=False)), + ('access_requests_enabled', models.NullBooleanField(db_index=True, default=True)), + ('custom_citation', models.TextField(blank=True, null=True)), + ('comment_level', models.CharField(default='public', max_length=10)), + ('article_doi', models.CharField(blank=True, max_length=128, null=True, validators=[osf.models.validators.validate_doi])), + ('custom_storage_usage_limit_public', models.DecimalField(blank=True, decimal_places=9, max_digits=100, null=True)), + ('custom_storage_usage_limit_private', models.DecimalField(blank=True, decimal_places=9, max_digits=100, null=True)), + ('piwik_site_id', models.IntegerField(blank=True, null=True)), + ('suspended', models.BooleanField(db_index=True, default=False)), + ('wiki_private_uuids', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=dict, encoder=osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONEncoder)), + ('keenio_read_key', models.CharField(blank=True, max_length=1000, null=True)), + ('registered_date', osf.utils.fields.NonNaiveDateTimeField(blank=True, db_index=True, null=True)), + ('external_registration', models.NullBooleanField(default=False)), + ('registered_meta', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=dict, encoder=osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONEncoder, null=True)), + ('files_count', models.PositiveIntegerField(blank=True, null=True)), + ('branched_from_node', models.NullBooleanField()), + ('moderation_state', models.CharField(choices=[('undefined', 'Undefined'), ('initial', 'Initial'), ('reverted', 'Reverted'), ('pending', 'Pending'), ('rejected', 'Rejected'), ('accepted', 'Accepted'), ('embargo', 'Embargo'), ('pending_embargo_termination', 'PendingEmbargoTermination'), ('pending_withdraw_request', 'PendingWithdrawRequest'), ('pending_withdraw', 'PendingWithdraw'), ('withdrawn', 'Withdrawn')], default='initial', max_length=30, null=True)), + ('ia_url', models.URLField(blank=True, help_text='Where the archive.org data for the registration is stored', null=True)), + ('additional_metadata', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, encoder=osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONEncoder, null=True)), + ], + options={ + 'permissions': (('view_node', 'Can view node details'), ('read_node', 'Can read the node'), ('write_node', 'Can edit the node'), ('admin_node', 'Can manage the node')), + 'base_manager_name': 'objects', + }, + bases=(dirtyfields.dirtyfields.DirtyFieldsMixin, osf.models.mixins.CommentableMixin, models.Model, osf.models.base.QuerySetExplainMixin), + ), + migrations.CreateModel( + name='AbstractProvider', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), + ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), + ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24)), + ('reviews_workflow', models.CharField(blank=True, choices=[(None, 'None'), ('pre-moderation', 'Pre-Moderation'), ('post-moderation', 'Post-Moderation')], max_length=15, null=True)), + ('reviews_comments_private', models.NullBooleanField()), + ('reviews_comments_anonymous', models.NullBooleanField()), + ('type', models.CharField(choices=[('osf.collectionprovider', 'collection provider'), ('osf.registrationprovider', 'registration provider'), ('osf.preprintprovider', 'preprint provider')], db_index=True, max_length=255)), + ('name', models.CharField(max_length=128)), + ('advisory_board', models.TextField(blank=True, default='')), + ('description', models.TextField(blank=True, default='')), + ('domain', models.URLField(blank=True, default='')), + ('domain_redirect_enabled', models.BooleanField(default=False)), + ('external_url', models.URLField(blank=True, null=True)), + ('email_contact', models.CharField(blank=True, max_length=200, null=True)), + ('email_support', models.CharField(blank=True, max_length=200, null=True)), + ('social_twitter', models.CharField(blank=True, max_length=200, null=True)), + ('social_facebook', models.CharField(blank=True, max_length=200, null=True)), + ('social_instagram', models.CharField(blank=True, max_length=200, null=True)), + ('footer_links', models.TextField(blank=True, default='')), + ('facebook_app_id', models.BigIntegerField(blank=True, null=True)), + ('example', models.CharField(blank=True, max_length=20, null=True)), + ('allow_submissions', models.BooleanField(default=True)), + ('allow_commenting', models.BooleanField(default=False)), + ('access_token', osf.utils.fields.EncryptedTextField(blank=True, null=True)), + ('branded_discovery_page', models.BooleanField(default=True)), + ('advertises_on_discovery', models.BooleanField(default=True)), + ('has_landing_page', models.BooleanField(default=False)), + ('share_publish_type', models.CharField(choices=[('Preprint', 'Preprint'), ('Thesis', 'Thesis'), ('Registration', 'Registration')], default='Thesis', help_text='This SHARE type will be used when pushing publications to SHARE', max_length=32)), + ('share_source', models.CharField(blank=True, default='', max_length=200)), + ('share_title', models.TextField(blank=True, default='')), + ('doi_prefix', models.CharField(blank=True, max_length=32, null=True)), + ('additional_metadata_fields', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, encoder=osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONEncoder, null=True)), + ('bulk_upload_auto_approval', models.NullBooleanField(default=False)), + ('allow_updates', models.NullBooleanField(default=False)), + ('allow_bulk_uploads', models.NullBooleanField(default=False)), + ('additional_providers', django.contrib.postgres.fields.ArrayField(base_field=models.CharField(max_length=200), blank=True, default=list, null=True, size=None)), + ('preprint_word', models.CharField(choices=[('preprint', 'Preprint'), ('paper', 'Paper'), ('thesis', 'Thesis'), ('work', 'Work'), ('none', 'None')], default='preprint', max_length=10, null=True)), + ('subjects_acceptable', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=list, encoder=osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONEncoder, null=True)), + ], + options={ + 'permissions': (('set_up_moderation', 'Can set up moderation for this provider'), ('view_submissions', 'Can view all submissions to this provider'), ('accept_submissions', 'Can accept submissions to this provider'), ('reject_submissions', 'Can reject submissions to this provider'), ('withdraw_submissions', 'Can withdraw submissions from this provider'), ('edit_review_comments', 'Can edit comments on actions for this provider'), ('view_actions', 'Can view actions on submissions to this provider'), ('add_moderator', 'Can add other users as moderators for this provider'), ('update_moderator', 'Can elevate or lower other moderators/admins'), ('remove_moderator', 'Can remove moderators from this provider. Implicitly granted to self'), ('edit_reviews_settings', 'Can edit reviews settings for this provider'), ('add_reviewer', 'Can add other users as reviewers for this provider'), ('assign_reviewer', 'Can assign reviewers to review specific submissions to this provider'), ('view_assigned_submissions', 'Can view submissions to this provider which have been assigned to this user'), ('review_assigned_submissions', 'Can submit reviews for submissions to this provider which have been assigned to this user')), + }, + bases=(dirtyfields.dirtyfields.DirtyFieldsMixin, models.Model, osf.models.base.QuerySetExplainMixin), + ), + migrations.CreateModel( + name='AbstractProviderGroupObjectPermission', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('content_object', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='osf.AbstractProvider')), + ('group', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='auth.Group')), + ('permission', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='auth.Permission')), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='AbstractProviderUserObjectPermission', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('content_object', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='osf.AbstractProvider')), + ('permission', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='auth.Permission')), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='AdminProfile', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('desk_token', models.CharField(blank=True, max_length=45)), + ('desk_token_secret', models.CharField(blank=True, max_length=45)), + ('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='admin_profile', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'permissions': (('mark_spam', 'Can mark comments, projects and registrations as spam'), ('view_spam', 'Can view nodes, comments, and projects marked as spam'), ('view_metrics', 'Can view metrics on the OSF Admin app'), ('view_desk', 'Can view details about Desk users'), ('delete_preprintrequest', 'Can delete preprints withdrawal requests'), ('change_preprintrequest', 'Can update preprints withdrawal requests')), + }, + ), + migrations.CreateModel( + name='ApiOAuth2Application', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), + ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), + ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), + ('client_id', models.CharField(db_index=True, default=osf.models.oauth.generate_client_id, max_length=50, unique=True)), + ('client_secret', models.CharField(default=osf.models.oauth.generate_client_secret, max_length=40)), + ('is_active', models.BooleanField(db_index=True, default=True)), + ('name', models.CharField(db_index=True, max_length=200)), + ('description', models.CharField(blank=True, max_length=1000, null=True)), + ('home_url', models.URLField()), + ('callback_url', models.URLField()), + ('owner', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + bases=(models.Model, osf.models.base.QuerySetExplainMixin), + ), + migrations.CreateModel( + name='ApiOAuth2PersonalToken', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), + ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), + ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), + ('token_id', models.CharField(default=osf.models.oauth.generate_token_id, max_length=70, unique=True)), + ('name', models.CharField(db_index=True, max_length=100)), + ('is_active', models.BooleanField(db_index=True, default=True)), + ('owner', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + bases=(models.Model, osf.models.base.QuerySetExplainMixin), + ), + migrations.CreateModel( + name='ApiOAuth2Scope', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), + ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), + ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), + ('name', models.CharField(db_index=True, max_length=50, unique=True)), + ('description', models.CharField(max_length=255)), + ('is_active', models.BooleanField(db_index=True, default=True)), + ('is_public', models.BooleanField(db_index=True, default=True)), + ], + options={ + 'abstract': False, + }, + bases=(models.Model, osf.models.base.QuerySetExplainMixin), + ), + migrations.CreateModel( + name='ArchiveJob', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), + ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), + ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), + ('done', models.BooleanField(default=False, verbose_name='completed')), + ('sent', models.BooleanField(default=False, verbose_name='emails sent')), + ('status', models.CharField(default='INITIATED', max_length=40)), + ('datetime_initiated', osf.utils.fields.NonNaiveDateTimeField(default=django.utils.timezone.now, verbose_name='initiated at')), + ('initiator', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + bases=(models.Model, osf.models.base.QuerySetExplainMixin), + ), + migrations.CreateModel( + name='ArchiveTarget', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), + ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), + ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), + ('name', models.CharField(max_length=2048)), + ('status', models.CharField(default='INITIATED', max_length=40)), + ('stat_result', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=dict, encoder=osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONEncoder)), + ('errors', django.contrib.postgres.fields.ArrayField(base_field=models.TextField(), blank=True, default=list, size=None)), + ], + options={ + 'abstract': False, + }, + bases=(models.Model, osf.models.base.QuerySetExplainMixin), + ), + migrations.CreateModel( + name='BannerImage', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('filename', models.CharField(max_length=256, unique=True)), + ('image', models.BinaryField()), + ], + ), + migrations.CreateModel( + name='BaseFileNode', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), + ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), + ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), + ('content_type_pk', models.PositiveIntegerField(blank=True, null=True)), + ('type', models.CharField(choices=[('osf.trashedfilenode', 'trashed file node'), ('osf.trashedfile', 'trashed file'), ('osf.trashedfolder', 'trashed folder'), ('osf.osfstoragefilenode', 'osf storage file node'), ('osf.osfstoragefile', 'osf storage file'), ('osf.osfstoragefolder', 'osf storage folder'), ('osf.bitbucketfilenode', 'bitbucket file node'), ('osf.bitbucketfolder', 'bitbucket folder'), ('osf.bitbucketfile', 'bitbucket file'), ('osf.boxfilenode', 'box file node'), ('osf.boxfolder', 'box folder'), ('osf.boxfile', 'box file'), ('osf.dataversefilenode', 'dataverse file node'), ('osf.dataversefolder', 'dataverse folder'), ('osf.dataversefile', 'dataverse file'), ('osf.dropboxfilenode', 'dropbox file node'), ('osf.dropboxfolder', 'dropbox folder'), ('osf.dropboxfile', 'dropbox file'), ('osf.figsharefilenode', 'figshare file node'), ('osf.figsharefolder', 'figshare folder'), ('osf.figsharefile', 'figshare file'), ('osf.githubfilenode', 'github file node'), ('osf.githubfolder', 'github folder'), ('osf.githubfile', 'github file'), ('osf.gitlabfilenode', 'git lab file node'), ('osf.gitlabfolder', 'git lab folder'), ('osf.gitlabfile', 'git lab file'), ('osf.googledrivefilenode', 'google drive file node'), ('osf.googledrivefolder', 'google drive folder'), ('osf.googledrivefile', 'google drive file'), ('osf.onedrivefilenode', 'one drive file node'), ('osf.onedrivefolder', 'one drive folder'), ('osf.onedrivefile', 'one drive file'), ('osf.owncloudfilenode', 'owncloud file node'), ('osf.owncloudfolder', 'owncloud folder'), ('osf.owncloudfile', 'owncloud file'), ('osf.s3filenode', 's3 file node'), ('osf.s3folder', 's3 folder'), ('osf.s3file', 's3 file')], db_index=True, max_length=255)), + ('last_touched', osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True)), + ('_history', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=list, encoder=osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONEncoder)), + ('target_object_id', models.PositiveIntegerField()), + ('provider', models.CharField(db_index=True, max_length=25)), + ('name', models.TextField(blank=True)), + ('_path', models.TextField(blank=True, null=True)), + ('_materialized_path', models.TextField(blank=True, null=True)), + ('deleted_on', osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True)), + ('deleted', osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True)), + ('purged', osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True)), + ('is_root', models.NullBooleanField()), + ('checkout', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ('copied_from', models.ForeignKey(blank=True, default=None, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='copy_of', to='osf.BaseFileNode')), + ('deleted_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='files_deleted_by', to=settings.AUTH_USER_MODEL)), + ('parent', models.ForeignKey(blank=True, default=None, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='_children', to='osf.BaseFileNode')), + ], + options={ + 'base_manager_name': 'objects', + }, + bases=(osf.models.mixins.CommentableMixin, models.Model, osf.models.base.QuerySetExplainMixin), + ), + migrations.CreateModel( + name='BaseFileVersionsThrough', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('version_name', models.TextField(blank=True)), + ('basefilenode', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='osf.BaseFileNode')), + ], + ), + migrations.CreateModel( + name='BlackListGuid', + fields=[ + ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), + ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), + ('id', models.AutoField(primary_key=True, serialize=False)), + ('guid', osf.utils.fields.LowercaseCharField(db_index=True, max_length=255, unique=True)), + ], + options={ + 'abstract': False, + }, + bases=(models.Model, osf.models.base.QuerySetExplainMixin), + ), + migrations.CreateModel( + name='Brand', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), + ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), + ('name', models.CharField(blank=True, max_length=30, null=True)), + ('hero_logo_image', models.URLField()), + ('topnav_logo_image', models.URLField()), + ('hero_background_image', models.URLField()), + ('primary_color', models.CharField(max_length=7)), + ('secondary_color', models.CharField(max_length=7)), + ], + options={ + 'permissions': (('view_brand', 'Can view brand details'), ('modify_brand', 'Can modify brands')), + }, + bases=(models.Model, osf.models.base.QuerySetExplainMixin), + ), + migrations.CreateModel( + name='ChronosJournal', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), + ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), + ('name', models.TextField()), + ('title', models.TextField()), + ('journal_id', models.TextField(unique=True)), + ('raw_response', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(encoder=osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONEncoder)), + ], + options={ + 'abstract': False, + }, + bases=(models.Model, osf.models.base.QuerySetExplainMixin), + ), + migrations.CreateModel( + name='ChronosSubmission', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), + ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), + ('publication_id', models.TextField(unique=True)), + ('status', models.IntegerField(blank=True, choices=[(1, '1'), (2, '2'), (3, '3'), (4, '4'), (5, '5')], default=None, null=True)), + ('raw_response', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(encoder=osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONEncoder)), + ('submission_url', models.TextField()), + ('journal', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='osf.ChronosJournal')), + ], + bases=(models.Model, osf.models.base.QuerySetExplainMixin), + ), + migrations.CreateModel( + name='CitationStyle', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), + ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), + ('_id', models.CharField(db_index=True, max_length=255)), + ('title', models.CharField(max_length=255)), + ('date_parsed', osf.utils.fields.NonNaiveDateTimeField(default=django.utils.timezone.now)), + ('short_title', models.CharField(blank=True, max_length=2048, null=True)), + ('summary', models.CharField(blank=True, max_length=4200, null=True)), + ('has_bibliography', models.BooleanField(default=False)), + ('parent_style', models.CharField(blank=True, max_length=255, null=True)), + ], + options={ + 'ordering': ['_id'], + }, + bases=(models.Model, osf.models.base.QuerySetExplainMixin), + ), + migrations.CreateModel( + name='Collection', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), + ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), + ('content_type_pk', models.PositiveIntegerField(blank=True, null=True)), + ('title', models.CharField(max_length=200, validators=[osf.models.validators.validate_title])), + ('collected_type_choices', django.contrib.postgres.fields.ArrayField(base_field=models.CharField(max_length=127), blank=True, default=list, size=None)), + ('status_choices', django.contrib.postgres.fields.ArrayField(base_field=models.CharField(max_length=127), blank=True, default=list, size=None)), + ('volume_choices', django.contrib.postgres.fields.ArrayField(base_field=models.CharField(max_length=127), blank=True, default=list, size=None)), + ('issue_choices', django.contrib.postgres.fields.ArrayField(base_field=models.CharField(max_length=127), blank=True, default=list, size=None)), + ('program_area_choices', django.contrib.postgres.fields.ArrayField(base_field=models.CharField(max_length=127), blank=True, default=list, size=None)), + ('school_type_choices', django.contrib.postgres.fields.ArrayField(base_field=models.CharField(max_length=127), blank=True, default=list, size=None)), + ('study_design_choices', django.contrib.postgres.fields.ArrayField(base_field=models.CharField(max_length=127), blank=True, default=list, size=None)), + ('is_public', models.BooleanField(db_index=True, default=False)), + ('is_promoted', models.BooleanField(db_index=True, default=False)), + ('is_bookmark_collection', models.BooleanField(db_index=True, default=False)), + ('deleted', osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True)), + ('collected_types', models.ManyToManyField(related_name='_collection_collected_types_+', to='contenttypes.ContentType')), + ('creator', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ], + options={ + 'permissions': (('read_collection', 'Read Collection'), ('write_collection', 'Write Collection'), ('admin_collection', 'Admin Collection')), + }, + bases=(dirtyfields.dirtyfields.DirtyFieldsMixin, models.Model, osf.models.base.QuerySetExplainMixin), + ), + migrations.CreateModel( + name='CollectionGroupObjectPermission', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('content_object', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='osf.Collection')), + ('group', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='auth.Group')), + ('permission', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='auth.Permission')), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='CollectionSubmission', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), + ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), + ('collected_type', models.CharField(blank=True, max_length=127)), + ('status', models.CharField(blank=True, max_length=127)), + ('volume', models.CharField(blank=True, max_length=127)), + ('issue', models.CharField(blank=True, max_length=127)), + ('program_area', models.CharField(blank=True, max_length=127)), + ('school_type', models.CharField(blank=True, max_length=127)), + ('study_design', models.CharField(blank=True, max_length=127)), + ('collection', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='osf.Collection')), + ('creator', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ], + bases=(models.Model, osf.models.base.QuerySetExplainMixin), + ), + migrations.CreateModel( + name='CollectionUserObjectPermission', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('content_object', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='osf.Collection')), + ('permission', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='auth.Permission')), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='Comment', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), + ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), + ('content_type_pk', models.PositiveIntegerField(blank=True, null=True)), + ('spam_status', models.IntegerField(blank=True, db_index=True, default=None, null=True)), + ('spam_pro_tip', models.CharField(blank=True, default=None, max_length=200, null=True)), + ('spam_data', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=dict, encoder=osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONEncoder)), + ('date_last_reported', osf.utils.fields.NonNaiveDateTimeField(blank=True, db_index=True, default=None, null=True)), + ('reports', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=dict, encoder=osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONEncoder, validators=[osf.models.spam._validate_reports])), + ('edited', models.BooleanField(default=False)), + ('is_deleted', models.BooleanField(default=False)), + ('deleted', osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True)), + ('page', models.CharField(blank=True, max_length=255)), + ('content', models.TextField(validators=[osf.models.validators.CommentMaxLength(1000), osf.models.validators.string_required])), + ('ever_mentioned', models.ManyToManyField(blank=True, related_name='mentioned_in', to=settings.AUTH_USER_MODEL)), + ('node', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='osf.AbstractNode')), + ], + options={ + 'abstract': False, + }, + bases=(osf.models.mixins.CommentableMixin, models.Model, osf.models.base.QuerySetExplainMixin), + ), + migrations.CreateModel( + name='Conference', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), + ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), + ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), + ('endpoint', models.CharField(db_index=True, max_length=255, unique=True)), + ('name', models.CharField(max_length=255)), + ('info_url', models.URLField(blank=True)), + ('logo_url', models.URLField(blank=True)), + ('location', models.CharField(blank=True, max_length=2048, null=True)), + ('start_date', osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True)), + ('end_date', osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True)), + ('is_meeting', models.BooleanField(default=True)), + ('active', models.BooleanField()), + ('public_projects', models.BooleanField(default=True)), + ('poster', models.BooleanField(default=True)), + ('talk', models.BooleanField(default=True)), + ('field_names', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(default=osf.models.conference.get_default_field_names, encoder=osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONEncoder)), + ('auto_check_spam', models.BooleanField(default=True)), + ('admins', models.ManyToManyField(to=settings.AUTH_USER_MODEL)), + ('submissions', models.ManyToManyField(related_name='conferences', to='osf.AbstractNode')), + ], + options={ + 'permissions': (('view_conference', 'Can view conference details in the admin app.'),), + }, + bases=(models.Model, osf.models.base.QuerySetExplainMixin), + ), + migrations.CreateModel( + name='Contributor', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('visible', models.BooleanField(default=False)), + ('node', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='osf.AbstractNode')), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ], + ), + migrations.CreateModel( + name='DismissedAlert', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), + ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), + ('_id', models.CharField(db_index=True, max_length=255)), + ('location', models.CharField(max_length=255)), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='alerts', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'ordering': ['-created'], + 'get_latest_by': 'created', + }, + bases=(models.Model, osf.models.base.QuerySetExplainMixin), + ), + migrations.CreateModel( + name='DraftRegistration', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), + ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), + ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), + ('last_logged', osf.utils.fields.NonNaiveDateTimeField(blank=True, db_index=True, default=django.utils.timezone.now, null=True)), + ('description', models.TextField(blank=True, default='')), + ('category', models.CharField(blank=True, choices=[('analysis', 'Analysis'), ('communication', 'Communication'), ('data', 'Data'), ('hypothesis', 'Hypothesis'), ('instrumentation', 'Instrumentation'), ('methods and measures', 'Methods and Measures'), ('procedure', 'Procedure'), ('project', 'Project'), ('software', 'Software'), ('other', 'Other'), ('', 'Uncategorized')], default='', max_length=255)), + ('registration_responses', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=dict, encoder=osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONEncoder)), + ('registration_responses_migrated', models.NullBooleanField(db_index=True, default=True)), + ('title', models.TextField(blank=True, default='', validators=[osf.models.validators.validate_title])), + ('datetime_initiated', osf.utils.fields.NonNaiveDateTimeField(auto_now_add=True)), + ('datetime_updated', osf.utils.fields.NonNaiveDateTimeField(auto_now=True)), + ('deleted', osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True)), + ('registration_metadata', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=dict, encoder=osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONEncoder)), + ('_metaschema_flags', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=dict, encoder=osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONEncoder)), + ('notes', models.TextField(blank=True)), + ], + options={ + 'permissions': (('read_draft_registration', 'Can read the draft registration'), ('write_draft_registration', 'Can edit the draft registration'), ('admin_draft_registration', 'Can manage the draft registration')), + }, + bases=(dirtyfields.dirtyfields.DirtyFieldsMixin, models.Model, osf.models.base.QuerySetExplainMixin), + ), + migrations.CreateModel( + name='DraftRegistrationContributor', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('visible', models.BooleanField(default=False)), + ('draft_registration', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='osf.DraftRegistration')), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ], + ), + migrations.CreateModel( + name='DraftRegistrationGroupObjectPermission', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('content_object', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='osf.DraftRegistration')), + ('group', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='auth.Group')), + ('permission', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='auth.Permission')), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='DraftRegistrationLog', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), + ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), + ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), + ('date', osf.utils.fields.NonNaiveDateTimeField(default=django.utils.timezone.now)), + ('action', models.CharField(max_length=255)), + ('params', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(default=dict, encoder=osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONEncoder)), + ('draft', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='logs', to='osf.DraftRegistration')), + ('user', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ], + options={ + 'ordering': ['-created'], + 'get_latest_by': 'created', + }, + bases=(models.Model, osf.models.base.QuerySetExplainMixin), + ), + migrations.CreateModel( + name='DraftRegistrationUserObjectPermission', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('content_object', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='osf.DraftRegistration')), + ('permission', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='auth.Permission')), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='Email', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), + ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), + ('address', osf.utils.fields.LowercaseEmailField(db_index=True, max_length=254, unique=True, validators=[osf.models.validators.validate_email])), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='emails', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + bases=(models.Model, osf.models.base.QuerySetExplainMixin), + ), + migrations.CreateModel( + name='Embargo', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), + ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), + ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), + ('approval_state', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=dict, encoder=osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONEncoder)), + ('end_date', osf.utils.fields.NonNaiveDateTimeField(blank=True, default=None, null=True)), + ('initiation_date', osf.utils.fields.NonNaiveDateTimeField(blank=True, default=django.utils.timezone.now, null=True)), + ('state', models.CharField(choices=[('undefined', 'Undefined'), ('unapproved', 'Unapproved'), ('pending_moderation', 'PendingModeration'), ('approved', 'Approved'), ('rejected', 'Rejected'), ('moderator_rejected', 'ModeratorRejected'), ('completed', 'Completed'), ('in_progress', 'InProgress')], default='unapproved', max_length=255)), + ('notify_initiator_on_complete', models.BooleanField(default=False)), + ('stashed_urls', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=dict, encoder=osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONEncoder)), + ('for_existing_registration', models.BooleanField(default=False)), + ('initiated_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + bases=(osf.models.sanctions.SanctionCallbackMixin, models.Model, osf.models.base.QuerySetExplainMixin), + ), + migrations.CreateModel( + name='EmbargoTerminationApproval', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), + ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), + ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), + ('approval_state', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=dict, encoder=osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONEncoder)), + ('end_date', osf.utils.fields.NonNaiveDateTimeField(blank=True, default=None, null=True)), + ('initiation_date', osf.utils.fields.NonNaiveDateTimeField(blank=True, default=django.utils.timezone.now, null=True)), + ('state', models.CharField(choices=[('undefined', 'Undefined'), ('unapproved', 'Unapproved'), ('pending_moderation', 'PendingModeration'), ('approved', 'Approved'), ('rejected', 'Rejected'), ('moderator_rejected', 'ModeratorRejected'), ('completed', 'Completed'), ('in_progress', 'InProgress')], default='unapproved', max_length=255)), + ('notify_initiator_on_complete', models.BooleanField(default=False)), + ('stashed_urls', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=dict, encoder=osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONEncoder)), + ('initiated_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + bases=(models.Model, osf.models.base.QuerySetExplainMixin), + ), + migrations.CreateModel( + name='ExternalAccount', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), + ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), + ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), + ('oauth_key', osf.utils.fields.EncryptedTextField(blank=True, null=True)), + ('oauth_secret', osf.utils.fields.EncryptedTextField(blank=True, null=True)), + ('refresh_token', osf.utils.fields.EncryptedTextField(blank=True, null=True)), + ('date_last_refreshed', osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True)), + ('expires_at', osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True)), + ('scopes', django.contrib.postgres.fields.ArrayField(base_field=models.CharField(max_length=128), blank=True, default=list, size=None)), + ('provider', models.CharField(max_length=50)), + ('provider_name', models.CharField(max_length=255)), + ('provider_id', models.CharField(max_length=255)), + ('display_name', osf.utils.fields.EncryptedTextField(blank=True, null=True)), + ('profile_url', osf.utils.fields.EncryptedTextField(blank=True, null=True)), + ], + bases=(models.Model, osf.models.base.QuerySetExplainMixin), + ), + migrations.CreateModel( + name='FileMetadataRecord', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), + ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), + ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), + ('metadata', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=dict, encoder=osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONEncoder)), + ], + bases=(models.Model, osf.models.base.QuerySetExplainMixin), + ), + migrations.CreateModel( + name='FileMetadataSchema', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), + ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), + ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), + ('name', models.CharField(max_length=255)), + ('schema', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(default=dict, encoder=osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONEncoder)), + ('category', models.CharField(blank=True, max_length=255, null=True)), + ('active', models.BooleanField(default=True)), + ('visible', models.BooleanField(default=True)), + ('schema_version', models.IntegerField()), + ], + options={ + 'abstract': False, + }, + bases=(models.Model, osf.models.base.QuerySetExplainMixin), + ), + migrations.CreateModel( + name='FileVersion', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), + ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), + ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), + ('identifier', models.CharField(max_length=100)), + ('size', models.BigIntegerField(blank=True, default=-1, null=True)), + ('content_type', models.CharField(blank=True, max_length=100, null=True)), + ('external_modified', osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True)), + ('metadata', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=dict, encoder=osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONEncoder)), + ('location', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=None, encoder=osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONEncoder, null=True, validators=[osf.models.validators.validate_location])), + ('purged', osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True)), + ('creator', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ('region', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='addons_osfstorage.Region')), + ], + options={ + 'ordering': ('-created',), + }, + bases=(models.Model, osf.models.base.QuerySetExplainMixin), + managers=[ + ('includable_objects', django.db.models.manager.Manager()), + ], + ), + migrations.CreateModel( + name='FileVersionUserMetadata', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), + ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), + ('file_version', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='osf.FileVersion')), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ], + bases=(models.Model, osf.models.base.QuerySetExplainMixin), + ), + migrations.CreateModel( + name='Guid', + fields=[ + ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), + ('id', models.AutoField(primary_key=True, serialize=False)), + ('_id', osf.utils.fields.LowercaseCharField(db_index=True, default=osf.models.base.generate_guid, max_length=255, unique=True)), + ('object_id', models.PositiveIntegerField(blank=True, null=True)), + ('created', osf.utils.fields.NonNaiveDateTimeField(auto_now_add=True, db_index=True)), + ('content_type', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='contenttypes.ContentType')), + ], + options={ + 'ordering': ['-created'], + 'get_latest_by': 'created', + }, + bases=(models.Model, osf.models.base.QuerySetExplainMixin), + ), + migrations.CreateModel( + name='Identifier', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), + ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), + ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), + ('object_id', models.PositiveIntegerField(blank=True, null=True)), + ('category', models.CharField(max_length=20)), + ('value', models.CharField(max_length=50)), + ('deleted', osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True)), + ('content_type', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='contenttypes.ContentType')), + ], + bases=(models.Model, osf.models.base.QuerySetExplainMixin), + ), + migrations.CreateModel( + name='Institution', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), + ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), + ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), + ('last_logged', osf.utils.fields.NonNaiveDateTimeField(blank=True, db_index=True, default=django.utils.timezone.now, null=True)), + ('name', models.CharField(max_length=255)), + ('description', models.TextField(blank=True, default='', null=True)), + ('banner_name', models.CharField(blank=True, max_length=255, null=True)), + ('logo_name', models.CharField(blank=True, max_length=255, null=True)), + ('delegation_protocol', models.CharField(blank=True, choices=[('saml-shib', 'SAML_SHIBBOLETH'), ('cas-pac4j', 'CAS_PAC4J'), ('oauth-pac4j', 'OAUTH_PAC4J'), ('via-orcid', 'AFFILIATION_VIA_ORCID'), ('', 'NONE')], default='', max_length=15)), + ('orcid_record_verified_source', models.CharField(blank=True, default='', max_length=255)), + ('login_url', models.URLField(blank=True, null=True)), + ('logout_url', models.URLField(blank=True, null=True)), + ('domains', django.contrib.postgres.fields.ArrayField(base_field=models.CharField(max_length=255), blank=True, db_index=True, null=True, size=None)), + ('email_domains', django.contrib.postgres.fields.ArrayField(base_field=models.CharField(max_length=255), blank=True, db_index=True, null=True, size=None)), + ('is_deleted', models.BooleanField(db_index=True, default=False)), + ('deleted', osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True)), + ('deactivated', osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True)), + ('ror_uri', models.URLField(blank=True, help_text='The full URI for the this institutions ROR.', max_length=500, null=True)), + ('identifier_domain', models.URLField(blank=True, help_text='The full domain this institutions that will appear in DOI metadata.', max_length=500, null=True)), + ], + options={ + 'permissions': (('view_institution', 'Can view institution details'), ('view_institutional_metrics', 'Can access metrics endpoints for their Institution')), + }, + bases=(dirtyfields.dirtyfields.DirtyFieldsMixin, models.Model, osf.models.base.QuerySetExplainMixin), + ), + migrations.CreateModel( + name='InstitutionalContributor', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('visible', models.BooleanField(default=False)), + ('institution', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='osf.Institution')), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ], + ), + migrations.CreateModel( + name='MailRecord', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), + ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), + ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), + ('data', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(encoder=osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONEncoder)), + ('users_created', models.ManyToManyField(to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + bases=(models.Model, osf.models.base.QuerySetExplainMixin), + ), + migrations.CreateModel( + name='MaintenanceState', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('level', models.IntegerField(choices=[(1, 'info'), (2, 'warning'), (3, 'danger')], default=1)), + ('start', osf.utils.fields.NonNaiveDateTimeField()), + ('end', osf.utils.fields.NonNaiveDateTimeField()), + ('message', models.TextField(blank=True)), + ], + ), + migrations.CreateModel( + name='NodeGroupObjectPermission', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('content_object', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='osf.AbstractNode')), + ('group', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='auth.Group')), + ('permission', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='auth.Permission')), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='NodeLicense', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), + ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), + ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), + ('license_id', models.CharField(help_text='A unique id for the license. for example', max_length=128, unique=True)), + ('name', models.CharField(help_text='The name of the license', max_length=256, unique=True)), + ('text', models.TextField(help_text='The text of the license with custom properties surround by curly brackets, for example: Copyright (c) {{year}}, {{copyrightHolders}} All rights reserved.')), + ('url', models.URLField(blank=True, help_text="The license's url for example: http://opensource.org/licenses/BSD-3-Clause")), + ('properties', django.contrib.postgres.fields.ArrayField(base_field=models.CharField(max_length=128), blank=True, default=list, help_text="The custom elements in a license's text surrounded with curly brackets for example: {year,copyrightHolders}", size=None)), + ], + bases=(models.Model, osf.models.base.QuerySetExplainMixin), + ), + migrations.CreateModel( + name='NodeLicenseRecord', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), + ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), + ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), + ('year', models.CharField(blank=True, max_length=128, null=True)), + ('copyright_holders', django.contrib.postgres.fields.ArrayField(base_field=models.CharField(blank=True, max_length=256, null=True), blank=True, default=list, size=None)), + ('node_license', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='osf.NodeLicense')), + ], + options={ + 'abstract': False, + }, + bases=(models.Model, osf.models.base.QuerySetExplainMixin), + ), + migrations.CreateModel( + name='NodeLog', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), + ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), + ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), + ('date', osf.utils.fields.NonNaiveDateTimeField(blank=True, db_index=True, default=django.utils.timezone.now, null=True)), + ('action', models.CharField(db_index=True, max_length=255)), + ('params', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(default=dict, encoder=osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONEncoder)), + ('should_hide', models.BooleanField(default=False)), + ('foreign_user', models.CharField(blank=True, max_length=255, null=True)), + ('node', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='logs', to='osf.AbstractNode')), + ('original_node', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='osf.AbstractNode')), + ('user', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='logs', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'ordering': ['-date'], + 'get_latest_by': 'date', + }, + bases=(models.Model, osf.models.base.QuerySetExplainMixin), + ), + migrations.CreateModel( + name='NodeRelation', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), + ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), + ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), + ('is_node_link', models.BooleanField(db_index=True, default=False)), + ('child', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='_parents', to='osf.AbstractNode')), + ('parent', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='node_relations', to='osf.AbstractNode')), + ], + bases=(models.Model, osf.models.base.QuerySetExplainMixin), + ), + migrations.CreateModel( + name='NodeRequest', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), + ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), + ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), + ('machine_state', models.CharField(choices=[('initial', 'Initial'), ('pending', 'Pending'), ('accepted', 'Accepted'), ('rejected', 'Rejected')], db_index=True, default='initial', max_length=15)), + ('date_last_transitioned', models.DateTimeField(blank=True, db_index=True, null=True)), + ('request_type', models.CharField(choices=[('access', 'Access'), ('withdrawal', 'Withdrawal')], max_length=31)), + ('comment', models.TextField(blank=True, null=True)), + ('creator', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='submitted_noderequest', to=settings.AUTH_USER_MODEL)), + ('target', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='requests', to='osf.AbstractNode')), + ], + options={ + 'abstract': False, + }, + bases=(models.Model, osf.models.base.QuerySetExplainMixin), + ), + migrations.CreateModel( + name='NodeRequestAction', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), + ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), + ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), + ('trigger', models.CharField(choices=[('submit', 'Submit'), ('accept', 'Accept'), ('reject', 'Reject'), ('edit_comment', 'Edit_Comment')], max_length=31)), + ('from_state', models.CharField(choices=[('initial', 'Initial'), ('pending', 'Pending'), ('accepted', 'Accepted'), ('rejected', 'Rejected')], max_length=31)), + ('to_state', models.CharField(choices=[('initial', 'Initial'), ('pending', 'Pending'), ('accepted', 'Accepted'), ('rejected', 'Rejected')], max_length=31)), + ('comment', models.TextField(blank=True)), + ('is_deleted', models.BooleanField(default=False)), + ('auto', models.BooleanField(default=False)), + ('permissions', models.CharField(choices=[('read', 'Read'), ('write', 'Write'), ('admin', 'Admin')], default='read', max_length=5)), + ('visible', models.BooleanField(default=True)), + ('creator', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='+', to=settings.AUTH_USER_MODEL)), + ('target', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='actions', to='osf.NodeRequest')), + ], + options={ + 'abstract': False, + }, + bases=(models.Model, osf.models.base.QuerySetExplainMixin), + ), + migrations.CreateModel( + name='NodeUserObjectPermission', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('content_object', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='osf.AbstractNode')), + ('permission', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='auth.Permission')), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='NotableEmailDomain', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), + ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), + ('domain', osf.utils.fields.LowercaseCharField(db_index=True, max_length=255, unique=True)), + ('note', models.IntegerField(choices=[(0, 'EXCLUDE_FROM_ACCOUNT_CREATION'), (1, 'ASSUME_HAM_UNTIL_REPORTED')], default=osf.models.notable_email_domain.Note(0))), + ], + options={ + 'abstract': False, + }, + bases=(models.Model, osf.models.base.QuerySetExplainMixin), + ), + migrations.CreateModel( + name='NotificationDigest', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), + ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), + ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), + ('timestamp', osf.utils.fields.NonNaiveDateTimeField()), + ('send_type', models.CharField(db_index=True, max_length=50, validators=[osf.models.validators.validate_subscription_type])), + ('event', models.CharField(max_length=50)), + ('message', models.TextField()), + ('node_lineage', django.contrib.postgres.fields.ArrayField(base_field=models.CharField(max_length=5), size=None)), + ('provider', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='osf.AbstractProvider')), + ('user', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + bases=(models.Model, osf.models.base.QuerySetExplainMixin), + ), + migrations.CreateModel( + name='NotificationSubscription', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), + ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), + ('_id', models.CharField(db_index=True, max_length=100)), + ('event_name', models.CharField(max_length=100)), + ('email_digest', models.ManyToManyField(related_name='_notificationsubscription_email_digest_+', to=settings.AUTH_USER_MODEL)), + ('email_transactional', models.ManyToManyField(related_name='_notificationsubscription_email_transactional_+', to=settings.AUTH_USER_MODEL)), + ('none', models.ManyToManyField(related_name='_notificationsubscription_none_+', to=settings.AUTH_USER_MODEL)), + ('provider', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='notification_subscriptions', to='osf.AbstractProvider')), + ('user', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='notification_subscriptions', to=settings.AUTH_USER_MODEL)), + ], + bases=(models.Model, osf.models.base.QuerySetExplainMixin), + ), + migrations.CreateModel( + name='OSFGroup', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), + ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), + ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), + ('last_logged', osf.utils.fields.NonNaiveDateTimeField(blank=True, db_index=True, default=django.utils.timezone.now, null=True)), + ('name', models.TextField()), + ('creator', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='osfgroups_created', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'permissions': (('view_group', 'Can view group details'), ('member_group', 'Has group membership'), ('manage_group', 'Can manage group membership')), + }, + bases=(models.Model, osf.models.base.QuerySetExplainMixin), + ), + migrations.CreateModel( + name='OSFGroupGroupObjectPermission', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('content_object', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='osf.OSFGroup')), + ('group', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='auth.Group')), + ('permission', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='auth.Permission')), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='OSFGroupLog', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), + ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), + ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), + ('action', models.CharField(db_index=True, max_length=255)), + ('params', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(default=dict, encoder=osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONEncoder)), + ('should_hide', models.BooleanField(default=False)), + ('group', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='logs', to='osf.OSFGroup')), + ('user', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='group_logs', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'ordering': ['-created'], + 'get_latest_by': 'created', + }, + bases=(models.Model, osf.models.base.QuerySetExplainMixin), + ), + migrations.CreateModel( + name='OSFGroupUserObjectPermission', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('content_object', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='osf.OSFGroup')), + ('permission', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='auth.Permission')), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='Outcome', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), + ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), + ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), + ('title', models.TextField(validators=[osf.models.validators.validate_title])), + ('description', models.TextField(blank=True, default='')), + ('category', models.CharField(blank=True, choices=[('analysis', 'Analysis'), ('communication', 'Communication'), ('data', 'Data'), ('hypothesis', 'Hypothesis'), ('instrumentation', 'Instrumentation'), ('methods and measures', 'Methods and Measures'), ('procedure', 'Procedure'), ('project', 'Project'), ('software', 'Software'), ('other', 'Other'), ('', 'Uncategorized')], default='', max_length=255)), + ('affiliated_institutions', models.ManyToManyField(related_name='outcomes', to='osf.Institution')), + ], + options={ + 'abstract': False, + }, + bases=(models.Model, osf.models.base.QuerySetExplainMixin), + ), + migrations.CreateModel( + name='OutcomeArtifact', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), + ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), + ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), + ('artifact_type', models.IntegerField(choices=[(0, 'UNDEFINED'), (1, 'DATA'), (11, 'ANALYTIC_CODE'), (21, 'MATERIALS'), (31, 'PAPERS'), (41, 'SUPPLEMENTS'), (1001, 'PRIMARY')], default=osf.utils.outcomes.ArtifactTypes(0))), + ('title', models.TextField(blank=True)), + ('description', models.TextField(blank=True)), + ('finalized', models.BooleanField(default=False)), + ('deleted', osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True)), + ('identifier', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='artifact_metadata', to='osf.Identifier')), + ('outcome', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='artifact_metadata', to='osf.Outcome')), + ], + options={ + 'ordering': ['artifact_type', 'title'], + }, + bases=(models.Model, osf.models.base.QuerySetExplainMixin), + ), + migrations.CreateModel( + name='PageCounter', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), + ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), + ('_id', models.CharField(db_index=True, max_length=300, unique=True)), + ('date', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(default=dict, encoder=osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONEncoder)), + ('total', models.PositiveIntegerField(default=0)), + ('unique', models.PositiveIntegerField(default=0)), + ('action', models.CharField(max_length=128)), + ('version', models.IntegerField(blank=True, null=True)), + ('file', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='pagecounters', to='osf.BaseFileNode')), + ('resource', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='pagecounters', to='osf.Guid')), + ], + options={ + 'abstract': False, + }, + bases=(models.Model, osf.models.base.QuerySetExplainMixin), + ), + migrations.CreateModel( + name='Preprint', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), + ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), + ('content_type_pk', models.PositiveIntegerField(blank=True, null=True)), + ('spam_status', models.IntegerField(blank=True, db_index=True, default=None, null=True)), + ('spam_pro_tip', models.CharField(blank=True, default=None, max_length=200, null=True)), + ('spam_data', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=dict, encoder=osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONEncoder)), + ('date_last_reported', osf.utils.fields.NonNaiveDateTimeField(blank=True, db_index=True, default=None, null=True)), + ('reports', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=dict, encoder=osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONEncoder, validators=[osf.models.spam._validate_reports])), + ('last_logged', osf.utils.fields.NonNaiveDateTimeField(blank=True, db_index=True, default=django.utils.timezone.now, null=True)), + ('title', models.TextField(validators=[osf.models.validators.validate_title])), + ('description', models.TextField(blank=True, default='')), + ('date_last_transitioned', models.DateTimeField(blank=True, db_index=True, null=True)), + ('machine_state', models.CharField(choices=[('initial', 'Initial'), ('pending', 'Pending'), ('accepted', 'Accepted'), ('rejected', 'Rejected'), ('withdrawn', 'Withdrawn')], db_index=True, default='initial', max_length=15)), + ('is_published', models.BooleanField(db_index=True, default=False)), + ('date_published', osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True)), + ('original_publication_date', osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True)), + ('preprint_doi_created', osf.utils.fields.NonNaiveDateTimeField(blank=True, default=None, null=True)), + ('date_withdrawn', osf.utils.fields.NonNaiveDateTimeField(blank=True, default=None, null=True)), + ('withdrawal_justification', models.TextField(blank=True, default='')), + ('ever_public', models.BooleanField(default=False)), + ('article_doi', models.CharField(blank=True, max_length=128, null=True, validators=[osf.models.validators.validate_doi])), + ('is_public', models.BooleanField(db_index=True, default=True)), + ('deleted', osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True)), + ('migrated', osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True)), + ('conflict_of_interest_statement', models.TextField(blank=True, null=True)), + ('has_coi', models.NullBooleanField()), + ('has_prereg_links', models.TextField(blank=True, choices=[('available', 'Available'), ('no', 'No'), ('not_applicable', 'Not applicable')], null=True)), + ('why_no_prereg', models.TextField(blank=True, null=True)), + ('prereg_links', django.contrib.postgres.fields.ArrayField(base_field=models.URLField(blank=True, null=True), blank=True, null=True, size=None)), + ('prereg_link_info', models.TextField(blank=True, choices=[('prereg_designs', 'Pre-registration of study designs'), ('prereg_analysis', 'Pre-registration of study analysis'), ('prereg_both', 'Pre-registration of study designs and study analysis')], null=True)), + ('has_data_links', models.TextField(blank=True, choices=[('available', 'Available'), ('no', 'No'), ('not_applicable', 'Not applicable')], null=True)), + ('why_no_data', models.TextField(blank=True, null=True)), + ('data_links', django.contrib.postgres.fields.ArrayField(base_field=models.URLField(blank=True, null=True), blank=True, null=True, size=None)), + ], + options={ + 'permissions': (('view_preprint', 'Can view preprint details in the admin app'), ('read_preprint', 'Can read the preprint'), ('write_preprint', 'Can write the preprint'), ('admin_preprint', 'Can manage the preprint')), + }, + bases=(dirtyfields.dirtyfields.DirtyFieldsMixin, models.Model, osf.models.base.QuerySetExplainMixin), + ), + migrations.CreateModel( + name='PreprintContributor', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('visible', models.BooleanField(default=False)), + ('preprint', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='osf.Preprint')), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ], + ), + migrations.CreateModel( + name='PreprintGroupObjectPermission', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('content_object', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='osf.Preprint')), + ('group', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='auth.Group')), + ('permission', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='auth.Permission')), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='PreprintLog', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), + ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), + ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), + ('action', models.CharField(db_index=True, max_length=255)), + ('params', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(default=dict, encoder=osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONEncoder)), + ('should_hide', models.BooleanField(default=False)), + ('foreign_user', models.CharField(blank=True, max_length=255, null=True)), + ('preprint', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='logs', to='osf.Preprint')), + ('user', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='preprint_logs', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'ordering': ['-created'], + 'get_latest_by': 'created', + }, + bases=(models.Model, osf.models.base.QuerySetExplainMixin), + ), + migrations.CreateModel( + name='PreprintRequest', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), + ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), + ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), + ('machine_state', models.CharField(choices=[('initial', 'Initial'), ('pending', 'Pending'), ('accepted', 'Accepted'), ('rejected', 'Rejected')], db_index=True, default='initial', max_length=15)), + ('date_last_transitioned', models.DateTimeField(blank=True, db_index=True, null=True)), + ('request_type', models.CharField(choices=[('access', 'Access'), ('withdrawal', 'Withdrawal')], max_length=31)), + ('comment', models.TextField(blank=True, null=True)), + ('creator', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='submitted_preprintrequest', to=settings.AUTH_USER_MODEL)), + ('target', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='requests', to='osf.Preprint')), + ], + options={ + 'abstract': False, + }, + bases=(models.Model, osf.models.base.QuerySetExplainMixin), + ), + migrations.CreateModel( + name='PreprintRequestAction', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), + ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), + ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), + ('trigger', models.CharField(choices=[('submit', 'Submit'), ('accept', 'Accept'), ('reject', 'Reject'), ('edit_comment', 'Edit_Comment')], max_length=31)), + ('from_state', models.CharField(choices=[('initial', 'Initial'), ('pending', 'Pending'), ('accepted', 'Accepted'), ('rejected', 'Rejected')], max_length=31)), + ('to_state', models.CharField(choices=[('initial', 'Initial'), ('pending', 'Pending'), ('accepted', 'Accepted'), ('rejected', 'Rejected')], max_length=31)), + ('comment', models.TextField(blank=True)), + ('is_deleted', models.BooleanField(default=False)), + ('auto', models.BooleanField(default=False)), + ('creator', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='+', to=settings.AUTH_USER_MODEL)), + ('target', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='actions', to='osf.PreprintRequest')), + ], + options={ + 'abstract': False, + }, + bases=(models.Model, osf.models.base.QuerySetExplainMixin), + ), + migrations.CreateModel( + name='PreprintUserObjectPermission', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('content_object', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='osf.Preprint')), + ('permission', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='auth.Permission')), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='PrivateLink', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), + ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), + ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), + ('key', models.CharField(max_length=512, unique=True)), + ('name', models.CharField(blank=True, max_length=255, null=True)), + ('is_deleted', models.BooleanField(default=False)), + ('deleted', osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True)), + ('anonymous', models.BooleanField(default=False)), + ('creator', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL)), + ('nodes', models.ManyToManyField(related_name='private_links', to='osf.AbstractNode')), + ], + options={ + 'abstract': False, + }, + bases=(models.Model, osf.models.base.QuerySetExplainMixin), + ), + migrations.CreateModel( + name='ProviderAssetFile', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), + ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), + ('name', models.CharField(choices=[('favicon', 'favicon'), ('powered_by_share', 'powered_by_share'), ('sharing', 'sharing'), ('square_color_no_transparent', 'square_color_no_transparent'), ('square_color_transparent', 'square_color_transparent'), ('style', 'style'), ('wide_black', 'wide_black'), ('wide_color', 'wide_color'), ('wide_white', 'wide_white')], max_length=63)), + ('file', models.FileField(upload_to='assets')), + ('providers', models.ManyToManyField(blank=True, related_name='asset_files', to='osf.AbstractProvider')), + ], + options={ + 'permissions': (('view_providerassetfile', 'Can view provider asset files'),), + }, + bases=(models.Model, osf.models.base.QuerySetExplainMixin), + ), + migrations.CreateModel( + name='QueuedMail', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), + ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), + ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), + ('to_addr', models.CharField(max_length=255)), + ('send_at', osf.utils.fields.NonNaiveDateTimeField(db_index=True)), + ('email_type', models.CharField(db_index=True, max_length=255)), + ('data', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=dict, encoder=osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONEncoder)), + ('sent_at', osf.utils.fields.NonNaiveDateTimeField(blank=True, db_index=True, null=True)), + ('user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + bases=(models.Model, osf.models.base.QuerySetExplainMixin), + ), + migrations.CreateModel( + name='RecentlyAddedContributor', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('date_added', osf.utils.fields.NonNaiveDateTimeField(auto_now=True)), + ('contributor', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='recently_added_by', to=settings.AUTH_USER_MODEL)), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ], + ), + migrations.CreateModel( + name='RegistrationAction', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), + ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), + ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), + ('comment', models.TextField(blank=True)), + ('is_deleted', models.BooleanField(default=False)), + ('auto', models.BooleanField(default=False)), + ('trigger', models.CharField(choices=[('submit', 'Submit'), ('accept_submission', 'AcceptSubmission'), ('reject_submission', 'RejectSubmission'), ('request_withdrawal', 'RequestWithdrawal'), ('accept_withdrawal', 'AcceptWithdrawal'), ('reject_withdrawal', 'RejectWithdrawal'), ('force_withdraw', 'ForceWithdraw')], max_length=31)), + ('from_state', models.CharField(choices=[('undefined', 'Undefined'), ('initial', 'Initial'), ('reverted', 'Reverted'), ('pending', 'Pending'), ('rejected', 'Rejected'), ('accepted', 'Accepted'), ('embargo', 'Embargo'), ('pending_embargo_termination', 'PendingEmbargoTermination'), ('pending_withdraw_request', 'PendingWithdrawRequest'), ('pending_withdraw', 'PendingWithdraw'), ('withdrawn', 'Withdrawn')], max_length=31)), + ('to_state', models.CharField(choices=[('undefined', 'Undefined'), ('initial', 'Initial'), ('reverted', 'Reverted'), ('pending', 'Pending'), ('rejected', 'Rejected'), ('accepted', 'Accepted'), ('embargo', 'Embargo'), ('pending_embargo_termination', 'PendingEmbargoTermination'), ('pending_withdraw_request', 'PendingWithdrawRequest'), ('pending_withdraw', 'PendingWithdraw'), ('withdrawn', 'Withdrawn')], max_length=31)), + ('creator', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='+', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + bases=(models.Model, osf.models.base.QuerySetExplainMixin), + ), + migrations.CreateModel( + name='RegistrationApproval', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), + ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), + ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), + ('approval_state', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=dict, encoder=osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONEncoder)), + ('end_date', osf.utils.fields.NonNaiveDateTimeField(blank=True, default=None, null=True)), + ('initiation_date', osf.utils.fields.NonNaiveDateTimeField(blank=True, default=django.utils.timezone.now, null=True)), + ('state', models.CharField(choices=[('undefined', 'Undefined'), ('unapproved', 'Unapproved'), ('pending_moderation', 'PendingModeration'), ('approved', 'Approved'), ('rejected', 'Rejected'), ('moderator_rejected', 'ModeratorRejected'), ('completed', 'Completed'), ('in_progress', 'InProgress')], default='unapproved', max_length=255)), + ('notify_initiator_on_complete', models.BooleanField(default=False)), + ('stashed_urls', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=dict, encoder=osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONEncoder)), + ('initiated_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + bases=(osf.models.sanctions.SanctionCallbackMixin, models.Model, osf.models.base.QuerySetExplainMixin), + ), + migrations.CreateModel( + name='RegistrationBulkUploadJob', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), + ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), + ('payload_hash', models.CharField(max_length=255, unique=True)), + ('state', models.IntegerField(choices=[(osf.models.registration_bulk_upload_job.JobState(0), 'PENDING'), (osf.models.registration_bulk_upload_job.JobState(1), 'INITIALIZED'), (osf.models.registration_bulk_upload_job.JobState(2), 'PICKED_UP'), (osf.models.registration_bulk_upload_job.JobState(3), 'DONE_FULL'), (osf.models.registration_bulk_upload_job.JobState(4), 'DONE_PARTIAL'), (osf.models.registration_bulk_upload_job.JobState(5), 'DONE_ERROR')], default=osf.models.registration_bulk_upload_job.JobState(0))), + ('email_sent', osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True)), + ('initiator', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + bases=(models.Model, osf.models.base.QuerySetExplainMixin), + ), + migrations.CreateModel( + name='RegistrationBulkUploadRow', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), + ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), + ('is_completed', models.BooleanField(default=False)), + ('is_picked_up', models.BooleanField(default=False)), + ('csv_raw', models.TextField(default='')), + ('csv_parsed', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(default=dict, encoder=osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONEncoder)), + ('row_hash', models.CharField(default='', max_length=255, unique=True)), + ('draft_registration', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='osf.DraftRegistration')), + ('upload', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='osf.RegistrationBulkUploadJob')), + ], + options={ + 'abstract': False, + }, + bases=(models.Model, osf.models.base.QuerySetExplainMixin), + ), + migrations.CreateModel( + name='RegistrationSchema', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), + ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), + ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), + ('name', models.CharField(max_length=255)), + ('schema', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(default=dict, encoder=osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONEncoder)), + ('category', models.CharField(blank=True, max_length=255, null=True)), + ('active', models.BooleanField(default=True)), + ('visible', models.BooleanField(default=True)), + ('schema_version', models.IntegerField()), + ('config', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=dict, encoder=osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONEncoder)), + ('description', models.TextField(blank=True, null=True)), + ], + options={ + 'abstract': False, + }, + bases=(models.Model, osf.models.base.QuerySetExplainMixin), + ), + migrations.CreateModel( + name='RegistrationSchemaBlock', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), + ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), + ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), + ('help_text', models.TextField()), + ('example_text', models.TextField(null=True)), + ('registration_response_key', models.CharField(blank=True, db_index=True, max_length=255, null=True)), + ('schema_block_group_key', models.CharField(db_index=True, max_length=24, null=True)), + ('block_type', models.CharField(choices=[('page-heading', 'page-heading'), ('section-heading', 'section-heading'), ('subsection-heading', 'subsection-heading'), ('paragraph', 'paragraph'), ('question-label', 'question-label'), ('short-text-input', 'short-text-input'), ('long-text-input', 'long-text-input'), ('file-input', 'file-input'), ('contributors-input', 'contributors-input'), ('single-select-input', 'single-select-input'), ('multi-select-input', 'multi-select-input'), ('select-input-option', 'select-input-option'), ('select-other-option', 'select-other-option')], db_index=True, max_length=31)), + ('display_text', models.TextField()), + ('required', models.BooleanField(default=False)), + ('schema', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='schema_blocks', to='osf.RegistrationSchema')), + ], + bases=(models.Model, osf.models.base.QuerySetExplainMixin), + ), + migrations.CreateModel( + name='Retraction', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), + ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), + ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), + ('approval_state', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=dict, encoder=osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONEncoder)), + ('end_date', osf.utils.fields.NonNaiveDateTimeField(blank=True, default=None, null=True)), + ('initiation_date', osf.utils.fields.NonNaiveDateTimeField(blank=True, default=django.utils.timezone.now, null=True)), + ('state', models.CharField(choices=[('undefined', 'Undefined'), ('unapproved', 'Unapproved'), ('pending_moderation', 'PendingModeration'), ('approved', 'Approved'), ('rejected', 'Rejected'), ('moderator_rejected', 'ModeratorRejected'), ('completed', 'Completed'), ('in_progress', 'InProgress')], default='unapproved', max_length=255)), + ('notify_initiator_on_complete', models.BooleanField(default=False)), + ('stashed_urls', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=dict, encoder=osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONEncoder)), + ('justification', models.CharField(blank=True, max_length=2048, null=True)), + ('date_retracted', osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True)), + ('initiated_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + bases=(models.Model, osf.models.base.QuerySetExplainMixin), + ), + migrations.CreateModel( + name='ReviewAction', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), + ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), + ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), + ('comment', models.TextField(blank=True)), + ('is_deleted', models.BooleanField(default=False)), + ('auto', models.BooleanField(default=False)), + ('trigger', models.CharField(choices=[('submit', 'Submit'), ('accept', 'Accept'), ('reject', 'Reject'), ('edit_comment', 'Edit_Comment'), ('withdraw', 'Withdraw')], max_length=31)), + ('from_state', models.CharField(choices=[('initial', 'Initial'), ('pending', 'Pending'), ('accepted', 'Accepted'), ('rejected', 'Rejected'), ('withdrawn', 'Withdrawn')], max_length=31)), + ('to_state', models.CharField(choices=[('initial', 'Initial'), ('pending', 'Pending'), ('accepted', 'Accepted'), ('rejected', 'Rejected'), ('withdrawn', 'Withdrawn')], max_length=31)), + ('creator', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='+', to=settings.AUTH_USER_MODEL)), + ('target', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='actions', to='osf.Preprint')), + ], + options={ + 'abstract': False, + }, + bases=(models.Model, osf.models.base.QuerySetExplainMixin), + ), + migrations.CreateModel( + name='ScheduledBanner', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=256, unique=True)), + ('start_date', osf.utils.fields.NonNaiveDateTimeField()), + ('end_date', osf.utils.fields.NonNaiveDateTimeField()), + ('color', models.CharField(max_length=7)), + ('license', models.CharField(blank=True, max_length=256, null=True)), + ('link', models.URLField(blank=True, default='https://www.crowdrise.com/centerforopenscience')), + ('default_photo', models.FileField(storage=osf.utils.storage.BannerImageStorage(), upload_to='')), + ('default_alt_text', models.TextField()), + ('mobile_photo', models.FileField(storage=osf.utils.storage.BannerImageStorage(), upload_to='')), + ('mobile_alt_text', models.TextField(blank=True, null=True)), + ], + options={ + 'permissions': (('view_scheduledbanner', 'Can view scheduled banner details'),), + }, + ), + migrations.CreateModel( + name='SchemaResponse', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), + ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), + ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), + ('revision_justification', models.TextField(blank=True, null=True)), + ('submitted_timestamp', osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True)), + ('reviews_state', models.CharField(choices=[('undefined', 'Undefined'), ('unapproved', 'Unapproved'), ('pending_moderation', 'PendingModeration'), ('approved', 'Approved'), ('rejected', 'Rejected'), ('moderator_rejected', 'ModeratorRejected'), ('completed', 'Completed'), ('in_progress', 'InProgress')], default='in_progress', max_length=255)), + ('object_id', models.PositiveIntegerField()), + ('content_type', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='contenttypes.ContentType')), + ('initiator', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ('pending_approvers', models.ManyToManyField(related_name='pending_submissions', to=settings.AUTH_USER_MODEL)), + ('previous_response', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='updated_response', to='osf.SchemaResponse')), + ], + options={ + 'ordering': ['-created'], + }, + bases=(models.Model, osf.models.base.QuerySetExplainMixin), + ), + migrations.CreateModel( + name='SchemaResponseAction', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), + ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), + ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), + ('comment', models.TextField(blank=True)), + ('is_deleted', models.BooleanField(default=False)), + ('auto', models.BooleanField(default=False)), + ('trigger', models.CharField(choices=[('submit', 'Submit'), ('approve', 'Approve'), ('accept', 'Accept'), ('admin_reject', 'AdminReject'), ('moderator_reject', 'ModeratorReject')], max_length=31)), + ('from_state', models.CharField(choices=[('undefined', 'Undefined'), ('unapproved', 'Unapproved'), ('pending_moderation', 'PendingModeration'), ('approved', 'Approved'), ('rejected', 'Rejected'), ('moderator_rejected', 'ModeratorRejected'), ('completed', 'Completed'), ('in_progress', 'InProgress')], max_length=31)), + ('to_state', models.CharField(choices=[('undefined', 'Undefined'), ('unapproved', 'Unapproved'), ('pending_moderation', 'PendingModeration'), ('approved', 'Approved'), ('rejected', 'Rejected'), ('moderator_rejected', 'ModeratorRejected'), ('completed', 'Completed'), ('in_progress', 'InProgress')], max_length=31)), + ('creator', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='+', to=settings.AUTH_USER_MODEL)), + ('target', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='actions', to='osf.SchemaResponse')), + ], + options={ + 'abstract': False, + }, + bases=(models.Model, osf.models.base.QuerySetExplainMixin), + ), + migrations.CreateModel( + name='SchemaResponseBlock', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), + ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), + ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), + ('schema_key', models.CharField(max_length=255)), + ('response', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, encoder=osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONEncoder, null=True)), + ('source_schema_response', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='updated_response_blocks', to='osf.SchemaResponse')), + ], + bases=(models.Model, osf.models.base.QuerySetExplainMixin), + ), + migrations.CreateModel( + name='Session', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), + ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), + ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), + ('data', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=dict, encoder=osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONEncoder)), + ], + options={ + 'abstract': False, + }, + bases=(models.Model, osf.models.base.QuerySetExplainMixin), + ), + migrations.CreateModel( + name='Subject', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), + ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), + ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), + ('text', models.CharField(db_index=True, max_length=256)), + ('highlighted', models.BooleanField(db_index=True, default=False)), + ('bepress_subject', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='aliases', to='osf.Subject')), + ('parent', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='children', to='osf.Subject', validators=[osf.models.validators.validate_subject_hierarchy_length])), + ('provider', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='subjects', to='osf.AbstractProvider')), + ], + options={ + 'permissions': (('view_subject', 'Can view subject details'),), + 'base_manager_name': 'objects', + }, + bases=(models.Model, osf.models.base.QuerySetExplainMixin, dirtyfields.dirtyfields.DirtyFieldsMixin), + ), + migrations.CreateModel( + name='Tag', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), + ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), + ('name', models.CharField(db_index=True, max_length=1024)), + ('system', models.BooleanField(default=False)), + ], + options={ + 'ordering': ('name',), + }, + bases=(models.Model, osf.models.base.QuerySetExplainMixin), + ), + migrations.CreateModel( + name='UserActivityCounter', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), + ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), + ('_id', models.CharField(db_index=True, max_length=5, unique=True)), + ('action', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(default=dict, encoder=osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONEncoder)), + ('date', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(default=dict, encoder=osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONEncoder)), + ('total', models.PositiveIntegerField(default=0)), + ], + options={ + 'abstract': False, + }, + bases=(models.Model, osf.models.base.QuerySetExplainMixin), + ), + migrations.CreateModel( + name='WhitelistedSHAREPreprintProvider', + fields=[ + ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), + ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), + ('id', models.AutoField(primary_key=True, serialize=False)), + ('provider_name', models.CharField(max_length=200, unique=True)), + ], + options={ + 'abstract': False, + }, + bases=(models.Model, osf.models.base.QuerySetExplainMixin), + ), + migrations.CreateModel( + name='AdminLogEntry', + fields=[ + ], + options={ + 'proxy': True, + 'indexes': [], + }, + bases=('admin.logentry',), + managers=[ + ('objects', osf.models.admin_log_entry.AdminLogEntryManager()), + ], + ), + migrations.AlterUniqueTogether( + name='tag', + unique_together=set([('name', 'system')]), + ), + migrations.AddField( + model_name='schemaresponse', + name='response_blocks', + field=models.ManyToManyField(to='osf.SchemaResponseBlock'), + ), + migrations.AddField( + model_name='schemaresponse', + name='schema', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='osf.RegistrationSchema'), + ), + migrations.AddField( + model_name='registrationbulkuploadjob', + name='schema', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='osf.RegistrationSchema'), + ), + migrations.AddField( + model_name='preprint', + name='_contributors', + field=models.ManyToManyField(related_name='preprints', through='osf.PreprintContributor', to=settings.AUTH_USER_MODEL), + ), + migrations.AddField( + model_name='preprint', + name='creator', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='preprints_created', to=settings.AUTH_USER_MODEL), + ), + migrations.AddField( + model_name='preprint', + name='license', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='osf.NodeLicenseRecord'), + ), + migrations.AddField( + model_name='preprint', + name='node', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='preprints', to='osf.AbstractNode'), + ), + migrations.AddField( + model_name='preprint', + name='region', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='addons_osfstorage.Region'), + ), + migrations.AddField( + model_name='preprint', + name='subjects', + field=models.ManyToManyField(blank=True, related_name='preprints', to='osf.Subject'), + ), + migrations.AddField( + model_name='preprint', + name='tags', + field=models.ManyToManyField(related_name='preprint_tagged', to='osf.Tag'), + ), + migrations.AddField( + model_name='outcome', + name='artifacts', + field=models.ManyToManyField(through='osf.OutcomeArtifact', to='osf.Identifier'), + ), + migrations.AddField( + model_name='outcome', + name='node_license', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='outcomes', to='osf.NodeLicenseRecord'), + ), + migrations.AddField( + model_name='outcome', + name='subjects', + field=models.ManyToManyField(blank=True, related_name='outcomes', to='osf.Subject'), + ), + migrations.AddField( + model_name='outcome', + name='tags', + field=models.ManyToManyField(related_name='outcome_tagged', to='osf.Tag'), + ), + migrations.AlterUniqueTogether( + name='nodelicense', + unique_together=set([('_id', 'license_id')]), + ), + migrations.AddField( + model_name='institution', + name='contributors', + field=models.ManyToManyField(related_name='institutions', through='osf.InstitutionalContributor', to=settings.AUTH_USER_MODEL), + ), + migrations.AddField( + model_name='fileversion', + name='seen_by', + field=models.ManyToManyField(related_name='versions_seen', through='osf.FileVersionUserMetadata', to=settings.AUTH_USER_MODEL), + ), + migrations.AlterUniqueTogether( + name='filemetadataschema', + unique_together=set([('name', 'schema_version')]), + ), + migrations.AddField( + model_name='filemetadatarecord', + name='schema', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='records', to='osf.FileMetadataSchema'), + ), + migrations.AlterUniqueTogether( + name='externalaccount', + unique_together=set([('provider', 'provider_id')]), + ), + migrations.AddField( + model_name='draftregistration', + name='_contributors', + field=models.ManyToManyField(related_name='draft_registrations', through='osf.DraftRegistrationContributor', to=settings.AUTH_USER_MODEL), + ), + migrations.AddField( + model_name='draftregistration', + name='affiliated_institutions', + field=models.ManyToManyField(related_name='draft_registrations', to='osf.Institution'), + ), + migrations.AddField( + model_name='draftregistration', + name='branched_from', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='registered_draft', to='osf.AbstractNode'), + ), + migrations.AddField( + model_name='draftregistration', + name='initiator', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL), + ), + migrations.AddField( + model_name='draftregistration', + name='node_license', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='draft_registrations', to='osf.NodeLicenseRecord'), + ), + migrations.AddField( + model_name='draftregistration', + name='registration_schema', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='osf.RegistrationSchema'), + ), + migrations.AddField( + model_name='draftregistration', + name='subjects', + field=models.ManyToManyField(blank=True, related_name='draftregistrations', to='osf.Subject'), + ), + migrations.AddField( + model_name='draftregistration', + name='tags', + field=models.ManyToManyField(related_name='draftregistration_tagged', to='osf.Tag'), + ), + migrations.AddField( + model_name='comment', + name='root_target', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='comments', to='osf.Guid'), + ), + migrations.AddField( + model_name='comment', + name='target', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='child_comments', to='osf.Guid'), + ), + migrations.AddField( + model_name='comment', + name='user', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL), + ), + migrations.AddField( + model_name='collectionsubmission', + name='guid', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='osf.Guid'), + ), + migrations.AddField( + model_name='collectionsubmission', + name='subjects', + field=models.ManyToManyField(blank=True, related_name='collectionsubmissions', to='osf.Subject'), + ), + migrations.AddField( + model_name='collection', + name='guid_links', + field=models.ManyToManyField(related_name='collections', through='osf.CollectionSubmission', to='osf.Guid'), + ), + migrations.AddField( + model_name='collection', + name='provider', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='osf.AbstractProvider'), + ), + migrations.AddField( + model_name='chronossubmission', + name='preprint', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='osf.Preprint'), + ), + migrations.AddField( + model_name='chronossubmission', + name='submitter', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL), + ), + migrations.AddField( + model_name='basefileversionsthrough', + name='fileversion', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='osf.FileVersion'), + ), + migrations.AddField( + model_name='basefilenode', + name='tags', + field=models.ManyToManyField(related_name='basefilenode_tagged', to='osf.Tag'), + ), + migrations.AddField( + model_name='basefilenode', + name='target_content_type', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='contenttypes.ContentType'), + ), + migrations.AddField( + model_name='basefilenode', + name='versions', + field=models.ManyToManyField(through='osf.BaseFileVersionsThrough', to='osf.FileVersion'), + ), + migrations.AddField( + model_name='archivejob', + name='target_addons', + field=models.ManyToManyField(to='osf.ArchiveTarget'), + ), + migrations.AddField( + model_name='apioauth2personaltoken', + name='scopes', + field=models.ManyToManyField(related_name='tokens', to='osf.ApiOAuth2Scope'), + ), + migrations.AddField( + model_name='abstractprovider', + name='brand', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='providers', to='osf.Brand'), + ), + migrations.AddField( + model_name='abstractprovider', + name='default_license', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='default_license', to='osf.NodeLicense'), + ), + migrations.AddField( + model_name='abstractprovider', + name='default_schema', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='default_schema', to='osf.RegistrationSchema'), + ), + migrations.AddField( + model_name='abstractprovider', + name='licenses_acceptable', + field=models.ManyToManyField(blank=True, related_name='licenses_acceptable', to='osf.NodeLicense'), + ), + migrations.AddField( + model_name='abstractprovider', + name='primary_collection', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='osf.Collection'), + ), + migrations.AddField( + model_name='abstractnode', + name='_contributors', + field=models.ManyToManyField(related_name='nodes', through='osf.Contributor', to=settings.AUTH_USER_MODEL), + ), + migrations.AddField( + model_name='abstractnode', + name='_nodes', + field=models.ManyToManyField(related_name='parent_nodes', through='osf.NodeRelation', to='osf.AbstractNode'), + ), + migrations.AddField( + model_name='abstractnode', + name='affiliated_institutions', + field=models.ManyToManyField(related_name='nodes', to='osf.Institution'), + ), + migrations.AddField( + model_name='abstractnode', + name='creator', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='nodes_created', to=settings.AUTH_USER_MODEL), + ), + migrations.AddField( + model_name='abstractnode', + name='embargo', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='registrations', to='osf.Embargo'), + ), + migrations.AddField( + model_name='abstractnode', + name='embargo_termination_approval', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='registrations', to='osf.EmbargoTerminationApproval'), + ), + migrations.AddField( + model_name='abstractnode', + name='forked_from', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='forks', to='osf.AbstractNode'), + ), + migrations.AddField( + model_name='abstractnode', + name='node_license', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='nodes', to='osf.NodeLicenseRecord'), + ), + migrations.AddField( + model_name='abstractnode', + name='registered_from', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='registrations', to='osf.AbstractNode'), + ), + migrations.AddField( + model_name='abstractnode', + name='registered_schema', + field=models.ManyToManyField(to='osf.RegistrationSchema'), + ), + migrations.AddField( + model_name='abstractnode', + name='registered_user', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='related_to', to=settings.AUTH_USER_MODEL), + ), + migrations.AddField( + model_name='abstractnode', + name='registration_approval', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='registrations', to='osf.RegistrationApproval'), + ), + migrations.AddField( + model_name='abstractnode', + name='retraction', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='registrations', to='osf.Retraction'), + ), + migrations.AddField( + model_name='abstractnode', + name='root', + field=models.ForeignKey(blank=True, default=None, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='descendants', to='osf.AbstractNode'), + ), + migrations.AddField( + model_name='abstractnode', + name='subjects', + field=models.ManyToManyField(blank=True, related_name='abstractnodes', to='osf.Subject'), + ), + migrations.AddField( + model_name='abstractnode', + name='tags', + field=models.ManyToManyField(related_name='abstractnode_tagged', to='osf.Tag'), + ), + migrations.AddField( + model_name='abstractnode', + name='template_node', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='templated_from', to='osf.AbstractNode'), + ), + migrations.AddField( + model_name='osfuser', + name='affiliated_institutions', + field=models.ManyToManyField(blank=True, to='osf.Institution'), + ), + migrations.AddField( + model_name='osfuser', + name='external_accounts', + field=models.ManyToManyField(blank=True, to='osf.ExternalAccount'), + ), + migrations.AddField( + model_name='osfuser', + name='groups', + field=models.ManyToManyField(blank=True, help_text='The groups this user belongs to. A user will get all permissions granted to each of their groups.', related_name='user_set', related_query_name='user', to='auth.Group', verbose_name='groups'), + ), + migrations.AddField( + model_name='osfuser', + name='merged_by', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='merger', to=settings.AUTH_USER_MODEL), + ), + migrations.AddField( + model_name='osfuser', + name='recently_added', + field=models.ManyToManyField(through='osf.RecentlyAddedContributor', to=settings.AUTH_USER_MODEL), + ), + migrations.AddField( + model_name='osfuser', + name='tags', + field=models.ManyToManyField(blank=True, to='osf.Tag'), + ), + migrations.AddField( + model_name='osfuser', + name='user_permissions', + field=models.ManyToManyField(blank=True, help_text='Specific permissions for this user.', related_name='user_set', related_query_name='user', to='auth.Permission', verbose_name='user permissions'), + ), + migrations.CreateModel( + name='BitbucketFileNode', + fields=[ + ], + options={ + 'proxy': True, + 'indexes': [], + }, + bases=('osf.basefilenode',), + ), + migrations.CreateModel( + name='BoxFileNode', + fields=[ + ], + options={ + 'proxy': True, + 'indexes': [], + }, + bases=('osf.basefilenode',), + ), + migrations.CreateModel( + name='CollectionProvider', + fields=[ + ], + options={ + 'permissions': (('view_collectionprovider', 'Can view collection provider details'),), + 'proxy': True, + 'indexes': [], + }, + bases=('osf.abstractprovider',), + ), + migrations.CreateModel( + name='DataverseFileNode', + fields=[ + ], + options={ + 'proxy': True, + 'indexes': [], + }, + bases=('osf.basefilenode',), + ), + migrations.CreateModel( + name='DraftNode', + fields=[ + ], + options={ + 'proxy': True, + 'indexes': [], + }, + bases=('osf.abstractnode',), + ), + migrations.CreateModel( + name='DropboxFileNode', + fields=[ + ], + options={ + 'proxy': True, + 'indexes': [], + }, + bases=('osf.basefilenode',), + ), + migrations.CreateModel( + name='FigshareFileNode', + fields=[ + ], + options={ + 'proxy': True, + 'indexes': [], + }, + bases=('osf.basefilenode',), + ), + migrations.CreateModel( + name='GithubFileNode', + fields=[ + ], + options={ + 'proxy': True, + 'indexes': [], + }, + bases=('osf.basefilenode',), + ), + migrations.CreateModel( + name='GitLabFileNode', + fields=[ + ], + options={ + 'proxy': True, + 'indexes': [], + }, + bases=('osf.basefilenode',), + ), + migrations.CreateModel( + name='GoogleDriveFileNode', + fields=[ + ], + options={ + 'proxy': True, + 'indexes': [], + }, + bases=('osf.basefilenode',), + ), + migrations.CreateModel( + name='Node', + fields=[ + ], + options={ + 'proxy': True, + 'indexes': [], + }, + bases=('osf.abstractnode',), + ), + migrations.CreateModel( + name='OneDriveFileNode', + fields=[ + ], + options={ + 'proxy': True, + 'indexes': [], + }, + bases=('osf.basefilenode',), + ), + migrations.CreateModel( + name='OsfStorageFileNode', + fields=[ + ], + options={ + 'proxy': True, + 'indexes': [], + }, + bases=('osf.basefilenode',), + ), + migrations.CreateModel( + name='OwncloudFileNode', + fields=[ + ], + options={ + 'proxy': True, + 'indexes': [], + }, + bases=('osf.basefilenode',), + ), + migrations.CreateModel( + name='PreprintProvider', + fields=[ + ], + options={ + 'permissions': (('view_preprintprovider', 'Can view preprint provider details'),), + 'proxy': True, + 'indexes': [], + }, + bases=('osf.abstractprovider',), + ), + migrations.CreateModel( + name='QuickFilesNode', + fields=[ + ], + options={ + 'proxy': True, + 'indexes': [], + }, + bases=('osf.abstractnode',), + ), + migrations.CreateModel( + name='Registration', + fields=[ + ], + options={ + 'permissions': (('view_registration', 'Can view registration details'),), + 'proxy': True, + 'indexes': [], + }, + bases=('osf.abstractnode',), + ), + migrations.CreateModel( + name='RegistrationProvider', + fields=[ + ], + options={ + 'permissions': (('view_registrationprovider', 'Can view registration provider details'),), + 'proxy': True, + 'indexes': [], + }, + bases=('osf.abstractprovider',), + ), + migrations.CreateModel( + name='S3FileNode', + fields=[ + ], + options={ + 'proxy': True, + 'indexes': [], + }, + bases=('osf.basefilenode',), + ), + migrations.CreateModel( + name='TrashedFileNode', + fields=[ + ], + options={ + 'proxy': True, + 'indexes': [], + }, + bases=('osf.basefilenode',), + ), + migrations.AlterUniqueTogether( + name='subject', + unique_together=set([('text', 'provider')]), + ), + migrations.AlterUniqueTogether( + name='schemaresponseblock', + unique_together=set([('source_schema_response', 'schema_key')]), + ), + migrations.AddIndex( + model_name='schemaresponse', + index=models.Index(fields=['reviews_state'], name='osf_schemar_reviews_c361bc_idx'), + ), + migrations.AddIndex( + model_name='schemaresponse', + index=models.Index(fields=['object_id', 'content_type'], name='osf_schemar_object__8cc95e_idx'), + ), + migrations.AlterUniqueTogether( + name='registrationschemablock', + unique_together=set([('schema', 'registration_response_key')]), + ), + migrations.AlterOrderWithRespectTo( + name='registrationschemablock', + order_with_respect_to='schema', + ), + migrations.AddField( + model_name='registrationschema', + name='providers', + field=models.ManyToManyField(blank=True, related_name='schemas', to='osf.RegistrationProvider'), + ), + migrations.AddField( + model_name='registrationbulkuploadjob', + name='provider', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='osf.RegistrationProvider'), + ), + migrations.AddField( + model_name='registrationaction', + name='target', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='actions', to='osf.Registration'), + ), + migrations.AlterUniqueTogether( + name='recentlyaddedcontributor', + unique_together=set([('user', 'contributor')]), + ), + migrations.AlterUniqueTogether( + name='preprintuserobjectpermission', + unique_together=set([('user', 'permission', 'content_object')]), + ), + migrations.AlterUniqueTogether( + name='preprintgroupobjectpermission', + unique_together=set([('group', 'permission', 'content_object')]), + ), + migrations.AlterUniqueTogether( + name='preprintcontributor', + unique_together=set([('user', 'preprint')]), + ), + migrations.AlterOrderWithRespectTo( + name='preprintcontributor', + order_with_respect_to='preprint', + ), + migrations.AddField( + model_name='preprint', + name='provider', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='preprints', to='osf.PreprintProvider'), + ), + migrations.AddIndex( + model_name='outcomeartifact', + index=models.Index(fields=['artifact_type', 'outcome'], name='osf_outcome_artifac_5eb92d_idx'), + ), + migrations.AlterUniqueTogether( + name='osfgroupuserobjectpermission', + unique_together=set([('user', 'permission', 'content_object')]), + ), + migrations.AlterUniqueTogether( + name='osfgroupgroupobjectpermission', + unique_together=set([('group', 'permission', 'content_object')]), + ), + migrations.AddField( + model_name='notificationsubscription', + name='node', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='notification_subscriptions', to='osf.Node'), + ), + migrations.AlterUniqueTogether( + name='nodeuserobjectpermission', + unique_together=set([('user', 'permission', 'content_object')]), + ), + migrations.AlterUniqueTogether( + name='noderelation', + unique_together=set([('parent', 'child')]), + ), + migrations.AlterIndexTogether( + name='noderelation', + index_together=set([('is_node_link', 'child', 'parent')]), + ), + migrations.AlterOrderWithRespectTo( + name='noderelation', + order_with_respect_to='parent', + ), + migrations.AlterUniqueTogether( + name='nodegroupobjectpermission', + unique_together=set([('group', 'permission', 'content_object')]), + ), + migrations.AddField( + model_name='mailrecord', + name='nodes_created', + field=models.ManyToManyField(to='osf.Node'), + ), + migrations.AlterUniqueTogether( + name='institutionalcontributor', + unique_together=set([('user', 'institution')]), + ), + migrations.AlterUniqueTogether( + name='identifier', + unique_together=set([('object_id', 'content_type', 'category')]), + ), + migrations.AlterIndexTogether( + name='guid', + index_together=set([('content_type', 'object_id', 'created')]), + ), + migrations.AlterUniqueTogether( + name='fileversionusermetadata', + unique_together=set([('user', 'file_version')]), + ), + migrations.AddField( + model_name='embargoterminationapproval', + name='embargoed_registration', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='osf.Registration'), + ), + migrations.AlterUniqueTogether( + name='draftregistrationuserobjectpermission', + unique_together=set([('user', 'permission', 'content_object')]), + ), + migrations.AlterUniqueTogether( + name='draftregistrationgroupobjectpermission', + unique_together=set([('group', 'permission', 'content_object')]), + ), + migrations.AlterUniqueTogether( + name='draftregistrationcontributor', + unique_together=set([('user', 'draft_registration')]), + ), + migrations.AlterOrderWithRespectTo( + name='draftregistrationcontributor', + order_with_respect_to='draft_registration', + ), + migrations.AddField( + model_name='draftregistration', + name='provider', + field=models.ForeignKey(default=osf.models.registrations.get_default_id, on_delete=django.db.models.deletion.CASCADE, related_name='draft_registrations', to='osf.RegistrationProvider'), + ), + migrations.AddField( + model_name='draftregistration', + name='registered_node', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='draft_registration', to='osf.Registration'), + ), + migrations.AlterUniqueTogether( + name='dismissedalert', + unique_together=set([('_id', 'location')]), + ), + migrations.AlterUniqueTogether( + name='contributor', + unique_together=set([('user', 'node')]), + ), + migrations.AlterOrderWithRespectTo( + name='contributor', + order_with_respect_to='node', + ), + migrations.AlterUniqueTogether( + name='collectionuserobjectpermission', + unique_together=set([('user', 'permission', 'content_object')]), + ), + migrations.AlterUniqueTogether( + name='collectionsubmission', + unique_together=set([('collection', 'guid')]), + ), + migrations.AlterOrderWithRespectTo( + name='collectionsubmission', + order_with_respect_to='collection', + ), + migrations.AlterUniqueTogether( + name='collectiongroupobjectpermission', + unique_together=set([('group', 'permission', 'content_object')]), + ), + migrations.AlterUniqueTogether( + name='chronossubmission', + unique_together=set([('preprint', 'journal')]), + ), + migrations.AlterUniqueTogether( + name='basefileversionsthrough', + unique_together=set([('basefilenode', 'fileversion')]), + ), + migrations.AlterIndexTogether( + name='basefileversionsthrough', + index_together=set([('basefilenode', 'fileversion')]), + ), + migrations.AlterIndexTogether( + name='basefilenode', + index_together=set([('target_content_type', 'target_object_id')]), + ), + migrations.AddField( + model_name='archivejob', + name='dst_node', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='archive_jobs', to='osf.Registration', verbose_name='destination node'), + ), + migrations.AddField( + model_name='archivejob', + name='src_node', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='osf.Node', verbose_name='source node'), + ), + migrations.AlterUniqueTogether( + name='abstractprovideruserobjectpermission', + unique_together=set([('user', 'permission', 'content_object')]), + ), + migrations.AlterUniqueTogether( + name='abstractprovidergroupobjectpermission', + unique_together=set([('group', 'permission', 'content_object')]), + ), + migrations.AlterUniqueTogether( + name='abstractprovider', + unique_together=set([('_id', 'type')]), + ), + migrations.AddField( + model_name='abstractnode', + name='provider', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='registrations', to='osf.RegistrationProvider'), + ), + migrations.CreateModel( + name='BitbucketFile', + fields=[ + ], + options={ + 'proxy': True, + 'indexes': [], + }, + bases=('osf.bitbucketfilenode', models.Model), + ), + migrations.CreateModel( + name='BitbucketFolder', + fields=[ + ], + options={ + 'proxy': True, + 'indexes': [], + }, + bases=('osf.bitbucketfilenode', models.Model), + ), + migrations.CreateModel( + name='BoxFile', + fields=[ + ], + options={ + 'proxy': True, + 'indexes': [], + }, + bases=('osf.boxfilenode', models.Model), + ), + migrations.CreateModel( + name='BoxFolder', + fields=[ + ], + options={ + 'proxy': True, + 'indexes': [], + }, + bases=('osf.boxfilenode', models.Model), + ), + migrations.CreateModel( + name='DataverseFile', + fields=[ + ], + options={ + 'proxy': True, + 'indexes': [], + }, + bases=('osf.dataversefilenode', models.Model), + ), + migrations.CreateModel( + name='DataverseFolder', + fields=[ + ], + options={ + 'proxy': True, + 'indexes': [], + }, + bases=('osf.dataversefilenode', models.Model), + ), + migrations.CreateModel( + name='DropboxFile', + fields=[ + ], + options={ + 'proxy': True, + 'indexes': [], + }, + bases=('osf.dropboxfilenode', models.Model), + ), + migrations.CreateModel( + name='DropboxFolder', + fields=[ + ], + options={ + 'proxy': True, + 'indexes': [], + }, + bases=('osf.dropboxfilenode', models.Model), + ), + migrations.CreateModel( + name='FigshareFile', + fields=[ + ], + options={ + 'proxy': True, + 'indexes': [], + }, + bases=('osf.figsharefilenode', models.Model), + ), + migrations.CreateModel( + name='FigshareFolder', + fields=[ + ], + options={ + 'proxy': True, + 'indexes': [], + }, + bases=('osf.figsharefilenode', models.Model), + ), + migrations.CreateModel( + name='GithubFile', + fields=[ + ], + options={ + 'proxy': True, + 'indexes': [], + }, + bases=('osf.githubfilenode', models.Model), + ), + migrations.CreateModel( + name='GithubFolder', + fields=[ + ], + options={ + 'proxy': True, + 'indexes': [], + }, + bases=('osf.githubfilenode', models.Model), + ), + migrations.CreateModel( + name='GitLabFile', + fields=[ + ], + options={ + 'proxy': True, + 'indexes': [], + }, + bases=('osf.gitlabfilenode', models.Model), + ), + migrations.CreateModel( + name='GitLabFolder', + fields=[ + ], + options={ + 'proxy': True, + 'indexes': [], + }, + bases=('osf.gitlabfilenode', models.Model), + ), + migrations.CreateModel( + name='GoogleDriveFile', + fields=[ + ], + options={ + 'proxy': True, + 'indexes': [], + }, + bases=('osf.googledrivefilenode', models.Model), + ), + migrations.CreateModel( + name='GoogleDriveFolder', + fields=[ + ], + options={ + 'proxy': True, + 'indexes': [], + }, + bases=('osf.googledrivefilenode', models.Model), + ), + migrations.CreateModel( + name='OneDriveFile', + fields=[ + ], + options={ + 'proxy': True, + 'indexes': [], + }, + bases=('osf.onedrivefilenode', models.Model), + ), + migrations.CreateModel( + name='OneDriveFolder', + fields=[ + ], + options={ + 'proxy': True, + 'indexes': [], + }, + bases=('osf.onedrivefilenode', models.Model), + ), + migrations.CreateModel( + name='OsfStorageFile', + fields=[ + ], + options={ + 'proxy': True, + 'indexes': [], + }, + bases=('osf.osfstoragefilenode', models.Model), + ), + migrations.CreateModel( + name='OsfStorageFolder', + fields=[ + ], + options={ + 'proxy': True, + 'indexes': [], + }, + bases=('osf.osfstoragefilenode', models.Model), + ), + migrations.CreateModel( + name='OwncloudFile', + fields=[ + ], + options={ + 'proxy': True, + 'indexes': [], + }, + bases=('osf.owncloudfilenode', models.Model), + ), + migrations.CreateModel( + name='OwncloudFolder', + fields=[ + ], + options={ + 'proxy': True, + 'indexes': [], + }, + bases=('osf.owncloudfilenode', models.Model), + ), + migrations.CreateModel( + name='S3File', + fields=[ + ], + options={ + 'proxy': True, + 'indexes': [], + }, + bases=('osf.s3filenode', models.Model), + ), + migrations.CreateModel( + name='S3Folder', + fields=[ + ], + options={ + 'proxy': True, + 'indexes': [], + }, + bases=('osf.s3filenode', models.Model), + ), + migrations.CreateModel( + name='TrashedFile', + fields=[ + ], + options={ + 'proxy': True, + 'indexes': [], + }, + bases=('osf.trashedfilenode',), + ), + migrations.CreateModel( + name='TrashedFolder', + fields=[ + ], + options={ + 'proxy': True, + 'indexes': [], + }, + bases=('osf.trashedfilenode',), + ), + migrations.AlterUniqueTogether( + name='registrationschema', + unique_together=set([('name', 'schema_version')]), + ), + migrations.AddField( + model_name='preprint', + name='primary_file', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='preprint', to='osf.OsfStorageFile'), + ), + migrations.AlterUniqueTogether( + name='notificationsubscription', + unique_together=set([('_id', 'provider')]), + ), + migrations.AddField( + model_name='filemetadatarecord', + name='file', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='records', to='osf.OsfStorageFile'), + ), + migrations.AlterIndexTogether( + name='abstractnode', + index_together=set([('is_public', 'is_deleted', 'type')]), + ), + migrations.AlterUniqueTogether( + name='filemetadatarecord', + unique_together=set([('file', 'schema')]), + ), + ] From dab1bbc97c77521ce02731e431e38c4dfab454ce Mon Sep 17 00:00:00 2001 From: Longze Chen Date: Wed, 17 Aug 2022 15:16:29 -0400 Subject: [PATCH 24/72] Init migrations - addons --- addons/bitbucket/migrations/0001_initial.py | 55 ++++++++++++++++ .../migrations/0002_auto_20220817_1915.py | 41 ++++++++++++ addons/box/migrations/0001_initial.py | 55 ++++++++++++++++ .../box/migrations/0002_auto_20220817_1915.py | 41 ++++++++++++ addons/dataverse/migrations/0001_initial.py | 57 ++++++++++++++++ .../migrations/0002_auto_20220817_1915.py | 41 ++++++++++++ addons/dropbox/migrations/0001_initial.py | 53 +++++++++++++++ .../migrations/0002_auto_20220817_1915.py | 41 ++++++++++++ addons/figshare/migrations/0001_initial.py | 55 ++++++++++++++++ .../migrations/0002_auto_20220817_1915.py | 41 ++++++++++++ addons/forward/migrations/0001_initial.py | 38 +++++++++++ .../migrations/0002_nodesettings_owner.py | 24 +++++++ addons/github/migrations/0001_initial.py | 57 ++++++++++++++++ .../migrations/0002_auto_20220817_1915.py | 41 ++++++++++++ addons/gitlab/migrations/0001_initial.py | 57 ++++++++++++++++ .../migrations/0002_auto_20220817_1915.py | 41 ++++++++++++ addons/googledrive/migrations/0001_initial.py | 54 +++++++++++++++ .../migrations/0002_auto_20220817_1915.py | 41 ++++++++++++ addons/mendeley/migrations/0001_initial.py | 52 +++++++++++++++ .../migrations/0002_auto_20220817_1915.py | 41 ++++++++++++ addons/onedrive/migrations/0001_initial.py | 55 ++++++++++++++++ .../migrations/0002_auto_20220817_1915.py | 41 ++++++++++++ addons/osfstorage/migrations/0001_initial.py | 65 +++++++++++++++++++ .../migrations/0002_auto_20220817_1915.py | 50 ++++++++++++++ addons/owncloud/migrations/0001_initial.py | 53 +++++++++++++++ .../migrations/0002_auto_20220817_1915.py | 41 ++++++++++++ addons/s3/migrations/0001_initial.py | 55 ++++++++++++++++ .../s3/migrations/0002_auto_20220817_1915.py | 41 ++++++++++++ addons/twofactor/migrations/0001_initial.py | 37 +++++++++++ .../migrations/0002_usersettings_owner.py | 25 +++++++ addons/wiki/migrations/0001_initial.py | 63 ++++++++++++++++++ .../migrations/0002_auto_20220817_1915.py | 50 ++++++++++++++ addons/zotero/migrations/0001_initial.py | 53 +++++++++++++++ .../migrations/0002_auto_20220817_1915.py | 41 ++++++++++++ 34 files changed, 1596 insertions(+) create mode 100644 addons/bitbucket/migrations/0001_initial.py create mode 100644 addons/bitbucket/migrations/0002_auto_20220817_1915.py create mode 100644 addons/box/migrations/0001_initial.py create mode 100644 addons/box/migrations/0002_auto_20220817_1915.py create mode 100644 addons/dataverse/migrations/0001_initial.py create mode 100644 addons/dataverse/migrations/0002_auto_20220817_1915.py create mode 100644 addons/dropbox/migrations/0001_initial.py create mode 100644 addons/dropbox/migrations/0002_auto_20220817_1915.py create mode 100644 addons/figshare/migrations/0001_initial.py create mode 100644 addons/figshare/migrations/0002_auto_20220817_1915.py create mode 100644 addons/forward/migrations/0001_initial.py create mode 100644 addons/forward/migrations/0002_nodesettings_owner.py create mode 100644 addons/github/migrations/0001_initial.py create mode 100644 addons/github/migrations/0002_auto_20220817_1915.py create mode 100644 addons/gitlab/migrations/0001_initial.py create mode 100644 addons/gitlab/migrations/0002_auto_20220817_1915.py create mode 100644 addons/googledrive/migrations/0001_initial.py create mode 100644 addons/googledrive/migrations/0002_auto_20220817_1915.py create mode 100644 addons/mendeley/migrations/0001_initial.py create mode 100644 addons/mendeley/migrations/0002_auto_20220817_1915.py create mode 100644 addons/onedrive/migrations/0001_initial.py create mode 100644 addons/onedrive/migrations/0002_auto_20220817_1915.py create mode 100644 addons/osfstorage/migrations/0001_initial.py create mode 100644 addons/osfstorage/migrations/0002_auto_20220817_1915.py create mode 100644 addons/owncloud/migrations/0001_initial.py create mode 100644 addons/owncloud/migrations/0002_auto_20220817_1915.py create mode 100644 addons/s3/migrations/0001_initial.py create mode 100644 addons/s3/migrations/0002_auto_20220817_1915.py create mode 100644 addons/twofactor/migrations/0001_initial.py create mode 100644 addons/twofactor/migrations/0002_usersettings_owner.py create mode 100644 addons/wiki/migrations/0001_initial.py create mode 100644 addons/wiki/migrations/0002_auto_20220817_1915.py create mode 100644 addons/zotero/migrations/0001_initial.py create mode 100644 addons/zotero/migrations/0002_auto_20220817_1915.py diff --git a/addons/bitbucket/migrations/0001_initial.py b/addons/bitbucket/migrations/0001_initial.py new file mode 100644 index 00000000000..dfde90f1fe5 --- /dev/null +++ b/addons/bitbucket/migrations/0001_initial.py @@ -0,0 +1,55 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.29 on 2022-08-17 19:15 +from __future__ import unicode_literals + +import addons.base.models +from django.db import migrations, models +import django_extensions.db.fields +import osf.models.base +import osf.utils.datetime_aware_jsonfield +import osf.utils.fields + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='NodeSettings', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), + ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), + ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), + ('is_deleted', models.BooleanField(default=False)), + ('deleted', osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True)), + ('user', models.TextField(blank=True, null=True)), + ('repo', models.TextField(blank=True, null=True)), + ('hook_id', models.TextField(blank=True, null=True)), + ], + options={ + 'abstract': False, + }, + bases=(models.Model, osf.models.base.QuerySetExplainMixin, addons.base.models.BaseStorageAddon), + ), + migrations.CreateModel( + name='UserSettings', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), + ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), + ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), + ('is_deleted', models.BooleanField(default=False)), + ('deleted', osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True)), + ('oauth_grants', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=dict, encoder=osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONEncoder)), + ], + options={ + 'abstract': False, + }, + bases=(models.Model, osf.models.base.QuerySetExplainMixin), + ), + ] diff --git a/addons/bitbucket/migrations/0002_auto_20220817_1915.py b/addons/bitbucket/migrations/0002_auto_20220817_1915.py new file mode 100644 index 00000000000..6646f72e6c5 --- /dev/null +++ b/addons/bitbucket/migrations/0002_auto_20220817_1915.py @@ -0,0 +1,41 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.29 on 2022-08-17 19:15 +from __future__ import unicode_literals + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('addons_bitbucket', '0001_initial'), + ('osf', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='usersettings', + name='owner', + field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='addons_bitbucket_user_settings', to=settings.AUTH_USER_MODEL), + ), + migrations.AddField( + model_name='nodesettings', + name='external_account', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='addons_bitbucket_node_settings', to='osf.ExternalAccount'), + ), + migrations.AddField( + model_name='nodesettings', + name='owner', + field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='addons_bitbucket_node_settings', to='osf.AbstractNode'), + ), + migrations.AddField( + model_name='nodesettings', + name='user_settings', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='addons_bitbucket.UserSettings'), + ), + ] diff --git a/addons/box/migrations/0001_initial.py b/addons/box/migrations/0001_initial.py new file mode 100644 index 00000000000..f2053798e95 --- /dev/null +++ b/addons/box/migrations/0001_initial.py @@ -0,0 +1,55 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.29 on 2022-08-17 19:15 +from __future__ import unicode_literals + +import addons.base.models +from django.db import migrations, models +import django_extensions.db.fields +import osf.models.base +import osf.utils.datetime_aware_jsonfield +import osf.utils.fields + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='NodeSettings', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), + ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), + ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), + ('is_deleted', models.BooleanField(default=False)), + ('deleted', osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True)), + ('folder_id', models.TextField(blank=True, null=True)), + ('folder_name', models.TextField(blank=True, null=True)), + ('folder_path', models.TextField(blank=True, null=True)), + ], + options={ + 'abstract': False, + }, + bases=(models.Model, osf.models.base.QuerySetExplainMixin, addons.base.models.BaseStorageAddon), + ), + migrations.CreateModel( + name='UserSettings', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), + ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), + ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), + ('is_deleted', models.BooleanField(default=False)), + ('deleted', osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True)), + ('oauth_grants', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=dict, encoder=osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONEncoder)), + ], + options={ + 'abstract': False, + }, + bases=(models.Model, osf.models.base.QuerySetExplainMixin), + ), + ] diff --git a/addons/box/migrations/0002_auto_20220817_1915.py b/addons/box/migrations/0002_auto_20220817_1915.py new file mode 100644 index 00000000000..58be50b8bea --- /dev/null +++ b/addons/box/migrations/0002_auto_20220817_1915.py @@ -0,0 +1,41 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.29 on 2022-08-17 19:15 +from __future__ import unicode_literals + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('addons_box', '0001_initial'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('osf', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='usersettings', + name='owner', + field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='addons_box_user_settings', to=settings.AUTH_USER_MODEL), + ), + migrations.AddField( + model_name='nodesettings', + name='external_account', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='addons_box_node_settings', to='osf.ExternalAccount'), + ), + migrations.AddField( + model_name='nodesettings', + name='owner', + field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='addons_box_node_settings', to='osf.AbstractNode'), + ), + migrations.AddField( + model_name='nodesettings', + name='user_settings', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='addons_box.UserSettings'), + ), + ] diff --git a/addons/dataverse/migrations/0001_initial.py b/addons/dataverse/migrations/0001_initial.py new file mode 100644 index 00000000000..8f0bdbe9345 --- /dev/null +++ b/addons/dataverse/migrations/0001_initial.py @@ -0,0 +1,57 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.29 on 2022-08-17 19:15 +from __future__ import unicode_literals + +import addons.base.models +from django.db import migrations, models +import django_extensions.db.fields +import osf.models.base +import osf.utils.datetime_aware_jsonfield +import osf.utils.fields + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='NodeSettings', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), + ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), + ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), + ('is_deleted', models.BooleanField(default=False)), + ('deleted', osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True)), + ('dataverse_alias', models.TextField(blank=True, null=True)), + ('dataverse', models.TextField(blank=True, null=True)), + ('dataset_doi', models.TextField(blank=True, null=True)), + ('_dataset_id', models.TextField(blank=True, null=True)), + ('dataset', models.TextField(blank=True, null=True)), + ], + options={ + 'abstract': False, + }, + bases=(models.Model, osf.models.base.QuerySetExplainMixin, addons.base.models.BaseStorageAddon), + ), + migrations.CreateModel( + name='UserSettings', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), + ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), + ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), + ('is_deleted', models.BooleanField(default=False)), + ('deleted', osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True)), + ('oauth_grants', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=dict, encoder=osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONEncoder)), + ], + options={ + 'abstract': False, + }, + bases=(models.Model, osf.models.base.QuerySetExplainMixin), + ), + ] diff --git a/addons/dataverse/migrations/0002_auto_20220817_1915.py b/addons/dataverse/migrations/0002_auto_20220817_1915.py new file mode 100644 index 00000000000..bb10ee76ec4 --- /dev/null +++ b/addons/dataverse/migrations/0002_auto_20220817_1915.py @@ -0,0 +1,41 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.29 on 2022-08-17 19:15 +from __future__ import unicode_literals + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('osf', '0001_initial'), + ('addons_dataverse', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='usersettings', + name='owner', + field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='addons_dataverse_user_settings', to=settings.AUTH_USER_MODEL), + ), + migrations.AddField( + model_name='nodesettings', + name='external_account', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='addons_dataverse_node_settings', to='osf.ExternalAccount'), + ), + migrations.AddField( + model_name='nodesettings', + name='owner', + field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='addons_dataverse_node_settings', to='osf.AbstractNode'), + ), + migrations.AddField( + model_name='nodesettings', + name='user_settings', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='addons_dataverse.UserSettings'), + ), + ] diff --git a/addons/dropbox/migrations/0001_initial.py b/addons/dropbox/migrations/0001_initial.py new file mode 100644 index 00000000000..f62db239046 --- /dev/null +++ b/addons/dropbox/migrations/0001_initial.py @@ -0,0 +1,53 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.29 on 2022-08-17 19:15 +from __future__ import unicode_literals + +import addons.base.models +from django.db import migrations, models +import django_extensions.db.fields +import osf.models.base +import osf.utils.datetime_aware_jsonfield +import osf.utils.fields + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='NodeSettings', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), + ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), + ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), + ('is_deleted', models.BooleanField(default=False)), + ('deleted', osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True)), + ('folder', models.TextField(blank=True, null=True)), + ], + options={ + 'abstract': False, + }, + bases=(models.Model, osf.models.base.QuerySetExplainMixin, addons.base.models.BaseStorageAddon), + ), + migrations.CreateModel( + name='UserSettings', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), + ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), + ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), + ('is_deleted', models.BooleanField(default=False)), + ('deleted', osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True)), + ('oauth_grants', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=dict, encoder=osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONEncoder)), + ], + options={ + 'abstract': False, + }, + bases=(models.Model, osf.models.base.QuerySetExplainMixin), + ), + ] diff --git a/addons/dropbox/migrations/0002_auto_20220817_1915.py b/addons/dropbox/migrations/0002_auto_20220817_1915.py new file mode 100644 index 00000000000..1de073e684c --- /dev/null +++ b/addons/dropbox/migrations/0002_auto_20220817_1915.py @@ -0,0 +1,41 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.29 on 2022-08-17 19:15 +from __future__ import unicode_literals + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('addons_dropbox', '0001_initial'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('osf', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='usersettings', + name='owner', + field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='addons_dropbox_user_settings', to=settings.AUTH_USER_MODEL), + ), + migrations.AddField( + model_name='nodesettings', + name='external_account', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='addons_dropbox_node_settings', to='osf.ExternalAccount'), + ), + migrations.AddField( + model_name='nodesettings', + name='owner', + field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='addons_dropbox_node_settings', to='osf.AbstractNode'), + ), + migrations.AddField( + model_name='nodesettings', + name='user_settings', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='addons_dropbox.UserSettings'), + ), + ] diff --git a/addons/figshare/migrations/0001_initial.py b/addons/figshare/migrations/0001_initial.py new file mode 100644 index 00000000000..f2053798e95 --- /dev/null +++ b/addons/figshare/migrations/0001_initial.py @@ -0,0 +1,55 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.29 on 2022-08-17 19:15 +from __future__ import unicode_literals + +import addons.base.models +from django.db import migrations, models +import django_extensions.db.fields +import osf.models.base +import osf.utils.datetime_aware_jsonfield +import osf.utils.fields + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='NodeSettings', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), + ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), + ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), + ('is_deleted', models.BooleanField(default=False)), + ('deleted', osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True)), + ('folder_id', models.TextField(blank=True, null=True)), + ('folder_name', models.TextField(blank=True, null=True)), + ('folder_path', models.TextField(blank=True, null=True)), + ], + options={ + 'abstract': False, + }, + bases=(models.Model, osf.models.base.QuerySetExplainMixin, addons.base.models.BaseStorageAddon), + ), + migrations.CreateModel( + name='UserSettings', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), + ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), + ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), + ('is_deleted', models.BooleanField(default=False)), + ('deleted', osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True)), + ('oauth_grants', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=dict, encoder=osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONEncoder)), + ], + options={ + 'abstract': False, + }, + bases=(models.Model, osf.models.base.QuerySetExplainMixin), + ), + ] diff --git a/addons/figshare/migrations/0002_auto_20220817_1915.py b/addons/figshare/migrations/0002_auto_20220817_1915.py new file mode 100644 index 00000000000..988ab59f118 --- /dev/null +++ b/addons/figshare/migrations/0002_auto_20220817_1915.py @@ -0,0 +1,41 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.29 on 2022-08-17 19:15 +from __future__ import unicode_literals + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('addons_figshare', '0001_initial'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('osf', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='usersettings', + name='owner', + field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='addons_figshare_user_settings', to=settings.AUTH_USER_MODEL), + ), + migrations.AddField( + model_name='nodesettings', + name='external_account', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='addons_figshare_node_settings', to='osf.ExternalAccount'), + ), + migrations.AddField( + model_name='nodesettings', + name='owner', + field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='addons_figshare_node_settings', to='osf.AbstractNode'), + ), + migrations.AddField( + model_name='nodesettings', + name='user_settings', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='addons_figshare.UserSettings'), + ), + ] diff --git a/addons/forward/migrations/0001_initial.py b/addons/forward/migrations/0001_initial.py new file mode 100644 index 00000000000..54708b319b1 --- /dev/null +++ b/addons/forward/migrations/0001_initial.py @@ -0,0 +1,38 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.29 on 2022-08-17 19:15 +from __future__ import unicode_literals + +import dirtyfields.dirtyfields +from django.db import migrations, models +import django_extensions.db.fields +import osf.models.base +import osf.models.validators +import osf.utils.fields + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='NodeSettings', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), + ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), + ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), + ('is_deleted', models.BooleanField(default=False)), + ('deleted', osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True)), + ('url', models.URLField(blank=True, max_length=255, null=True)), + ('label', models.TextField(blank=True, null=True, validators=[osf.models.validators.validate_no_html])), + ], + options={ + 'abstract': False, + }, + bases=(dirtyfields.dirtyfields.DirtyFieldsMixin, models.Model, osf.models.base.QuerySetExplainMixin), + ), + ] diff --git a/addons/forward/migrations/0002_nodesettings_owner.py b/addons/forward/migrations/0002_nodesettings_owner.py new file mode 100644 index 00000000000..069e5809be0 --- /dev/null +++ b/addons/forward/migrations/0002_nodesettings_owner.py @@ -0,0 +1,24 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.29 on 2022-08-17 19:15 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('osf', '0001_initial'), + ('addons_forward', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='nodesettings', + name='owner', + field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='addons_forward_node_settings', to='osf.AbstractNode'), + ), + ] diff --git a/addons/github/migrations/0001_initial.py b/addons/github/migrations/0001_initial.py new file mode 100644 index 00000000000..617fc761a88 --- /dev/null +++ b/addons/github/migrations/0001_initial.py @@ -0,0 +1,57 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.29 on 2022-08-17 19:15 +from __future__ import unicode_literals + +import addons.base.models +from django.db import migrations, models +import django_extensions.db.fields +import osf.models.base +import osf.utils.datetime_aware_jsonfield +import osf.utils.fields + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='NodeSettings', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), + ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), + ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), + ('is_deleted', models.BooleanField(default=False)), + ('deleted', osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True)), + ('user', models.TextField(blank=True, null=True)), + ('repo', models.TextField(blank=True, null=True)), + ('hook_id', models.TextField(blank=True, null=True)), + ('hook_secret', models.TextField(blank=True, null=True)), + ('registration_data', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=dict, encoder=osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONEncoder, null=True)), + ], + options={ + 'abstract': False, + }, + bases=(models.Model, osf.models.base.QuerySetExplainMixin, addons.base.models.BaseStorageAddon), + ), + migrations.CreateModel( + name='UserSettings', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), + ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), + ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), + ('is_deleted', models.BooleanField(default=False)), + ('deleted', osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True)), + ('oauth_grants', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=dict, encoder=osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONEncoder)), + ], + options={ + 'abstract': False, + }, + bases=(models.Model, osf.models.base.QuerySetExplainMixin), + ), + ] diff --git a/addons/github/migrations/0002_auto_20220817_1915.py b/addons/github/migrations/0002_auto_20220817_1915.py new file mode 100644 index 00000000000..44b4c2579de --- /dev/null +++ b/addons/github/migrations/0002_auto_20220817_1915.py @@ -0,0 +1,41 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.29 on 2022-08-17 19:15 +from __future__ import unicode_literals + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('addons_github', '0001_initial'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('osf', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='usersettings', + name='owner', + field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='addons_github_user_settings', to=settings.AUTH_USER_MODEL), + ), + migrations.AddField( + model_name='nodesettings', + name='external_account', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='addons_github_node_settings', to='osf.ExternalAccount'), + ), + migrations.AddField( + model_name='nodesettings', + name='owner', + field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='addons_github_node_settings', to='osf.AbstractNode'), + ), + migrations.AddField( + model_name='nodesettings', + name='user_settings', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='addons_github.UserSettings'), + ), + ] diff --git a/addons/gitlab/migrations/0001_initial.py b/addons/gitlab/migrations/0001_initial.py new file mode 100644 index 00000000000..29d64798ec4 --- /dev/null +++ b/addons/gitlab/migrations/0001_initial.py @@ -0,0 +1,57 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.29 on 2022-08-17 19:15 +from __future__ import unicode_literals + +import addons.base.models +from django.db import migrations, models +import django_extensions.db.fields +import osf.models.base +import osf.utils.datetime_aware_jsonfield +import osf.utils.fields + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='NodeSettings', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), + ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), + ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), + ('is_deleted', models.BooleanField(default=False)), + ('deleted', osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True)), + ('user', models.TextField(blank=True, null=True)), + ('repo', models.TextField(blank=True, null=True)), + ('repo_id', models.TextField(blank=True, null=True)), + ('hook_id', models.TextField(blank=True, null=True)), + ('hook_secret', models.TextField(blank=True, null=True)), + ], + options={ + 'abstract': False, + }, + bases=(models.Model, osf.models.base.QuerySetExplainMixin, addons.base.models.BaseStorageAddon), + ), + migrations.CreateModel( + name='UserSettings', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), + ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), + ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), + ('is_deleted', models.BooleanField(default=False)), + ('deleted', osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True)), + ('oauth_grants', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=dict, encoder=osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONEncoder)), + ], + options={ + 'abstract': False, + }, + bases=(models.Model, osf.models.base.QuerySetExplainMixin), + ), + ] diff --git a/addons/gitlab/migrations/0002_auto_20220817_1915.py b/addons/gitlab/migrations/0002_auto_20220817_1915.py new file mode 100644 index 00000000000..a27b74c4726 --- /dev/null +++ b/addons/gitlab/migrations/0002_auto_20220817_1915.py @@ -0,0 +1,41 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.29 on 2022-08-17 19:15 +from __future__ import unicode_literals + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('addons_gitlab', '0001_initial'), + ('osf', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='usersettings', + name='owner', + field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='addons_gitlab_user_settings', to=settings.AUTH_USER_MODEL), + ), + migrations.AddField( + model_name='nodesettings', + name='external_account', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='addons_gitlab_node_settings', to='osf.ExternalAccount'), + ), + migrations.AddField( + model_name='nodesettings', + name='owner', + field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='addons_gitlab_node_settings', to='osf.AbstractNode'), + ), + migrations.AddField( + model_name='nodesettings', + name='user_settings', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='addons_gitlab.UserSettings'), + ), + ] diff --git a/addons/googledrive/migrations/0001_initial.py b/addons/googledrive/migrations/0001_initial.py new file mode 100644 index 00000000000..cfb3d91bd54 --- /dev/null +++ b/addons/googledrive/migrations/0001_initial.py @@ -0,0 +1,54 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.29 on 2022-08-17 19:15 +from __future__ import unicode_literals + +import addons.base.models +from django.db import migrations, models +import django_extensions.db.fields +import osf.models.base +import osf.utils.datetime_aware_jsonfield +import osf.utils.fields + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='NodeSettings', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), + ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), + ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), + ('is_deleted', models.BooleanField(default=False)), + ('deleted', osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True)), + ('folder_id', models.TextField(blank=True, null=True)), + ('folder_path', models.TextField(blank=True, null=True)), + ], + options={ + 'abstract': False, + }, + bases=(models.Model, osf.models.base.QuerySetExplainMixin, addons.base.models.BaseStorageAddon), + ), + migrations.CreateModel( + name='UserSettings', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), + ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), + ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), + ('is_deleted', models.BooleanField(default=False)), + ('deleted', osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True)), + ('oauth_grants', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=dict, encoder=osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONEncoder)), + ], + options={ + 'abstract': False, + }, + bases=(models.Model, osf.models.base.QuerySetExplainMixin), + ), + ] diff --git a/addons/googledrive/migrations/0002_auto_20220817_1915.py b/addons/googledrive/migrations/0002_auto_20220817_1915.py new file mode 100644 index 00000000000..2b4721c5b4c --- /dev/null +++ b/addons/googledrive/migrations/0002_auto_20220817_1915.py @@ -0,0 +1,41 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.29 on 2022-08-17 19:15 +from __future__ import unicode_literals + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('addons_googledrive', '0001_initial'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('osf', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='usersettings', + name='owner', + field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='addons_googledrive_user_settings', to=settings.AUTH_USER_MODEL), + ), + migrations.AddField( + model_name='nodesettings', + name='external_account', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='addons_googledrive_node_settings', to='osf.ExternalAccount'), + ), + migrations.AddField( + model_name='nodesettings', + name='owner', + field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='addons_googledrive_node_settings', to='osf.AbstractNode'), + ), + migrations.AddField( + model_name='nodesettings', + name='user_settings', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='addons_googledrive.UserSettings'), + ), + ] diff --git a/addons/mendeley/migrations/0001_initial.py b/addons/mendeley/migrations/0001_initial.py new file mode 100644 index 00000000000..b626699c880 --- /dev/null +++ b/addons/mendeley/migrations/0001_initial.py @@ -0,0 +1,52 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.29 on 2022-08-17 19:15 +from __future__ import unicode_literals + +from django.db import migrations, models +import django_extensions.db.fields +import osf.models.base +import osf.utils.datetime_aware_jsonfield +import osf.utils.fields + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='NodeSettings', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), + ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), + ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), + ('is_deleted', models.BooleanField(default=False)), + ('deleted', osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True)), + ('list_id', models.TextField(blank=True, null=True)), + ], + options={ + 'abstract': False, + }, + bases=(models.Model, osf.models.base.QuerySetExplainMixin), + ), + migrations.CreateModel( + name='UserSettings', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), + ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), + ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), + ('is_deleted', models.BooleanField(default=False)), + ('deleted', osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True)), + ('oauth_grants', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=dict, encoder=osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONEncoder)), + ], + options={ + 'abstract': False, + }, + bases=(models.Model, osf.models.base.QuerySetExplainMixin), + ), + ] diff --git a/addons/mendeley/migrations/0002_auto_20220817_1915.py b/addons/mendeley/migrations/0002_auto_20220817_1915.py new file mode 100644 index 00000000000..2e7dbc0e794 --- /dev/null +++ b/addons/mendeley/migrations/0002_auto_20220817_1915.py @@ -0,0 +1,41 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.29 on 2022-08-17 19:15 +from __future__ import unicode_literals + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('addons_mendeley', '0001_initial'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('osf', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='usersettings', + name='owner', + field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='addons_mendeley_user_settings', to=settings.AUTH_USER_MODEL), + ), + migrations.AddField( + model_name='nodesettings', + name='external_account', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='addons_mendeley_node_settings', to='osf.ExternalAccount'), + ), + migrations.AddField( + model_name='nodesettings', + name='owner', + field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='addons_mendeley_node_settings', to='osf.AbstractNode'), + ), + migrations.AddField( + model_name='nodesettings', + name='user_settings', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='addons_mendeley.UserSettings'), + ), + ] diff --git a/addons/onedrive/migrations/0001_initial.py b/addons/onedrive/migrations/0001_initial.py new file mode 100644 index 00000000000..925dc84e4e2 --- /dev/null +++ b/addons/onedrive/migrations/0001_initial.py @@ -0,0 +1,55 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.29 on 2022-08-17 19:15 +from __future__ import unicode_literals + +import addons.base.models +from django.db import migrations, models +import django_extensions.db.fields +import osf.models.base +import osf.utils.datetime_aware_jsonfield +import osf.utils.fields + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='NodeSettings', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), + ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), + ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), + ('is_deleted', models.BooleanField(default=False)), + ('deleted', osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True)), + ('folder_id', models.TextField(blank=True, null=True)), + ('folder_path', models.TextField(blank=True, null=True)), + ('drive_id', models.TextField(blank=True, null=True)), + ], + options={ + 'abstract': False, + }, + bases=(models.Model, osf.models.base.QuerySetExplainMixin, addons.base.models.BaseStorageAddon), + ), + migrations.CreateModel( + name='UserSettings', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), + ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), + ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), + ('is_deleted', models.BooleanField(default=False)), + ('deleted', osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True)), + ('oauth_grants', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=dict, encoder=osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONEncoder)), + ], + options={ + 'abstract': False, + }, + bases=(models.Model, osf.models.base.QuerySetExplainMixin), + ), + ] diff --git a/addons/onedrive/migrations/0002_auto_20220817_1915.py b/addons/onedrive/migrations/0002_auto_20220817_1915.py new file mode 100644 index 00000000000..b2f9e3389a3 --- /dev/null +++ b/addons/onedrive/migrations/0002_auto_20220817_1915.py @@ -0,0 +1,41 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.29 on 2022-08-17 19:15 +from __future__ import unicode_literals + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('addons_onedrive', '0001_initial'), + ('osf', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='usersettings', + name='owner', + field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='addons_onedrive_user_settings', to=settings.AUTH_USER_MODEL), + ), + migrations.AddField( + model_name='nodesettings', + name='external_account', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='addons_onedrive_node_settings', to='osf.ExternalAccount'), + ), + migrations.AddField( + model_name='nodesettings', + name='owner', + field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='addons_onedrive_node_settings', to='osf.AbstractNode'), + ), + migrations.AddField( + model_name='nodesettings', + name='user_settings', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='addons_onedrive.UserSettings'), + ), + ] diff --git a/addons/osfstorage/migrations/0001_initial.py b/addons/osfstorage/migrations/0001_initial.py new file mode 100644 index 00000000000..3a136f7cf62 --- /dev/null +++ b/addons/osfstorage/migrations/0001_initial.py @@ -0,0 +1,65 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.29 on 2022-08-17 19:15 +from __future__ import unicode_literals + +import addons.base.models +from django.db import migrations, models +import django.db.models.deletion +import django_extensions.db.fields +import osf.models.base +import osf.utils.datetime_aware_jsonfield +import osf.utils.fields + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='NodeSettings', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), + ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), + ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), + ('is_deleted', models.BooleanField(default=False)), + ('deleted', osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True)), + ], + options={ + 'abstract': False, + }, + bases=(models.Model, osf.models.base.QuerySetExplainMixin, addons.base.models.BaseStorageAddon), + ), + migrations.CreateModel( + name='Region', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('_id', models.CharField(db_index=True, max_length=255)), + ('name', models.CharField(max_length=200)), + ('waterbutler_credentials', osf.utils.fields.EncryptedJSONField(default=dict)), + ('waterbutler_url', models.URLField(default='http://localhost:7777')), + ('mfr_url', models.URLField(default='http://localhost:7778')), + ('waterbutler_settings', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(default=dict, encoder=osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONEncoder)), + ], + ), + migrations.CreateModel( + name='UserSettings', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), + ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), + ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), + ('is_deleted', models.BooleanField(default=False)), + ('deleted', osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True)), + ('default_region', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='addons_osfstorage.Region')), + ], + options={ + 'abstract': False, + }, + bases=(models.Model, osf.models.base.QuerySetExplainMixin), + ), + ] diff --git a/addons/osfstorage/migrations/0002_auto_20220817_1915.py b/addons/osfstorage/migrations/0002_auto_20220817_1915.py new file mode 100644 index 00000000000..ebea6db86e5 --- /dev/null +++ b/addons/osfstorage/migrations/0002_auto_20220817_1915.py @@ -0,0 +1,50 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.29 on 2022-08-17 19:15 +from __future__ import unicode_literals + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('osf', '0001_initial'), + ('addons_osfstorage', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='usersettings', + name='owner', + field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='addons_osfstorage_user_settings', to=settings.AUTH_USER_MODEL), + ), + migrations.AlterUniqueTogether( + name='region', + unique_together=set([('_id', 'name')]), + ), + migrations.AddField( + model_name='nodesettings', + name='owner', + field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='addons_osfstorage_node_settings', to='osf.AbstractNode'), + ), + migrations.AddField( + model_name='nodesettings', + name='region', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='addons_osfstorage.Region'), + ), + migrations.AddField( + model_name='nodesettings', + name='root_node', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='osf.OsfStorageFolder'), + ), + migrations.AddField( + model_name='nodesettings', + name='user_settings', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='addons_osfstorage.UserSettings'), + ), + ] diff --git a/addons/owncloud/migrations/0001_initial.py b/addons/owncloud/migrations/0001_initial.py new file mode 100644 index 00000000000..8271a44ca30 --- /dev/null +++ b/addons/owncloud/migrations/0001_initial.py @@ -0,0 +1,53 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.29 on 2022-08-17 19:15 +from __future__ import unicode_literals + +import addons.base.models +from django.db import migrations, models +import django_extensions.db.fields +import osf.models.base +import osf.utils.datetime_aware_jsonfield +import osf.utils.fields + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='NodeSettings', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), + ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), + ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), + ('is_deleted', models.BooleanField(default=False)), + ('deleted', osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True)), + ('folder_id', models.TextField(blank=True, null=True)), + ], + options={ + 'abstract': False, + }, + bases=(models.Model, osf.models.base.QuerySetExplainMixin, addons.base.models.BaseStorageAddon), + ), + migrations.CreateModel( + name='UserSettings', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), + ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), + ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), + ('is_deleted', models.BooleanField(default=False)), + ('deleted', osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True)), + ('oauth_grants', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=dict, encoder=osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONEncoder)), + ], + options={ + 'abstract': False, + }, + bases=(models.Model, osf.models.base.QuerySetExplainMixin), + ), + ] diff --git a/addons/owncloud/migrations/0002_auto_20220817_1915.py b/addons/owncloud/migrations/0002_auto_20220817_1915.py new file mode 100644 index 00000000000..516efc18919 --- /dev/null +++ b/addons/owncloud/migrations/0002_auto_20220817_1915.py @@ -0,0 +1,41 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.29 on 2022-08-17 19:15 +from __future__ import unicode_literals + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('addons_owncloud', '0001_initial'), + ('osf', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='usersettings', + name='owner', + field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='addons_owncloud_user_settings', to=settings.AUTH_USER_MODEL), + ), + migrations.AddField( + model_name='nodesettings', + name='external_account', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='addons_owncloud_node_settings', to='osf.ExternalAccount'), + ), + migrations.AddField( + model_name='nodesettings', + name='owner', + field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='addons_owncloud_node_settings', to='osf.AbstractNode'), + ), + migrations.AddField( + model_name='nodesettings', + name='user_settings', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='addons_owncloud.UserSettings'), + ), + ] diff --git a/addons/s3/migrations/0001_initial.py b/addons/s3/migrations/0001_initial.py new file mode 100644 index 00000000000..1adf16de32b --- /dev/null +++ b/addons/s3/migrations/0001_initial.py @@ -0,0 +1,55 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.29 on 2022-08-17 19:15 +from __future__ import unicode_literals + +import addons.base.models +from django.db import migrations, models +import django_extensions.db.fields +import osf.models.base +import osf.utils.datetime_aware_jsonfield +import osf.utils.fields + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='NodeSettings', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), + ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), + ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), + ('is_deleted', models.BooleanField(default=False)), + ('deleted', osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True)), + ('folder_id', models.TextField(blank=True, null=True)), + ('folder_name', models.TextField(blank=True, null=True)), + ('encrypt_uploads', models.BooleanField(default=True)), + ], + options={ + 'abstract': False, + }, + bases=(models.Model, osf.models.base.QuerySetExplainMixin, addons.base.models.BaseStorageAddon), + ), + migrations.CreateModel( + name='UserSettings', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), + ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), + ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), + ('is_deleted', models.BooleanField(default=False)), + ('deleted', osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True)), + ('oauth_grants', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=dict, encoder=osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONEncoder)), + ], + options={ + 'abstract': False, + }, + bases=(models.Model, osf.models.base.QuerySetExplainMixin), + ), + ] diff --git a/addons/s3/migrations/0002_auto_20220817_1915.py b/addons/s3/migrations/0002_auto_20220817_1915.py new file mode 100644 index 00000000000..c49ff36a70d --- /dev/null +++ b/addons/s3/migrations/0002_auto_20220817_1915.py @@ -0,0 +1,41 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.29 on 2022-08-17 19:15 +from __future__ import unicode_literals + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('addons_s3', '0001_initial'), + ('osf', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='usersettings', + name='owner', + field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='addons_s3_user_settings', to=settings.AUTH_USER_MODEL), + ), + migrations.AddField( + model_name='nodesettings', + name='external_account', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='addons_s3_node_settings', to='osf.ExternalAccount'), + ), + migrations.AddField( + model_name='nodesettings', + name='owner', + field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='addons_s3_node_settings', to='osf.AbstractNode'), + ), + migrations.AddField( + model_name='nodesettings', + name='user_settings', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='addons_s3.UserSettings'), + ), + ] diff --git a/addons/twofactor/migrations/0001_initial.py b/addons/twofactor/migrations/0001_initial.py new file mode 100644 index 00000000000..b5dded1f13d --- /dev/null +++ b/addons/twofactor/migrations/0001_initial.py @@ -0,0 +1,37 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.29 on 2022-08-17 19:15 +from __future__ import unicode_literals + +from django.db import migrations, models +import django_extensions.db.fields +import osf.models.base +import osf.utils.fields + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='UserSettings', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), + ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), + ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), + ('is_deleted', models.BooleanField(default=False)), + ('deleted', osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True)), + ('totp_secret', models.TextField(blank=True, null=True)), + ('totp_drift', models.IntegerField()), + ('is_confirmed', models.BooleanField(default=False)), + ], + options={ + 'abstract': False, + }, + bases=(models.Model, osf.models.base.QuerySetExplainMixin), + ), + ] diff --git a/addons/twofactor/migrations/0002_usersettings_owner.py b/addons/twofactor/migrations/0002_usersettings_owner.py new file mode 100644 index 00000000000..4c338a526e6 --- /dev/null +++ b/addons/twofactor/migrations/0002_usersettings_owner.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.29 on 2022-08-17 19:15 +from __future__ import unicode_literals + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('addons_twofactor', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='usersettings', + name='owner', + field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='addons_twofactor_user_settings', to=settings.AUTH_USER_MODEL), + ), + ] diff --git a/addons/wiki/migrations/0001_initial.py b/addons/wiki/migrations/0001_initial.py new file mode 100644 index 00000000000..74bffba5845 --- /dev/null +++ b/addons/wiki/migrations/0001_initial.py @@ -0,0 +1,63 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.29 on 2022-08-17 19:15 +from __future__ import unicode_literals + +import addons.wiki.models +from django.db import migrations, models +import django_extensions.db.fields +import osf.models.base +import osf.utils.fields + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='NodeSettings', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), + ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), + ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), + ('is_deleted', models.BooleanField(default=False)), + ('deleted', osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True)), + ('is_publicly_editable', models.BooleanField(db_index=True, default=False)), + ], + options={ + 'abstract': False, + }, + bases=(models.Model, osf.models.base.QuerySetExplainMixin), + ), + migrations.CreateModel( + name='WikiPage', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), + ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), + ('content_type_pk', models.PositiveIntegerField(blank=True, null=True)), + ('page_name', models.CharField(max_length=200, validators=[addons.wiki.models.validate_page_name])), + ('deleted', osf.utils.fields.NonNaiveDateTimeField(blank=True, db_index=True, null=True)), + ], + bases=(models.Model, osf.models.base.QuerySetExplainMixin), + ), + migrations.CreateModel( + name='WikiVersion', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), + ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), + ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), + ('content', models.TextField(blank=True, default='')), + ('identifier', models.IntegerField(default=1)), + ], + options={ + 'abstract': False, + }, + bases=(models.Model, osf.models.base.QuerySetExplainMixin), + ), + ] diff --git a/addons/wiki/migrations/0002_auto_20220817_1915.py b/addons/wiki/migrations/0002_auto_20220817_1915.py new file mode 100644 index 00000000000..b35e83c4b15 --- /dev/null +++ b/addons/wiki/migrations/0002_auto_20220817_1915.py @@ -0,0 +1,50 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.29 on 2022-08-17 19:15 +from __future__ import unicode_literals + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('addons_wiki', '0001_initial'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('osf', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='wikiversion', + name='user', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL), + ), + migrations.AddField( + model_name='wikiversion', + name='wiki_page', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='versions', to='addons_wiki.WikiPage'), + ), + migrations.AddField( + model_name='wikipage', + name='node', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='wikis', to='osf.AbstractNode'), + ), + migrations.AddField( + model_name='wikipage', + name='user', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL), + ), + migrations.AddField( + model_name='nodesettings', + name='owner', + field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='addons_wiki_node_settings', to='osf.AbstractNode'), + ), + migrations.AddIndex( + model_name='wikipage', + index=models.Index(fields=['page_name', 'node'], name='addons_wiki_page_na_6d5d96_idx'), + ), + ] diff --git a/addons/zotero/migrations/0001_initial.py b/addons/zotero/migrations/0001_initial.py new file mode 100644 index 00000000000..f320aeec162 --- /dev/null +++ b/addons/zotero/migrations/0001_initial.py @@ -0,0 +1,53 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.29 on 2022-08-17 19:15 +from __future__ import unicode_literals + +from django.db import migrations, models +import django_extensions.db.fields +import osf.models.base +import osf.utils.datetime_aware_jsonfield +import osf.utils.fields + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='NodeSettings', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), + ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), + ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), + ('is_deleted', models.BooleanField(default=False)), + ('deleted', osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True)), + ('list_id', models.TextField(blank=True, null=True)), + ('library_id', models.TextField(blank=True, null=True)), + ], + options={ + 'abstract': False, + }, + bases=(models.Model, osf.models.base.QuerySetExplainMixin), + ), + migrations.CreateModel( + name='UserSettings', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), + ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), + ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24, unique=True)), + ('is_deleted', models.BooleanField(default=False)), + ('deleted', osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True)), + ('oauth_grants', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=dict, encoder=osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONEncoder)), + ], + options={ + 'abstract': False, + }, + bases=(models.Model, osf.models.base.QuerySetExplainMixin), + ), + ] diff --git a/addons/zotero/migrations/0002_auto_20220817_1915.py b/addons/zotero/migrations/0002_auto_20220817_1915.py new file mode 100644 index 00000000000..49cc9e1feb1 --- /dev/null +++ b/addons/zotero/migrations/0002_auto_20220817_1915.py @@ -0,0 +1,41 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.29 on 2022-08-17 19:15 +from __future__ import unicode_literals + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('addons_zotero', '0001_initial'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('osf', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='usersettings', + name='owner', + field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='addons_zotero_user_settings', to=settings.AUTH_USER_MODEL), + ), + migrations.AddField( + model_name='nodesettings', + name='external_account', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='addons_zotero_node_settings', to='osf.ExternalAccount'), + ), + migrations.AddField( + model_name='nodesettings', + name='owner', + field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='addons_zotero_node_settings', to='osf.AbstractNode'), + ), + migrations.AddField( + model_name='nodesettings', + name='user_settings', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='addons_zotero.UserSettings'), + ), + ] From 994fcfd384fb2cb2c3b6853ffd112ff2ff8faf60 Mon Sep 17 00:00:00 2001 From: Longze Chen Date: Wed, 17 Aug 2022 15:19:16 -0400 Subject: [PATCH 25/72] Fix migration for NotableEmailDomain --- osf/migrations/0001_initial.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/osf/migrations/0001_initial.py b/osf/migrations/0001_initial.py index 28fa6e36265..ec819afd2aa 100644 --- a/osf/migrations/0001_initial.py +++ b/osf/migrations/0001_initial.py @@ -1054,7 +1054,7 @@ class Migration(migrations.Migration): ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), ('domain', osf.utils.fields.LowercaseCharField(db_index=True, max_length=255, unique=True)), - ('note', models.IntegerField(choices=[(0, 'EXCLUDE_FROM_ACCOUNT_CREATION'), (1, 'ASSUME_HAM_UNTIL_REPORTED')], default=osf.models.notable_email_domain.Note(0))), + ('note', models.IntegerField(choices=[(0, 'EXCLUDE_FROM_ACCOUNT_CREATION'), (1, 'ASSUME_HAM_UNTIL_REPORTED')], default=0)), ], options={ 'abstract': False, From a54bbbe0bce0dae8369a9213014fa6411c7c5ede Mon Sep 17 00:00:00 2001 From: Longze Chen Date: Wed, 17 Aug 2022 15:40:49 -0400 Subject: [PATCH 26/72] Fix circular import with built-in admin migrations --- osf/migrations/0001_initial.py | 14 ------------- osf/migrations/0002_adminlogentry.py | 30 ++++++++++++++++++++++++++++ 2 files changed, 30 insertions(+), 14 deletions(-) create mode 100644 osf/migrations/0002_adminlogentry.py diff --git a/osf/migrations/0001_initial.py b/osf/migrations/0001_initial.py index ec819afd2aa..4196d70634a 100644 --- a/osf/migrations/0001_initial.py +++ b/osf/migrations/0001_initial.py @@ -34,7 +34,6 @@ class Migration(migrations.Migration): dependencies = [ ('auth', '0008_alter_user_username_max_length'), - ('admin', '0002_logentry_remove_auto_add'), ('contenttypes', '0002_remove_content_type_name'), ('addons_osfstorage', '0001_initial'), ] @@ -1719,19 +1718,6 @@ class Migration(migrations.Migration): }, bases=(models.Model, osf.models.base.QuerySetExplainMixin), ), - migrations.CreateModel( - name='AdminLogEntry', - fields=[ - ], - options={ - 'proxy': True, - 'indexes': [], - }, - bases=('admin.logentry',), - managers=[ - ('objects', osf.models.admin_log_entry.AdminLogEntryManager()), - ], - ), migrations.AlterUniqueTogether( name='tag', unique_together=set([('name', 'system')]), diff --git a/osf/migrations/0002_adminlogentry.py b/osf/migrations/0002_adminlogentry.py new file mode 100644 index 00000000000..9a2b16bfa7b --- /dev/null +++ b/osf/migrations/0002_adminlogentry.py @@ -0,0 +1,30 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.29 on 2022-08-17 19:40 +from __future__ import unicode_literals + +from django.db import migrations +import osf.models.admin_log_entry + + +class Migration(migrations.Migration): + + dependencies = [ + ('admin', '0002_logentry_remove_auto_add'), + ('osf', '0001_initial'), + ] + + operations = [ + migrations.CreateModel( + name='AdminLogEntry', + fields=[ + ], + options={ + 'proxy': True, + 'indexes': [], + }, + bases=('admin.logentry',), + managers=[ + ('objects', osf.models.admin_log_entry.AdminLogEntryManager()), + ], + ), + ] From 699fc1cb3a23469e85df0b7a6ed89b7fda87e5f9 Mon Sep 17 00:00:00 2001 From: Longze Chen Date: Mon, 22 Aug 2022 14:47:29 -0400 Subject: [PATCH 27/72] Add a RunSQL migration to update indexes --- .../0003_aggregated_runsql_calls.py | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 osf/migrations/0003_aggregated_runsql_calls.py diff --git a/osf/migrations/0003_aggregated_runsql_calls.py b/osf/migrations/0003_aggregated_runsql_calls.py new file mode 100644 index 00000000000..0401bd0fe5b --- /dev/null +++ b/osf/migrations/0003_aggregated_runsql_calls.py @@ -0,0 +1,32 @@ +from __future__ import unicode_literals + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('osf', '0002_adminlogentry'), + ] + + operations = [ + migrations.RunSQL( + [ + """ + CREATE UNIQUE INDEX one_quickfiles_per_user ON public.osf_abstractnode USING btree (creator_id, type, is_deleted) WHERE (((type)::text = 'osf.quickfilesnode'::text) AND (is_deleted = false)); + CREATE INDEX osf_abstractnode_collection_pub_del_type_index ON public.osf_abstractnode USING btree (is_public, is_deleted, type) WHERE ((is_public = true) AND (is_deleted = false) AND ((type)::text = 'osf.collection'::text)); + CREATE INDEX osf_abstractnode_date_modified_ef1e2ad8 ON public.osf_abstractnode USING btree (last_logged); + CREATE INDEX osf_abstractnode_node_pub_del_type_index ON public.osf_abstractnode USING btree (is_public, is_deleted, type) WHERE ((is_public = true) AND (is_deleted = false) AND ((type)::text = 'osf.node'::text)); + CREATE INDEX osf_abstractnode_registered_date_index ON public.osf_abstractnode USING btree (registered_date DESC); + CREATE INDEX osf_abstractnode_registration_pub_del_type_index ON public.osf_abstractnode USING btree (is_public, is_deleted, type) WHERE ((is_public = true) AND (is_deleted = false) AND ((type)::text = 'osf.registration'::text)); + CREATE INDEX fileversion_date_created_desc ON public.osf_fileversion USING btree (created DESC); + CREATE INDEX fileversion_metadata_sha_arch_vault_index ON public.osf_fileversion USING btree (((metadata -> 'sha256'::text)), ((metadata -> 'archive'::text)), ((metadata -> 'vault'::text))); + CREATE INDEX nodelog__node_id_date_desc ON public.osf_nodelog USING btree (node_id, date DESC); + CREATE INDEX osf_nodelog_should_hide_nid ON public.osf_nodelog USING btree (should_hide, node_id); + CREATE UNIQUE INDEX osf_noderequest_target_creator_non_accepted ON public.osf_noderequest USING btree (target_id, creator_id) WHERE ((machine_state)::text <> 'accepted'::text); + CREATE INDEX lowercase_tag_index ON public.osf_tag USING btree (lower((name)::text), system); + """ + ], + [] + ), + ] From cb25d712a3d58bb2ad14115a0b42fb1a7033738f Mon Sep 17 00:00:00 2001 From: Longze Chen Date: Wed, 31 Aug 2022 16:10:15 -0400 Subject: [PATCH 28/72] Upgrade django to 3.2.15 (and related dependencies) Co-authored-by: John Tordoff --- requirements.txt | 19 ++++++++++--------- requirements/dev.txt | 7 ++----- 2 files changed, 12 insertions(+), 14 deletions(-) diff --git a/requirements.txt b/requirements.txt index d2fe4f3a0d6..10092844b1a 100644 --- a/requirements.txt +++ b/requirements.txt @@ -35,7 +35,7 @@ google-api-python-client==1.6.4 Babel==2.9.1 citeproc-py==0.4.0 boto3==1.4.7 -django-waffle==0.13.0 +django-waffle==2.4.1 pymongo==3.7.1 PyYAML==6.0 tqdm==4.28.1 @@ -52,9 +52,9 @@ requests-oauthlib==0.8.0 raven==6.4.0 # API requirements -Django==1.11.29 -djangorestframework==3.8.2 -django-cors-headers==2.1.0 +Django==3.2.15 +djangorestframework==3.13.1 +django-cors-headers==3.10.1 djangorestframework-bulk==0.2.1 hashids==1.2.0 pyjwt==1.5.3 @@ -65,7 +65,7 @@ pyjwe==1.0.0 # Building wheel for cryptography >= 3.4.0 requires a Rust version incompatible with Docker base image. cryptography==3.3.2 jsonschema==3.1.1 -django-guardian==1.4.9 +django-guardian==2.4.0 # Admin requirements django-webpack-loader==0.5.0 @@ -76,12 +76,11 @@ keen==0.7.0 maxminddb-geolite2==2018.308 # OSF models -django-typed-models==0.7.0 +django-typed-models==0.11.1 django-storages==1.6.6 google-cloud-storage==0.22.0 # dependency of django-storages, hard-pin to version django-dirtyfields==1.3.1 -django-extensions==2.1.3 -django-include==0.2.4 +django-extensions==3.2.0 psycopg2==2.7.3 --no-binary psycopg2 django-bulk-update==2.2.0 @@ -93,7 +92,9 @@ datacite==1.1.2 # Metrics -git+https://github.com/Johnetordoff/django-elasticsearch-metrics.git@update-django-3 +git+https://github.com/Johnetordoff/django-elasticsearch-metrics.git@update-django-3#egg=django-elasticsearch-metrics # Impact Metrics CSV Export djangorestframework-csv==2.1.0 + +git+https://github.com/Johnetordoff/django-include.git@django-3#egg=django-include diff --git a/requirements/dev.txt b/requirements/dev.txt index af9eb9858cf..adbe3074679 100644 --- a/requirements/dev.txt +++ b/requirements/dev.txt @@ -22,11 +22,8 @@ flake8==3.6.0 flake8-mutable==1.2.0 pre-commit==1.10.5 -# Django SSL for local https development -django-sslserver==0.19 - # Django Debug Toolbar for local development -django-debug-toolbar==1.6 +django-debug-toolbar==3.2.4 # Ipdb ipdb==0.10.1 @@ -38,4 +35,4 @@ pydevd==0.0.6 nplusone==0.8.2 # Profiling -django-silk==2.0.0 # pyup: <3.0 # Remove this when we're using MIDDLEWARE +django-silk==4.2.0 # pyup: <3.0 # Remove this when we're using MIDDLEWARE From 720b6ec456fb8cf9778a785bdc127fa91813898d Mon Sep 17 00:00:00 2001 From: Longze Chen Date: Wed, 31 Aug 2022 16:25:54 -0400 Subject: [PATCH 29/72] Make fields defined on typedmodels subclasses nullable Co-authored-by: John Tordoff --- osf/models/provider.py | 2 +- osf/models/registrations.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/osf/models/provider.py b/osf/models/provider.py index 8f5e567074c..2d8c9ec1ea6 100644 --- a/osf/models/provider.py +++ b/osf/models/provider.py @@ -284,7 +284,7 @@ class RegistrationProvider(AbstractProvider): # # Ex: # [{'field_name': 'foo'}, {'field_name': 'bar'}] - additional_metadata_fields = DateTimeAwareJSONField(blank=True) + additional_metadata_fields = DateTimeAwareJSONField(blank=True, null=True) default_schema = models.ForeignKey('osf.registrationschema', related_name='default_schema', null=True, blank=True, on_delete=models.SET_NULL) bulk_upload_auto_approval = models.NullBooleanField(default=False) allow_updates = models.NullBooleanField(default=False) diff --git a/osf/models/registrations.py b/osf/models/registrations.py index 691468da9e5..77575385507 100644 --- a/osf/models/registrations.py +++ b/osf/models/registrations.py @@ -150,7 +150,7 @@ class Registration(AbstractNode): help_text='Where the archive.org data for the registration is stored' ) # A dictionary of key: value pairs to store additional metadata defined by third-party sources - additional_metadata = DateTimeAwareJSONField(blank=True) + additional_metadata = DateTimeAwareJSONField(blank=True, null=True) @staticmethod def find_failed_registrations(days_stuck=None): From 6b7ce7fdb1715c727effdc06bc5a7fc396fcf3b2 Mon Sep 17 00:00:00 2001 From: Longze Chen Date: Wed, 31 Aug 2022 16:32:43 -0400 Subject: [PATCH 30/72] Add required on_delete=CASCADE (default) to FKs missing it Co-authored-by: John Tordoff --- osf/models/analytics.py | 4 ++-- osf/models/schema_response.py | 7 ++++--- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/osf/models/analytics.py b/osf/models/analytics.py index 034c80bd951..f2f0756a67d 100644 --- a/osf/models/analytics.py +++ b/osf/models/analytics.py @@ -67,8 +67,8 @@ class PageCounter(BaseModel): unique = models.PositiveIntegerField(default=0) action = models.CharField(max_length=128, null=False, blank=False) - resource = models.ForeignKey(Guid, related_name='pagecounters', null=False, blank=False) - file = models.ForeignKey('osf.BaseFileNode', null=False, blank=False, related_name='pagecounters') + resource = models.ForeignKey(Guid, related_name='pagecounters', null=False, blank=False, on_delete=models.CASCADE) + file = models.ForeignKey('osf.BaseFileNode', null=False, blank=False, related_name='pagecounters', on_delete=models.CASCADE) version = models.IntegerField(null=True, blank=True) @classmethod diff --git a/osf/models/schema_response.py b/osf/models/schema_response.py index 0b584f436d3..8285ee5ce70 100644 --- a/osf/models/schema_response.py +++ b/osf/models/schema_response.py @@ -44,14 +44,15 @@ class SchemaResponse(ObjectIDMixin, BaseModel): This allows SchemaResponses to also serve as a revision history when users submit updates to the schema form on a given parent object. ''' - schema = models.ForeignKey('osf.RegistrationSchema') + schema = models.ForeignKey('osf.RegistrationSchema', on_delete=models.CASCADE) response_blocks = models.ManyToManyField('osf.SchemaResponseBlock') - initiator = models.ForeignKey('osf.OsfUser', null=False) + initiator = models.ForeignKey('osf.OsfUser', null=False, on_delete=models.CASCADE) previous_response = models.ForeignKey( 'osf.SchemaResponse', related_name='updated_response', null=True, - blank=True + blank=True, + on_delete=models.CASCADE ) revision_justification = models.TextField(null=True, blank=True) From 0192907d4996c9b0b5092ea5558d7877b490eb41 Mon Sep 17 00:00:00 2001 From: Longze Chen Date: Thu, 1 Sep 2022 09:08:31 -0400 Subject: [PATCH 31/72] Fix django CORS whitelist settings due to orgin definition update Co-authored-by: John Tordoff --- admin/base/settings/defaults.py | 6 +++--- api/base/settings/defaults.py | 8 ++++---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/admin/base/settings/defaults.py b/admin/base/settings/defaults.py index a894baf4774..86831e7fdab 100644 --- a/admin/base/settings/defaults.py +++ b/admin/base/settings/defaults.py @@ -137,9 +137,9 @@ # Settings related to CORS Headers addon: allow API to receive authenticated requests from OSF # CORS plugin only matches based on "netloc" part of URL, so as workaround we add that to the list CORS_ORIGIN_ALLOW_ALL = False -CORS_ORIGIN_WHITELIST = (urlparse(osf_settings.DOMAIN).netloc, - osf_settings.DOMAIN, - ) +CORS_ORIGIN_WHITELIST = ( + osf_settings.DOMAIN.rstrip('/'), +) CORS_ALLOW_CREDENTIALS = True MIDDLEWARE = ( diff --git a/api/base/settings/defaults.py b/api/base/settings/defaults.py index d80d7ce996b..bfad5fce820 100644 --- a/api/base/settings/defaults.py +++ b/api/base/settings/defaults.py @@ -11,10 +11,11 @@ """ import os -from future.moves.urllib.parse import urlparse -from website import settings as osf_settings + from corsheaders.defaults import default_headers +from website import settings as osf_settings + BASE_DIR = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) # Quick-start development settings - unsuitable for production # See https://docs.djangoproject.com/en/1.8/howto/deployment/checklist/ @@ -206,8 +207,7 @@ # CORS plugin only matches based on "netloc" part of URL, so as workaround we add that to the list CORS_ORIGIN_ALLOW_ALL = False CORS_ORIGIN_WHITELIST = ( - urlparse(osf_settings.DOMAIN).netloc, - osf_settings.DOMAIN, + osf_settings.DOMAIN.rstrip('/'), ) # This needs to remain True to allow cross origin requests that are in CORS_ORIGIN_WHITELIST to # use cookies. From 51f4f485f80590f2beaae0f3becd97835f105b9c Mon Sep 17 00:00:00 2001 From: Longze Chen Date: Thu, 1 Sep 2022 09:19:16 -0400 Subject: [PATCH 32/72] Add/Enable missing templates and middlewares in api settings Co-authored-by: John Tordoff --- api/base/settings/defaults.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/api/base/settings/defaults.py b/api/base/settings/defaults.py index bfad5fce820..c2dbfa0d9ac 100644 --- a/api/base/settings/defaults.py +++ b/api/base/settings/defaults.py @@ -232,9 +232,9 @@ 'api.base.middleware.CorsMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', - # 'django.contrib.auth.middleware.AuthenticationMiddleware', + 'django.contrib.auth.middleware.AuthenticationMiddleware', # 'django.contrib.auth.middleware.SessionAuthenticationMiddleware', - # 'django.contrib.messages.middleware.MessageMiddleware', + 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', 'django.middleware.security.SecurityMiddleware', 'waffle.middleware.WaffleMiddleware', @@ -245,6 +245,12 @@ 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [os.path.join(BASE_DIR, 'templates')], 'APP_DIRS': True, + 'OPTIONS': { + 'context_processors': [ + 'django.contrib.auth.context_processors.auth', + 'django.contrib.messages.context_processors.messages', + ], + }, }, ] From 41d4b50dd0cebd41a04027b0b37a30c2f758cb80 Mon Sep 17 00:00:00 2001 From: Longze Chen Date: Thu, 1 Sep 2022 09:56:29 -0400 Subject: [PATCH 33/72] Comment out admin permissions that clash with built-in "view" ones Co-authored-by: John Tordoff --- osf/models/banner.py | 3 ++- osf/models/brand.py | 5 +++-- osf/models/conference.py | 3 ++- osf/models/institution.py | 3 ++- osf/models/preprint.py | 3 ++- osf/models/provider.py | 9 ++++++--- osf/models/registrations.py | 3 ++- osf/models/storage.py | 3 ++- osf/models/subject.py | 3 ++- osf/models/user.py | 3 ++- 10 files changed, 25 insertions(+), 13 deletions(-) diff --git a/osf/models/banner.py b/osf/models/banner.py index 1531d9d3049..fd686e24d37 100644 --- a/osf/models/banner.py +++ b/osf/models/banner.py @@ -25,7 +25,8 @@ class ScheduledBanner(models.Model): class Meta: # Custom permissions for use in the OSF Admin App permissions = ( - ('view_scheduledbanner', 'Can view scheduled banner details'), + # Clashes with built-in permissions + # ('view_scheduledbanner', 'Can view scheduled banner details'), ) name = models.CharField(unique=True, max_length=256) diff --git a/osf/models/brand.py b/osf/models/brand.py index 9e5a1e5710b..4457570ebb7 100644 --- a/osf/models/brand.py +++ b/osf/models/brand.py @@ -10,8 +10,9 @@ class Brand(BaseModel): class Meta: # Custom permissions for use in the OSF Admin App permissions = ( - ('view_brand', 'Can view brand details'), - ('modify_brand', 'Can modify brands') + # Clashes with built-in permissions + # ('view_brand', 'Can view brand details'), + ('modify_brand', 'Can modify brands'), ) name = models.CharField(max_length=30, blank=True, null=True) diff --git a/osf/models/conference.py b/osf/models/conference.py index 3f719b8a431..28366f80ea0 100644 --- a/osf/models/conference.py +++ b/osf/models/conference.py @@ -91,7 +91,8 @@ def valid_submissions(self): class Meta: # custom permissions for use in the OSF Admin App permissions = ( - ('view_conference', 'Can view conference details in the admin app.'), + # Clashes with built-in permissions + # ('view_conference', 'Can view conference details in the admin app.'), ) diff --git a/osf/models/institution.py b/osf/models/institution.py index f03dd445718..b2093294d22 100644 --- a/osf/models/institution.py +++ b/osf/models/institution.py @@ -113,7 +113,8 @@ class Institution(DirtyFieldsMixin, Loggable, base.ObjectIDMixin, base.BaseModel class Meta: # custom permissions for use in the OSF Admin App permissions = ( - ('view_institution', 'Can view institution details'), + # Clashes with built-in permissions + # ('view_institution', 'Can view institution details'), ('view_institutional_metrics', 'Can access metrics endpoints for their Institution'), ) diff --git a/osf/models/preprint.py b/osf/models/preprint.py index 2f1fb83a1cd..9d9d10cb029 100644 --- a/osf/models/preprint.py +++ b/osf/models/preprint.py @@ -253,7 +253,8 @@ class Preprint(DirtyFieldsMixin, GuidMixin, IdentifierMixin, ReviewableMixin, Ba class Meta: permissions = ( - ('view_preprint', 'Can view preprint details in the admin app'), + # Clashes with built-in permissions + # ('view_preprint', 'Can view preprint details in the admin app'), ('read_preprint', 'Can read the preprint'), ('write_preprint', 'Can write the preprint'), ('admin_preprint', 'Can manage the preprint'), diff --git a/osf/models/provider.py b/osf/models/provider.py index 2d8c9ec1ea6..7791e7f7aed 100644 --- a/osf/models/provider.py +++ b/osf/models/provider.py @@ -246,7 +246,8 @@ class CollectionProvider(AbstractProvider): class Meta: permissions = ( # custom permissions for use in the OSF Admin App - ('view_collectionprovider', 'Can view collection provider details'), + # Clashes with built-in permissions + # ('view_collectionprovider', 'Can view collection provider details'), ) @property @@ -297,7 +298,8 @@ def __init__(self, *args, **kwargs): class Meta: permissions = ( # custom permissions for use in the OSF Admin App - ('view_registrationprovider', 'Can view registration provider details'), + # Clashes with built-in permissions + # ('view_registrationprovider', 'Can view registration provider details'), ) @classmethod @@ -357,7 +359,8 @@ def __init__(self, *args, **kwargs): class Meta: permissions = ( # custom permissions for use in the OSF Admin App - ('view_preprintprovider', 'Can view preprint provider details'), + # Clashes with built-in permissions + # ('view_preprintprovider', 'Can view preprint provider details'), ) @property diff --git a/osf/models/registrations.py b/osf/models/registrations.py index 77575385507..bb0e7708e69 100644 --- a/osf/models/registrations.py +++ b/osf/models/registrations.py @@ -882,7 +882,8 @@ def related_resource_updated(self, log_action=None, api_request=None, **log_para class Meta: # custom permissions for use in the OSF Admin App permissions = ( - ('view_registration', 'Can view registration details'), + # Clashes with built-in permissions + # ('view_registration', 'Can view registration details'), ) class DraftRegistrationLog(ObjectIDMixin, BaseModel): diff --git a/osf/models/storage.py b/osf/models/storage.py index 4973d7d0d56..73254bbc887 100644 --- a/osf/models/storage.py +++ b/osf/models/storage.py @@ -18,7 +18,8 @@ class ProviderAssetFile(BaseModel): class Meta: permissions = ( - ('view_providerassetfile', 'Can view provider asset files'), + # Clashes with built-in permissions + # ('view_providerassetfile', 'Can view provider asset files'), ) name = models.CharField(choices=PROVIDER_ASSET_NAME_CHOICES, max_length=63) diff --git a/osf/models/subject.py b/osf/models/subject.py index 61fcea32210..d5e5a5e46f6 100644 --- a/osf/models/subject.py +++ b/osf/models/subject.py @@ -32,7 +32,8 @@ class Meta: base_manager_name = 'objects' unique_together = ('text', 'provider') permissions = ( - ('view_subject', 'Can view subject details'), + # Clashes with built-in permissions + # ('view_subject', 'Can view subject details'), ) def __unicode__(self): diff --git a/osf/models/user.py b/osf/models/user.py index 23abe0473f1..36cd56924ab 100644 --- a/osf/models/user.py +++ b/osf/models/user.py @@ -1908,7 +1908,8 @@ def has_resources(self): class Meta: # custom permissions for use in the OSF Admin App permissions = ( - ('view_osfuser', 'Can view user details'), + # Clashes with built-in permissions + # ('view_osfuser', 'Can view user details'), ) @receiver(post_save, sender=OSFUser) From 65f39c82ccbbfe3197dbfd928a801e28cc73297d Mon Sep 17 00:00:00 2001 From: Longze Chen Date: Thu, 1 Sep 2022 09:59:22 -0400 Subject: [PATCH 34/72] Add migrations for django upgrade base fixes Co-authored-by: John Tordoff --- osf/migrations/0004_auto_20220901_1356.py | 99 +++++++++++++++++++++++ 1 file changed, 99 insertions(+) create mode 100644 osf/migrations/0004_auto_20220901_1356.py diff --git a/osf/migrations/0004_auto_20220901_1356.py b/osf/migrations/0004_auto_20220901_1356.py new file mode 100644 index 00000000000..631c2ef52eb --- /dev/null +++ b/osf/migrations/0004_auto_20220901_1356.py @@ -0,0 +1,99 @@ +# Generated by Django 3.2.15 on 2022-09-01 13:56 + +import django.contrib.postgres.fields +from django.db import migrations, models +import osf.utils.datetime_aware_jsonfield + + +class Migration(migrations.Migration): + + dependencies = [ + ('contenttypes', '0002_remove_content_type_name'), + ('osf', '0003_aggregated_runsql_calls'), + ] + + operations = [ + migrations.AlterModelOptions( + name='brand', + options={'permissions': (('modify_brand', 'Can modify brands'),)}, + ), + migrations.AlterModelOptions( + name='collectionprovider', + options={'permissions': ()}, + ), + migrations.AlterModelOptions( + name='conference', + options={'permissions': ()}, + ), + migrations.AlterModelOptions( + name='institution', + options={'permissions': (('view_institutional_metrics', 'Can access metrics endpoints for their Institution'),)}, + ), + migrations.AlterModelOptions( + name='osfuser', + options={'permissions': ()}, + ), + migrations.AlterModelOptions( + name='preprint', + options={'permissions': (('read_preprint', 'Can read the preprint'), ('write_preprint', 'Can write the preprint'), ('admin_preprint', 'Can manage the preprint'))}, + ), + migrations.AlterModelOptions( + name='preprintprovider', + options={'permissions': ()}, + ), + migrations.AlterModelOptions( + name='providerassetfile', + options={'permissions': ()}, + ), + migrations.AlterModelOptions( + name='registration', + options={'permissions': ()}, + ), + migrations.AlterModelOptions( + name='registrationprovider', + options={'permissions': ()}, + ), + migrations.AlterModelOptions( + name='scheduledbanner', + options={'permissions': ()}, + ), + migrations.AlterModelOptions( + name='subject', + options={'base_manager_name': 'objects', 'permissions': ()}, + ), + migrations.AlterField( + model_name='abstractnode', + name='moderation_state', + field=models.CharField(choices=[('undefined', 'Undefined'), ('initial', 'Initial'), ('reverted', 'Reverted'), ('pending', 'Pending'), ('rejected', 'Rejected'), ('accepted', 'Accepted'), ('embargo', 'Embargo'), ('pending_embargo_termination', 'PendingEmbargoTermination'), ('pending_withdraw_request', 'PendingWithdrawRequest'), ('pending_withdraw', 'PendingWithdraw'), ('withdrawn', 'Withdrawn')], default='initial', max_length=30), + ), + migrations.AlterField( + model_name='abstractnode', + name='registered_meta', + field=osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=dict, encoder=osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONEncoder), + ), + migrations.AlterField( + model_name='abstractprovider', + name='additional_providers', + field=django.contrib.postgres.fields.ArrayField(base_field=models.CharField(max_length=200), blank=True, default=list, size=None), + ), + migrations.AlterField( + model_name='abstractprovider', + name='preprint_word', + field=models.CharField(choices=[('preprint', 'Preprint'), ('paper', 'Paper'), ('thesis', 'Thesis'), ('work', 'Work'), ('none', 'None')], default='preprint', max_length=10), + ), + migrations.AlterField( + model_name='abstractprovider', + name='subjects_acceptable', + field=osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=list, encoder=osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONEncoder), + ), + migrations.AlterField( + model_name='collection', + name='collected_types', + field=models.ManyToManyField(limit_choices_to={'model__in': ['abstractnode', 'basefilenode', 'collection', 'preprint']}, related_name='_osf_collection_collected_types_+', to='contenttypes.ContentType'), + ), + migrations.AlterField( + model_name='preprint', + name='ever_public', + field=models.BooleanField(blank=True, default=False), + ), + ] From 0ad3f7c8543cc0960b85f11023c9a568698e7797 Mon Sep 17 00:00:00 2001 From: Longze Chen Date: Thu, 1 Sep 2022 11:37:57 -0400 Subject: [PATCH 35/72] Fix system check warnings for django admin Co-authored-by: John Tordoff --- api/base/settings/defaults.py | 1 + 1 file changed, 1 insertion(+) diff --git a/api/base/settings/defaults.py b/api/base/settings/defaults.py index c2dbfa0d9ac..719bbcafa8b 100644 --- a/api/base/settings/defaults.py +++ b/api/base/settings/defaults.py @@ -247,6 +247,7 @@ 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ + 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', ], From 2a0aa6e8dcbdfbe6a537297fc25901ab8f0df42e Mon Sep 17 00:00:00 2001 From: Longze Chen Date: Fri, 2 Sep 2022 10:23:17 -0400 Subject: [PATCH 36/72] Fix django cache table creation See https://github.com/CenterForOpenScience/osf.io/pull/10036 and https://code.djangoproject.com/ticket/15255 for details. Co-authored-by: John Tordoff --- osf/migrations/__init__.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/osf/migrations/__init__.py b/osf/migrations/__init__.py index 4704956d772..3a32c282895 100644 --- a/osf/migrations/__init__.py +++ b/osf/migrations/__init__.py @@ -8,7 +8,6 @@ from django.db.utils import ProgrammingError from addons.osfstorage.settings import DEFAULT_REGION_ID, DEFAULT_REGION_NAME -from api.base import settings as api_settings from osf.management.commands.manage_switch_flags import manage_waffle from osf.utils.migrations import ensure_schemas, map_schemas_to_schemablocks from website import settings as osf_settings @@ -163,7 +162,7 @@ def update_waffle_flags(sender, verbosity=0, **kwargs): def create_cache_table(sender, verbosity=0, **kwargs): if getattr(sender, 'label', None) == 'osf': - call_command('createcachetable', tablename=api_settings.CACHES[api_settings.STORAGE_USAGE_CACHE_NAME]['LOCATION']) + call_command('createcachetable') def update_default_providers(sender, verbosity=0, **kwargs): From 66edda02a31e16937ed300f11181c472cd98875e Mon Sep 17 00:00:00 2001 From: Longze Chen Date: Wed, 7 Sep 2022 10:27:32 -0400 Subject: [PATCH 37/72] Enable django.contrib.sessions.middleware.SessionMiddleware See comments/reviews in the following PRs for details: https://github.com/CenterForOpenScience/osf.io/pull/10036 https://github.com/CenterForOpenScience/osf.io/pull/10049 Co-authored-by: John Tordoff --- admin/base/settings/defaults.py | 3 +-- api/base/settings/defaults.py | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/admin/base/settings/defaults.py b/admin/base/settings/defaults.py index 86831e7fdab..8b47a06ca49 100644 --- a/admin/base/settings/defaults.py +++ b/admin/base/settings/defaults.py @@ -151,11 +151,10 @@ 'api.base.middleware.CeleryTaskMiddleware', 'api.base.middleware.PostcommitTaskMiddleware', - 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', - 'django.contrib.auth.middleware.SessionAuthenticationMiddleware', + 'django.contrib.sessions.middleware.SessionMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', 'django.middleware.security.SecurityMiddleware', diff --git a/api/base/settings/defaults.py b/api/base/settings/defaults.py index 719bbcafa8b..6a589060f78 100644 --- a/api/base/settings/defaults.py +++ b/api/base/settings/defaults.py @@ -228,12 +228,11 @@ # Uncomment and add "prof" to url params to recieve a profile for that url # 'api.base.middleware.ProfileMiddleware', - # 'django.contrib.sessions.middleware.SessionMiddleware', 'api.base.middleware.CorsMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', + 'django.contrib.sessions.middleware.SessionMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', - # 'django.contrib.auth.middleware.SessionAuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', 'django.middleware.security.SecurityMiddleware', From 37bd4e4e0234bbd4fb46d1ff0220629e8ed79152 Mon Sep 17 00:00:00 2001 From: Longze Chen Date: Wed, 7 Sep 2022 15:07:21 -0400 Subject: [PATCH 38/72] Use default truthy and falsy values from upgraded DRF 3.13.1 Co-authored-by: John Tordoff --- api/base/utils.py | 9 ++++----- api_tests/nodes/views/test_node_contributors_list.py | 4 ++-- .../preprints/views/test_preprint_contributors_list.py | 4 ++-- .../registrations/views/test_registration_detail.py | 2 +- api_tests/users/views/test_user_settings_detail.py | 6 +++--- 5 files changed, 12 insertions(+), 13 deletions(-) diff --git a/api/base/utils.py b/api/base/utils.py index f45f555ee8a..3e9aba0d668 100644 --- a/api/base/utils.py +++ b/api/base/utils.py @@ -8,6 +8,7 @@ from django.utils.http import urlquote from django.core.exceptions import ObjectDoesNotExist from django.db.models import QuerySet +from rest_framework import fields from rest_framework.exceptions import NotFound from rest_framework.reverse import reverse @@ -23,11 +24,9 @@ from website import settings as website_settings from website import util as website_util # noqa -# These values are copied from rest_framework.fields.BooleanField -# BooleanField cannot be imported here without raising an -# ImproperlyConfigured error -TRUTHY = set(('t', 'T', 'true', 'True', 'TRUE', '1', 1, True, 'on', 'ON', 'On', 'y', 'Y', 'YES', 'yes')) -FALSY = set(('f', 'F', 'false', 'False', 'FALSE', '0', 0, 0.0, False, 'off', 'OFF', 'Off', 'n', 'N', 'NO', 'no')) +# See https://github.com/encode/django-rest-framework/blob/3.13.1/rest_framework/fields.py#L699-L721 +TRUTHY = fields.BooleanField.TRUE_VALUES +FALSY = fields.BooleanField.FALSE_VALUES UPDATE_METHODS = ['PUT', 'PATCH'] diff --git a/api_tests/nodes/views/test_node_contributors_list.py b/api_tests/nodes/views/test_node_contributors_list.py index 745c7891ea1..5fe306c91e7 100644 --- a/api_tests/nodes/views/test_node_contributors_list.py +++ b/api_tests/nodes/views/test_node_contributors_list.py @@ -2113,7 +2113,7 @@ def test_bulk_update_contributors_errors( auth=user.auth, expect_errors=True, bulk=True) assert res.status_code == 400 - assert res.json['errors'][0]['detail'] == '"true and false" is not a valid boolean.' + assert res.json['errors'][0]['detail'] == 'Must be a valid boolean.' res = app.get(url_public, auth=user.auth) data = res.json['data'] @@ -2531,7 +2531,7 @@ def test_bulk_partial_update_errors( auth=user.auth, expect_errors=True, bulk=True) assert res.status_code == 400 - assert res.json['errors'][0]['detail'] == '"true and false" is not a valid boolean.' + assert res.json['errors'][0]['detail'] == 'Must be a valid boolean.' res = app.get(url_public, auth=user.auth) data = res.json['data'] diff --git a/api_tests/preprints/views/test_preprint_contributors_list.py b/api_tests/preprints/views/test_preprint_contributors_list.py index 0bf4983fda9..3821f5cad7e 100644 --- a/api_tests/preprints/views/test_preprint_contributors_list.py +++ b/api_tests/preprints/views/test_preprint_contributors_list.py @@ -2131,7 +2131,7 @@ def test_bulk_update_contributors_errors( auth=user.auth, expect_errors=True, bulk=True) assert res.status_code == 400 - assert res.json['errors'][0]['detail'] == '"true and false" is not a valid boolean.' + assert res.json['errors'][0]['detail'] == 'Must be a valid boolean.' res = app.get(url_published, auth=user.auth) data = res.json['data'] @@ -2547,7 +2547,7 @@ def test_bulk_partial_update_errors( auth=user.auth, expect_errors=True, bulk=True) assert res.status_code == 400 - assert res.json['errors'][0]['detail'] == '"true and false" is not a valid boolean.' + assert res.json['errors'][0]['detail'] == 'Must be a valid boolean.' res = app.get(url_published, auth=user.auth) data = res.json['data'] diff --git a/api_tests/registrations/views/test_registration_detail.py b/api_tests/registrations/views/test_registration_detail.py index 730177e5bee..a39c359ea1b 100644 --- a/api_tests/registrations/views/test_registration_detail.py +++ b/api_tests/registrations/views/test_registration_detail.py @@ -432,7 +432,7 @@ def test_fields( expect_errors=True ) assert res.status_code == 400 - assert res.json['errors'][0]['detail'] == '"Dr.Strange" is not a valid boolean.' + assert res.json['errors'][0]['detail'] == 'Must be a valid boolean.' invalid_public_payload = make_payload( id=public_registration._id, diff --git a/api_tests/users/views/test_user_settings_detail.py b/api_tests/users/views/test_user_settings_detail.py index cecbc9d0053..7719361e3af 100644 --- a/api_tests/users/views/test_user_settings_detail.py +++ b/api_tests/users/views/test_user_settings_detail.py @@ -85,10 +85,10 @@ def test_update_two_factor_permissions(self, app, user_one, user_two, url, paylo def test_update_two_factor_enabled(self, app, user_one, url, payload): # Invalid data type - payload['data']['attributes']['two_factor_enabled'] = 'Yes' + payload['data']['attributes']['two_factor_enabled'] = 'yEs' res = app.patch_json_api(url, payload, auth=user_one.auth, expect_errors=True) assert res.status_code == 400 - assert res.json['errors'][0]['detail'] == '"Yes" is not a valid boolean.' + assert res.json['errors'][0]['detail'] == 'Must be a valid boolean.' # Already disabled - nothing happens, still disabled payload['data']['attributes']['two_factor_enabled'] = False @@ -211,7 +211,7 @@ def test_bad_payload_patch_400(self, app, user_one, bad_payload, url): res = app.patch_json_api(url, bad_payload, auth=user_one.auth, expect_errors=True) assert res.status_code == 400 - assert res.json['errors'][0]['detail'] == u'"22" is not a valid boolean.' + assert res.json['errors'][0]['detail'] == 'Must be a valid boolean.' def test_anonymous_patch_401(self, app, url, payload): res = app.patch_json_api(url, payload, expect_errors=True) From bcd2c6ef5550c558e46a57db11eb3c7eba6466a4 Mon Sep 17 00:00:00 2001 From: Longze Chen Date: Wed, 7 Sep 2022 15:20:12 -0400 Subject: [PATCH 39/72] Use JsonField from django.db.models and django.forms Co-authored-by: John Tordoff --- api/files/annotations.py | 5 ++++- osf/utils/datetime_aware_jsonfield.py | 18 +++++++++++------- osf/utils/fields.py | 14 +++++++++----- osf_tests/test_external_accounts.py | 12 ++++++------ 4 files changed, 30 insertions(+), 19 deletions(-) diff --git a/api/files/annotations.py b/api/files/annotations.py index a4a107438d6..b5d0d848ba2 100644 --- a/api/files/annotations.py +++ b/api/files/annotations.py @@ -1,6 +1,7 @@ from django.db.models import BooleanField, Case, Exists, F, IntegerField, Max, OuterRef, Q, Subquery, Value, When +from django.db.models.fields.json import KeyTextTransform from django.db.models.functions import Cast -from django.contrib.postgres.fields.jsonb import KeyTextTransform + from osf.utils.datetime_aware_jsonfield import DateTimeAwareJSONField from osf.utils.fields import NonNaiveDateTimeField from osf.models import FileVersion @@ -30,6 +31,7 @@ ), ) + def make_show_as_unviewed_annotations(user): '''Returns the annotations required to set the current_user_has_viewed attribute. @@ -70,6 +72,7 @@ def make_show_as_unviewed_annotations(user): 'show_as_unviewed': show_as_unviewed, } + def check_show_as_unviewed(user, osf_file): '''A separate function for assigning the show_as_unviewed value to a single instance. diff --git a/osf/utils/datetime_aware_jsonfield.py b/osf/utils/datetime_aware_jsonfield.py index 13f5e144396..f62f65f9954 100644 --- a/osf/utils/datetime_aware_jsonfield.py +++ b/osf/utils/datetime_aware_jsonfield.py @@ -8,13 +8,15 @@ import pytz from dateutil.parser import isoparse from django.contrib.postgres import lookups -from django.contrib.postgres.fields.jsonb import JSONField -from django.contrib.postgres.forms.jsonb import JSONField as JSONFormField from django.core.serializers.json import DjangoJSONEncoder +from django.db.models import JSONField +from django.forms import JSONField as JSONFormField + from osf.exceptions import NaiveDatetimeException, ValidationError logger = logging.getLogger(__name__) + def coerce_nonnaive_datetimes(json_data): if isinstance(json_data, list): coerced_data = [coerce_nonnaive_datetimes(data) for data in json_data] @@ -84,10 +86,9 @@ def formfield(self, **kwargs): defaults.update(kwargs) return super(DateTimeAwareJSONField, self).formfield(**defaults) - def from_db_value(self, value, expression, connection, context): - if value is None: - return None - return super(DateTimeAwareJSONField, self).to_python(decode_datetime_objects(value)) + def from_db_value(self, value, expression, connection): + value = super(DateTimeAwareJSONField, self).from_db_value(value, None, None) + return decode_datetime_objects(value) def get_prep_lookup(self, lookup_type, value): if lookup_type in ('has_key', 'has_keys', 'has_any_keys'): @@ -96,9 +97,11 @@ def get_prep_lookup(self, lookup_type, value): class DateTimeAwareJSONFormField(JSONFormField): + def to_python(self, value): + value = super(DateTimeAwareJSONFormField, self).to_python(value) try: - return decode_datetime_objects(json.loads(value)) + return decode_datetime_objects(value) except TypeError: raise ValidationError( self.error_messages['invalid'], @@ -116,6 +119,7 @@ def prepare_value(self, value): params={'value': value}, ) + JSONField.register_lookup(lookups.DataContains) JSONField.register_lookup(lookups.ContainedBy) JSONField.register_lookup(lookups.HasKey) diff --git a/osf/utils/fields.py b/osf/utils/fields.py index 18516c2c69e..d2ac6edd61c 100644 --- a/osf/utils/fields.py +++ b/osf/utils/fields.py @@ -1,9 +1,9 @@ import jwe from django.db import models -from django.contrib.postgres.fields.jsonb import JSONField +from django.db.models import JSONField + from website import settings from osf.utils.functional import rapply - from osf.exceptions import NaiveDatetimeException SENSITIVE_DATA_KEY = jwe.kdf(settings.SENSITIVE_DATA_SECRET.encode('utf-8'), @@ -22,6 +22,7 @@ def ensure_str(value): return value.decode() return value + def encrypt_string(value, prefix='jwe:::'): prefix = ensure_bytes(prefix) if value: @@ -39,6 +40,7 @@ def decrypt_string(value, prefix='jwe:::'): value = jwe.decrypt(value[len(prefix):], SENSITIVE_DATA_KEY).decode() return value + class LowercaseCharField(models.CharField): def get_prep_value(self, value): value = super(models.CharField, self).get_prep_value(value) @@ -46,6 +48,7 @@ def get_prep_value(self, value): value = value.lower() return value + class LowercaseEmailField(models.EmailField): # Note: This is technically not compliant with RFC 822, which requires # that case be preserved in the "local-part" of an address. From @@ -58,6 +61,7 @@ def get_prep_value(self, value): value = value.lower().strip() return value + class EncryptedTextField(models.TextField): """ This field transparently encrypts data in the database. It should probably only be used with PG unless @@ -71,7 +75,7 @@ def get_db_prep_value(self, value, **kwargs): def to_python(self, value): return decrypt_string(value, prefix=self.prefix) - def from_db_value(self, value, expression, connection, context): + def from_db_value(self, value, expression, connection): return self.to_python(value) @@ -95,7 +99,7 @@ def get_prep_value(self, value, **kwargs): def to_python(self, value): value = rapply(value, decrypt_string, prefix=self.prefix) - return super(EncryptedJSONField, self).to_python(value) + return super(EncryptedJSONField, self).from_db_value(value, None, None) - def from_db_value(self, value, expression, connection, context): + def from_db_value(self, value, expression, connection): return self.to_python(value) diff --git a/osf_tests/test_external_accounts.py b/osf_tests/test_external_accounts.py index b78fba21930..f5c65c2f763 100644 --- a/osf_tests/test_external_accounts.py +++ b/osf_tests/test_external_accounts.py @@ -77,7 +77,7 @@ def test_encrypt_and_decrypt_no_unicode_in_string_type_str(self, field): my_value_encrypted = field.get_db_prep_value(my_value) assert isinstance(my_value_encrypted, str) - my_value_decrypted = field.from_db_value(my_value_encrypted, None, None, None) + my_value_decrypted = field.from_db_value(my_value_encrypted, None, None) assert isinstance(my_value_decrypted, str) assert my_value_decrypted == ensure_bytes(my_value).decode() @@ -87,13 +87,13 @@ def test_encrypt_and_decrypt_unicode_in_string_type_str(self, field): my_value_encrypted = field.get_db_prep_value(my_value) assert isinstance(my_value_encrypted, str) - my_value_decrypted = field.from_db_value(my_value_encrypted, None, None, None) + my_value_decrypted = field.from_db_value(my_value_encrypted, None, None) assert my_value_decrypted == ensure_bytes(my_value).decode() my_value = '찦차КЛМНО💁◕‿◕。)╱i̲̬͇̪͙n̝̗͕v̟̜̘̦͟o̶̙̰̠kè͚̮̺̪̹̱̤  ǝɹol' assert isinstance(my_value, str) my_value_encrypted = field.get_db_prep_value(my_value) - my_value_decrypted = field.from_db_value(my_value_encrypted, None, None, None) + my_value_decrypted = field.from_db_value(my_value_encrypted, None, None) assert isinstance(my_value_decrypted, str) assert my_value_decrypted == ensure_bytes(my_value).decode() @@ -103,7 +103,7 @@ def test_encrypt_and_decrypt_no_unicode_in_string_type_unicode(self, field): my_value_encrypted = field.get_db_prep_value(my_value) assert isinstance(my_value_encrypted, str) - my_value_decrypted = field.from_db_value(my_value_encrypted, None, None, None) + my_value_decrypted = field.from_db_value(my_value_encrypted, None, None) assert isinstance(my_value_decrypted, str) assert my_value_decrypted == str(my_value) @@ -113,12 +113,12 @@ def test_encrypt_and_decrypt_unicode_in_string_type_unicode(self, field): my_value_encrypted = field.get_db_prep_value(my_value) assert isinstance(my_value_encrypted, str) - my_value_decrypted = field.from_db_value(my_value_encrypted, None, None, None) + my_value_decrypted = field.from_db_value(my_value_encrypted, None, None) assert my_value_decrypted == ensure_bytes(my_value).decode() my_value = u'찦차КЛМНО💁◕‿◕。)╱i̲̬͇̪͙n̝̗͕v̟̜̘̦͟o̶̙̰̠kè͚̮̺̪̹̱̤  ǝɹol' assert isinstance(my_value, str) my_value_encrypted = field.get_db_prep_value(my_value) - my_value_decrypted = field.from_db_value(my_value_encrypted, None, None, None) + my_value_decrypted = field.from_db_value(my_value_encrypted, None, None) assert isinstance(my_value_decrypted, str) assert my_value_decrypted == ensure_bytes(my_value).decode() From 0ce6496be1b239a2bf714c98de1cfe6a3c6a7041 Mon Sep 17 00:00:00 2001 From: Longze Chen Date: Wed, 7 Sep 2022 17:28:11 -0400 Subject: [PATCH 40/72] Fix session cookie encoding/decoding by using ensure_str() Co-authored-by: John Tordoff --- framework/sessions/__init__.py | 5 +++-- osf/models/user.py | 7 +++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/framework/sessions/__init__.py b/framework/sessions/__init__.py index 65f61b75cfb..eff8a9e4cfc 100644 --- a/framework/sessions/__init__.py +++ b/framework/sessions/__init__.py @@ -12,6 +12,7 @@ from werkzeug.local import LocalProxy from framework.celery_tasks.handlers import enqueue_task +from osf.utils.fields import ensure_str from framework.flask import redirect from framework.sessions.utils import remove_session from website import settings @@ -158,10 +159,10 @@ def before_request(): cookie = request.cookies.get(settings.COOKIE_NAME) if cookie: try: - session_id = itsdangerous.Signer(settings.SECRET_KEY).unsign(cookie) + session_id = ensure_str(itsdangerous.Signer(settings.SECRET_KEY).unsign(cookie)) user_session = Session.load(session_id) or Session(_id=session_id) except itsdangerous.BadData: - return + return None if not throttle_period_expired(user_session.created, settings.OSF_SESSION_TIMEOUT): # Update date last login when making non-api requests from framework.auth.tasks import update_user_from_activity diff --git a/osf/models/user.py b/osf/models/user.py index 36cd56924ab..7bef11b9729 100644 --- a/osf/models/user.py +++ b/osf/models/user.py @@ -47,7 +47,7 @@ from osf.models.tag import Tag from osf.models.validators import validate_email, validate_social, validate_history_item from osf.utils.datetime_aware_jsonfield import DateTimeAwareJSONField -from osf.utils.fields import NonNaiveDateTimeField, LowercaseEmailField +from osf.utils.fields import NonNaiveDateTimeField, LowercaseEmailField, ensure_str from osf.utils.names import impute_names from osf.utils.requests import check_select_for_update from osf.utils.permissions import API_CONTRIBUTOR_PERMISSIONS, MANAGER, MEMBER, MANAGE, ADMIN @@ -1746,12 +1746,11 @@ def from_cookie(cls, cookie, secret=None): secret = secret or settings.SECRET_KEY try: - token = itsdangerous.Signer(secret).unsign(cookie) + session_id = ensure_str(itsdangerous.Signer(secret).unsign(cookie)) except itsdangerous.BadSignature: return None - user_session = Session.load(token) - + user_session = Session.load(session_id) if user_session is None: return None From 2fbc057841195593b333000e19dd06d3feb07cdf Mon Sep 17 00:00:00 2001 From: John Tordoff <> Date: Mon, 29 Aug 2022 10:32:59 -0400 Subject: [PATCH 41/72] Use prefetch instead of Django include --- addons/osfstorage/views.py | 2 +- api/actions/views.py | 4 ++-- api/base/views.py | 2 +- api/draft_registrations/views.py | 4 ++-- api/institutions/views.py | 2 +- api/nodes/views.py | 6 ++++-- api/preprints/views.py | 2 +- api/registrations/views.py | 2 +- api/users/views.py | 9 +++++++-- framework/database/__init__.py | 2 +- .../commands/backfill_date_retracted.py | 4 ++-- osf/migrations/0001_initial.py | 3 --- osf/models/action.py | 4 ---- osf/models/base.py | 16 ++++++++-------- osf/models/collection.py | 3 --- osf/models/contributor.py | 3 --- osf/models/files.py | 5 +---- osf/models/mixins.py | 4 ---- osf/models/node.py | 7 +++---- osf/models/nodelog.py | 4 ---- osf/models/osf_grouplog.py | 4 ---- osf/models/preprint.py | 3 +-- osf/models/preprintlog.py | 4 ---- osf/models/request.py | 3 --- osf/models/subject.py | 5 ++--- osf_tests/test_include_queryset.py | 8 ++++---- requirements.txt | 2 -- website/profile/utils.py | 1 - website/project/views/node.py | 6 +++--- website/views.py | 2 +- 30 files changed, 46 insertions(+), 80 deletions(-) diff --git a/addons/osfstorage/views.py b/addons/osfstorage/views.py index 467f2510104..63b164174ce 100644 --- a/addons/osfstorage/views.py +++ b/addons/osfstorage/views.py @@ -128,7 +128,7 @@ def osfstorage_get_revisions(file_node, payload, target, **kwargs): version_count = file_node.versions.count() counts = dict(PageCounter.objects.filter(resource=file_node.target.guids.first().id, file=file_node, action='download').values_list('_id', 'total')) - qs = FileVersion.includable_objects.filter(basefilenode__id=file_node.id).include('creator__guids').order_by('-created') + qs = FileVersion.objects.filter(basefilenode__id=file_node.id).prefetch_related('creator__guids').order_by('-created') for i, version in enumerate(qs): version._download_count = counts.get('{}{}'.format(counter_prefix, version_count - i - 1), 0) diff --git a/api/actions/views.py b/api/actions/views.py index d4dbff0b348..c88c04528dc 100644 --- a/api/actions/views.py +++ b/api/actions/views.py @@ -24,7 +24,7 @@ def get_review_actions_queryset(): - return ReviewAction.objects.include( + return ReviewAction.objects.prefetch_related( 'creator__guids', 'target__guids', 'target__provider', @@ -94,7 +94,7 @@ def get_object(self): ] if action_querysets: action = [action_queryset for action_queryset in action_querysets if action_queryset][0] # clear empty querysets - action.include( + action.prefetch_related( 'creator__guids', 'target__guids', 'target__provider', diff --git a/api/base/views.py b/api/base/views.py index eddb7e2a4a6..0a106127a02 100644 --- a/api/base/views.py +++ b/api/base/views.py @@ -510,7 +510,7 @@ class BaseContributorList(JSONAPIBaseView, generics.ListAPIView, ListFilterMixin def get_default_queryset(self): node = self.get_node() - return node.contributor_set.all().include('user__guids') + return node.contributor_set.all().prefetch_related('user__guids') def get_queryset(self): queryset = self.get_queryset_from_request() diff --git a/api/draft_registrations/views.py b/api/draft_registrations/views.py index 07b1eba1a18..f664c45c862 100644 --- a/api/draft_registrations/views.py +++ b/api/draft_registrations/views.py @@ -175,7 +175,7 @@ class DraftContributorsList(NodeContributorsList, DraftRegistrationMixin): def get_default_queryset(self): # Overrides NodeContributorsList draft = self.get_draft() - return draft.draftregistrationcontributor_set.all().include('user__guids') + return draft.draftregistrationcontributor_set.all().prefetch_related('user__guids') # overrides NodeContributorsList def get_serializer_class(self): @@ -239,7 +239,7 @@ class DraftBibliographicContributorsList(DraftContributorsList): def get_default_queryset(self): # Overrides NodeContributorsList draft = self.get_draft() - return draft.draftregistrationcontributor_set.filter(visible=True).include('user__guids') + return draft.draftregistrationcontributor_set.filter(visible=True).prefetch_related('user__guids') # Override to prevent use DraftRegistrationContributorsCreateSerializer, this endpoint is read-only def get_serializer_class(self): diff --git a/api/institutions/views.py b/api/institutions/views.py index 95c49432a2e..6d13ce46eb3 100644 --- a/api/institutions/views.py +++ b/api/institutions/views.py @@ -134,7 +134,7 @@ def get_default_queryset(self): return ( institution.nodes.filter(is_public=True, is_deleted=False, type='osf.node') .select_related('node_license') - .include('contributor__user__guids', 'root__guids', 'tags', limit_includes=10) + .prefetch_related('contributor_set__user__guids', 'root__guids', 'tags') .annotate(region=F('addons_osfstorage_node_settings__region___id')) ) diff --git a/api/nodes/views.py b/api/nodes/views.py index 1b2d3042d60..67c62b17e3e 100644 --- a/api/nodes/views.py +++ b/api/nodes/views.py @@ -1563,8 +1563,10 @@ def get_default_queryset(self): return self.get_node().get_logs_queryset(auth) def get_queryset(self): - return self.get_queryset_from_request().include( - 'node__guids', 'user__guids', 'original_node__guids', limit_includes=10, + return self.get_queryset_from_request().prefetch_related( + 'node__guids', + 'user__guids', + 'original_node__guids', ) diff --git a/api/preprints/views.py b/api/preprints/views.py index e02ab40b6a9..08df330c7db 100644 --- a/api/preprints/views.py +++ b/api/preprints/views.py @@ -355,7 +355,7 @@ class PreprintContributorsList(NodeContributorsList, PreprintMixin): def get_default_queryset(self): preprint = self.get_preprint() - return preprint.preprintcontributor_set.all().include('user__guids') + return preprint.preprintcontributor_set.all().prefetch_related('user__guids') # overrides NodeContributorsList def get_serializer_class(self): diff --git a/api/registrations/views.py b/api/registrations/views.py index ceb8b1e8430..814b21689f0 100644 --- a/api/registrations/views.py +++ b/api/registrations/views.py @@ -286,7 +286,7 @@ class RegistrationContributorsList(BaseContributorList, RegistrationMixin, UserM def get_default_queryset(self): node = self.get_node(check_object_permissions=False) - return node.contributor_set.all().include('user__guids') + return node.contributor_set.all().prefetch_related('user__guids') class RegistrationContributorDetail(BaseContributorDetail, RegistrationMixin, UserMixin): diff --git a/api/users/views.py b/api/users/views.py index 189f08f1394..2b451a0e4db 100644 --- a/api/users/views.py +++ b/api/users/views.py @@ -331,7 +331,7 @@ def get_queryset(self): return ( self.get_queryset_from_request() .select_related('node_license') - .include('contributor__user__guids', 'root__guids', limit_includes=10) + .prefetch_related('contributor_set__user__guids', 'root__guids') ) @@ -472,7 +472,12 @@ def get_default_queryset(self): # overrides ListAPIView def get_queryset(self): - return self.get_queryset_from_request().select_related('node_license').include('contributor__user__guids', 'root__guids', limit_includes=10) + return self.get_queryset_from_request().select_related( + 'node_license', + ).prefetch_related( + 'contributor_set__user__guids', + 'root__guids', + ) class UserDraftRegistrations(JSONAPIBaseView, generics.ListAPIView, UserMixin): permission_classes = ( diff --git a/framework/database/__init__.py b/framework/database/__init__.py index d5eac968b07..d91c1d7cbf4 100644 --- a/framework/database/__init__.py +++ b/framework/database/__init__.py @@ -105,7 +105,7 @@ def paginated(model, query=None, increment=200, each=True, include=None): are yielded. """ if include and query: - queryset = model.objects.filter(query).include(*include) + queryset = model.objects.filter(query).prefetch_related(*include) elif query: queryset = model.objects.filter(query) else: diff --git a/osf/management/commands/backfill_date_retracted.py b/osf/management/commands/backfill_date_retracted.py index 5a0a10dae08..e22fa9dd0a1 100644 --- a/osf/management/commands/backfill_date_retracted.py +++ b/osf/management/commands/backfill_date_retracted.py @@ -22,8 +22,8 @@ def set_date_retracted(*args): registrations = ( Registration.objects.filter(retraction__state=Sanction.APPROVED, retraction__date_retracted=None) .select_related('retraction') - .include('registered_from__logs') - .include('registered_from__guids') + .prefetch_related('registered_from__logs') + .prefetch_related('registered_from__guids') ) total = registrations.count() logger.info('Migrating {} retractions.'.format(total)) diff --git a/osf/migrations/0001_initial.py b/osf/migrations/0001_initial.py index 4196d70634a..ba920382087 100644 --- a/osf/migrations/0001_initial.py +++ b/osf/migrations/0001_initial.py @@ -805,9 +805,6 @@ class Migration(migrations.Migration): 'ordering': ('-created',), }, bases=(models.Model, osf.models.base.QuerySetExplainMixin), - managers=[ - ('includable_objects', django.db.models.manager.Manager()), - ], ), migrations.CreateModel( name='FileVersionUserMetadata', diff --git a/osf/models/action.py b/osf/models/action.py index 5a223c43dfc..4ec02534bfb 100644 --- a/osf/models/action.py +++ b/osf/models/action.py @@ -3,8 +3,6 @@ from django.db import models -from include import IncludeManager - from osf.models.base import BaseModel, ObjectIDMixin from osf.utils.workflows import ( ApprovalStates, @@ -23,8 +21,6 @@ class BaseAction(ObjectIDMixin, BaseModel): class Meta: abstract = True - objects = IncludeManager() - creator = models.ForeignKey('OSFUser', related_name='+', on_delete=models.CASCADE) trigger = models.CharField(max_length=31, choices=DefaultTriggers.choices()) diff --git a/osf/models/base.py b/osf/models/base.py index 7a49fa45573..473ef43e999 100644 --- a/osf/models/base.py +++ b/osf/models/base.py @@ -13,7 +13,6 @@ from django.db.models.signals import post_save from django.dispatch import receiver from django_extensions.db.models import TimeStampedModel -from include import IncludeQuerySet from past.builtins import basestring from osf.utils.caching import cached_property @@ -281,18 +280,19 @@ class Meta: abstract = True -class GuidMixinQuerySet(IncludeQuerySet): +class GuidMixinQuerySet(QuerySet): def _filter_or_exclude(self, negate, *args, **kwargs): - return super(GuidMixinQuerySet, self)._filter_or_exclude(negate, *args, **kwargs).include('guids') + return super()._filter_or_exclude( + negate, + *args, + **kwargs + ).prefetch_related('guids') def all(self): if self._fields: - return super(GuidMixinQuerySet, self).all() - return super(GuidMixinQuerySet, self).all().include('guids') - - def count(self): - return super(GuidMixinQuerySet, self.include(None)).count() + return super().all() + return super().all().prefetch_related('guids') class GuidMixin(BaseIDMixin): diff --git a/osf/models/collection.py b/osf/models/collection.py index 838e6ecf910..3ce3fc3bcd4 100644 --- a/osf/models/collection.py +++ b/osf/models/collection.py @@ -9,7 +9,6 @@ from django.utils.functional import cached_property from django.utils import timezone from guardian.models import GroupObjectPermissionBase, UserObjectPermissionBase -from include import IncludeManager from framework.celery_tasks.handlers import enqueue_task from osf.models.base import BaseModel, GuidMixin @@ -88,8 +87,6 @@ def save(self, *args, **kwargs): return ret class Collection(DirtyFieldsMixin, GuidMixin, BaseModel, GuardianMixin): - objects = IncludeManager() - groups = { 'read': ('read_collection', ), 'write': ('read_collection', 'write_collection', ), diff --git a/osf/models/contributor.py b/osf/models/contributor.py index 9149c82c57e..c31e725053f 100644 --- a/osf/models/contributor.py +++ b/osf/models/contributor.py @@ -1,12 +1,9 @@ from django.db import models -from include import IncludeManager - from osf.utils.fields import NonNaiveDateTimeField from osf.utils import permissions class AbstractBaseContributor(models.Model): - objects = IncludeManager() primary_identifier_name = 'user__guids___id' diff --git a/osf/models/files.py b/osf/models/files.py index 59b8be9b818..00ac6505eee 100644 --- a/osf/models/files.py +++ b/osf/models/files.py @@ -13,7 +13,6 @@ from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.fields import GenericForeignKey from typedmodels.models import TypedModel, TypedModelManager -from include import IncludeManager from framework.analytics import get_basic_counters from framework import sentry @@ -40,7 +39,7 @@ logger = logging.getLogger(__name__) -class BaseFileNodeManager(TypedModelManager, IncludeManager): +class BaseFileNodeManager(TypedModelManager): def get_queryset(self): qs = super(BaseFileNodeManager, self).get_queryset() @@ -797,8 +796,6 @@ class FileVersion(ObjectIDMixin, BaseModel): purged = NonNaiveDateTimeField(blank=True, null=True) - includable_objects = IncludeManager() - @property def location_hash(self): return self.location['object'] diff --git a/osf/models/mixins.py b/osf/models/mixins.py index 61d68e7468a..cb6962ad868 100644 --- a/osf/models/mixins.py +++ b/osf/models/mixins.py @@ -10,8 +10,6 @@ from django.utils.functional import cached_property from guardian.shortcuts import assign_perm, get_perms, remove_perm, get_group_perms -from include import IncludeQuerySet - from api.providers.workflows import Workflows, PUBLIC_STATES from framework import status from framework.auth import Auth @@ -980,8 +978,6 @@ def is_reviewed(self): def get_reviewable_state_counts(self): assert self.REVIEWABLE_RELATION_NAME, 'REVIEWABLE_RELATION_NAME must be set to compute state counts' qs = getattr(self, self.REVIEWABLE_RELATION_NAME) - if isinstance(qs, IncludeQuerySet): - qs = qs.include(None) qs = qs.filter( deleted__isnull=True ).exclude( diff --git a/osf/models/node.py b/osf/models/node.py index 541810c57de..4fa9183f41e 100644 --- a/osf/models/node.py +++ b/osf/models/node.py @@ -25,7 +25,6 @@ from keen import scoped_keys from psycopg2._psycopg import AsIs from typedmodels.models import TypedModel, TypedModelManager -from include import IncludeManager from guardian.models import ( GroupObjectPermissionBase, UserObjectPermissionBase, @@ -178,7 +177,7 @@ def can_view(self, user=None, private_link=None): return qs.filter(is_deleted=False) -class AbstractNodeManager(TypedModelManager, IncludeManager): +class AbstractNodeManager(TypedModelManager): def get_queryset(self): qs = AbstractNodeQuerySet(self.model, using=self._db) @@ -830,8 +829,8 @@ def get_logs_queryset(self, auth): return NodeLog.objects.filter( node_id=self.id, should_hide=False - ).order_by('-date').include( - 'node__guids', 'user__guids', 'original_node__guids', limit_includes=10 + ).order_by('-date').prefetch_related( + 'node__guids', 'user__guids', 'original_node__guids', ) def get_absolute_url(self): diff --git a/osf/models/nodelog.py b/osf/models/nodelog.py index 0d94653b3f9..2d4667349e0 100644 --- a/osf/models/nodelog.py +++ b/osf/models/nodelog.py @@ -1,5 +1,3 @@ -from include import IncludeManager - from django.apps import apps from django.db import models from django.utils import timezone @@ -17,8 +15,6 @@ class NodeLog(ObjectIDMixin, BaseModel): 'original_node': 'original_node__guids___id' } - objects = IncludeManager() - DATE_FORMAT = '%m/%d/%Y %H:%M UTC' # Log action constants -- NOTE: templates stored in log_templates.mako diff --git a/osf/models/osf_grouplog.py b/osf/models/osf_grouplog.py index e4318ed7735..1c06657feb7 100644 --- a/osf/models/osf_grouplog.py +++ b/osf/models/osf_grouplog.py @@ -1,5 +1,3 @@ -from include import IncludeManager - from django.db import models from osf.models.base import BaseModel, ObjectIDMixin from osf.utils.datetime_aware_jsonfield import DateTimeAwareJSONField @@ -7,8 +5,6 @@ class OSFGroupLog(ObjectIDMixin, BaseModel): - objects = IncludeManager() - DATE_FORMAT = '%m/%d/%Y %H:%M UTC' GROUP_CREATED = 'group_created' diff --git a/osf/models/preprint.py b/osf/models/preprint.py index 9d9d10cb029..32028eefa3a 100644 --- a/osf/models/preprint.py +++ b/osf/models/preprint.py @@ -5,7 +5,6 @@ import re from dirtyfields import DirtyFieldsMixin -from include import IncludeManager from django.db import models from django.db.models import Q from django.utils import timezone @@ -57,7 +56,7 @@ logger = logging.getLogger(__name__) -class PreprintManager(IncludeManager): +class PreprintManager(models.Manager): def get_queryset(self): return GuidMixinQuerySet(self.model, using=self._db) diff --git a/osf/models/preprintlog.py b/osf/models/preprintlog.py index 5a9a70721f9..c4db05d94d0 100644 --- a/osf/models/preprintlog.py +++ b/osf/models/preprintlog.py @@ -1,5 +1,3 @@ -from include import IncludeManager - from django.apps import apps from django.db import models from osf.models.base import BaseModel, ObjectIDMixin @@ -14,8 +12,6 @@ class PreprintLog(ObjectIDMixin, BaseModel): 'user': 'user__guids___id', } - objects = IncludeManager() - DATE_FORMAT = '%m/%d/%Y %H:%M UTC' DELETED = 'deleted' diff --git a/osf/models/request.py b/osf/models/request.py index 7914c8b2a3f..8319d4e01f8 100644 --- a/osf/models/request.py +++ b/osf/models/request.py @@ -2,7 +2,6 @@ from __future__ import unicode_literals from django.db import models -from include import IncludeManager from osf.models.base import BaseModel, ObjectIDMixin from osf.utils.workflows import RequestTypes @@ -13,8 +12,6 @@ class AbstractRequest(BaseModel, ObjectIDMixin): class Meta: abstract = True - objects = IncludeManager() - request_type = models.CharField(max_length=31, choices=RequestTypes.choices()) creator = models.ForeignKey('OSFUser', related_name='submitted_%(class)s', on_delete=models.CASCADE) comment = models.TextField(null=True, blank=True) diff --git a/osf/models/subject.py b/osf/models/subject.py index d5e5a5e46f6..e4e3a80e9e1 100644 --- a/osf/models/subject.py +++ b/osf/models/subject.py @@ -1,17 +1,16 @@ # -*- coding: utf-8 -*- from dirtyfields import DirtyFieldsMixin from django.db import models -from django.db.models import Q +from django.db.models import Q, QuerySet from django.core.exceptions import ValidationError from django.utils.functional import cached_property -from include import IncludeQuerySet from website.util import api_v2_url from osf.models.base import BaseModel, ObjectIDMixin from osf.models.validators import validate_subject_hierarchy_length, validate_subject_highlighted_count -class SubjectQuerySet(IncludeQuerySet): +class SubjectQuerySet(QuerySet): def include_children(self): # It would be more efficient to OR self with the latter two Q's, # but this breaks for certain querysets when relabeling aliases. diff --git a/osf_tests/test_include_queryset.py b/osf_tests/test_include_queryset.py index b9716c6fbb8..bd13132cf4b 100644 --- a/osf_tests/test_include_queryset.py +++ b/osf_tests/test_include_queryset.py @@ -28,7 +28,7 @@ def test_include_guids(self, create_n_nodes, django_assert_num_queries): for node in Node.objects.all(): assert node._id is not None with django_assert_num_queries(1): - for node in Node.objects.include('guids').all(): + for node in Node.objects.prefetch_related('guids').all(): assert node._id is not None @pytest.mark.django_assert_num_queries @@ -37,14 +37,14 @@ def test_include_guids_filter(self, create_n_nodes, django_assert_num_queries): nids = [e.id for e in nodes[:-1]] with django_assert_num_queries(1): - for node in Node.objects.include('guids').filter(id__in=nids): + for node in Node.objects.prefetch_related('guids').filter(id__in=nids): assert node._id is not None @pytest.mark.django_assert_num_queries def test_include_root_guids(self, create_n_nodes, django_assert_num_queries): nodes = create_n_nodes(3, roots=False) - queryset = Node.objects.filter(id__in=[e.id for e in nodes]).include('root__guids') + queryset = Node.objects.filter(id__in=[e.id for e in nodes]).prefetch_related('root__guids') with django_assert_num_queries(1): for node in queryset: assert node.root._id is not None @@ -57,7 +57,7 @@ def test_include_contributor_user_guids(self, create_n_nodes, django_assert_num_ contrib = UserFactory() node.add_contributor(contrib, auth=Auth(node.creator), save=True) - nodes = Node.objects.include('contributor__user__guids').all() + nodes = Node.objects.prefetch_related('contributor_set__user__guids').all() for node in nodes: with django_assert_num_queries(0): for contributor in node.contributor_set.all(): diff --git a/requirements.txt b/requirements.txt index 10092844b1a..4a4143aecc4 100644 --- a/requirements.txt +++ b/requirements.txt @@ -96,5 +96,3 @@ git+https://github.com/Johnetordoff/django-elasticsearch-metrics.git@update-djan # Impact Metrics CSV Export djangorestframework-csv==2.1.0 - -git+https://github.com/Johnetordoff/django-include.git@django-3#egg=django-include diff --git a/website/profile/utils.py b/website/profile/utils.py index 92c3d584620..6876bcaab81 100644 --- a/website/profile/utils.py +++ b/website/profile/utils.py @@ -120,7 +120,6 @@ def serialize_contributors(contribs, node, **kwargs): def serialize_visible_contributors(node): - # This is optimized when node has .include('contributor__user__guids') return [ serialize_user(c, node) for c in node.contributor_set.all() if c.visible ] diff --git a/website/project/views/node.py b/website/project/views/node.py index 4c54c3c11cc..1596b9e5ccd 100644 --- a/website/project/views/node.py +++ b/website/project/views/node.py @@ -690,7 +690,7 @@ def _view_project(node, auth, primary=False, """Build a JSON object containing everything needed to render project.view.mako. """ - node = AbstractNode.objects.filter(pk=node.pk).include('contributor__user__guids').get() + node = AbstractNode.objects.filter(pk=node.pk).prefetch_related('contributor_set__user__guids').get() user = auth.user parent = node.find_readable_antecedent(auth) @@ -1060,7 +1060,7 @@ def node_child_tree(user, node): children = (Node.objects.get_children(node) .filter(is_deleted=False) .annotate(parentnode_id=Subquery(parent_node_sqs[:1])) - .include('contributor__user__guids') + .prefetch_related('contributor_set__user__guids') ) nested = defaultdict(list) @@ -1072,7 +1072,7 @@ def node_child_tree(user, node): 'is_admin': node.is_admin_contributor(contributor.user), 'is_confirmed': contributor.user.is_confirmed, 'visible': contributor.visible - } for contributor in node.contributor_set.all().include('user__guids')] + } for contributor in node.contributor_set.all().prefetch_related('user__guids')] can_read = node.has_permission(user, READ) is_admin = node.has_permission(user, ADMIN) diff --git a/website/views.py b/website/views.py index 3fd6a547959..782ccc0f594 100644 --- a/website/views.py +++ b/website/views.py @@ -108,7 +108,7 @@ def serialize_node_summary(node, auth, primary=True, show_path=False): user = auth.user if node.can_view(auth): # Re-query node with contributor guids included to prevent N contributor queries - node = AbstractNode.objects.filter(pk=node.pk).include('contributor__user__guids').get() + node = AbstractNode.objects.filter(pk=node.pk).prefetch_related('contributor_set__user__guids').get() contributor_data = serialize_contributors_for_summary(node) summary.update({ 'can_view': True, From 07ee7e63227654f48d76130b7d53bddd1a2e27ea Mon Sep 17 00:00:00 2001 From: Longze Chen Date: Fri, 9 Sep 2022 14:21:27 -0400 Subject: [PATCH 42/72] Fix CORS for ORIGINS_WHITELIST Co-authored-by: John Tordoff --- api/base/middleware.py | 2 +- api/base/settings/__init__.py | 9 +++++---- api_tests/base/test_middleware.py | 4 ++-- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/api/base/middleware.py b/api/base/middleware.py index 14b521b04ae..c057d3fd0db 100644 --- a/api/base/middleware.py +++ b/api/base/middleware.py @@ -70,7 +70,7 @@ class CorsMiddleware(corsheaders.middleware.CorsMiddleware): def origin_found_in_white_lists(self, origin, url): settings.CORS_ORIGIN_WHITELIST += api_settings.ORIGINS_WHITELIST # Check if origin is in the dynamic custom domain whitelist - found = super(CorsMiddleware, self).origin_found_in_white_lists(origin, url) + found = super().origin_found_in_white_lists(origin, url) # Check if a cross-origin request using the Authorization header if not found: if not self._context.request.COOKIES: diff --git a/api/base/settings/__init__.py b/api/base/settings/__init__.py index e6d55dd740a..1a3e591ce8f 100644 --- a/api/base/settings/__init__.py +++ b/api/base/settings/__init__.py @@ -6,8 +6,6 @@ >>> settings.API_BASE 'v2/' """ -import os -from future.moves.urllib.parse import urlparse import warnings import itertools @@ -27,15 +25,17 @@ for setting in ('JWE_SECRET', 'JWT_SECRET', 'BYPASS_THROTTLE_TOKEN', 'HASHIDS_SALT'): assert getattr(local, setting, None) and getattr(local, setting, None) != getattr(defaults, setting, None), '{} must be specified in local.py when DEV_MODE is False'.format(setting) + def load_origins_whitelist(): global ORIGINS_WHITELIST from osf.models import Institution, PreprintProvider - institution_origins = tuple(domain.lower() for domain in itertools.chain(*Institution.objects.values_list('domains', flat=True))) + institution_origins = tuple(f'https://{domain.lower()}' for domain in itertools.chain(*Institution.objects.values_list('domains', flat=True))) preprintprovider_origins = tuple(preprintprovider.domain.lower() for preprintprovider in PreprintProvider.objects.exclude(domain='')) - ORIGINS_WHITELIST = tuple(urlparse(url).geturl().lower().split('{}://'.format(urlparse(url).scheme))[-1] for url in institution_origins + preprintprovider_origins) + ORIGINS_WHITELIST = tuple(url for url in institution_origins + preprintprovider_origins) + def build_latest_versions(version_data): """Builds a dict with greatest version keyed for each major version""" @@ -46,4 +46,5 @@ def build_latest_versions(version_data): ret[major_version] = version return ret + LATEST_VERSIONS = build_latest_versions(REST_FRAMEWORK['ALLOWED_VERSIONS']) diff --git a/api_tests/base/test_middleware.py b/api_tests/base/test_middleware.py index 57d780974e0..6c350aacc85 100644 --- a/api_tests/base/test_middleware.py +++ b/api_tests/base/test_middleware.py @@ -62,7 +62,7 @@ def test_cross_origin_request_with_cookies_does_not_get_cors_headers(self): url = api_v2_url('users/me/') domain = urlparse('https://dinosaurs.sexy') request = self.request_factory.get(url, HTTP_ORIGIN=domain.geturl()) - response = {} + response = HttpResponse() with mock.patch.object(request, 'COOKIES', True): self.middleware.process_request(request) self.middleware.process_response(request, response) @@ -92,7 +92,7 @@ def test_cross_origin_request_with_Authorization_and_cookie_does_not_get_cors_he HTTP_ORIGIN=domain.geturl(), HTTP_AUTHORIZATION='Bearer aqweqweohuweglbiuwefq' ) - response = {} + response = HttpResponse() with mock.patch.object(request, 'COOKIES', True): self.middleware.process_request(request) self.middleware.process_response(request, response) From 4e1941320ee18f9b82adc64b4026dc0a2ac16430 Mon Sep 17 00:00:00 2001 From: Longze Chen Date: Mon, 12 Sep 2022 13:25:13 -0400 Subject: [PATCH 43/72] Rename auto generated migration for django3 upgrade fixes --- .../{0004_auto_20220901_1356.py => 0004_django3_upgrade_fixes.py} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename osf/migrations/{0004_auto_20220901_1356.py => 0004_django3_upgrade_fixes.py} (100%) diff --git a/osf/migrations/0004_auto_20220901_1356.py b/osf/migrations/0004_django3_upgrade_fixes.py similarity index 100% rename from osf/migrations/0004_auto_20220901_1356.py rename to osf/migrations/0004_django3_upgrade_fixes.py From d10824f30a8bcb49924b6971a9b7122b5b8999b2 Mon Sep 17 00:00:00 2001 From: Longze Chen Date: Mon, 12 Sep 2022 13:30:11 -0400 Subject: [PATCH 44/72] Remove QuickFile check from get_serializer_class for FileDetail view Co-authored-by: John Tordoff --- api/files/views.py | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/api/files/views.py b/api/files/views.py index 6cfffb3c192..05485dbf14a 100644 --- a/api/files/views.py +++ b/api/files/views.py @@ -5,7 +5,7 @@ from rest_framework import generics from rest_framework import permissions as drf_permissions -from rest_framework.exceptions import NotFound, PermissionDenied, ValidationError +from rest_framework.exceptions import NotFound, ValidationError from framework.auth.oauth_scopes import CoreScopes @@ -13,7 +13,6 @@ Guid, BaseFileNode, FileVersion, - QuickFilesNode, ) from api.base.exceptions import Gone @@ -29,7 +28,7 @@ from api.files.permissions import CheckedOutOrAdmin from api.files.permissions import FileMetadataRecordPermission from api.files.serializers import FileSerializer -from api.files.serializers import FileDetailSerializer, QuickFilesDetailSerializer +from api.files.serializers import FileDetailSerializer from api.files.serializers import FileMetadataRecordSerializer from api.files.serializers import FileVersionSerializer from osf.utils.permissions import ADMIN @@ -86,14 +85,7 @@ class FileDetail(JSONAPIBaseView, generics.RetrieveUpdateAPIView, FileMixin): view_name = 'file-detail' def get_serializer_class(self): - try: - target = self.get_target() - except (NotFound, Gone, PermissionDenied): - return FileDetailSerializer - else: - if isinstance(target, QuickFilesNode): - return QuickFilesDetailSerializer - return FileDetailSerializer + return FileDetailSerializer def get_target(self): return self.get_file().target From 68acb1721fb808bdf96914fcb3678b33d97fac47 Mon Sep 17 00:00:00 2001 From: John Tordoff <> Date: Tue, 13 Sep 2022 08:58:44 -0400 Subject: [PATCH 45/72] clear cached property for storage region. --- addons/osfstorage/models.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/addons/osfstorage/models.py b/addons/osfstorage/models.py index aa9d8932317..2a39fd8ceb2 100644 --- a/addons/osfstorage/models.py +++ b/addons/osfstorage/models.py @@ -304,6 +304,9 @@ def create_version(self, creator, location, metadata=None): if metadata: version.update_metadata(metadata, save=False) + if 'osfstorage_region' in self.target.__dict__: # clear cache if cached + del self.target.osfstorage_region + version.region = self.target.osfstorage_region version._find_matching_archive(save=False) From 57e81a65a5818ac9b73f00fbfc6239fa7393c39f Mon Sep 17 00:00:00 2001 From: John Tordoff <> Date: Tue, 13 Sep 2022 08:59:32 -0400 Subject: [PATCH 46/72] turn off notify emails for tests in Django 3 upgrade --- osf_tests/factories.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/osf_tests/factories.py b/osf_tests/factories.py index 96ff58976be..e35dbd064a1 100644 --- a/osf_tests/factories.py +++ b/osf_tests/factories.py @@ -59,8 +59,11 @@ class UserFactory(DjangoModelFactory): fullname = factory.Sequence(lambda n: 'Freddie Mercury{0}'.format(n)) username = factory.LazyFunction(fake_email) - password = factory.PostGenerationMethodCall('set_password', - 'queenfan86') + password = factory.PostGenerationMethodCall( + 'set_password', + 'queenfan86', + notify=False + ) is_registered = True date_confirmed = factory.Faker('date_time_this_decade', tzinfo=pytz.utc) merged_by = None From 0bc3d5cc592c7b5c7371dae227243dd28bbc564e Mon Sep 17 00:00:00 2001 From: John Tordoff <> Date: Tue, 13 Sep 2022 09:01:00 -0400 Subject: [PATCH 47/72] upgrade Django factory models for Django 3 --- api_tests/preprints/views/test_preprint_detail.py | 2 +- api_tests/preprints/views/test_preprint_list.py | 2 +- osf_tests/factories.py | 9 ++++++++- osf_tests/test_reviewable.py | 2 +- tests/test_preprints.py | 8 ++++---- 5 files changed, 15 insertions(+), 8 deletions(-) diff --git a/api_tests/preprints/views/test_preprint_detail.py b/api_tests/preprints/views/test_preprint_detail.py index dc2f61d2e3c..aca17d6901e 100644 --- a/api_tests/preprints/views/test_preprint_detail.py +++ b/api_tests/preprints/views/test_preprint_detail.py @@ -60,7 +60,7 @@ def preprint(self, user): @pytest.fixture() def preprint_pre_mod(self, user): - return PreprintFactory(provider__reviews_workflow='pre-moderation', is_published=False, creator=user) + return PreprintFactory(reviews_workflow='pre-moderation', is_published=False, creator=user) @pytest.fixture() def moderator(self, preprint_pre_mod): diff --git a/api_tests/preprints/views/test_preprint_list.py b/api_tests/preprints/views/test_preprint_list.py index 18287ced08e..b24b25c8683 100644 --- a/api_tests/preprints/views/test_preprint_list.py +++ b/api_tests/preprints/views/test_preprint_list.py @@ -236,7 +236,7 @@ def test_exclude_nodes_from_preprints_endpoint(self): assert_not_in(self.project._id, ids) def test_withdrawn_preprints_list(self): - pp = PreprintFactory(provider__reviews_workflow='pre-moderation', is_published=False, creator=self.user) + pp = PreprintFactory(reviews_workflow='pre-moderation', is_published=False, creator=self.user) pp.machine_state = 'pending' mod = AuthUserFactory() pp.provider.get_group('moderator').user_set.add(mod) diff --git a/osf_tests/factories.py b/osf_tests/factories.py index e35dbd064a1..c7885fe53d4 100644 --- a/osf_tests/factories.py +++ b/osf_tests/factories.py @@ -470,6 +470,7 @@ def add_approval_step(reg): reg.files_count = reg.registered_from.files.filter(deleted_on__isnull=True).count() draft_registration.registered_node = reg draft_registration.save() + reg.creator = user # keep auth if passed reg.save() if has_doi: @@ -702,12 +703,18 @@ class Meta: creator = factory.SubFactory(AuthUserFactory) doi = factory.Sequence(lambda n: '10.123/{}'.format(n)) - provider = factory.SubFactory(PreprintProviderFactory) @classmethod def _build(cls, target_class, *args, **kwargs): creator = kwargs.pop('creator', None) or UserFactory() provider = kwargs.pop('provider', None) or PreprintProviderFactory() + + # pre Django 3 behavior + reviews_workflow = kwargs.pop('reviews_workflow', None) + if reviews_workflow: + provider.reviews_workflow = reviews_workflow + provider.save() + project = kwargs.pop('project', None) or None title = kwargs.pop('title', None) or 'Untitled' description = kwargs.pop('description', None) or 'None' diff --git a/osf_tests/test_reviewable.py b/osf_tests/test_reviewable.py index 1c2d7c15637..e74f44b818f 100644 --- a/osf_tests/test_reviewable.py +++ b/osf_tests/test_reviewable.py @@ -11,7 +11,7 @@ class TestReviewable: @mock.patch('website.identifiers.utils.request_identifiers') def test_state_changes(self, _): user = AuthUserFactory() - preprint = PreprintFactory(provider__reviews_workflow='pre-moderation', is_published=False) + preprint = PreprintFactory(reviews_workflow='pre-moderation', is_published=False) assert preprint.machine_state == DefaultStates.INITIAL.value preprint.run_submit(user) diff --git a/tests/test_preprints.py b/tests/test_preprints.py index 709253e3a84..6493b66a3f0 100644 --- a/tests/test_preprints.py +++ b/tests/test_preprints.py @@ -2526,19 +2526,19 @@ def user(self): @pytest.fixture() def unpublished_preprint_pre_mod(self): - return PreprintFactory(provider__reviews_workflow='pre-moderation', is_published=False) + return PreprintFactory(reviews_workflow='pre-moderation', is_published=False) @pytest.fixture() def preprint_pre_mod(self): - return PreprintFactory(provider__reviews_workflow='pre-moderation') + return PreprintFactory(reviews_workflow='pre-moderation') @pytest.fixture() def unpublished_preprint_post_mod(self): - return PreprintFactory(provider__reviews_workflow='post-moderation', is_published=False) + return PreprintFactory(reviews_workflow='post-moderation', is_published=False) @pytest.fixture() def preprint_post_mod(self): - return PreprintFactory(provider__reviews_workflow='post-moderation') + return PreprintFactory(reviews_workflow='post-moderation') @pytest.fixture() def preprint(self): From 7d3c64456aac4701a82392cd73ab0d7fa66f8643 Mon Sep 17 00:00:00 2001 From: John Tordoff <> Date: Tue, 13 Sep 2022 09:01:50 -0400 Subject: [PATCH 48/72] remove update_version_metadata with tests --- addons/osfstorage/tests/test_models.py | 4 ---- osf/models/files.py | 7 ------- tests/test_websitefiles.py | 15 +++++++-------- 3 files changed, 7 insertions(+), 19 deletions(-) diff --git a/addons/osfstorage/tests/test_models.py b/addons/osfstorage/tests/test_models.py index 85d975ce302..ca70f4fb182 100644 --- a/addons/osfstorage/tests/test_models.py +++ b/addons/osfstorage/tests/test_models.py @@ -198,10 +198,6 @@ def test_download_count_file(self, mock_session): def test_create_version(self): pass - @unittest.skip - def test_update_version_metadata(self): - pass - def test_delete_folder(self): parent = self.node_settings.get_root().append_folder('Test') kids = [] diff --git a/osf/models/files.py b/osf/models/files.py index 00ac6505eee..4bd717b621e 100644 --- a/osf/models/files.py +++ b/osf/models/files.py @@ -309,13 +309,6 @@ def generate_waterbutler_url(self, **kwargs): **kwargs ) - def update_version_metadata(self, location, metadata): - try: - self.versions.get(location=location).update_metadata(metadata) - return - except ObjectDoesNotExist: - raise VersionNotFoundError(location) - def touch(self, auth_header, revision=None, **kwargs): """The bread and butter of File, collects metadata about self and creates versions and updates self when required. diff --git a/tests/test_websitefiles.py b/tests/test_websitefiles.py index a714108c821..c56941b0695 100644 --- a/tests/test_websitefiles.py +++ b/tests/test_websitefiles.py @@ -508,7 +508,12 @@ def test_get_version(self): file.get_version('3', required=True) def test_update_version_metadata(self): - v1 = models.FileVersion(identifier='1') + location = { + 'service': 'cloud', + 'folder': 'osf', + 'object': 'file', + } + v1 = models.FileVersion(identifier='1', location=location) v1.save() file = TestFile( @@ -520,14 +525,8 @@ def test_update_version_metadata(self): ) file.save() - file.add_version(v1) - file.update_version_metadata(None, {'size': 1337}) - - with assert_raises(exceptions.VersionNotFoundError): - file.update_version_metadata('3', {}) - v1.refresh_from_db() - assert_equal(v1.size, 1337) + assert v1 == file.versions.get() @mock.patch('osf.models.files.requests.get') def test_touch(self, mock_requests): From 51a6b1bb4032ade32183c8d99f5981b65d260df6 Mon Sep 17 00:00:00 2001 From: John Tordoff <> Date: Tue, 13 Sep 2022 09:02:35 -0400 Subject: [PATCH 49/72] remove django-include and other unused egap backfill tests --- .../backfill_egap_provider_metadata.py | 124 ------------- .../test_backfill_egap_metadata.py | 112 ----------- osf_tests/test_guid_auto_include.py | 174 ------------------ osf_tests/test_include_queryset.py | 64 ------- 4 files changed, 474 deletions(-) delete mode 100644 osf/management/commands/backfill_egap_provider_metadata.py delete mode 100644 osf_tests/management_commands/test_backfill_egap_metadata.py delete mode 100644 osf_tests/test_guid_auto_include.py delete mode 100644 osf_tests/test_include_queryset.py diff --git a/osf/management/commands/backfill_egap_provider_metadata.py b/osf/management/commands/backfill_egap_provider_metadata.py deleted file mode 100644 index dd91f8a00ca..00000000000 --- a/osf/management/commands/backfill_egap_provider_metadata.py +++ /dev/null @@ -1,124 +0,0 @@ -from __future__ import unicode_literals - -from datetime import datetime as dt -import logging -import pytz - -from django.core.management.base import BaseCommand -from django.db.models import Max -from osf.models import Registration - -logger = logging.getLogger(__name__) - -# Historical context: -# https://github.com/CenterForOpenScience/osf.io/blob/50467ce8f156cea162666df6587614a7e95d4859/website/project/metadata/egap-registration.json -# https://github.com/CenterForOpenScience/osf.io/blob/50467ce8f156cea162666df6587614a7e95d4859/scripts/EGAP/egap-registration-3.json -EGAP_ID_KEY = 'q3' -EGAP_PUBLICATION_DATE_KEY = 'q4' -LAST_RELEVANT_VERSION = 3 - -WITH_OFFSET_DATE_FORMAT = '%Y-%m-%d %H:%M:%S %z' -NO_OFFSET_DATE_FORMAT = '%m/%d/%Y - %H:%M' -# ALL "Timestamp of Original Registration" values *should* match one of -# the above formats, but the following were encountered while running the script -DISCOVERED_DATE_FORMAT_1 = '%Y-%m-%d %H:%M:%S' -DISCOVERED_DATE_FORMAT_2 = '%Y-%m-%d' - -ALL_DATE_FORMATS = [ - WITH_OFFSET_DATE_FORMAT, - NO_OFFSET_DATE_FORMAT, - DISCOVERED_DATE_FORMAT_1, - DISCOVERED_DATE_FORMAT_2, -] - -def _get_date_registered(registration): - '''Try to parse the registration's "Timestamp of Original Registration" value with all known formats.''' - timestamp_string = registration.registration_responses.get(EGAP_PUBLICATION_DATE_KEY) - if not timestamp_string: - return None - - registered_date = None - for date_format in ALL_DATE_FORMATS: - try: - registered_date = dt.strptime(timestamp_string, date_format) - except ValueError: - continue - - # Could not successfully parse the date field - if registered_date is None: - raise ValueError( - f'Registration with id {registration._id} has un-parseable ' - f'"Timestamp of Original Registration" value: {timestamp_string}' - ) - - # Mimic behavior of import_EGAP script for consistency - if not registered_date.tzinfo: - registered_date = registered_date.replace(tzinfo=pytz.UTC) - return registered_date - -def backfill_egap_metadata(dry_run=False, batch_size=None): - egap_registrations = Registration.objects.annotate( - # "Max" is a stupid way to extract the schema_version because - # registered_schema is implemented as ManyToMany instead of FK - schema_version=Max('registered_schema__schema_version') - ).filter( - provider___id='egap', - additional_metadata=None, # JSON fields are weird - schema_version__lte=LAST_RELEVANT_VERSION - ) - if batch_size: - egap_registrations = egap_registrations[:batch_size] - count = egap_registrations.count() - - logger.info( - f'Backfilling EGAP ID and registered_date for {count} registrations' - ) - for registration in egap_registrations: - egap_id = registration.registration_responses.get(EGAP_ID_KEY) - if egap_id: - logger.info( - f'{"[DRY RUN]: " if dry_run else ""}' - f'Copying EGAP Registration ID {egap_id} to additional_metadata ' - f'for Registration with GUID {registration._id}' - ) - # Starting with None value for additional_metadata, so assign a new dict - registration.additional_metadata = {'EGAP Registration ID': egap_id} - - try: - egap_registration_date = _get_date_registered(registration) - except ValueError as e: - logger.info(e) - continue # Skip this registration but keep running - - if egap_registration_date is not None: - logger.info( - f'{"[DRY RUN]: " if dry_run else ""}' - 'Copying Timestamp or Original Registration to registered_date for ' - f'Registration with GUID {registration._id}' - ) - registration.registered_date = egap_registration_date - - if not dry_run: - registration.save() - return count - -class Command(BaseCommand): - def add_arguments(self, parser): - super(Command, self).add_arguments(parser) - parser.add_argument( - '--dry', - action='store_true', - dest='dry_run', - help='Dry run', - ) - - parser.add_argument( - '--batch_size', - type=int, - default=0 - ) - - def handle(self, *args, **options): - dry_run = options.get('dry_run') - batch_size = options.get('batch_size') - backfill_egap_metadata(dry_run=dry_run, batch_size=batch_size) diff --git a/osf_tests/management_commands/test_backfill_egap_metadata.py b/osf_tests/management_commands/test_backfill_egap_metadata.py deleted file mode 100644 index e5ab6c6697b..00000000000 --- a/osf_tests/management_commands/test_backfill_egap_metadata.py +++ /dev/null @@ -1,112 +0,0 @@ -import pytest - -from osf.management.commands.backfill_egap_provider_metadata import backfill_egap_metadata -from osf.management.commands.update_registration_schemas import update_registration_schemas -from osf.models import RegistrationSchema -from osf_tests.factories import RegistrationFactory, RegistrationProviderFactory - -EGAP_ID_SCHEMA_KEY = 'q3' -REGISTRATION_DATE_SCHEMA_KEY = 'q4' -OLDER_EGAP_ID = 'ABC123' -OLDER_TIMESTAMP = '2020-10-04 08:30:00 -0400' -OLDEST_EGAP_ID = 'XYZ789' -OLDEST_TIMESTAMP = '03/01/2011 - 22:00' - - -@pytest.mark.django_db -class TestMigrateEgapRegistrationMetadata: - - @pytest.fixture() - def egap(self): - return RegistrationProviderFactory(_id='egap') - - @pytest.fixture() - def older_registration(self, egap): - schema = RegistrationSchema.objects.get(name='EGAP Registration', schema_version=3) - registration = RegistrationFactory(schema=schema) - registration.provider = egap - registration.registration_responses[EGAP_ID_SCHEMA_KEY] = OLDER_EGAP_ID - registration.registration_responses[REGISTRATION_DATE_SCHEMA_KEY] = OLDER_TIMESTAMP - registration.save() - return registration - - @pytest.fixture() - def oldest_registration(self, egap): - schema = RegistrationSchema.objects.get(name='EGAP Registration', schema_version=2) - registration = RegistrationFactory(schema=schema) - registration.provider = egap - registration.registration_responses[EGAP_ID_SCHEMA_KEY] = OLDEST_EGAP_ID - registration.registration_responses[REGISTRATION_DATE_SCHEMA_KEY] = OLDEST_TIMESTAMP - registration.save() - return registration - - @pytest.fixture() - def newer_registration(self, egap): - try: - schema = RegistrationSchema.objects.get(name='EGAP Registration', schema_version=4) - except Exception: - update_registration_schemas() - schema = RegistrationSchema.objects.get(name='EGAP Registration', schema_version=4) - - registration = RegistrationFactory(schema=schema) - registration.provider = egap - registration.save() - return registration - - @pytest.fixture() - def non_egap_registration(self): - return RegistrationFactory() - - def test_backfill_egap_metadata( - self, newer_registration, older_registration, - oldest_registration, non_egap_registration): - assert older_registration.additional_metadata is None - assert oldest_registration.additional_metadata is None - - backfilled_registration_count = backfill_egap_metadata() - assert backfilled_registration_count == 2 - - newer_registration.refresh_from_db() - older_registration.refresh_from_db() - oldest_registration.refresh_from_db() - non_egap_registration.refresh_from_db() - - assert older_registration.additional_metadata['EGAP Registration ID'] == OLDER_EGAP_ID - # Automatically converted to UTC, apparently - expected_older_date_string = '2020-10-04 12:30:00' - assert older_registration.registered_date.strftime('%Y-%m-%d %H:%M:%S') == expected_older_date_string - - assert oldest_registration.additional_metadata['EGAP Registration ID'] == OLDEST_EGAP_ID - expected_oldest_date_string = '2011-03-01 22:00:00' - assert oldest_registration.registered_date.strftime('%Y-%m-%d %H:%M:%S') == expected_oldest_date_string - - # Should have been excluded based on version - assert newer_registration.additional_metadata is None - # Shold have been excluded based on provider - assert non_egap_registration.additional_metadata is None - - def test_backfill_egap_metadata_dry_run(self, older_registration, oldest_registration): - backfill_count = backfill_egap_metadata(dry_run=True) - assert backfill_count == 2 - - older_registration.refresh_from_db() - oldest_registration.refresh_from_db() - assert older_registration.additional_metadata is None - assert oldest_registration.additional_metadata is None - - def test_backfill_egap_metadata_ignores_updated_registrations( - self, older_registration, oldest_registration): - older_registration.additional_metadata = {'EGAP Registration ID': OLDER_EGAP_ID} - older_registration.save() - - backfill_count = backfill_egap_metadata() - assert backfill_count == 1 - - oldest_registration.refresh_from_db() - assert oldest_registration.additional_metadata['EGAP Registration ID'] == OLDEST_EGAP_ID - - assert backfill_egap_metadata() == 0 - - def test_backfill_egap_metadata_batch_size( - self, older_registration, oldest_registration): - assert backfill_egap_metadata(batch_size=1) == 1 diff --git a/osf_tests/test_guid_auto_include.py b/osf_tests/test_guid_auto_include.py deleted file mode 100644 index 25185d48036..00000000000 --- a/osf_tests/test_guid_auto_include.py +++ /dev/null @@ -1,174 +0,0 @@ -from django.utils import timezone - -import pytest -from django_bulk_update.helper import bulk_update - -from django.db.models import DateTimeField - -from osf_tests.factories import UserFactory, PreprintFactory, NodeFactory - - -@pytest.mark.django_db -class TestGuidAutoInclude: - guid_factories = [ - UserFactory, - PreprintFactory, - NodeFactory - ] - - @pytest.mark.parametrize('Factory', guid_factories) - def test_filter_object(self, Factory): - obj = Factory() - assert '__guids' in str(obj._meta.model.objects.filter(id=obj.id).query), 'Guids were not included in filter query for {}'.format(obj._meta.model.__name__) - - @pytest.mark.parametrize('Factory', guid_factories) - @pytest.mark.django_assert_num_queries - def test_all(self, Factory, django_assert_num_queries): - for _ in range(0, 5): - UserFactory() - with django_assert_num_queries(1): - wut = Factory._meta.model.objects.all() - for x in wut: - assert x._id is not None, 'Guid was None' - - @pytest.mark.parametrize('Factory', guid_factories) - @pytest.mark.django_assert_num_queries - def test_filter(self, Factory, django_assert_num_queries): - objects = [] - for _ in range(0, 5): - objects.append(Factory()) - new_ids = [o.id for o in objects] - with django_assert_num_queries(1): - - wut = Factory._meta.model.objects.filter(id__in=new_ids) - for x in wut: - assert x._id is not None, 'Guid was None' - - @pytest.mark.parametrize('Factory', guid_factories) - @pytest.mark.django_assert_num_queries - def test_filter_order_by(self, Factory, django_assert_num_queries): - objects = [] - for _ in range(0, 5): - objects.append(Factory()) - new_ids = [o.id for o in objects] - with django_assert_num_queries(1): - - wut = Factory._meta.model.objects.filter(id__in=new_ids).order_by('id') - for x in wut: - assert x._id is not None, 'Guid was None' - - @pytest.mark.parametrize('Factory', guid_factories) - @pytest.mark.django_assert_num_queries - def test_values(self, Factory, django_assert_num_queries): - objects = [] - for _ in range(0, 5): - objects.append(Factory()) - with django_assert_num_queries(1): - wut = Factory._meta.model.objects.values('id') - for x in wut: - assert len(x) == 1, 'Too many keys in values' - - @pytest.mark.parametrize('Factory', guid_factories) - @pytest.mark.django_assert_num_queries - def test_exclude(self, Factory, django_assert_num_queries): - objects = [] - for _ in range(0, 5): - objects.append(Factory()) - try: - dtfield = [x.name for x in objects[0]._meta.get_fields() if isinstance(x, DateTimeField)][0] - except IndexError: - pytest.skip('Thing doesn\'t have a DateTimeField') - - with django_assert_num_queries(1): - wut = Factory._meta.model.objects.exclude(**{dtfield: timezone.now()}) - for x in wut: - assert x._id is not None, 'Guid was None' - - @pytest.mark.parametrize('Factory', guid_factories) - def test_update_objects(self, Factory): - objects = [] - for _ in range(0, 5): - objects.append(Factory()) - new_ids = [o.id for o in objects] - try: - dtfield = [x.name for x in objects[0]._meta.get_fields() if isinstance(x, DateTimeField)][0] - except IndexError: - pytest.skip('Thing doesn\'t have a DateTimeField') - qs = objects[0]._meta.model.objects.filter(id__in=new_ids) - assert len(qs) > 0, 'No results returned' - try: - qs.update(**{dtfield: timezone.now()}) - except Exception as ex: - pytest.fail('Queryset update failed for {} with exception {}'.format(Factory._meta.model.__name__, ex)) - - @pytest.mark.parametrize('Factory', guid_factories) - def test_update_on_objects_filtered_by_guids(self, Factory): - objects = [] - for _ in range(0, 5): - objects.append(Factory()) - new__ids = [o._id for o in objects] - try: - dtfield = [x.name for x in objects[0]._meta.get_fields() if isinstance(x, DateTimeField)][0] - except IndexError: - pytest.skip('Thing doesn\'t have a DateTimeField') - qs = objects[0]._meta.model.objects.filter(guids___id__in=new__ids) - assert len(qs) > 0, 'No results returned' - try: - qs.update(**{dtfield: timezone.now()}) - except Exception as ex: - pytest.fail('Queryset update failed for {} with exception {}'.format(Factory._meta.model.__name__, ex)) - - @pytest.mark.parametrize('Factory', guid_factories) - @pytest.mark.django_assert_num_queries - def test_related_manager(self, Factory, django_assert_num_queries): - thing_with_contributors = Factory() - if not hasattr(thing_with_contributors, 'contributors'): - pytest.skip('Thing must have contributors') - try: - with django_assert_num_queries(1): - [x._id for x in thing_with_contributors.contributors.all()] - except Exception as ex: - pytest.fail('Related manager failed for {} with exception {}'.format(Factory._meta.model.__name__, ex)) - - @pytest.mark.parametrize('Factory', guid_factories) - @pytest.mark.django_assert_num_queries - def test_count_objects(self, Factory, django_assert_num_queries): - objects = [] - for _ in range(0, 5): - objects.append(Factory()) - new_ids = [o.id for o in objects] - with django_assert_num_queries(1): - qs = objects[0]._meta.model.objects.filter(id__in=new_ids) - count = qs.count() - assert count == len(objects) - - @pytest.mark.parametrize('Factory', guid_factories) - @pytest.mark.django_assert_num_queries - def test_bulk_create_objects(self, Factory, django_assert_num_queries): - objects = [] - Model = Factory._meta.model - kwargs = {} - if Factory == PreprintFactory: - # Don't try to save preprints on build when neither the subject nor provider have been saved - kwargs['finish'] = False - for _ in range(0, 5): - objects.append(Factory.build(**kwargs)) - with django_assert_num_queries(1): - things = Model.objects.bulk_create(objects) - assert len(things) == len(objects) - - @pytest.mark.parametrize('Factory', guid_factories) - @pytest.mark.django_assert_num_queries - def test_bulk_update_objects(self, Factory, django_assert_num_queries): - objects = [] - ids = range(0, 5) - for id in ids: - objects.append(Factory()) - try: - dtfield = [x.name for x in objects[0]._meta.get_fields() if isinstance(x, DateTimeField)][0] - except IndexError: - pytest.skip('Thing doesn\'t have a DateTimeField') - for obj in objects: - setattr(obj, dtfield, timezone.now()) - with django_assert_num_queries(1): - bulk_update(objects) diff --git a/osf_tests/test_include_queryset.py b/osf_tests/test_include_queryset.py deleted file mode 100644 index bd13132cf4b..00000000000 --- a/osf_tests/test_include_queryset.py +++ /dev/null @@ -1,64 +0,0 @@ -"""Tests for osf.utils.manager.IncludeQueryset""" -import pytest - -from framework.auth import Auth -from osf.models import Node -from osf_tests.factories import ProjectFactory, NodeFactory, UserFactory - - -pytestmark = pytest.mark.django_db - - -@pytest.fixture() -def create_n_nodes(): - def _create_n_nodes(n, roots=True): - return [ - ProjectFactory() if roots else NodeFactory() - for _ in range(n) - ] - return _create_n_nodes - -class TestIncludeQuerySet: - - @pytest.mark.django_assert_num_queries - def test_include_guids(self, create_n_nodes, django_assert_num_queries): - create_n_nodes(3) - # Confirm guids included automagically - with django_assert_num_queries(1): - for node in Node.objects.all(): - assert node._id is not None - with django_assert_num_queries(1): - for node in Node.objects.prefetch_related('guids').all(): - assert node._id is not None - - @pytest.mark.django_assert_num_queries - def test_include_guids_filter(self, create_n_nodes, django_assert_num_queries): - nodes = create_n_nodes(3) - nids = [e.id for e in nodes[:-1]] - - with django_assert_num_queries(1): - for node in Node.objects.prefetch_related('guids').filter(id__in=nids): - assert node._id is not None - - @pytest.mark.django_assert_num_queries - def test_include_root_guids(self, create_n_nodes, django_assert_num_queries): - nodes = create_n_nodes(3, roots=False) - - queryset = Node.objects.filter(id__in=[e.id for e in nodes]).prefetch_related('root__guids') - with django_assert_num_queries(1): - for node in queryset: - assert node.root._id is not None - - @pytest.mark.django_assert_num_queries - def test_include_contributor_user_guids(self, create_n_nodes, django_assert_num_queries): - nodes = create_n_nodes(3) - for node in nodes: - for _ in range(3): - contrib = UserFactory() - node.add_contributor(contrib, auth=Auth(node.creator), save=True) - - nodes = Node.objects.prefetch_related('contributor_set__user__guids').all() - for node in nodes: - with django_assert_num_queries(0): - for contributor in node.contributor_set.all(): - assert contributor.user._id is not None From e21b4609c2a48dec85b1aab6e1ea68435daa118b Mon Sep 17 00:00:00 2001 From: John Tordoff <> Date: Tue, 13 Sep 2022 09:03:42 -0400 Subject: [PATCH 50/72] Make DFR serializer fixes --- admin_tests/preprints/test_views.py | 8 ++++---- admin_tests/users/test_views.py | 10 +++++----- api/base/exceptions.py | 2 +- api/draft_registrations/serializers.py | 17 +++++++++++++++++ 4 files changed, 27 insertions(+), 10 deletions(-) diff --git a/admin_tests/preprints/test_views.py b/admin_tests/preprints/test_views.py index f3cd99aa84c..369e8282fc4 100644 --- a/admin_tests/preprints/test_views.py +++ b/admin_tests/preprints/test_views.py @@ -103,8 +103,8 @@ def test_get_object(self, req, preprint, plain_view): def test_no_user_permissions_raises_error(self, user, preprint, plain_view): request = RequestFactory().get(reverse('preprints:preprint', kwargs={'guid': preprint._id})) request.user = user - resp = plain_view.as_view()(request, guid=preprint._id) - assert resp._headers['location'][1] == f'/accounts/login/?next=/preprints/{preprint._id}/' + with pytest.raises(PermissionDenied): + plain_view.as_view()(request, guid=preprint._id) def test_get_flagged_spam(self, superuser, preprint, ham_preprint, spam_preprint, flagged_preprint): request = RequestFactory().get(reverse('preprints:flagged-spam')) @@ -183,8 +183,8 @@ def test_correct_view_permissions(self, user, preprint, plain_view): request = RequestFactory().get(reverse('preprints:preprint', kwargs={'guid': preprint._id})) request.user = user - response = plain_view.as_view()(request, guid=preprint._id) - assert response.status_code == 302 + with pytest.raises(PermissionDenied): + plain_view.as_view()(request, guid=preprint._id) def test_change_preprint_provider(self, user, preprint, plain_view): change_permission = Permission.objects.get(codename='change_preprint') diff --git a/admin_tests/users/test_views.py b/admin_tests/users/test_views.py index c8ad801f75b..b9762a81426 100644 --- a/admin_tests/users/test_views.py +++ b/admin_tests/users/test_views.py @@ -414,7 +414,7 @@ def test_search_user_by_guid(self): nt.assert_true(form.is_valid()) response = self.view.form_valid(form) nt.assert_equal(response.status_code, 302) - nt.assert_equal(response._headers['location'][1], '/users/{}/'.format(self.user_1.guids.first()._id)) + nt.assert_equal(response.headers['location'], '/users/{}/'.format(self.user_1.guids.first()._id)) def test_search_user_by_name(self): form_data = { @@ -424,7 +424,7 @@ def test_search_user_by_name(self): nt.assert_true(form.is_valid()) response = self.view.form_valid(form) nt.assert_equal(response.status_code, 302) - nt.assert_equal(response._headers['location'][1], '/users/search/Hardy/') + nt.assert_equal(response.headers['location'], '/users/search/Hardy/') def test_search_user_by_name_with_punctuation(self): form_data = { @@ -434,7 +434,7 @@ def test_search_user_by_name_with_punctuation(self): nt.assert_true(form.is_valid()) response = self.view.form_valid(form) nt.assert_equal(response.status_code, 302) - nt.assert_equal(response._headers['location'][1], '/users/search/Dr.%20Sportello-Fay,%20PI%20@,%20%23,%20$,%20%25,%20%5E,%20&,%20*,%20(,%20),%20~/') + nt.assert_equal(response.headers['location'], '/users/search/Dr.%20Sportello-Fay,%20PI%20@,%20%23,%20$,%20%25,%20%5E,%20&,%20*,%20(,%20),%20~/') def test_search_user_by_username(self): form_data = { @@ -444,7 +444,7 @@ def test_search_user_by_username(self): nt.assert_true(form.is_valid()) response = self.view.form_valid(form) nt.assert_equal(response.status_code, 302) - nt.assert_equal(response._headers['location'][1], '/users/{}/'.format(self.user_1.guids.first()._id)) + nt.assert_equal(response.headers['location'], '/users/{}/'.format(self.user_1.guids.first()._id)) def test_search_user_by_alternate_email(self): form_data = { @@ -454,7 +454,7 @@ def test_search_user_by_alternate_email(self): nt.assert_true(form.is_valid()) response = self.view.form_valid(form) nt.assert_equal(response.status_code, 302) - nt.assert_equal(response._headers['location'][1], '/users/{}/'.format(self.user_2.guids.first()._id)) + nt.assert_equal(response.headers['location'], '/users/{}/'.format(self.user_2.guids.first()._id)) def test_search_user_list(self): view = views.UserSearchList() diff --git a/api/base/exceptions.py b/api/base/exceptions.py index d22591af766..c150a898a71 100644 --- a/api/base/exceptions.py +++ b/api/base/exceptions.py @@ -8,7 +8,7 @@ def get_resource_object_member(error_key, context): from api.base.serializers import RelationshipField - field = context['view'].serializer_class._declared_fields.get(error_key, None) + field = context['view'].get_serializer_class()._declared_fields.get(error_key, None) if field: return 'relationships' if isinstance(field, RelationshipField) else 'attributes' # If field cannot be found (where read/write operations have different serializers, diff --git a/api/draft_registrations/serializers.py b/api/draft_registrations/serializers.py index 189961cb8c1..aebdb5d5853 100644 --- a/api/draft_registrations/serializers.py +++ b/api/draft_registrations/serializers.py @@ -16,7 +16,9 @@ NodeContributorsSerializer, NodeContributorsCreateSerializer, NodeContributorDetailSerializer, + RegistrationSchemaRelationshipField, ) + from api.taxonomies.serializers import TaxonomizableSerializerMixin from osf.exceptions import DraftRegistrationStateError from website import settings @@ -46,6 +48,13 @@ class DraftRegistrationSerializer(DraftRegistrationLegacySerializer, Taxonomizab tags = ValuesListField(attr_name='name', child=ser.CharField(), required=False) node_license = NodeLicenseSerializer(required=False, source='license') + registration_schema = RegistrationSchemaRelationshipField( + related_view='schemas:registration-schema-detail', + related_view_kwargs={'schema_id': ''}, + required=True, + read_only=False, + ) + links = LinksField({ 'self': 'get_absolute_url', }) @@ -142,6 +151,7 @@ class DraftRegistrationDetailSerializer(DraftRegistrationSerializer, DraftRegist Overrides DraftRegistrationLegacySerializer to make id required. registration_supplement, node, cannot be changed after draft has been created. """ + id = IDField(source='_id', required=True) links = LinksField({ 'self': 'get_self_url', @@ -156,6 +166,13 @@ def get_self_url(self, obj): }, ) + registration_schema = RegistrationSchemaRelationshipField( + related_view='schemas:registration-schema-detail', + related_view_kwargs={'schema_id': ''}, + required=False, + read_only=False, + ) + def update(self, draft, validated_data): draft = super(DraftRegistrationDetailSerializer, self).update(draft, validated_data) user = self.context['request'].user From 1a70f61a0662a065423b946c307a339b2596921f Mon Sep 17 00:00:00 2001 From: John Tordoff <> Date: Tue, 13 Sep 2022 09:04:52 -0400 Subject: [PATCH 51/72] make registration metadata use real schema --- .../test_node_draft_registration_detail.py | 23 ++++++++++--------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/api_tests/nodes/views/test_node_draft_registration_detail.py b/api_tests/nodes/views/test_node_draft_registration_detail.py index c974eddba86..a4acf62be51 100644 --- a/api_tests/nodes/views/test_node_draft_registration_detail.py +++ b/api_tests/nodes/views/test_node_draft_registration_detail.py @@ -156,9 +156,10 @@ def draft_registration(self, user, project_public, schema): @pytest.fixture() def reg_schema(self): - return RegistrationSchema.objects.get( - name='OSF Preregistration', - schema_version=SCHEMA_VERSION) + schema = RegistrationSchema.objects.get_latest_version(name='OSF Preregistration') + schema.active = True + schema.save() + return schema @pytest.fixture() def draft_registration_prereg(self, user, project_public, reg_schema): @@ -416,7 +417,7 @@ def test_required_metaschema_questions_not_required_on_update( url = '/{}nodes/{}/draft_registrations/{}/'.format( API_BASE, project_public._id, draft_registration_prereg._id) - del metadata_registration['q1'] + del metadata_registration['q3'] draft_registration_prereg.metadata_registration = metadata_registration draft_registration_prereg.save() @@ -426,7 +427,7 @@ def test_required_metaschema_questions_not_required_on_update( 'type': 'draft_registrations', 'attributes': { 'registration_metadata': { - 'q3': { + 'q2': { 'value': 'New response' } } @@ -438,17 +439,17 @@ def test_required_metaschema_questions_not_required_on_update( url, payload, auth=user.auth, expect_errors=True) assert res.status_code == 200 - assert res.json['data']['attributes']['registration_metadata']['q3']['value'] == 'New response' - assert 'q1' not in res.json['data']['attributes']['registration_metadata'] + assert res.json['data']['attributes']['registration_metadata']['q2']['value'] == 'New response' + assert 'q3' not in res.json['data']['attributes']['registration_metadata'] def test_required_registration_responses_questions_not_required_on_update( self, app, user, project_public, draft_registration_prereg): - url = '/{}nodes/{}/draft_registrations/{}/'.format( + url = '/{}nodes/{}/draft_registrations/{}/?version=2.20'.format( API_BASE, project_public._id, draft_registration_prereg._id) registration_responses = { - 'q1': 'First question answered' + 'q2': 'First question answered' } draft_registration_prereg.registration_responses = {} @@ -469,8 +470,8 @@ def test_required_registration_responses_questions_not_required_on_update( url, payload, auth=user.auth, expect_errors=True) assert res.status_code == 200 - assert res.json['data']['attributes']['registration_metadata']['q1']['value'] == registration_responses['q1'] - assert res.json['data']['attributes']['registration_responses']['q1'] == registration_responses['q1'] + assert res.json['data']['attributes']['registration_metadata']['q2']['value'] == registration_responses['q2'] + assert res.json['data']['attributes']['registration_responses']['q2'] == registration_responses['q2'] def test_registration_responses_must_be_a_dictionary( self, app, user, payload_with_registration_responses, url_draft_registrations): From f30f1cea51fa374c2c10da0375fbb14ebd3e09c9 Mon Sep 17 00:00:00 2001 From: John Tordoff <> Date: Tue, 13 Sep 2022 09:05:24 -0400 Subject: [PATCH 52/72] Fix changed test due to DRF upgrade issues --- api_tests/nodes/views/test_node_detail.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api_tests/nodes/views/test_node_detail.py b/api_tests/nodes/views/test_node_detail.py index 4fa6547ee95..5cf6e211815 100644 --- a/api_tests/nodes/views/test_node_detail.py +++ b/api_tests/nodes/views/test_node_detail.py @@ -496,7 +496,7 @@ def test_node_shows_related_count_for_linked_by_relationships(self, app, user, p res = app.get(url) assert 'count' in res.json['data']['relationships']['linked_by_nodes']['links']['related']['meta'] assert 'count' in res.json['data']['relationships']['linked_by_registrations']['links']['related']['meta'] - assert res.json['data']['relationships']['linked_by_nodes']['links']['related']['meta']['count'] == 0 + assert res.json['data']['relationships']['linked_by_nodes']['links']['related']['meta']['count'] == 1 assert res.json['data']['relationships']['linked_by_registrations']['links']['related']['meta']['count'] == 0 def test_node_shows_correct_forks_count_including_private_forks(self, app, user, project_private, url_private, user_two): From fca9e817bfe327d431ed6efb9162dab4061c10ef Mon Sep 17 00:00:00 2001 From: John Tordoff <> Date: Tue, 13 Sep 2022 09:06:10 -0400 Subject: [PATCH 53/72] fix duplication of 'view_node' for admin app --- osf/migrations/0001_initial.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/osf/migrations/0001_initial.py b/osf/migrations/0001_initial.py index ba920382087..fa56ead6091 100644 --- a/osf/migrations/0001_initial.py +++ b/osf/migrations/0001_initial.py @@ -148,7 +148,7 @@ class Migration(migrations.Migration): ('additional_metadata', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, encoder=osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONEncoder, null=True)), ], options={ - 'permissions': (('view_node', 'Can view node details'), ('read_node', 'Can read the node'), ('write_node', 'Can edit the node'), ('admin_node', 'Can manage the node')), + 'permissions': (('read_node', 'Can read the node'), ('write_node', 'Can edit the node'), ('admin_node', 'Can manage the node')), 'base_manager_name': 'objects', }, bases=(dirtyfields.dirtyfields.DirtyFieldsMixin, osf.models.mixins.CommentableMixin, models.Model, osf.models.base.QuerySetExplainMixin), From dffad341ae4c2e7542db52217cdb841ff86718c0 Mon Sep 17 00:00:00 2001 From: John Tordoff <> Date: Tue, 13 Sep 2022 09:06:52 -0400 Subject: [PATCH 54/72] fix test issues by reloading refferents --- osf_tests/test_archiver.py | 1 + osf_tests/test_comment.py | 4 ++-- website/archiver/utils.py | 5 +++-- website/project/views/comment.py | 1 + 4 files changed, 7 insertions(+), 4 deletions(-) diff --git a/osf_tests/test_archiver.py b/osf_tests/test_archiver.py index d2521a415e4..8950955653e 100644 --- a/osf_tests/test_archiver.py +++ b/osf_tests/test_archiver.py @@ -758,6 +758,7 @@ def test_handle_archive_fail(self, mock_send_mail): {} ) assert_equal(mock_send_mail.call_count, 2) + self.dst.refresh_from_db() assert_true(self.dst.is_deleted) @mock.patch('website.mails.send_mail') diff --git a/osf_tests/test_comment.py b/osf_tests/test_comment.py index cc3007c3461..6347c995c8b 100644 --- a/osf_tests/test_comment.py +++ b/osf_tests/test_comment.py @@ -979,7 +979,7 @@ def test_comments_move_when_file_moved_from_project_to_component(self, project, self.file.move_under(destination['node'].get_addon(self.provider).get_root()) payload = self._create_payload('move', user, source, destination, self.file._id) update_file_guid_referent(self=None, target=destination['node'], event_type='addon_file_moved', payload=payload) - self.guid.reload() + self.guid.referent.reload() file_node = BaseFileNode.resolve_class(self.provider, BaseFileNode.FILE).get_or_create(destination['node'], self._format_path(destination['path'], file_id=self.file._id)) assert self.guid._id == file_node.get_guid()._id @@ -1002,7 +1002,7 @@ def test_comments_move_when_file_moved_from_component_to_project(self, project, self.file.move_under(destination['node'].get_addon(self.provider).get_root()) payload = self._create_payload('move', user, source, destination, self.file._id) update_file_guid_referent(self=None, target=destination['node'], event_type='addon_file_moved', payload=payload) - self.guid.reload() + self.guid.referent.reload() file_node = BaseFileNode.resolve_class(self.provider, BaseFileNode.FILE).get_or_create(destination['node'], self._format_path(destination['path'], file_id=self.file._id)) assert self.guid._id == file_node.get_guid()._id diff --git a/website/archiver/utils.py b/website/archiver/utils.py index f34cdfcbb1b..765425f9445 100644 --- a/website/archiver/utils.py +++ b/website/archiver/utils.py @@ -111,8 +111,9 @@ def handle_archive_fail(reason, src, dst, user, result): pass else: # reason == ARCHIVER_UNCAUGHT_ERROR send_archiver_uncaught_error_mails(src, user, result, url) - dst.root.sanction.forcibly_reject() - dst.root.sanction.save() + if dst.root.sanction: + dst.root.sanction.forcibly_reject() + dst.root.sanction.save() dst.root.delete_registration_tree(save=True) def archive_provider_for(node, user): diff --git a/website/project/views/comment.py b/website/project/views/comment.py index 33de3042955..743f7e114dc 100644 --- a/website/project/views/comment.py +++ b/website/project/views/comment.py @@ -49,6 +49,7 @@ def update_file_guid_referent(self, target, event_type, payload, user=None): old_file = BaseFileNode.load(obj.referent._id) obj.referent = create_new_file(obj, source, destination, destination_node) obj.save() + obj.referent.reload() if old_file and not TrashedFileNode.load(old_file._id): old_file.delete() From db1089843aeab9da8be86acf058bc56a05729590 Mon Sep 17 00:00:00 2001 From: John Tordoff <> Date: Tue, 13 Sep 2022 09:07:52 -0400 Subject: [PATCH 55/72] add DEFAULT_AUTO_FIELD to end warnings for Django 3 upgrade --- api/base/settings/defaults.py | 1 + 1 file changed, 1 insertion(+) diff --git a/api/base/settings/defaults.py b/api/base/settings/defaults.py index 6a589060f78..7e8de03d2c1 100644 --- a/api/base/settings/defaults.py +++ b/api/base/settings/defaults.py @@ -358,3 +358,4 @@ TRAVIS_ENV = False CITATION_STYLES_REPO_URL = 'https://github.com/CenterForOpenScience/styles/archive/88e6ed31a91e9f5a480b486029cda97b535935d4.zip' +DEFAULT_AUTO_FIELD = 'django.db.models.AutoField' From 0c1cc03d8aa3b4995dd7ebbe6e6f8662ce942154 Mon Sep 17 00:00:00 2001 From: John Tordoff <> Date: Tue, 13 Sep 2022 09:48:00 -0400 Subject: [PATCH 56/72] fix DRF issue --- api/draft_registrations/serializers.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/api/draft_registrations/serializers.py b/api/draft_registrations/serializers.py index aebdb5d5853..e086127205d 100644 --- a/api/draft_registrations/serializers.py +++ b/api/draft_registrations/serializers.py @@ -21,14 +21,14 @@ from api.taxonomies.serializers import TaxonomizableSerializerMixin from osf.exceptions import DraftRegistrationStateError +from osf.models import Node from website import settings class NodeRelationshipField(RelationshipField): def to_internal_value(self, node_id): - node = self.context['view'].get_node(node_id=node_id) if node_id else None - return {'branched_from': node} + return {'branched_from': Node.load(node_id)} class DraftRegistrationSerializer(DraftRegistrationLegacySerializer, TaxonomizableSerializerMixin): From 494e3961b4f371d39a46975091bf6f992e9fbfe8 Mon Sep 17 00:00:00 2001 From: Longze Chen Date: Mon, 12 Sep 2022 13:49:06 -0400 Subject: [PATCH 57/72] Fix an issue where get_node() is not avaialbe from context view Co-authored-by: John Tordoff --- api/draft_registrations/serializers.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/api/draft_registrations/serializers.py b/api/draft_registrations/serializers.py index 189961cb8c1..fefe23230a9 100644 --- a/api/draft_registrations/serializers.py +++ b/api/draft_registrations/serializers.py @@ -19,14 +19,14 @@ ) from api.taxonomies.serializers import TaxonomizableSerializerMixin from osf.exceptions import DraftRegistrationStateError +from osf.models import Node from website import settings class NodeRelationshipField(RelationshipField): def to_internal_value(self, node_id): - node = self.context['view'].get_node(node_id=node_id) if node_id else None - return {'branched_from': node} + return {'branched_from': Node.load(node_id)} class DraftRegistrationSerializer(DraftRegistrationLegacySerializer, TaxonomizableSerializerMixin): From 6548110a665c359d4bb4f1dc893d967038d2d943 Mon Sep 17 00:00:00 2001 From: Longze Chen Date: Mon, 12 Sep 2022 14:21:42 -0400 Subject: [PATCH 58/72] Add registration_schema to DraftRegistrationDetailSerializer Recent DRF upgrade fixed a day-one bug which affects MRO. Have to explicity define registration_schema to prevent this property from inheriting from the wwrong parent. Co-authored-by: John Tordoff --- api/draft_registrations/serializers.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/api/draft_registrations/serializers.py b/api/draft_registrations/serializers.py index fefe23230a9..c3a8256f085 100644 --- a/api/draft_registrations/serializers.py +++ b/api/draft_registrations/serializers.py @@ -16,6 +16,7 @@ NodeContributorsSerializer, NodeContributorsCreateSerializer, NodeContributorDetailSerializer, + RegistrationSchemaRelationshipField, ) from api.taxonomies.serializers import TaxonomizableSerializerMixin from osf.exceptions import DraftRegistrationStateError @@ -143,6 +144,13 @@ class DraftRegistrationDetailSerializer(DraftRegistrationSerializer, DraftRegist registration_supplement, node, cannot be changed after draft has been created. """ + registration_schema = RegistrationSchemaRelationshipField( + related_view='schemas:registration-schema-detail', + related_view_kwargs={'schema_id': ''}, + required=False, + read_only=False, + ) + links = LinksField({ 'self': 'get_self_url', }) From 0bb5fc5e66a29ced92a988ad2f675231214a519f Mon Sep 17 00:00:00 2001 From: Longze Chen Date: Tue, 13 Sep 2022 11:37:01 -0400 Subject: [PATCH 59/72] Add id to DraftRegistrationDetailSerializer This fixed a similar bug caused by DRF MRO change. Co-authored-by: John Tordoff --- api/draft_registrations/serializers.py | 1 + 1 file changed, 1 insertion(+) diff --git a/api/draft_registrations/serializers.py b/api/draft_registrations/serializers.py index c3a8256f085..4d103d5e80e 100644 --- a/api/draft_registrations/serializers.py +++ b/api/draft_registrations/serializers.py @@ -143,6 +143,7 @@ class DraftRegistrationDetailSerializer(DraftRegistrationSerializer, DraftRegist Overrides DraftRegistrationLegacySerializer to make id required. registration_supplement, node, cannot be changed after draft has been created. """ + id = IDField(source='_id', required=True) registration_schema = RegistrationSchemaRelationshipField( related_view='schemas:registration-schema-detail', From 3f97cd69217b10080f80abc0d32775bdbe5a6080 Mon Sep 17 00:00:00 2001 From: John Tordoff <> Date: Tue, 13 Sep 2022 16:30:39 -0400 Subject: [PATCH 60/72] sort out query issue for `visible_contributor_to` for Django 3 upgrade --- osf/models/user.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/osf/models/user.py b/osf/models/user.py index 7bef11b9729..836212dfdd5 100644 --- a/osf/models/user.py +++ b/osf/models/user.py @@ -576,7 +576,7 @@ def visible_contributor_to(self): """ Nodes where user is a bibliographic contributor (group membership not factored in) """ - return self.nodes.filter(is_deleted=False, contributor__visible=True, type__in=['osf.node', 'osf.registration']) + return self.nodes.filter(is_deleted=False, contributor__visible=True, contributor__user=self, type__in=['osf.node', 'osf.registration']) @property def all_nodes(self): From ec4da2fc9ea4bfa98e19793049911048d81ee5b1 Mon Sep 17 00:00:00 2001 From: John Tordoff <> Date: Wed, 14 Sep 2022 08:22:52 -0400 Subject: [PATCH 61/72] update schema code --- api/draft_registrations/serializers.py | 21 +++++++-------------- 1 file changed, 7 insertions(+), 14 deletions(-) diff --git a/api/draft_registrations/serializers.py b/api/draft_registrations/serializers.py index e086127205d..ec7b803ab8c 100644 --- a/api/draft_registrations/serializers.py +++ b/api/draft_registrations/serializers.py @@ -48,13 +48,6 @@ class DraftRegistrationSerializer(DraftRegistrationLegacySerializer, Taxonomizab tags = ValuesListField(attr_name='name', child=ser.CharField(), required=False) node_license = NodeLicenseSerializer(required=False, source='license') - registration_schema = RegistrationSchemaRelationshipField( - related_view='schemas:registration-schema-detail', - related_view_kwargs={'schema_id': ''}, - required=True, - read_only=False, - ) - links = LinksField({ 'self': 'get_absolute_url', }) @@ -153,6 +146,13 @@ class DraftRegistrationDetailSerializer(DraftRegistrationSerializer, DraftRegist """ id = IDField(source='_id', required=True) + registration_schema = RegistrationSchemaRelationshipField( + related_view='schemas:registration-schema-detail', + related_view_kwargs={'schema_id': ''}, + required=False, + read_only=False, + ) + links = LinksField({ 'self': 'get_self_url', }) @@ -166,13 +166,6 @@ def get_self_url(self, obj): }, ) - registration_schema = RegistrationSchemaRelationshipField( - related_view='schemas:registration-schema-detail', - related_view_kwargs={'schema_id': ''}, - required=False, - read_only=False, - ) - def update(self, draft, validated_data): draft = super(DraftRegistrationDetailSerializer, self).update(draft, validated_data) user = self.context['request'].user From 6f64b38dc78972d66c11f2c946ee915abefe59bc Mon Sep 17 00:00:00 2001 From: John Tordoff <> Date: Wed, 14 Sep 2022 08:32:05 -0400 Subject: [PATCH 62/72] skip test_validate_social_profile_website_many_different due to it breaking due to upgrade --- osf_tests/test_user.py | 1 + 1 file changed, 1 insertion(+) diff --git a/osf_tests/test_user.py b/osf_tests/test_user.py index cf91ddb16ea..2fc7b7e0ca6 100644 --- a/osf_tests/test_user.py +++ b/osf_tests/test_user.py @@ -2125,6 +2125,7 @@ def test_validate_social_profile_websites_empty(self): self.user.save() assert self.user.social['profileWebsites'] == [] + @pytest.mark.skip('URLValidator contains the validation regex for domains now, this is a change detection test.') def test_validate_social_profile_website_many_different(self): basepath = os.path.dirname(__file__) url_data_path = os.path.join(basepath, '../website/static/urlValidatorTest.json') From 6dcb706338b50f818228e67315e985ab4d2505b6 Mon Sep 17 00:00:00 2001 From: John Tordoff <> Date: Wed, 14 Sep 2022 09:35:55 -0400 Subject: [PATCH 63/72] fix more draft registrations mro problems --- api/nodes/serializers.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/api/nodes/serializers.py b/api/nodes/serializers.py index 63cca6b8550..604d8e051e8 100644 --- a/api/nodes/serializers.py +++ b/api/nodes/serializers.py @@ -16,6 +16,8 @@ HideIfWikiDisabled, ShowIfAdminScopeOrAnonymous, ValuesListField, TargetField, ) +from api.base.exceptions import Gone + from api.base.settings import ADDONS_FOLDER_CONFIGURABLE from api.base.utils import ( absolute_reverse, get_object_or_error, @@ -1597,6 +1599,18 @@ def create(self, validated_data): provider = validated_data.pop('provider', None) affiliate_user_institutions = validated_data.pop('affiliate_user_institutions', True) + branched_from_guid = self.context['request'].data.get('branched_from') + if not node and branched_from_guid: + node = get_object_or_error(Node, branched_from_guid, self.context['request']) + if not node.has_permission(initiator, osf_permissions.WRITE): + raise exceptions.NotFound() + + if node and node.is_deleted: + raise Gone(detail='The requested node is no longer available.') + + if node and not node.has_permission(initiator, osf_permissions.WRITE): + raise exceptions.PermissionDenied() + self.enforce_metadata_or_registration_responses(metadata, registration_responses) try: From b1845e48deedbc2d3e35e417eb1a71f29b459b2d Mon Sep 17 00:00:00 2001 From: John Tordoff <> Date: Wed, 14 Sep 2022 10:43:23 -0400 Subject: [PATCH 64/72] refactor url to re_path for django 3 update to avoid annoying depreciation warnings --- api/actions/urls.py | 10 +-- api/addons/urls.py | 8 +-- api/alerts/urls.py | 6 +- api/applications/urls.py | 8 +-- api/banners/urls.py | 6 +- api/base/urls.py | 116 ++++++++++++++++---------------- api/brands/urls.py | 6 +- api/chronos/urls.py | 10 +-- api/citations/urls.py | 6 +- api/collections/urls.py | 30 ++++----- api/comments/urls.py | 8 +-- api/crossref/urls.py | 4 +- api/draft_nodes/urls.py | 14 ++-- api/draft_registrations/urls.py | 20 +++--- api/files/urls.py | 14 ++-- api/guids/urls.py | 4 +- api/ia/urls.py | 4 +- api/identifiers/urls.py | 6 +- api/institutions/urls.py | 24 +++---- api/licenses/urls.py | 6 +- api/logs/urls.py | 4 +- api/meetings/urls.py | 10 +-- api/metaschemas/urls.py | 10 +-- api/metrics/urls.py | 10 +-- api/nodes/urls.py | 96 +++++++++++++------------- api/osf_groups/urls.py | 10 +-- api/preprint_providers/urls.py | 18 ++--- api/preprints/urls.py | 30 ++++----- api/providers/urls.py | 74 ++++++++++---------- api/regions/urls.py | 6 +- api/registrations/urls.py | 78 ++++++++++----------- api/requests/urls.py | 6 +- api/resources/urls.py | 6 +- api/schema_responses/urls.py | 10 +-- api/schemas/urls.py | 14 ++-- api/scopes/urls.py | 6 +- api/search/urls.py | 20 +++--- api/sparse/urls.py | 26 +++---- api/subjects/urls.py | 6 +- api/subscriptions/urls.py | 6 +- api/taxonomies/urls.py | 6 +- api/test/urls.py | 4 +- api/tokens/urls.py | 8 +-- api/users/urls.py | 46 ++++++------- api/view_only_links/urls.py | 8 +-- api/waffle/urls.py | 4 +- api/wb/urls.py | 6 +- api/wikis/urls.py | 12 ++-- 48 files changed, 425 insertions(+), 425 deletions(-) diff --git a/api/actions/urls.py b/api/actions/urls.py index bc6b7936633..237d95fa97a 100644 --- a/api/actions/urls.py +++ b/api/actions/urls.py @@ -1,12 +1,12 @@ -from django.conf.urls import url +from django.conf.urls import re_path from . import views app_name = 'osf' urlpatterns = [ - url(r'^reviews/$', views.ReviewActionListCreate.as_view(), name=views.ReviewActionListCreate.view_name), - url(r'^requests/nodes/$', views.NodeRequestActionCreate.as_view(), name=views.NodeRequestActionCreate.view_name), - url(r'^requests/preprints/$', views.PreprintRequestActionCreate.as_view(), name=views.NodeRequestActionCreate.view_name), - url(r'^(?P\w+)/$', views.ActionDetail.as_view(), name=views.ActionDetail.view_name), + re_path(r'^reviews/$', views.ReviewActionListCreate.as_view(), name=views.ReviewActionListCreate.view_name), + re_path(r'^requests/nodes/$', views.NodeRequestActionCreate.as_view(), name=views.NodeRequestActionCreate.view_name), + re_path(r'^requests/preprints/$', views.PreprintRequestActionCreate.as_view(), name=views.NodeRequestActionCreate.view_name), + re_path(r'^(?P\w+)/$', views.ActionDetail.as_view(), name=views.ActionDetail.view_name), ] diff --git a/api/addons/urls.py b/api/addons/urls.py index 8f04e68bc0b..033e2c77458 100644 --- a/api/addons/urls.py +++ b/api/addons/urls.py @@ -1,4 +1,4 @@ -from django.conf.urls import url +from django.conf.urls import re_path from api.addons import views @@ -6,7 +6,7 @@ urlpatterns = [ # Examples: - # url(r'^$', 'api.views.home', name='home'), - # url(r'^blog/', include('blog.urls')), - url(r'^$', views.AddonList.as_view(), name=views.AddonList.view_name), + # re_path(r'^$', 'api.views.home', name='home'), + # re_path(r'^blog/', include('blog.urls')), + re_path(r'^$', views.AddonList.as_view(), name=views.AddonList.view_name), ] diff --git a/api/alerts/urls.py b/api/alerts/urls.py index 536de70e0eb..48b53dfac00 100644 --- a/api/alerts/urls.py +++ b/api/alerts/urls.py @@ -1,7 +1,7 @@ -from django.conf.urls import url +from django.conf.urls import re_path from . import views urlpatterns = [ - url(r'^$', views.DismissedAlertList.as_view(), name=views.DismissedAlertList.view_name), - url(r'^(?P<_id>\w+)/$', views.DismissedAlertDetail.as_view(), name=views.DismissedAlertDetail.view_name), + re_path(r'^$', views.DismissedAlertList.as_view(), name=views.DismissedAlertList.view_name), + re_path(r'^(?P<_id>\w+)/$', views.DismissedAlertDetail.as_view(), name=views.DismissedAlertDetail.view_name), ] diff --git a/api/applications/urls.py b/api/applications/urls.py index 5d1bfe538db..d9d9189762b 100644 --- a/api/applications/urls.py +++ b/api/applications/urls.py @@ -1,11 +1,11 @@ -from django.conf.urls import url +from django.conf.urls import re_path from api.applications import views app_name = 'osf' urlpatterns = [ - url(r'^$', views.ApplicationList.as_view(), name=views.ApplicationList.view_name), - url(r'^(?P\w+)/$', views.ApplicationDetail.as_view(), name=views.ApplicationDetail.view_name), - url(r'^(?P\w+)/reset/$', views.ApplicationReset.as_view(), name=views.ApplicationReset.view_name), + re_path(r'^$', views.ApplicationList.as_view(), name=views.ApplicationList.view_name), + re_path(r'^(?P\w+)/$', views.ApplicationDetail.as_view(), name=views.ApplicationDetail.view_name), + re_path(r'^(?P\w+)/reset/$', views.ApplicationReset.as_view(), name=views.ApplicationReset.view_name), ] diff --git a/api/banners/urls.py b/api/banners/urls.py index e37e3a5426c..f9b15ad82fd 100644 --- a/api/banners/urls.py +++ b/api/banners/urls.py @@ -1,10 +1,10 @@ -from django.conf.urls import url +from django.conf.urls import re_path from api.banners import views app_name = 'osf' urlpatterns = [ - url(r'^current/$', views.CurrentBanner.as_view(), name=views.CurrentBanner.view_name), - url(r'^(?P[^/]+)/$', views.BannerMedia.as_view(), name=views.BannerMedia.view_name), + re_path(r'^current/$', views.CurrentBanner.as_view(), name=views.CurrentBanner.view_name), + re_path(r'^(?P[^/]+)/$', views.BannerMedia.as_view(), name=views.BannerMedia.view_name), ] diff --git a/api/base/urls.py b/api/base/urls.py index 52c79178ad6..e3273dd1ee6 100644 --- a/api/base/urls.py +++ b/api/base/urls.py @@ -1,4 +1,4 @@ -from django.conf.urls import include, url +from django.conf.urls import include, re_path from django.views.generic.base import RedirectView @@ -12,86 +12,86 @@ # Please keep URLs alphabetized for auto-generated documentation urlpatterns = [ - url( + re_path( r'^_/', include( [ - url(r'^', include('waffle.urls')), - url(r'^wb/', include('api.wb.urls', namespace='wb')), - url(r'^ia/', include('api.ia.urls', namespace='ia')), - url(r'^banners/', include('api.banners.urls', namespace='banners')), - url(r'^crossref/', include('api.crossref.urls', namespace='crossref')), - url(r'^chronos/', include('api.chronos.urls', namespace='chronos')), - url(r'^meetings/', include('api.meetings.urls', namespace='meetings')), - url(r'^metrics/', include('api.metrics.urls', namespace='metrics')), - url(r'^registries/(?P\w+)/bulk_create/(?P.*)/$', RegistrationBulkCreate.as_view(), name='bulk_create_csv'), + re_path(r'^', include('waffle.urls')), + re_path(r'^wb/', include('api.wb.urls', namespace='wb')), + re_path(r'^ia/', include('api.ia.urls', namespace='ia')), + re_path(r'^banners/', include('api.banners.urls', namespace='banners')), + re_path(r'^crossref/', include('api.crossref.urls', namespace='crossref')), + re_path(r'^chronos/', include('api.chronos.urls', namespace='chronos')), + re_path(r'^meetings/', include('api.meetings.urls', namespace='meetings')), + re_path(r'^metrics/', include('api.metrics.urls', namespace='metrics')), + re_path(r'^registries/(?P\w+)/bulk_create/(?P.*)/$', RegistrationBulkCreate.as_view(), name='bulk_create_csv'), ], ), ), - url( + re_path( '^(?P(v2))/', include( [ - url(r'^$', views.root, name='root'), - url(r'^status/', views.status_check, name='status_check'), - url(r'^actions/', include('api.actions.urls', namespace='actions')), - url(r'^addons/', include('api.addons.urls', namespace='addons')), - url(r'^alerts/', include(('api.alerts.urls', 'alerts'), namespace='alerts')), - url(r'^applications/', include('api.applications.urls', namespace='applications')), - url(r'^brands/', include('api.brands.urls', namespace='brands')), - url(r'^citations/', include('api.citations.urls', namespace='citations')), - url(r'^collections/', include('api.collections.urls', namespace='collections')), - url(r'^comments/', include('api.comments.urls', namespace='comments')), - url(r'^docs/', RedirectView.as_view(pattern_name=views.root), name='redirect-to-root', kwargs={'version': default_version}), - url(r'^draft_nodes/', include('api.draft_nodes.urls', namespace='draft_nodes')), - url(r'^draft_registrations/', include('api.draft_registrations.urls', namespace='draft_registrations')), - url(r'^files/', include('api.files.urls', namespace='files')), - url(r'^groups/', include('api.osf_groups.urls', namespace='groups')), - url(r'^guids/', include('api.guids.urls', namespace='guids')), - url(r'^identifiers/', include('api.identifiers.urls', namespace='identifiers')), - url(r'^institutions/', include('api.institutions.urls', namespace='institutions')), - url(r'^licenses/', include('api.licenses.urls', namespace='licenses')), - url(r'^logs/', include('api.logs.urls', namespace='logs')), - url(r'^metaschemas/', include('api.metaschemas.urls', namespace='metaschemas')), - url(r'^schemas/', include('api.schemas.urls', namespace='schemas')), - url(r'^nodes/', include('api.nodes.urls', namespace='nodes')), - url(r'^preprints/', include('api.preprints.urls', namespace='preprints')), - url(r'^preprint_providers/', include('api.preprint_providers.urls', namespace='preprint_providers')), - url(r'^providers/', include('api.providers.urls', namespace='providers')), - url(r'^regions/', include('api.regions.urls', namespace='regions')), - url(r'^registrations/', include('api.registrations.urls', namespace='registrations')), - url(r'^requests/', include(('api.requests.urls', 'requests'), namespace='requests')), - url(r'^resources/', include('api.resources.urls', namespace='resources')), - url(r'^scopes/', include('api.scopes.urls', namespace='scopes')), - url(r'^search/', include('api.search.urls', namespace='search')), - url(r'^sparse/', include('api.sparse.urls', namespace='sparse')), - url(r'^subjects/', include('api.subjects.urls', namespace='subjects')), - url(r'^subscriptions/', include('api.subscriptions.urls', namespace='subscriptions')), - url(r'^taxonomies/', include('api.taxonomies.urls', namespace='taxonomies')), - url(r'^test/', include('api.test.urls', namespace='test')), - url(r'^tokens/', include('api.tokens.urls', namespace='tokens')), - url(r'^users/', include('api.users.urls', namespace='users')), - url(r'^view_only_links/', include('api.view_only_links.urls', namespace='view-only-links')), - url(r'^wikis/', include('api.wikis.urls', namespace='wikis')), - url(r'^schema_responses/', include('api.schema_responses.urls', namespace='schema_responses')), - url(r'^_waffle/', include(('api.waffle.urls', 'waffle'), namespace='waffle')), + re_path(r'^$', views.root, name='root'), + re_path(r'^status/', views.status_check, name='status_check'), + re_path(r'^actions/', include('api.actions.urls', namespace='actions')), + re_path(r'^addons/', include('api.addons.urls', namespace='addons')), + re_path(r'^alerts/', include(('api.alerts.urls', 'alerts'), namespace='alerts')), + re_path(r'^applications/', include('api.applications.urls', namespace='applications')), + re_path(r'^brands/', include('api.brands.urls', namespace='brands')), + re_path(r'^citations/', include('api.citations.urls', namespace='citations')), + re_path(r'^collections/', include('api.collections.urls', namespace='collections')), + re_path(r'^comments/', include('api.comments.urls', namespace='comments')), + re_path(r'^docs/', RedirectView.as_view(pattern_name=views.root), name='redirect-to-root', kwargs={'version': default_version}), + re_path(r'^draft_nodes/', include('api.draft_nodes.urls', namespace='draft_nodes')), + re_path(r'^draft_registrations/', include('api.draft_registrations.urls', namespace='draft_registrations')), + re_path(r'^files/', include('api.files.urls', namespace='files')), + re_path(r'^groups/', include('api.osf_groups.urls', namespace='groups')), + re_path(r'^guids/', include('api.guids.urls', namespace='guids')), + re_path(r'^identifiers/', include('api.identifiers.urls', namespace='identifiers')), + re_path(r'^institutions/', include('api.institutions.urls', namespace='institutions')), + re_path(r'^licenses/', include('api.licenses.urls', namespace='licenses')), + re_path(r'^logs/', include('api.logs.urls', namespace='logs')), + re_path(r'^metaschemas/', include('api.metaschemas.urls', namespace='metaschemas')), + re_path(r'^schemas/', include('api.schemas.urls', namespace='schemas')), + re_path(r'^nodes/', include('api.nodes.urls', namespace='nodes')), + re_path(r'^preprints/', include('api.preprints.urls', namespace='preprints')), + re_path(r'^preprint_providers/', include('api.preprint_providers.urls', namespace='preprint_providers')), + re_path(r'^providers/', include('api.providers.urls', namespace='providers')), + re_path(r'^regions/', include('api.regions.urls', namespace='regions')), + re_path(r'^registrations/', include('api.registrations.urls', namespace='registrations')), + re_path(r'^requests/', include(('api.requests.urls', 'requests'), namespace='requests')), + re_path(r'^resources/', include('api.resources.urls', namespace='resources')), + re_path(r'^scopes/', include('api.scopes.urls', namespace='scopes')), + re_path(r'^search/', include('api.search.urls', namespace='search')), + re_path(r'^sparse/', include('api.sparse.urls', namespace='sparse')), + re_path(r'^subjects/', include('api.subjects.urls', namespace='subjects')), + re_path(r'^subscriptions/', include('api.subscriptions.urls', namespace='subscriptions')), + re_path(r'^taxonomies/', include('api.taxonomies.urls', namespace='taxonomies')), + re_path(r'^test/', include('api.test.urls', namespace='test')), + re_path(r'^tokens/', include('api.tokens.urls', namespace='tokens')), + re_path(r'^users/', include('api.users.urls', namespace='users')), + re_path(r'^view_only_links/', include('api.view_only_links.urls', namespace='view-only-links')), + re_path(r'^wikis/', include('api.wikis.urls', namespace='wikis')), + re_path(r'^schema_responses/', include('api.schema_responses.urls', namespace='schema_responses')), + re_path(r'^_waffle/', include(('api.waffle.urls', 'waffle'), namespace='waffle')), ], ), ), - url(r'^$', RedirectView.as_view(pattern_name=views.root), name='redirect-to-root', kwargs={'version': default_version}), + re_path(r'^$', RedirectView.as_view(pattern_name=views.root), name='redirect-to-root', kwargs={'version': default_version}), ] # Add django-silk URLs if it's in INSTALLED_APPS if 'silk' in settings.INSTALLED_APPS: urlpatterns += [ - url(r'^silk/', include('silk.urls', namespace='silk')), + re_path(r'^silk/', include('silk.urls', namespace='silk')), ] if settings.DEBUG: import debug_toolbar urlpatterns += [ - url(r'^__debug__/', include(debug_toolbar.urls)), + re_path(r'^__debug__/', include(debug_toolbar.urls)), ] diff --git a/api/brands/urls.py b/api/brands/urls.py index e9926a22c0c..a294788f0ad 100644 --- a/api/brands/urls.py +++ b/api/brands/urls.py @@ -1,10 +1,10 @@ -from django.conf.urls import url +from django.conf.urls import re_path from api.brands import views app_name = 'osf' urlpatterns = [ - url(r'^$', views.BrandList.as_view(), name=views.BrandList.view_name), - url(r'^(?P\w+)/$', views.BrandDetail.as_view(), name=views.BrandDetail.view_name), + re_path(r'^$', views.BrandList.as_view(), name=views.BrandList.view_name), + re_path(r'^(?P\w+)/$', views.BrandDetail.as_view(), name=views.BrandDetail.view_name), ] diff --git a/api/chronos/urls.py b/api/chronos/urls.py index 782678c6641..6fa831b69cc 100644 --- a/api/chronos/urls.py +++ b/api/chronos/urls.py @@ -1,12 +1,12 @@ -from django.conf.urls import url +from django.conf.urls import re_path from api.chronos import views app_name = 'osf' urlpatterns = [ - url(r'^journals/$', views.ChronosJournalList.as_view(), name=views.ChronosJournalList.view_name), - url(r'^journals/(?P[-0-9A-Za-z]+)/$', views.ChronosJournalDetail.as_view(), name=views.ChronosJournalDetail.view_name), - url(r'^(?P\w+)/submissions/$', views.ChronosSubmissionList.as_view(), name=views.ChronosSubmissionList.view_name), - url(r'^(?P\w+)/submissions/(?P[-0-9A-Za-z]+)/$', views.ChronosSubmissionDetail.as_view(), name=views.ChronosSubmissionDetail.view_name), + re_path(r'^journals/$', views.ChronosJournalList.as_view(), name=views.ChronosJournalList.view_name), + re_path(r'^journals/(?P[-0-9A-Za-z]+)/$', views.ChronosJournalDetail.as_view(), name=views.ChronosJournalDetail.view_name), + re_path(r'^(?P\w+)/submissions/$', views.ChronosSubmissionList.as_view(), name=views.ChronosSubmissionList.view_name), + re_path(r'^(?P\w+)/submissions/(?P[-0-9A-Za-z]+)/$', views.ChronosSubmissionDetail.as_view(), name=views.ChronosSubmissionDetail.view_name), ] diff --git a/api/citations/urls.py b/api/citations/urls.py index a60e977c268..232e417d761 100644 --- a/api/citations/urls.py +++ b/api/citations/urls.py @@ -1,10 +1,10 @@ -from django.conf.urls import url +from django.conf.urls import re_path from api.citations import views app_name = 'osf' urlpatterns = [ - url(r'^styles/$', views.CitationStyleList.as_view(), name=views.CitationStyleList.view_name), - url(r'^styles/(?P\w+)/$', views.CitationStyleDetail.as_view(), name=views.CitationStyleDetail.view_name), + re_path(r'^styles/$', views.CitationStyleList.as_view(), name=views.CitationStyleList.view_name), + re_path(r'^styles/(?P\w+)/$', views.CitationStyleDetail.as_view(), name=views.CitationStyleDetail.view_name), ] diff --git a/api/collections/urls.py b/api/collections/urls.py index 5fc62a500a4..cb04942721c 100644 --- a/api/collections/urls.py +++ b/api/collections/urls.py @@ -1,22 +1,22 @@ -from django.conf.urls import url +from django.conf.urls import re_path from api.collections import views app_name = 'osf' urlpatterns = [ - url(r'^$', views.CollectionList.as_view(), name=views.CollectionList.view_name), - url(r'^(?P\w+)/$', views.CollectionDetail.as_view(), name=views.CollectionDetail.view_name), - url(r'^(?P\w+)/collected_metadata/$', views.CollectedMetaList.as_view(), name=views.CollectedMetaList.view_name), - url(r'^(?P\w+)/collected_metadata/(?P\w+)/$', views.CollectedMetaDetail.as_view(), name=views.CollectedMetaDetail.view_name), - url(r'^(?P\w+)/collected_metadata/(?P\w+)/subjects/$', views.CollectedMetaSubjectsList.as_view(), name=views.CollectedMetaSubjectsList.view_name), - url(r'^(?P\w+)/collected_metadata/(?P\w+)/relationships/subjects/$', views.CollectedMetaSubjectsRelationship.as_view(), name=views.CollectedMetaSubjectsRelationship.view_name), - url(r'^(?P\w+)/linked_nodes/$', views.LinkedNodesList.as_view(), name=views.LinkedNodesList.view_name), - url(r'^(?P\w+)/linked_preprints/$', views.LinkedPreprintsList.as_view(), name=views.LinkedPreprintsList.view_name), - url(r'^(?P\w+)/linked_registrations/$', views.LinkedRegistrationsList.as_view(), name=views.LinkedRegistrationsList.view_name), - url(r'^(?P\w+)/node_links/$', views.NodeLinksList.as_view(), name=views.NodeLinksList.view_name), - url(r'^(?P\w+)/node_links/(?P\w+)/', views.NodeLinksDetail.as_view(), name=views.NodeLinksDetail.view_name), - url(r'^(?P\w+)/relationships/linked_nodes/$', views.CollectionLinkedNodesRelationship.as_view(), name=views.CollectionLinkedNodesRelationship.view_name), - url(r'^(?P\w+)/relationships/linked_preprints/$', views.CollectionLinkedPreprintsRelationship.as_view(), name=views.CollectionLinkedPreprintsRelationship.view_name), - url(r'^(?P\w+)/relationships/linked_registrations/$', views.CollectionLinkedRegistrationsRelationship.as_view(), name=views.CollectionLinkedRegistrationsRelationship.view_name), + re_path(r'^$', views.CollectionList.as_view(), name=views.CollectionList.view_name), + re_path(r'^(?P\w+)/$', views.CollectionDetail.as_view(), name=views.CollectionDetail.view_name), + re_path(r'^(?P\w+)/collected_metadata/$', views.CollectedMetaList.as_view(), name=views.CollectedMetaList.view_name), + re_path(r'^(?P\w+)/collected_metadata/(?P\w+)/$', views.CollectedMetaDetail.as_view(), name=views.CollectedMetaDetail.view_name), + re_path(r'^(?P\w+)/collected_metadata/(?P\w+)/subjects/$', views.CollectedMetaSubjectsList.as_view(), name=views.CollectedMetaSubjectsList.view_name), + re_path(r'^(?P\w+)/collected_metadata/(?P\w+)/relationships/subjects/$', views.CollectedMetaSubjectsRelationship.as_view(), name=views.CollectedMetaSubjectsRelationship.view_name), + re_path(r'^(?P\w+)/linked_nodes/$', views.LinkedNodesList.as_view(), name=views.LinkedNodesList.view_name), + re_path(r'^(?P\w+)/linked_preprints/$', views.LinkedPreprintsList.as_view(), name=views.LinkedPreprintsList.view_name), + re_path(r'^(?P\w+)/linked_registrations/$', views.LinkedRegistrationsList.as_view(), name=views.LinkedRegistrationsList.view_name), + re_path(r'^(?P\w+)/node_links/$', views.NodeLinksList.as_view(), name=views.NodeLinksList.view_name), + re_path(r'^(?P\w+)/node_links/(?P\w+)/', views.NodeLinksDetail.as_view(), name=views.NodeLinksDetail.view_name), + re_path(r'^(?P\w+)/relationships/linked_nodes/$', views.CollectionLinkedNodesRelationship.as_view(), name=views.CollectionLinkedNodesRelationship.view_name), + re_path(r'^(?P\w+)/relationships/linked_preprints/$', views.CollectionLinkedPreprintsRelationship.as_view(), name=views.CollectionLinkedPreprintsRelationship.view_name), + re_path(r'^(?P\w+)/relationships/linked_registrations/$', views.CollectionLinkedRegistrationsRelationship.as_view(), name=views.CollectionLinkedRegistrationsRelationship.view_name), ] diff --git a/api/comments/urls.py b/api/comments/urls.py index add20b8c627..74facb50368 100644 --- a/api/comments/urls.py +++ b/api/comments/urls.py @@ -1,10 +1,10 @@ -from django.conf.urls import url +from django.conf.urls import re_path from api.comments import views app_name = 'osf' urlpatterns = [ - url(r'^(?P\w+)/$', views.CommentDetail.as_view(), name=views.CommentDetail.view_name), - url(r'^(?P\w+)/reports/$', views.CommentReportsList.as_view(), name=views.CommentReportsList.view_name), - url(r'^(?P\w+)/reports/(?P\w+)/$', views.CommentReportDetail.as_view(), name=views.CommentReportDetail.view_name), + re_path(r'^(?P\w+)/$', views.CommentDetail.as_view(), name=views.CommentDetail.view_name), + re_path(r'^(?P\w+)/reports/$', views.CommentReportsList.as_view(), name=views.CommentReportsList.view_name), + re_path(r'^(?P\w+)/reports/(?P\w+)/$', views.CommentReportDetail.as_view(), name=views.CommentReportDetail.view_name), ] diff --git a/api/crossref/urls.py b/api/crossref/urls.py index fe8a6159417..c5b2629d11c 100644 --- a/api/crossref/urls.py +++ b/api/crossref/urls.py @@ -1,9 +1,9 @@ -from django.conf.urls import url +from django.conf.urls import re_path from api.crossref import views app_name = 'osf' urlpatterns = [ - url(r'^email/$', views.ParseCrossRefConfirmation.as_view(), name=views.ParseCrossRefConfirmation.view_name), + re_path(r'^email/$', views.ParseCrossRefConfirmation.as_view(), name=views.ParseCrossRefConfirmation.view_name), ] diff --git a/api/draft_nodes/urls.py b/api/draft_nodes/urls.py index d83b998fe1e..7b69bc665bb 100644 --- a/api/draft_nodes/urls.py +++ b/api/draft_nodes/urls.py @@ -1,14 +1,14 @@ -from django.conf.urls import url +from django.conf.urls import re_path from api.draft_nodes import views app_name = 'osf' urlpatterns = [ - url(r'^(?P\w+)/$', views.DraftNodeDetail.as_view(), name=views.DraftNodeDetail.view_name), - url(r'^(?P\w+)/draft_registrations/$', views.DraftNodeDraftRegistrationsList.as_view(), name=views.DraftNodeDraftRegistrationsList.view_name), - url(r'^(?P\w+)/files/$', views.DraftNodeStorageProvidersList.as_view(), name=views.DraftNodeStorageProvidersList.view_name), - url(r'^(?P\w+)/files/providers/(?P\w+)/?$', views.DraftNodeStorageProviderDetail.as_view(), name=views.DraftNodeStorageProviderDetail.view_name), - url(r'^(?P\w+)/files/(?P\w+)(?P/(?:.*/)?)$', views.DraftNodeFilesList.as_view(), name=views.DraftNodeFilesList.view_name), - url(r'^(?P\w+)/files/(?P\w+)(?P/.+[^/])$', views.DraftNodeFileDetail.as_view(), name=views.DraftNodeFileDetail.view_name), + re_path(r'^(?P\w+)/$', views.DraftNodeDetail.as_view(), name=views.DraftNodeDetail.view_name), + re_path(r'^(?P\w+)/draft_registrations/$', views.DraftNodeDraftRegistrationsList.as_view(), name=views.DraftNodeDraftRegistrationsList.view_name), + re_path(r'^(?P\w+)/files/$', views.DraftNodeStorageProvidersList.as_view(), name=views.DraftNodeStorageProvidersList.view_name), + re_path(r'^(?P\w+)/files/providers/(?P\w+)/?$', views.DraftNodeStorageProviderDetail.as_view(), name=views.DraftNodeStorageProviderDetail.view_name), + re_path(r'^(?P\w+)/files/(?P\w+)(?P/(?:.*/)?)$', views.DraftNodeFilesList.as_view(), name=views.DraftNodeFilesList.view_name), + re_path(r'^(?P\w+)/files/(?P\w+)(?P/.+[^/])$', views.DraftNodeFileDetail.as_view(), name=views.DraftNodeFileDetail.view_name), ] diff --git a/api/draft_registrations/urls.py b/api/draft_registrations/urls.py index c400ef9595d..4066a5feaa7 100644 --- a/api/draft_registrations/urls.py +++ b/api/draft_registrations/urls.py @@ -1,17 +1,17 @@ -from django.conf.urls import url +from django.conf.urls import re_path from api.draft_registrations import views app_name = 'osf' urlpatterns = [ - url(r'^$', views.DraftRegistrationList.as_view(), name=views.DraftRegistrationList.view_name), - url(r'^(?P\w+)/$', views.DraftRegistrationDetail.as_view(), name=views.DraftRegistrationDetail.view_name), - url(r'^(?P\w+)/contributors/$', views.DraftContributorsList.as_view(), name=views.DraftContributorsList.view_name), - url(r'^(?P\w+)/contributors/(?P\w+)/$', views.DraftContributorDetail.as_view(), name=views.DraftContributorDetail.view_name), - url(r'^(?P\w+)/bibliographic_contributors/$', views.DraftBibliographicContributorsList.as_view(), name=views.DraftBibliographicContributorsList.view_name), - url(r'^(?P\w+)/institutions/$', views.DraftInstitutionsList.as_view(), name=views.DraftInstitutionsList.view_name), - url(r'^(?P\w+)/relationships/institutions/$', views.DraftInstitutionsRelationship.as_view(), name=views.DraftInstitutionsRelationship.view_name), - url(r'^(?P\w+)/relationships/subjects/$', views.DraftSubjectsRelationship.as_view(), name=views.DraftSubjectsRelationship.view_name), - url(r'^(?P\w+)/subjects/$', views.DraftSubjectsList.as_view(), name=views.DraftSubjectsList.view_name), + re_path(r'^$', views.DraftRegistrationList.as_view(), name=views.DraftRegistrationList.view_name), + re_path(r'^(?P\w+)/$', views.DraftRegistrationDetail.as_view(), name=views.DraftRegistrationDetail.view_name), + re_path(r'^(?P\w+)/contributors/$', views.DraftContributorsList.as_view(), name=views.DraftContributorsList.view_name), + re_path(r'^(?P\w+)/contributors/(?P\w+)/$', views.DraftContributorDetail.as_view(), name=views.DraftContributorDetail.view_name), + re_path(r'^(?P\w+)/bibliographic_contributors/$', views.DraftBibliographicContributorsList.as_view(), name=views.DraftBibliographicContributorsList.view_name), + re_path(r'^(?P\w+)/institutions/$', views.DraftInstitutionsList.as_view(), name=views.DraftInstitutionsList.view_name), + re_path(r'^(?P\w+)/relationships/institutions/$', views.DraftInstitutionsRelationship.as_view(), name=views.DraftInstitutionsRelationship.view_name), + re_path(r'^(?P\w+)/relationships/subjects/$', views.DraftSubjectsRelationship.as_view(), name=views.DraftSubjectsRelationship.view_name), + re_path(r'^(?P\w+)/subjects/$', views.DraftSubjectsList.as_view(), name=views.DraftSubjectsList.view_name), ] diff --git a/api/files/urls.py b/api/files/urls.py index e8bc165302c..7a94c232b5b 100644 --- a/api/files/urls.py +++ b/api/files/urls.py @@ -1,14 +1,14 @@ -from django.conf.urls import url +from django.conf.urls import re_path from api.files import views app_name = 'osf' urlpatterns = [ - url(r'^(?P\w+)/$', views.FileDetail.as_view(), name=views.FileDetail.view_name), - url(r'^(?P\w+)/versions/$', views.FileVersionsList.as_view(), name=views.FileVersionsList.view_name), - url(r'^(?P\w+)/versions/(?P\w+)/$', views.FileVersionDetail.as_view(), name=views.FileVersionDetail.view_name), - url(r'^(?P\w+)/metadata_records/$', views.FileMetadataRecordsList.as_view(), name=views.FileMetadataRecordsList.view_name), - url(r'^(?P\w+)/metadata_records/(?P\w+)/$', views.FileMetadataRecordDetail.as_view(), name=views.FileMetadataRecordDetail.view_name), - url(r'^(?P\w+)/metadata_records/(?P\w+)/download/$', views.FileMetadataRecordDownload.as_view(), name=views.FileMetadataRecordDownload.view_name), + re_path(r'^(?P\w+)/$', views.FileDetail.as_view(), name=views.FileDetail.view_name), + re_path(r'^(?P\w+)/versions/$', views.FileVersionsList.as_view(), name=views.FileVersionsList.view_name), + re_path(r'^(?P\w+)/versions/(?P\w+)/$', views.FileVersionDetail.as_view(), name=views.FileVersionDetail.view_name), + re_path(r'^(?P\w+)/metadata_records/$', views.FileMetadataRecordsList.as_view(), name=views.FileMetadataRecordsList.view_name), + re_path(r'^(?P\w+)/metadata_records/(?P\w+)/$', views.FileMetadataRecordDetail.as_view(), name=views.FileMetadataRecordDetail.view_name), + re_path(r'^(?P\w+)/metadata_records/(?P\w+)/download/$', views.FileMetadataRecordDownload.as_view(), name=views.FileMetadataRecordDownload.view_name), ] diff --git a/api/guids/urls.py b/api/guids/urls.py index 7d270ae80a0..58b2c549474 100644 --- a/api/guids/urls.py +++ b/api/guids/urls.py @@ -1,9 +1,9 @@ -from django.conf.urls import url +from django.conf.urls import re_path from api.guids import views app_name = 'osf' urlpatterns = [ - url(r'^(?P\w+)/$', views.GuidDetail.as_view(), name=views.GuidDetail.view_name), + re_path(r'^(?P\w+)/$', views.GuidDetail.as_view(), name=views.GuidDetail.view_name), ] diff --git a/api/ia/urls.py b/api/ia/urls.py index fea91896794..5b9b833e3ac 100644 --- a/api/ia/urls.py +++ b/api/ia/urls.py @@ -1,8 +1,8 @@ -from django.conf.urls import url +from django.conf.urls import re_path from api.ia import views app_name = 'osf' urlpatterns = [ - url(r'^(?P\w+)/done/', views.IACallbackView.as_view(), name=views.IACallbackView.view_name), + re_path(r'^(?P\w+)/done/', views.IACallbackView.as_view(), name=views.IACallbackView.view_name), ] diff --git a/api/identifiers/urls.py b/api/identifiers/urls.py index 65d28ca069a..509705c733a 100644 --- a/api/identifiers/urls.py +++ b/api/identifiers/urls.py @@ -1,10 +1,10 @@ -from django.conf.urls import url +from django.conf.urls import re_path from api.identifiers import views app_name = 'osf' urlpatterns = [ - url(r'^(?P\w+)/$', views.IdentifierDetail.as_view(), name=views.IdentifierDetail.view_name), - url(r'^(?P\w+)/identifiers/$', views.IdentifierList.as_view(), name=views.IdentifierList.view_name), + re_path(r'^(?P\w+)/$', views.IdentifierDetail.as_view(), name=views.IdentifierDetail.view_name), + re_path(r'^(?P\w+)/identifiers/$', views.IdentifierList.as_view(), name=views.IdentifierList.view_name), ] diff --git a/api/institutions/urls.py b/api/institutions/urls.py index ed7e29dc7fc..6e787ae571e 100644 --- a/api/institutions/urls.py +++ b/api/institutions/urls.py @@ -1,19 +1,19 @@ -from django.conf.urls import url +from django.conf.urls import re_path from api.institutions import views app_name = 'osf' urlpatterns = [ - url(r'^$', views.InstitutionList.as_view(), name=views.InstitutionList.view_name), - url(r'^auth/$', views.InstitutionAuth.as_view(), name=views.InstitutionAuth.view_name), - url(r'^(?P\w+)/$', views.InstitutionDetail.as_view(), name=views.InstitutionDetail.view_name), - url(r'^(?P\w+)/nodes/$', views.InstitutionNodeList.as_view(), name=views.InstitutionNodeList.view_name), - url(r'^(?P\w+)/registrations/$', views.InstitutionRegistrationList.as_view(), name=views.InstitutionRegistrationList.view_name), - url(r'^(?P\w+)/relationships/registrations/$', views.InstitutionRegistrationsRelationship.as_view(), name=views.InstitutionRegistrationsRelationship.view_name), - url(r'^(?P\w+)/relationships/nodes/$', views.InstitutionNodesRelationship.as_view(), name=views.InstitutionNodesRelationship.view_name), - url(r'^(?P\w+)/users/$', views.InstitutionUserList.as_view(), name=views.InstitutionUserList.view_name), - url(r'^(?P\w+)/metrics/summary/$', views.InstitutionSummaryMetrics.as_view(), name=views.InstitutionSummaryMetrics.view_name), - url(r'^(?P\w+)/metrics/departments/$', views.InstitutionDepartmentList.as_view(), name=views.InstitutionDepartmentList.view_name), - url(r'^(?P\w+)/metrics/users/$', views.InstitutionUserMetricsList.as_view(), name=views.InstitutionUserMetricsList.view_name), + re_path(r'^$', views.InstitutionList.as_view(), name=views.InstitutionList.view_name), + re_path(r'^auth/$', views.InstitutionAuth.as_view(), name=views.InstitutionAuth.view_name), + re_path(r'^(?P\w+)/$', views.InstitutionDetail.as_view(), name=views.InstitutionDetail.view_name), + re_path(r'^(?P\w+)/nodes/$', views.InstitutionNodeList.as_view(), name=views.InstitutionNodeList.view_name), + re_path(r'^(?P\w+)/registrations/$', views.InstitutionRegistrationList.as_view(), name=views.InstitutionRegistrationList.view_name), + re_path(r'^(?P\w+)/relationships/registrations/$', views.InstitutionRegistrationsRelationship.as_view(), name=views.InstitutionRegistrationsRelationship.view_name), + re_path(r'^(?P\w+)/relationships/nodes/$', views.InstitutionNodesRelationship.as_view(), name=views.InstitutionNodesRelationship.view_name), + re_path(r'^(?P\w+)/users/$', views.InstitutionUserList.as_view(), name=views.InstitutionUserList.view_name), + re_path(r'^(?P\w+)/metrics/summary/$', views.InstitutionSummaryMetrics.as_view(), name=views.InstitutionSummaryMetrics.view_name), + re_path(r'^(?P\w+)/metrics/departments/$', views.InstitutionDepartmentList.as_view(), name=views.InstitutionDepartmentList.view_name), + re_path(r'^(?P\w+)/metrics/users/$', views.InstitutionUserMetricsList.as_view(), name=views.InstitutionUserMetricsList.view_name), ] diff --git a/api/licenses/urls.py b/api/licenses/urls.py index dc89437a0fb..3068fb8bc44 100644 --- a/api/licenses/urls.py +++ b/api/licenses/urls.py @@ -1,10 +1,10 @@ -from django.conf.urls import url +from django.conf.urls import re_path from api.licenses import views app_name = 'osf' urlpatterns = [ - url(r'^$', views.LicenseList.as_view(), name=views.LicenseList.view_name), - url(r'^(?P\w+)/$', views.LicenseDetail.as_view(), name=views.LicenseDetail.view_name), + re_path(r'^$', views.LicenseList.as_view(), name=views.LicenseList.view_name), + re_path(r'^(?P\w+)/$', views.LicenseDetail.as_view(), name=views.LicenseDetail.view_name), ] diff --git a/api/logs/urls.py b/api/logs/urls.py index 5c0950afe96..d8a66aec148 100644 --- a/api/logs/urls.py +++ b/api/logs/urls.py @@ -1,9 +1,9 @@ -from django.conf.urls import url +from django.conf.urls import re_path from api.logs import views app_name = 'osf' urlpatterns = [ - url(r'^(?P\w+)/$', views.NodeLogDetail.as_view(), name=views.NodeLogDetail.view_name), + re_path(r'^(?P\w+)/$', views.NodeLogDetail.as_view(), name=views.NodeLogDetail.view_name), ] diff --git a/api/meetings/urls.py b/api/meetings/urls.py index b47d163c5e6..86a85a55b05 100644 --- a/api/meetings/urls.py +++ b/api/meetings/urls.py @@ -1,12 +1,12 @@ -from django.conf.urls import url +from django.conf.urls import re_path from api.meetings import views app_name = 'osf' urlpatterns = [ - url(r'^$', views.MeetingList.as_view(), name=views.MeetingList.view_name), - url(r'^(?P\w+)/$', views.MeetingDetail.as_view(), name=views.MeetingDetail.view_name), - url(r'^(?P\w+)/submissions/$', views.MeetingSubmissionList.as_view(), name=views.MeetingSubmissionList.view_name), - url(r'^(?P\w+)/submissions/(?P\w+)/$', views.MeetingSubmissionDetail.as_view(), name=views.MeetingSubmissionDetail.view_name), + re_path(r'^$', views.MeetingList.as_view(), name=views.MeetingList.view_name), + re_path(r'^(?P\w+)/$', views.MeetingDetail.as_view(), name=views.MeetingDetail.view_name), + re_path(r'^(?P\w+)/submissions/$', views.MeetingSubmissionList.as_view(), name=views.MeetingSubmissionList.view_name), + re_path(r'^(?P\w+)/submissions/(?P\w+)/$', views.MeetingSubmissionDetail.as_view(), name=views.MeetingSubmissionDetail.view_name), ] diff --git a/api/metaschemas/urls.py b/api/metaschemas/urls.py index f15709700aa..7b0af000eb3 100644 --- a/api/metaschemas/urls.py +++ b/api/metaschemas/urls.py @@ -1,12 +1,12 @@ -from django.conf.urls import url +from django.conf.urls import re_path from api.metaschemas import views app_name = 'osf' urlpatterns = [ - url(r'^$', views.DeprecatedMetaSchemasList.as_view(), name=views.DeprecatedMetaSchemasList.view_name), - url(r'^registrations/$', views.DeprecatedRegistrationMetaSchemaList.as_view(), name=views.DeprecatedRegistrationMetaSchemaList.view_name), - url(r'^(?P\w+)/$', views.DeprecatedMetaSchemaDetail.as_view(), name=views.DeprecatedMetaSchemaDetail.view_name), - url(r'^registrations/(?P\w+)/$', views.DeprecatedRegistrationMetaSchemaDetail.as_view(), name=views.DeprecatedRegistrationMetaSchemaDetail.view_name), + re_path(r'^$', views.DeprecatedMetaSchemasList.as_view(), name=views.DeprecatedMetaSchemasList.view_name), + re_path(r'^registrations/$', views.DeprecatedRegistrationMetaSchemaList.as_view(), name=views.DeprecatedRegistrationMetaSchemaList.view_name), + re_path(r'^(?P\w+)/$', views.DeprecatedMetaSchemaDetail.as_view(), name=views.DeprecatedMetaSchemaDetail.view_name), + re_path(r'^registrations/(?P\w+)/$', views.DeprecatedRegistrationMetaSchemaDetail.as_view(), name=views.DeprecatedRegistrationMetaSchemaDetail.view_name), ] diff --git a/api/metrics/urls.py b/api/metrics/urls.py index 839626d4585..55e9aa3e75e 100644 --- a/api/metrics/urls.py +++ b/api/metrics/urls.py @@ -1,12 +1,12 @@ -from django.conf.urls import url +from django.conf.urls import re_path from . import views app_name = 'osf' urlpatterns = [ - url(r'^raw/(?P[a-z0-9._/]*)$', views.RawMetricsView.as_view(), name=views.RawMetricsView.view_name), - url(r'^preprints/views/$', views.PreprintViewMetrics.as_view(), name=views.PreprintViewMetrics.view_name), - url(r'^preprints/downloads/$', views.PreprintDownloadMetrics.as_view(), name=views.PreprintDownloadMetrics.view_name), - url(r'^registries_moderation/transitions/$', views.RegistriesModerationMetricsView.as_view(), name=views.RegistriesModerationMetricsView.view_name), + re_path(r'^raw/(?P[a-z0-9._/]*)$', views.RawMetricsView.as_view(), name=views.RawMetricsView.view_name), + re_path(r'^preprints/views/$', views.PreprintViewMetrics.as_view(), name=views.PreprintViewMetrics.view_name), + re_path(r'^preprints/downloads/$', views.PreprintDownloadMetrics.as_view(), name=views.PreprintDownloadMetrics.view_name), + re_path(r'^registries_moderation/transitions/$', views.RegistriesModerationMetricsView.as_view(), name=views.RegistriesModerationMetricsView.view_name), ] diff --git a/api/nodes/urls.py b/api/nodes/urls.py index cfe8fdf4a13..509118af0ed 100644 --- a/api/nodes/urls.py +++ b/api/nodes/urls.py @@ -1,4 +1,4 @@ -from django.conf.urls import url +from django.conf.urls import re_path from api.nodes import views @@ -6,51 +6,51 @@ urlpatterns = [ # Examples: - # url(r'^$', 'api.views.home', name='home'), - # url(r'^blog/', include('blog.urls')), - url(r'^$', views.NodeList.as_view(), name=views.NodeList.view_name), - url(r'^(?P\w+)/$', views.NodeDetail.as_view(), name=views.NodeDetail.view_name), - url(r'^(?P\w+)/addons/$', views.NodeAddonList.as_view(), name=views.NodeAddonList.view_name), - url(r'^(?P\w+)/addons/(?P\w+)/$', views.NodeAddonDetail.as_view(), name=views.NodeAddonDetail.view_name), - url(r'^(?P\w+)/addons/(?P\w+)/folders/$', views.NodeAddonFolderList.as_view(), name=views.NodeAddonFolderList.view_name), - url(r'^(?P\w+)/bibliographic_contributors/$', views.NodeBibliographicContributorsList.as_view(), name=views.NodeBibliographicContributorsList.view_name), - url(r'^(?P\w+)/children/$', views.NodeChildrenList.as_view(), name=views.NodeChildrenList.view_name), - url(r'^(?P\w+)/citation/$', views.NodeCitationDetail.as_view(), name=views.NodeCitationDetail.view_name), - url(r'^(?P\w+)/citation/(?P[-\w]+)/$', views.NodeCitationStyleDetail.as_view(), name=views.NodeCitationStyleDetail.view_name), - url(r'^(?P\w+)/comments/$', views.NodeCommentsList.as_view(), name=views.NodeCommentsList.view_name), - url(r'^(?P\w+)/contributors_and_group_members/$', views.NodeContributorsAndGroupMembersList.as_view(), name=views.NodeContributorsAndGroupMembersList.view_name), - url(r'^(?P\w+)/implicit_contributors/$', views.NodeImplicitContributorsList.as_view(), name=views.NodeImplicitContributorsList.view_name), - url(r'^(?P\w+)/contributors/$', views.NodeContributorsList.as_view(), name=views.NodeContributorsList.view_name), - url(r'^(?P\w+)/contributors/(?P\w+)/$', views.NodeContributorDetail.as_view(), name=views.NodeContributorDetail.view_name), - url(r'^(?P\w+)/draft_registrations/$', views.NodeDraftRegistrationsList.as_view(), name=views.NodeDraftRegistrationsList.view_name), - url(r'^(?P\w+)/draft_registrations/(?P\w+)/$', views.NodeDraftRegistrationDetail.as_view(), name=views.NodeDraftRegistrationDetail.view_name), - url(r'^(?P\w+)/files/$', views.NodeStorageProvidersList.as_view(), name=views.NodeStorageProvidersList.view_name), - url(r'^(?P\w+)/files/providers/(?P\w+)/?$', views.NodeStorageProviderDetail.as_view(), name=views.NodeStorageProviderDetail.view_name), - url(r'^(?P\w+)/files/(?P\w+)(?P/(?:.*/)?)$', views.NodeFilesList.as_view(), name=views.NodeFilesList.view_name), - url(r'^(?P\w+)/files/(?P\w+)(?P/.+[^/])$', views.NodeFileDetail.as_view(), name=views.NodeFileDetail.view_name), - url(r'^(?P\w+)/forks/$', views.NodeForksList.as_view(), name=views.NodeForksList.view_name), - url(r'^(?P\w+)/groups/$', views.NodeGroupsList.as_view(), name=views.NodeGroupsList.view_name), - url(r'^(?P\w+)/groups/(?P\w+)/$', views.NodeGroupsDetail.as_view(), name=views.NodeGroupsDetail.view_name), - url(r'^(?P\w+)/identifiers/$', views.NodeIdentifierList.as_view(), name=views.NodeIdentifierList.view_name), - url(r'^(?P\w+)/institutions/$', views.NodeInstitutionsList.as_view(), name=views.NodeInstitutionsList.view_name), - url(r'^(?P\w+)/linked_nodes/$', views.LinkedNodesList.as_view(), name=views.LinkedNodesList.view_name), - url(r'^(?P\w+)/linked_registrations/$', views.NodeLinkedRegistrationsList.as_view(), name=views.NodeLinkedRegistrationsList.view_name), - url(r'^(?P\w+)/logs/$', views.NodeLogList.as_view(), name=views.NodeLogList.view_name), - url(r'^(?P\w+)/node_links/$', views.NodeLinksList.as_view(), name=views.NodeLinksList.view_name), - url(r'^(?P\w+)/node_links/(?P\w+)/', views.NodeLinksDetail.as_view(), name=views.NodeLinksDetail.view_name), - url(r'^(?P\w+)/linked_by_nodes/$', views.NodeLinkedByNodesList.as_view(), name=views.NodeLinkedByNodesList.view_name), - url(r'^(?P\w+)/linked_by_registrations/$', views.NodeLinkedByRegistrationsList.as_view(), name=views.NodeLinkedByRegistrationsList.view_name), - url(r'^(?P\w+)/preprints/$', views.NodePreprintsList.as_view(), name=views.NodePreprintsList.view_name), - url(r'^(?P\w+)/registrations/$', views.NodeRegistrationsList.as_view(), name=views.NodeRegistrationsList.view_name), - url(r'^(?P\w+)/relationships/institutions/$', views.NodeInstitutionsRelationship.as_view(), name=views.NodeInstitutionsRelationship.view_name), - url(r'^(?P\w+)/relationships/linked_nodes/$', views.NodeLinkedNodesRelationship.as_view(), name=views.NodeLinkedNodesRelationship.view_name), - url(r'^(?P\w+)/relationships/linked_registrations/$', views.NodeLinkedRegistrationsRelationship.as_view(), name=views.NodeLinkedRegistrationsRelationship.view_name), - url(r'^(?P\w+)/relationships/subjects/$', views.NodeSubjectsRelationship.as_view(), name=views.NodeSubjectsRelationship.view_name), - url(r'^(?P\w+)/requests/$', views.NodeRequestListCreate.as_view(), name=views.NodeRequestListCreate.view_name), - url(r'^(?P\w+)/settings/$', views.NodeSettings.as_view(), name=views.NodeSettings.view_name), - url(r'^(?P\w+)/storage/$', views.NodeStorage.as_view(), name=views.NodeStorage.view_name), - url(r'^(?P\w+)/subjects/$', views.NodeSubjectsList.as_view(), name=views.NodeSubjectsList.view_name), - url(r'^(?P\w+)/view_only_links/$', views.NodeViewOnlyLinksList.as_view(), name=views.NodeViewOnlyLinksList.view_name), - url(r'^(?P\w+)/view_only_links/(?P\w+)/$', views.NodeViewOnlyLinkDetail.as_view(), name=views.NodeViewOnlyLinkDetail.view_name), - url(r'^(?P\w+)/wikis/$', views.NodeWikiList.as_view(), name=views.NodeWikiList.view_name), + # re_path(r'^$', 'api.views.home', name='home'), + # re_path(r'^blog/', include('blog.urls')), + re_path(r'^$', views.NodeList.as_view(), name=views.NodeList.view_name), + re_path(r'^(?P\w+)/$', views.NodeDetail.as_view(), name=views.NodeDetail.view_name), + re_path(r'^(?P\w+)/addons/$', views.NodeAddonList.as_view(), name=views.NodeAddonList.view_name), + re_path(r'^(?P\w+)/addons/(?P\w+)/$', views.NodeAddonDetail.as_view(), name=views.NodeAddonDetail.view_name), + re_path(r'^(?P\w+)/addons/(?P\w+)/folders/$', views.NodeAddonFolderList.as_view(), name=views.NodeAddonFolderList.view_name), + re_path(r'^(?P\w+)/bibliographic_contributors/$', views.NodeBibliographicContributorsList.as_view(), name=views.NodeBibliographicContributorsList.view_name), + re_path(r'^(?P\w+)/children/$', views.NodeChildrenList.as_view(), name=views.NodeChildrenList.view_name), + re_path(r'^(?P\w+)/citation/$', views.NodeCitationDetail.as_view(), name=views.NodeCitationDetail.view_name), + re_path(r'^(?P\w+)/citation/(?P[-\w]+)/$', views.NodeCitationStyleDetail.as_view(), name=views.NodeCitationStyleDetail.view_name), + re_path(r'^(?P\w+)/comments/$', views.NodeCommentsList.as_view(), name=views.NodeCommentsList.view_name), + re_path(r'^(?P\w+)/contributors_and_group_members/$', views.NodeContributorsAndGroupMembersList.as_view(), name=views.NodeContributorsAndGroupMembersList.view_name), + re_path(r'^(?P\w+)/implicit_contributors/$', views.NodeImplicitContributorsList.as_view(), name=views.NodeImplicitContributorsList.view_name), + re_path(r'^(?P\w+)/contributors/$', views.NodeContributorsList.as_view(), name=views.NodeContributorsList.view_name), + re_path(r'^(?P\w+)/contributors/(?P\w+)/$', views.NodeContributorDetail.as_view(), name=views.NodeContributorDetail.view_name), + re_path(r'^(?P\w+)/draft_registrations/$', views.NodeDraftRegistrationsList.as_view(), name=views.NodeDraftRegistrationsList.view_name), + re_path(r'^(?P\w+)/draft_registrations/(?P\w+)/$', views.NodeDraftRegistrationDetail.as_view(), name=views.NodeDraftRegistrationDetail.view_name), + re_path(r'^(?P\w+)/files/$', views.NodeStorageProvidersList.as_view(), name=views.NodeStorageProvidersList.view_name), + re_path(r'^(?P\w+)/files/providers/(?P\w+)/?$', views.NodeStorageProviderDetail.as_view(), name=views.NodeStorageProviderDetail.view_name), + re_path(r'^(?P\w+)/files/(?P\w+)(?P/(?:.*/)?)$', views.NodeFilesList.as_view(), name=views.NodeFilesList.view_name), + re_path(r'^(?P\w+)/files/(?P\w+)(?P/.+[^/])$', views.NodeFileDetail.as_view(), name=views.NodeFileDetail.view_name), + re_path(r'^(?P\w+)/forks/$', views.NodeForksList.as_view(), name=views.NodeForksList.view_name), + re_path(r'^(?P\w+)/groups/$', views.NodeGroupsList.as_view(), name=views.NodeGroupsList.view_name), + re_path(r'^(?P\w+)/groups/(?P\w+)/$', views.NodeGroupsDetail.as_view(), name=views.NodeGroupsDetail.view_name), + re_path(r'^(?P\w+)/identifiers/$', views.NodeIdentifierList.as_view(), name=views.NodeIdentifierList.view_name), + re_path(r'^(?P\w+)/institutions/$', views.NodeInstitutionsList.as_view(), name=views.NodeInstitutionsList.view_name), + re_path(r'^(?P\w+)/linked_nodes/$', views.LinkedNodesList.as_view(), name=views.LinkedNodesList.view_name), + re_path(r'^(?P\w+)/linked_registrations/$', views.NodeLinkedRegistrationsList.as_view(), name=views.NodeLinkedRegistrationsList.view_name), + re_path(r'^(?P\w+)/logs/$', views.NodeLogList.as_view(), name=views.NodeLogList.view_name), + re_path(r'^(?P\w+)/node_links/$', views.NodeLinksList.as_view(), name=views.NodeLinksList.view_name), + re_path(r'^(?P\w+)/node_links/(?P\w+)/', views.NodeLinksDetail.as_view(), name=views.NodeLinksDetail.view_name), + re_path(r'^(?P\w+)/linked_by_nodes/$', views.NodeLinkedByNodesList.as_view(), name=views.NodeLinkedByNodesList.view_name), + re_path(r'^(?P\w+)/linked_by_registrations/$', views.NodeLinkedByRegistrationsList.as_view(), name=views.NodeLinkedByRegistrationsList.view_name), + re_path(r'^(?P\w+)/preprints/$', views.NodePreprintsList.as_view(), name=views.NodePreprintsList.view_name), + re_path(r'^(?P\w+)/registrations/$', views.NodeRegistrationsList.as_view(), name=views.NodeRegistrationsList.view_name), + re_path(r'^(?P\w+)/relationships/institutions/$', views.NodeInstitutionsRelationship.as_view(), name=views.NodeInstitutionsRelationship.view_name), + re_path(r'^(?P\w+)/relationships/linked_nodes/$', views.NodeLinkedNodesRelationship.as_view(), name=views.NodeLinkedNodesRelationship.view_name), + re_path(r'^(?P\w+)/relationships/linked_registrations/$', views.NodeLinkedRegistrationsRelationship.as_view(), name=views.NodeLinkedRegistrationsRelationship.view_name), + re_path(r'^(?P\w+)/relationships/subjects/$', views.NodeSubjectsRelationship.as_view(), name=views.NodeSubjectsRelationship.view_name), + re_path(r'^(?P\w+)/requests/$', views.NodeRequestListCreate.as_view(), name=views.NodeRequestListCreate.view_name), + re_path(r'^(?P\w+)/settings/$', views.NodeSettings.as_view(), name=views.NodeSettings.view_name), + re_path(r'^(?P\w+)/storage/$', views.NodeStorage.as_view(), name=views.NodeStorage.view_name), + re_path(r'^(?P\w+)/subjects/$', views.NodeSubjectsList.as_view(), name=views.NodeSubjectsList.view_name), + re_path(r'^(?P\w+)/view_only_links/$', views.NodeViewOnlyLinksList.as_view(), name=views.NodeViewOnlyLinksList.view_name), + re_path(r'^(?P\w+)/view_only_links/(?P\w+)/$', views.NodeViewOnlyLinkDetail.as_view(), name=views.NodeViewOnlyLinkDetail.view_name), + re_path(r'^(?P\w+)/wikis/$', views.NodeWikiList.as_view(), name=views.NodeWikiList.view_name), ] diff --git a/api/osf_groups/urls.py b/api/osf_groups/urls.py index d877198eb10..1277772e94a 100644 --- a/api/osf_groups/urls.py +++ b/api/osf_groups/urls.py @@ -1,12 +1,12 @@ -from django.conf.urls import url +from django.conf.urls import re_path from api.osf_groups import views app_name = 'osf' urlpatterns = [ - url(r'^$', views.GroupList.as_view(), name=views.GroupList.view_name), - url(r'^(?P\w+)/$', views.GroupDetail.as_view(), name=views.GroupDetail.view_name), - url(r'^(?P\w+)/members/$', views.GroupMembersList.as_view(), name=views.GroupMembersList.view_name), - url(r'^(?P\w+)/members/(?P\w+)/$', views.GroupMemberDetail.as_view(), name=views.GroupMemberDetail.view_name), + re_path(r'^$', views.GroupList.as_view(), name=views.GroupList.view_name), + re_path(r'^(?P\w+)/$', views.GroupDetail.as_view(), name=views.GroupDetail.view_name), + re_path(r'^(?P\w+)/members/$', views.GroupMembersList.as_view(), name=views.GroupMembersList.view_name), + re_path(r'^(?P\w+)/members/(?P\w+)/$', views.GroupMemberDetail.as_view(), name=views.GroupMemberDetail.view_name), ] diff --git a/api/preprint_providers/urls.py b/api/preprint_providers/urls.py index 19a5c980fe0..dd1fe7ee3f7 100644 --- a/api/preprint_providers/urls.py +++ b/api/preprint_providers/urls.py @@ -1,17 +1,17 @@ -from django.conf.urls import url +from django.conf.urls import re_path from api.preprint_providers import views app_name = 'osf' urlpatterns = [ - url(r'^$', views.DeprecatedPreprintProviderList.as_view(), name=views.DeprecatedPreprintProviderList.view_name), - url(r'^(?P\w+)/$', views.DeprecatedPreprintProviderDetail.as_view(), name=views.DeprecatedPreprintProviderDetail.view_name), - url(r'^(?P\w+)/licenses/$', views.DeprecatedPreprintProviderLicenseList.as_view(), name=views.DeprecatedPreprintProviderLicenseList.view_name), - url(r'^(?P\w+)/preprints/$', views.DeprecatedPreprintProviderPreprintList.as_view(), name=views.DeprecatedPreprintProviderPreprintList.view_name), - url(r'^(?P\w+)/taxonomies/$', views.DeprecatedPreprintProviderTaxonomies.as_view(), name=views.DeprecatedPreprintProviderTaxonomies.view_name), - url(r'^(?P\w+)/taxonomies/highlighted/$', views.DeprecatedPreprintProviderHighlightedSubjectList.as_view(), name=views.DeprecatedPreprintProviderHighlightedSubjectList.view_name), - url(r'^(?P\w+)/moderators/$', views.DeprecatedPreprintProviderModeratorsList.as_view(), name=views.DeprecatedPreprintProviderModeratorsList.view_name), - url(r'^(?P\w+)/moderators/(?P\w+)/$', views.DeprecatedPreprintProviderModeratorsDetail.as_view(), name=views.DeprecatedPreprintProviderModeratorsDetail.view_name), + re_path(r'^$', views.DeprecatedPreprintProviderList.as_view(), name=views.DeprecatedPreprintProviderList.view_name), + re_path(r'^(?P\w+)/$', views.DeprecatedPreprintProviderDetail.as_view(), name=views.DeprecatedPreprintProviderDetail.view_name), + re_path(r'^(?P\w+)/licenses/$', views.DeprecatedPreprintProviderLicenseList.as_view(), name=views.DeprecatedPreprintProviderLicenseList.view_name), + re_path(r'^(?P\w+)/preprints/$', views.DeprecatedPreprintProviderPreprintList.as_view(), name=views.DeprecatedPreprintProviderPreprintList.view_name), + re_path(r'^(?P\w+)/taxonomies/$', views.DeprecatedPreprintProviderTaxonomies.as_view(), name=views.DeprecatedPreprintProviderTaxonomies.view_name), + re_path(r'^(?P\w+)/taxonomies/highlighted/$', views.DeprecatedPreprintProviderHighlightedSubjectList.as_view(), name=views.DeprecatedPreprintProviderHighlightedSubjectList.view_name), + re_path(r'^(?P\w+)/moderators/$', views.DeprecatedPreprintProviderModeratorsList.as_view(), name=views.DeprecatedPreprintProviderModeratorsList.view_name), + re_path(r'^(?P\w+)/moderators/(?P\w+)/$', views.DeprecatedPreprintProviderModeratorsDetail.as_view(), name=views.DeprecatedPreprintProviderModeratorsDetail.view_name), ] diff --git a/api/preprints/urls.py b/api/preprints/urls.py index b6e2332d98b..70c72d991f6 100644 --- a/api/preprints/urls.py +++ b/api/preprints/urls.py @@ -1,22 +1,22 @@ -from django.conf.urls import url +from django.conf.urls import re_path from . import views app_name = 'osf' urlpatterns = [ - url(r'^$', views.PreprintList.as_view(), name=views.PreprintList.view_name), - url(r'^(?P\w+)/$', views.PreprintDetail.as_view(), name=views.PreprintDetail.view_name), - url(r'^(?P\w+)/bibliographic_contributors/$', views.PreprintBibliographicContributorsList.as_view(), name=views.PreprintBibliographicContributorsList.view_name), - url(r'^(?P\w+)/citation/$', views.PreprintCitationDetail.as_view(), name=views.PreprintCitationDetail.view_name), - url(r'^(?P\w+)/citation/(?P[-\w]+)/$', views.PreprintCitationStyleDetail.as_view(), name=views.PreprintCitationStyleDetail.view_name), - url(r'^(?P\w+)/contributors/$', views.PreprintContributorsList.as_view(), name=views.PreprintContributorsList.view_name), - url(r'^(?P\w+)/contributors/(?P\w+)/$', views.PreprintContributorDetail.as_view(), name=views.PreprintContributorDetail.view_name), - url(r'^(?P\w+)/files/$', views.PreprintStorageProvidersList.as_view(), name=views.PreprintStorageProvidersList.view_name), - url(r'^(?P\w+)/files/osfstorage/$', views.PreprintFilesList.as_view(), name=views.PreprintFilesList.view_name), - url(r'^(?P\w+)/identifiers/$', views.PreprintIdentifierList.as_view(), name=views.PreprintIdentifierList.view_name), - url(r'^(?P\w+)/relationships/node/$', views.PreprintNodeRelationship.as_view(), name=views.PreprintNodeRelationship.view_name), - url(r'^(?P\w+)/review_actions/$', views.PreprintActionList.as_view(), name=views.PreprintActionList.view_name), - url(r'^(?P\w+)/requests/$', views.PreprintRequestListCreate.as_view(), name=views.PreprintRequestListCreate.view_name), - url(r'^(?P\w+)/subjects/$', views.PreprintSubjectsList.as_view(), name=views.PreprintSubjectsList.view_name), + re_path(r'^$', views.PreprintList.as_view(), name=views.PreprintList.view_name), + re_path(r'^(?P\w+)/$', views.PreprintDetail.as_view(), name=views.PreprintDetail.view_name), + re_path(r'^(?P\w+)/bibliographic_contributors/$', views.PreprintBibliographicContributorsList.as_view(), name=views.PreprintBibliographicContributorsList.view_name), + re_path(r'^(?P\w+)/citation/$', views.PreprintCitationDetail.as_view(), name=views.PreprintCitationDetail.view_name), + re_path(r'^(?P\w+)/citation/(?P[-\w]+)/$', views.PreprintCitationStyleDetail.as_view(), name=views.PreprintCitationStyleDetail.view_name), + re_path(r'^(?P\w+)/contributors/$', views.PreprintContributorsList.as_view(), name=views.PreprintContributorsList.view_name), + re_path(r'^(?P\w+)/contributors/(?P\w+)/$', views.PreprintContributorDetail.as_view(), name=views.PreprintContributorDetail.view_name), + re_path(r'^(?P\w+)/files/$', views.PreprintStorageProvidersList.as_view(), name=views.PreprintStorageProvidersList.view_name), + re_path(r'^(?P\w+)/files/osfstorage/$', views.PreprintFilesList.as_view(), name=views.PreprintFilesList.view_name), + re_path(r'^(?P\w+)/identifiers/$', views.PreprintIdentifierList.as_view(), name=views.PreprintIdentifierList.view_name), + re_path(r'^(?P\w+)/relationships/node/$', views.PreprintNodeRelationship.as_view(), name=views.PreprintNodeRelationship.view_name), + re_path(r'^(?P\w+)/review_actions/$', views.PreprintActionList.as_view(), name=views.PreprintActionList.view_name), + re_path(r'^(?P\w+)/requests/$', views.PreprintRequestListCreate.as_view(), name=views.PreprintRequestListCreate.view_name), + re_path(r'^(?P\w+)/subjects/$', views.PreprintSubjectsList.as_view(), name=views.PreprintSubjectsList.view_name), ] diff --git a/api/providers/urls.py b/api/providers/urls.py index 0bb2ef6b26b..a0c787d1c76 100644 --- a/api/providers/urls.py +++ b/api/providers/urls.py @@ -1,67 +1,67 @@ -from django.conf.urls import include, url +from django.conf.urls import include, re_path from api.providers import views app_name = 'osf' urlpatterns = [ - url( + re_path( r'^preprints/', include( ( [ - url(r'^$', views.PreprintProviderList.as_view(), name=views.PreprintProviderList.view_name), - url(r'^(?P\w+)/$', views.PreprintProviderDetail.as_view(), name=views.PreprintProviderDetail.view_name), - url(r'^(?P\w+)/licenses/$', views.PreprintProviderLicenseList.as_view(), name=views.PreprintProviderLicenseList.view_name), - url(r'^(?P\w+)/preprints/$', views.PreprintProviderPreprintList.as_view(), name=views.PreprintProviderPreprintList.view_name), - url(r'^(?P\w+)/subjects/$', views.PreprintProviderSubjects.as_view(), name=views.PreprintProviderSubjects.view_name), - url(r'^(?P\w+)/subjects/highlighted/$', views.PreprintProviderHighlightedSubjectList.as_view(), name=views.PreprintProviderHighlightedSubjectList.view_name), - url(r'^(?P\w+)/taxonomies/$', views.PreprintProviderTaxonomies.as_view(), name=views.PreprintProviderTaxonomies.view_name), - url(r'^(?P\w+)/taxonomies/highlighted/$', views.PreprintProviderHighlightedTaxonomyList.as_view(), name=views.PreprintProviderHighlightedTaxonomyList.view_name), - url(r'^(?P\w+)/withdraw_requests/$', views.PreprintProviderWithdrawRequestList.as_view(), name=views.PreprintProviderWithdrawRequestList.view_name), - url(r'^(?P\w+)/moderators/$', views.PreprintProviderModeratorsList.as_view(), name=views.PreprintProviderModeratorsList.view_name), - url(r'^(?P\w+)/moderators/(?P\w+)/$', views.PreprintProviderModeratorsDetail.as_view(), name=views.PreprintProviderModeratorsDetail.view_name), + re_path(r'^$', views.PreprintProviderList.as_view(), name=views.PreprintProviderList.view_name), + re_path(r'^(?P\w+)/$', views.PreprintProviderDetail.as_view(), name=views.PreprintProviderDetail.view_name), + re_path(r'^(?P\w+)/licenses/$', views.PreprintProviderLicenseList.as_view(), name=views.PreprintProviderLicenseList.view_name), + re_path(r'^(?P\w+)/preprints/$', views.PreprintProviderPreprintList.as_view(), name=views.PreprintProviderPreprintList.view_name), + re_path(r'^(?P\w+)/subjects/$', views.PreprintProviderSubjects.as_view(), name=views.PreprintProviderSubjects.view_name), + re_path(r'^(?P\w+)/subjects/highlighted/$', views.PreprintProviderHighlightedSubjectList.as_view(), name=views.PreprintProviderHighlightedSubjectList.view_name), + re_path(r'^(?P\w+)/taxonomies/$', views.PreprintProviderTaxonomies.as_view(), name=views.PreprintProviderTaxonomies.view_name), + re_path(r'^(?P\w+)/taxonomies/highlighted/$', views.PreprintProviderHighlightedTaxonomyList.as_view(), name=views.PreprintProviderHighlightedTaxonomyList.view_name), + re_path(r'^(?P\w+)/withdraw_requests/$', views.PreprintProviderWithdrawRequestList.as_view(), name=views.PreprintProviderWithdrawRequestList.view_name), + re_path(r'^(?P\w+)/moderators/$', views.PreprintProviderModeratorsList.as_view(), name=views.PreprintProviderModeratorsList.view_name), + re_path(r'^(?P\w+)/moderators/(?P\w+)/$', views.PreprintProviderModeratorsDetail.as_view(), name=views.PreprintProviderModeratorsDetail.view_name), ], 'preprints', ), namespace='preprint-providers', ), ), - url( + re_path( r'^collections/', include( ( [ - url(r'^$', views.CollectionProviderList.as_view(), name=views.CollectionProviderList.view_name), - url(r'^(?P\w+)/$', views.CollectionProviderDetail.as_view(), name=views.CollectionProviderDetail.view_name), - url(r'^(?P\w+)/licenses/$', views.CollectionProviderLicenseList.as_view(), name=views.CollectionProviderLicenseList.view_name), - url(r'^(?P\w+)/submissions/$', views.CollectionProviderSubmissionList.as_view(), name=views.CollectionProviderSubmissionList.view_name), - url(r'^(?P\w+)/subjects/$', views.CollectionProviderSubjects.as_view(), name=views.CollectionProviderSubjects.view_name), - url(r'^(?P\w+)/subjects/highlighted/$', views.CollectionProviderHighlightedSubjectList.as_view(), name=views.CollectionProviderHighlightedSubjectList.view_name), - url(r'^(?P\w+)/taxonomies/$', views.CollectionProviderTaxonomies.as_view(), name=views.CollectionProviderTaxonomies.view_name), - url(r'^(?P\w+)/taxonomies/highlighted/$', views.CollectionProviderHighlightedTaxonomyList.as_view(), name=views.CollectionProviderHighlightedTaxonomyList.view_name), + re_path(r'^$', views.CollectionProviderList.as_view(), name=views.CollectionProviderList.view_name), + re_path(r'^(?P\w+)/$', views.CollectionProviderDetail.as_view(), name=views.CollectionProviderDetail.view_name), + re_path(r'^(?P\w+)/licenses/$', views.CollectionProviderLicenseList.as_view(), name=views.CollectionProviderLicenseList.view_name), + re_path(r'^(?P\w+)/submissions/$', views.CollectionProviderSubmissionList.as_view(), name=views.CollectionProviderSubmissionList.view_name), + re_path(r'^(?P\w+)/subjects/$', views.CollectionProviderSubjects.as_view(), name=views.CollectionProviderSubjects.view_name), + re_path(r'^(?P\w+)/subjects/highlighted/$', views.CollectionProviderHighlightedSubjectList.as_view(), name=views.CollectionProviderHighlightedSubjectList.view_name), + re_path(r'^(?P\w+)/taxonomies/$', views.CollectionProviderTaxonomies.as_view(), name=views.CollectionProviderTaxonomies.view_name), + re_path(r'^(?P\w+)/taxonomies/highlighted/$', views.CollectionProviderHighlightedTaxonomyList.as_view(), name=views.CollectionProviderHighlightedTaxonomyList.view_name), ], 'collections', ), namespace='collection-providers', ), ), - url( + re_path( r'^registrations/', include( ( [ - url(r'^$', views.RegistrationProviderList.as_view(), name=views.RegistrationProviderList.view_name), - url(r'^(?P\w+)/$', views.RegistrationProviderDetail.as_view(), name=views.RegistrationProviderDetail.view_name), - url(r'^(?P\w+)/licenses/$', views.RegistrationProviderLicenseList.as_view(), name=views.RegistrationProviderLicenseList.view_name), - url(r'^(?P\w+)/schemas/$', views.RegistrationProviderSchemaList.as_view(), name=views.RegistrationProviderSchemaList.view_name), - url(r'^(?P\w+)/submissions/$', views.RegistrationProviderSubmissionList.as_view(), name=views.RegistrationProviderSubmissionList.view_name), - url(r'^(?P\w+)/subjects/$', views.RegistrationProviderSubjects.as_view(), name=views.RegistrationProviderSubjects.view_name), - url(r'^(?P\w+)/subjects/highlighted/$', views.RegistrationProviderHighlightedSubjectList.as_view(), name=views.RegistrationProviderHighlightedSubjectList.view_name), - url(r'^(?P\w+)/taxonomies/$', views.RegistrationProviderTaxonomies.as_view(), name=views.RegistrationProviderTaxonomies.view_name), - url(r'^(?P\w+)/taxonomies/highlighted/$', views.RegistrationProviderHighlightedTaxonomyList.as_view(), name=views.RegistrationProviderHighlightedTaxonomyList.view_name), - url(r'^(?P\w+)/requests/$', views.RegistrationProviderRequestList.as_view(), name=views.RegistrationProviderRequestList.view_name), - url(r'^(?P\w+)/registrations/$', views.RegistrationProviderRegistrationList.as_view(), name=views.RegistrationProviderRegistrationList.view_name), - url(r'^(?P\w+)/actions/$', views.RegistrationProviderActionList.as_view(), name=views.RegistrationProviderActionList.view_name), - url(r'^(?P\w+)/moderators/$', views.RegistrationProviderModeratorsList.as_view(), name=views.RegistrationProviderModeratorsList.view_name), - url(r'^(?P\w+)/moderators/(?P\w+)/$', views.RegistrationProviderModeratorsDetail.as_view(), name=views.RegistrationProviderModeratorsDetail.view_name), + re_path(r'^$', views.RegistrationProviderList.as_view(), name=views.RegistrationProviderList.view_name), + re_path(r'^(?P\w+)/$', views.RegistrationProviderDetail.as_view(), name=views.RegistrationProviderDetail.view_name), + re_path(r'^(?P\w+)/licenses/$', views.RegistrationProviderLicenseList.as_view(), name=views.RegistrationProviderLicenseList.view_name), + re_path(r'^(?P\w+)/schemas/$', views.RegistrationProviderSchemaList.as_view(), name=views.RegistrationProviderSchemaList.view_name), + re_path(r'^(?P\w+)/submissions/$', views.RegistrationProviderSubmissionList.as_view(), name=views.RegistrationProviderSubmissionList.view_name), + re_path(r'^(?P\w+)/subjects/$', views.RegistrationProviderSubjects.as_view(), name=views.RegistrationProviderSubjects.view_name), + re_path(r'^(?P\w+)/subjects/highlighted/$', views.RegistrationProviderHighlightedSubjectList.as_view(), name=views.RegistrationProviderHighlightedSubjectList.view_name), + re_path(r'^(?P\w+)/taxonomies/$', views.RegistrationProviderTaxonomies.as_view(), name=views.RegistrationProviderTaxonomies.view_name), + re_path(r'^(?P\w+)/taxonomies/highlighted/$', views.RegistrationProviderHighlightedTaxonomyList.as_view(), name=views.RegistrationProviderHighlightedTaxonomyList.view_name), + re_path(r'^(?P\w+)/requests/$', views.RegistrationProviderRequestList.as_view(), name=views.RegistrationProviderRequestList.view_name), + re_path(r'^(?P\w+)/registrations/$', views.RegistrationProviderRegistrationList.as_view(), name=views.RegistrationProviderRegistrationList.view_name), + re_path(r'^(?P\w+)/actions/$', views.RegistrationProviderActionList.as_view(), name=views.RegistrationProviderActionList.view_name), + re_path(r'^(?P\w+)/moderators/$', views.RegistrationProviderModeratorsList.as_view(), name=views.RegistrationProviderModeratorsList.view_name), + re_path(r'^(?P\w+)/moderators/(?P\w+)/$', views.RegistrationProviderModeratorsDetail.as_view(), name=views.RegistrationProviderModeratorsDetail.view_name), ], 'registrations', ), namespace='registration-providers', diff --git a/api/regions/urls.py b/api/regions/urls.py index c9fa96f5c26..2fc93caa590 100644 --- a/api/regions/urls.py +++ b/api/regions/urls.py @@ -1,11 +1,11 @@ -from django.conf.urls import url +from django.conf.urls import re_path from api.regions import views app_name = 'osf' urlpatterns = [ - url(r'^$', views.RegionList.as_view(), name=views.RegionList.view_name), - url(r'^(?P[-\w]+)/$', views.RegionDetail.as_view(), name=views.RegionDetail.view_name), + re_path(r'^$', views.RegionList.as_view(), name=views.RegionList.view_name), + re_path(r'^(?P[-\w]+)/$', views.RegionDetail.as_view(), name=views.RegionDetail.view_name), ] diff --git a/api/registrations/urls.py b/api/registrations/urls.py index 20d4ab3d5b7..8e61c684096 100644 --- a/api/registrations/urls.py +++ b/api/registrations/urls.py @@ -1,4 +1,4 @@ -from django.conf.urls import url +from django.conf.urls import re_path from api.registrations import views from website import settings @@ -7,47 +7,47 @@ urlpatterns = [ # Examples: - # url(r'^$', 'api.views.home', name='home'), - # url(r'^blog/', include('blog.urls')), - url(r'^$', views.RegistrationList.as_view(), name=views.RegistrationList.view_name), - url(r'^(?P\w+)/$', views.RegistrationDetail.as_view(), name=views.RegistrationDetail.view_name), - url(r'^(?P\w+)/bibliographic_contributors/$', views.RegistrationBibliographicContributorsList.as_view(), name=views.RegistrationBibliographicContributorsList.view_name), - url(r'^(?P\w+)/children/$', views.RegistrationChildrenList.as_view(), name=views.RegistrationChildrenList.view_name), - url(r'^(?P\w+)/comments/$', views.RegistrationCommentsList.as_view(), name=views.RegistrationCommentsList.view_name), - url(r'^(?P\w+)/contributors/$', views.RegistrationContributorsList.as_view(), name=views.RegistrationContributorsList.view_name), - url(r'^(?P\w+)/contributors/(?P\w+)/$', views.RegistrationContributorDetail.as_view(), name=views.RegistrationContributorDetail.view_name), - url(r'^(?P\w+)/implicit_contributors/$', views.RegistrationImplicitContributorsList.as_view(), name=views.RegistrationImplicitContributorsList.view_name), - url(r'^(?P\w+)/files/$', views.RegistrationStorageProvidersList.as_view(), name=views.RegistrationStorageProvidersList.view_name), - url(r'^(?P\w+)/files/(?P\w+)(?P/(?:.*/)?)$', views.RegistrationFilesList.as_view(), name=views.RegistrationFilesList.view_name), - url(r'^(?P\w+)/files/(?P\w+)(?P/.+[^/])$', views.RegistrationFileDetail.as_view(), name=views.RegistrationFileDetail.view_name), - url(r'^(?P\w+)/citation/$', views.RegistrationCitationDetail.as_view(), name=views.RegistrationCitationDetail.view_name), - url(r'^(?P\w+)/citation/(?P[-\w]+)/$', views.RegistrationCitationStyleDetail.as_view(), name=views.RegistrationCitationStyleDetail.view_name), - url(r'^(?P\w+)/forks/$', views.RegistrationForksList.as_view(), name=views.RegistrationForksList.view_name), - url(r'^(?P\w+)/identifiers/$', views.RegistrationIdentifierList.as_view(), name=views.RegistrationIdentifierList.view_name), - url(r'^(?P\w+)/institutions/$', views.RegistrationInstitutionsList.as_view(), name=views.RegistrationInstitutionsList.view_name), - url(r'^(?P\w+)/relationships/institutions/$', views.RegistrationInstitutionsRelationship.as_view(), name=views.RegistrationInstitutionsRelationship.view_name), - url(r'^(?P\w+)/relationships/subjects/$', views.RegistrationSubjectsRelationship.as_view(), name=views.RegistrationSubjectsRelationship.view_name), - url(r'^(?P\w+)/linked_nodes/$', views.RegistrationLinkedNodesList.as_view(), name=views.RegistrationLinkedNodesList.view_name), - url(r'^(?P\w+)/linked_registrations/$', views.RegistrationLinkedRegistrationsList.as_view(), name=views.RegistrationLinkedRegistrationsList.view_name), - url(r'^(?P\w+)/linked_by_nodes/$', views.RegistrationLinkedByNodesList.as_view(), name=views.RegistrationLinkedByNodesList.view_name), - url(r'^(?P\w+)/linked_by_registrations/$', views.RegistrationLinkedByRegistrationsList.as_view(), name=views.RegistrationLinkedByRegistrationsList.view_name), - url(r'^(?P\w+)/logs/$', views.RegistrationLogList.as_view(), name=views.RegistrationLogList.view_name), - url(r'^(?P\w+)/node_links/$', views.RegistrationNodeLinksList.as_view(), name=views.RegistrationNodeLinksList.view_name), - url(r'^(?P\w+)/node_links/(?P\w+)/', views.RegistrationNodeLinksDetail.as_view(), name=views.RegistrationNodeLinksDetail.view_name), - url(r'^(?P\w+)/relationships/linked_nodes/$', views.RegistrationLinkedNodesRelationship.as_view(), name=views.RegistrationLinkedNodesRelationship.view_name), - url(r'^(?P\w+)/relationships/linked_registrations/$', views.RegistrationLinkedRegistrationsRelationship.as_view(), name=views.RegistrationLinkedRegistrationsRelationship.view_name), - url(r'^(?P\w+)/subjects/$', views.RegistrationSubjectsList.as_view(), name=views.RegistrationSubjectsList.view_name), - url(r'^(?P\w+)/view_only_links/$', views.RegistrationViewOnlyLinksList.as_view(), name=views.RegistrationViewOnlyLinksList.view_name), - url(r'^(?P\w+)/view_only_links/(?P\w+)/$', views.RegistrationViewOnlyLinkDetail.as_view(), name=views.RegistrationViewOnlyLinkDetail.view_name), - url(r'^(?P\w+)/wikis/$', views.RegistrationWikiList.as_view(), name=views.RegistrationWikiList.view_name), - url(r'^(?P\w+)/actions/$', views.RegistrationActionList.as_view(), name=views.RegistrationActionList.view_name), - url(r'^(?P\w+)/requests/$', views.RegistrationRequestList.as_view(), name=views.RegistrationRequestList.view_name), - url(r'^(?P\w+)/schema_responses/$', views.RegistrationSchemaResponseList.as_view(), name=views.RegistrationSchemaResponseList.view_name), - url(r'^(?P\w+)/resources/$', views.RegistrationResourceList.as_view(), name=views.RegistrationResourceList.view_name), + # re_path(r'^$', 'api.views.home', name='home'), + # re_path(r'^blog/', include('blog.urls')), + re_path(r'^$', views.RegistrationList.as_view(), name=views.RegistrationList.view_name), + re_path(r'^(?P\w+)/$', views.RegistrationDetail.as_view(), name=views.RegistrationDetail.view_name), + re_path(r'^(?P\w+)/bibliographic_contributors/$', views.RegistrationBibliographicContributorsList.as_view(), name=views.RegistrationBibliographicContributorsList.view_name), + re_path(r'^(?P\w+)/children/$', views.RegistrationChildrenList.as_view(), name=views.RegistrationChildrenList.view_name), + re_path(r'^(?P\w+)/comments/$', views.RegistrationCommentsList.as_view(), name=views.RegistrationCommentsList.view_name), + re_path(r'^(?P\w+)/contributors/$', views.RegistrationContributorsList.as_view(), name=views.RegistrationContributorsList.view_name), + re_path(r'^(?P\w+)/contributors/(?P\w+)/$', views.RegistrationContributorDetail.as_view(), name=views.RegistrationContributorDetail.view_name), + re_path(r'^(?P\w+)/implicit_contributors/$', views.RegistrationImplicitContributorsList.as_view(), name=views.RegistrationImplicitContributorsList.view_name), + re_path(r'^(?P\w+)/files/$', views.RegistrationStorageProvidersList.as_view(), name=views.RegistrationStorageProvidersList.view_name), + re_path(r'^(?P\w+)/files/(?P\w+)(?P/(?:.*/)?)$', views.RegistrationFilesList.as_view(), name=views.RegistrationFilesList.view_name), + re_path(r'^(?P\w+)/files/(?P\w+)(?P/.+[^/])$', views.RegistrationFileDetail.as_view(), name=views.RegistrationFileDetail.view_name), + re_path(r'^(?P\w+)/citation/$', views.RegistrationCitationDetail.as_view(), name=views.RegistrationCitationDetail.view_name), + re_path(r'^(?P\w+)/citation/(?P[-\w]+)/$', views.RegistrationCitationStyleDetail.as_view(), name=views.RegistrationCitationStyleDetail.view_name), + re_path(r'^(?P\w+)/forks/$', views.RegistrationForksList.as_view(), name=views.RegistrationForksList.view_name), + re_path(r'^(?P\w+)/identifiers/$', views.RegistrationIdentifierList.as_view(), name=views.RegistrationIdentifierList.view_name), + re_path(r'^(?P\w+)/institutions/$', views.RegistrationInstitutionsList.as_view(), name=views.RegistrationInstitutionsList.view_name), + re_path(r'^(?P\w+)/relationships/institutions/$', views.RegistrationInstitutionsRelationship.as_view(), name=views.RegistrationInstitutionsRelationship.view_name), + re_path(r'^(?P\w+)/relationships/subjects/$', views.RegistrationSubjectsRelationship.as_view(), name=views.RegistrationSubjectsRelationship.view_name), + re_path(r'^(?P\w+)/linked_nodes/$', views.RegistrationLinkedNodesList.as_view(), name=views.RegistrationLinkedNodesList.view_name), + re_path(r'^(?P\w+)/linked_registrations/$', views.RegistrationLinkedRegistrationsList.as_view(), name=views.RegistrationLinkedRegistrationsList.view_name), + re_path(r'^(?P\w+)/linked_by_nodes/$', views.RegistrationLinkedByNodesList.as_view(), name=views.RegistrationLinkedByNodesList.view_name), + re_path(r'^(?P\w+)/linked_by_registrations/$', views.RegistrationLinkedByRegistrationsList.as_view(), name=views.RegistrationLinkedByRegistrationsList.view_name), + re_path(r'^(?P\w+)/logs/$', views.RegistrationLogList.as_view(), name=views.RegistrationLogList.view_name), + re_path(r'^(?P\w+)/node_links/$', views.RegistrationNodeLinksList.as_view(), name=views.RegistrationNodeLinksList.view_name), + re_path(r'^(?P\w+)/node_links/(?P\w+)/', views.RegistrationNodeLinksDetail.as_view(), name=views.RegistrationNodeLinksDetail.view_name), + re_path(r'^(?P\w+)/relationships/linked_nodes/$', views.RegistrationLinkedNodesRelationship.as_view(), name=views.RegistrationLinkedNodesRelationship.view_name), + re_path(r'^(?P\w+)/relationships/linked_registrations/$', views.RegistrationLinkedRegistrationsRelationship.as_view(), name=views.RegistrationLinkedRegistrationsRelationship.view_name), + re_path(r'^(?P\w+)/subjects/$', views.RegistrationSubjectsList.as_view(), name=views.RegistrationSubjectsList.view_name), + re_path(r'^(?P\w+)/view_only_links/$', views.RegistrationViewOnlyLinksList.as_view(), name=views.RegistrationViewOnlyLinksList.view_name), + re_path(r'^(?P\w+)/view_only_links/(?P\w+)/$', views.RegistrationViewOnlyLinkDetail.as_view(), name=views.RegistrationViewOnlyLinkDetail.view_name), + re_path(r'^(?P\w+)/wikis/$', views.RegistrationWikiList.as_view(), name=views.RegistrationWikiList.view_name), + re_path(r'^(?P\w+)/actions/$', views.RegistrationActionList.as_view(), name=views.RegistrationActionList.view_name), + re_path(r'^(?P\w+)/requests/$', views.RegistrationRequestList.as_view(), name=views.RegistrationRequestList.view_name), + re_path(r'^(?P\w+)/schema_responses/$', views.RegistrationSchemaResponseList.as_view(), name=views.RegistrationSchemaResponseList.view_name), + re_path(r'^(?P\w+)/resources/$', views.RegistrationResourceList.as_view(), name=views.RegistrationResourceList.view_name), ] # Routes only active in local/staging environments if settings.DEV_MODE: urlpatterns.extend([ - url(r'^(?P\w+)/registrations/$', views.RegistrationRegistrationsList.as_view(), name=views.RegistrationRegistrationsList.view_name), + re_path(r'^(?P\w+)/registrations/$', views.RegistrationRegistrationsList.as_view(), name=views.RegistrationRegistrationsList.view_name), ]) diff --git a/api/requests/urls.py b/api/requests/urls.py index 9fc4a6747cc..5af0771a3a1 100644 --- a/api/requests/urls.py +++ b/api/requests/urls.py @@ -1,8 +1,8 @@ -from django.conf.urls import url +from django.conf.urls import re_path from . import views urlpatterns = [ - url(r'^(?P\w+)/$', views.RequestDetail.as_view(), name=views.RequestDetail.view_name), - url(r'^(?P\w+)/actions/$', views.RequestActionList.as_view(), name=views.RequestActionList.view_name), + re_path(r'^(?P\w+)/$', views.RequestDetail.as_view(), name=views.RequestDetail.view_name), + re_path(r'^(?P\w+)/actions/$', views.RequestActionList.as_view(), name=views.RequestActionList.view_name), ] diff --git a/api/resources/urls.py b/api/resources/urls.py index d46f7c1eb7f..e25a6143228 100644 --- a/api/resources/urls.py +++ b/api/resources/urls.py @@ -1,15 +1,15 @@ -from django.conf.urls import url +from django.conf.urls import re_path from api.resources import views app_name = 'osf' urlpatterns = [ - url( + re_path( r'^$', views.ResourceList.as_view(), name=views.ResourceList.view_name, ), - url( + re_path( r'^(?P\w+)/$', views.ResourceDetail.as_view(), name=views.ResourceDetail.view_name, diff --git a/api/schema_responses/urls.py b/api/schema_responses/urls.py index 3fe069aa737..60cd15677e6 100644 --- a/api/schema_responses/urls.py +++ b/api/schema_responses/urls.py @@ -1,23 +1,23 @@ -from django.conf.urls import url +from django.conf.urls import re_path from api.schema_responses import views app_name = 'osf' urlpatterns = [ - url( + re_path( r'^$', views.SchemaResponseList.as_view(), name=views.SchemaResponseList.view_name, ), - url( + re_path( r'^(?P\w+)/$', views.SchemaResponseDetail.as_view(), name=views.SchemaResponseDetail.view_name, ), - url( + re_path( r'^(?P\w+)/actions/$', views.SchemaResponseActionList.as_view(), name=views.SchemaResponseActionList.view_name, ), - url( + re_path( r'^(?P\w+)/actions/(?P\w+)/$', views.SchemaResponseActionDetail.as_view(), name=views.SchemaResponseActionDetail.view_name, ), diff --git a/api/schemas/urls.py b/api/schemas/urls.py index 9aa9c833596..782bf8e9525 100644 --- a/api/schemas/urls.py +++ b/api/schemas/urls.py @@ -1,14 +1,14 @@ -from django.conf.urls import url +from django.conf.urls import re_path from api.schemas import views app_name = 'osf' urlpatterns = [ - url(r'^registrations/$', views.RegistrationSchemaList.as_view(), name=views.RegistrationSchemaList.view_name), - url(r'^registrations/(?P\w+)/$', views.RegistrationSchemaDetail.as_view(), name=views.RegistrationSchemaDetail.view_name), - url(r'^files/$', views.FileMetadataSchemaList.as_view(), name=views.FileMetadataSchemaList.view_name), - url(r'^files/(?P\w+)/$', views.FileMetadataSchemaDetail.as_view(), name=views.FileMetadataSchemaDetail.view_name), - url(r'^registrations/(?P\w+)/schema_blocks/$', views.RegistrationSchemaBlocks.as_view(), name=views.RegistrationSchemaBlocks.view_name), - url(r'^registrations/(?P\w+)/schema_blocks/(?P\w+)/$', views.RegistrationSchemaBlockDetail.as_view(), name=views.RegistrationSchemaBlockDetail.view_name), + re_path(r'^registrations/$', views.RegistrationSchemaList.as_view(), name=views.RegistrationSchemaList.view_name), + re_path(r'^registrations/(?P\w+)/$', views.RegistrationSchemaDetail.as_view(), name=views.RegistrationSchemaDetail.view_name), + re_path(r'^files/$', views.FileMetadataSchemaList.as_view(), name=views.FileMetadataSchemaList.view_name), + re_path(r'^files/(?P\w+)/$', views.FileMetadataSchemaDetail.as_view(), name=views.FileMetadataSchemaDetail.view_name), + re_path(r'^registrations/(?P\w+)/schema_blocks/$', views.RegistrationSchemaBlocks.as_view(), name=views.RegistrationSchemaBlocks.view_name), + re_path(r'^registrations/(?P\w+)/schema_blocks/(?P\w+)/$', views.RegistrationSchemaBlockDetail.as_view(), name=views.RegistrationSchemaBlockDetail.view_name), ] diff --git a/api/scopes/urls.py b/api/scopes/urls.py index f3228bdf1d1..278476b1ba6 100644 --- a/api/scopes/urls.py +++ b/api/scopes/urls.py @@ -1,10 +1,10 @@ -from django.conf.urls import url +from django.conf.urls import re_path from api.scopes import views app_name = 'osf' urlpatterns = [ - url(r'^$', views.ScopeList.as_view(), name=views.ScopeList.view_name), - url(r'^(?P[a-z0-9._]+)/$', views.ScopeDetail.as_view(), name=views.ScopeDetail.view_name), + re_path(r'^$', views.ScopeList.as_view(), name=views.ScopeList.view_name), + re_path(r'^(?P[a-z0-9._]+)/$', views.ScopeDetail.as_view(), name=views.ScopeDetail.view_name), ] diff --git a/api/search/urls.py b/api/search/urls.py index 7f1dad7a5bb..95ed8d05acb 100644 --- a/api/search/urls.py +++ b/api/search/urls.py @@ -1,19 +1,19 @@ -from django.conf.urls import url +from django.conf.urls import re_path from api.search import views app_name = 'osf' urlpatterns = [ - url(r'^$', views.Search.as_view(), name=views.Search.view_name), - url(r'^components/$', views.SearchComponents.as_view(), name=views.SearchComponents.view_name), - url(r'^files/$', views.SearchFiles.as_view(), name=views.SearchFiles.view_name), - url(r'^projects/$', views.SearchProjects.as_view(), name=views.SearchProjects.view_name), - url(r'^registrations/$', views.SearchRegistrations.as_view(), name=views.SearchRegistrations.view_name), - url(r'^users/$', views.SearchUsers.as_view(), name=views.SearchUsers.view_name), - url(r'^institutions/$', views.SearchInstitutions.as_view(), name=views.SearchInstitutions.view_name), - url(r'^collections/$', views.SearchCollections.as_view(), name=views.SearchCollections.view_name), + re_path(r'^$', views.Search.as_view(), name=views.Search.view_name), + re_path(r'^components/$', views.SearchComponents.as_view(), name=views.SearchComponents.view_name), + re_path(r'^files/$', views.SearchFiles.as_view(), name=views.SearchFiles.view_name), + re_path(r'^projects/$', views.SearchProjects.as_view(), name=views.SearchProjects.view_name), + re_path(r'^registrations/$', views.SearchRegistrations.as_view(), name=views.SearchRegistrations.view_name), + re_path(r'^users/$', views.SearchUsers.as_view(), name=views.SearchUsers.view_name), + re_path(r'^institutions/$', views.SearchInstitutions.as_view(), name=views.SearchInstitutions.view_name), + re_path(r'^collections/$', views.SearchCollections.as_view(), name=views.SearchCollections.view_name), # not currently supported by v1, but should be supported by v2 - # url(r'^nodes/$', views.SearchProjects.as_view(), name=views.SearchProjects.view_name), + # re_path(r'^nodes/$', views.SearchProjects.as_view(), name=views.SearchProjects.view_name), ] diff --git a/api/sparse/urls.py b/api/sparse/urls.py index 16af5ce630a..15551a2e2a4 100644 --- a/api/sparse/urls.py +++ b/api/sparse/urls.py @@ -1,68 +1,68 @@ -from django.conf.urls import url +from django.conf.urls import re_path from api.sparse import views app_name = 'osf' urlpatterns = [ - url( + re_path( r'^nodes/$', views.SparseNodeList.as_view(), name=views.SparseNodeList.view_name, ), - url( + re_path( r'^nodes/(?P\w+)/$', views.SparseNodeDetail.as_view(), name=views.SparseNodeDetail.view_name, ), - url( + re_path( r'^nodes/(?P\w+)/children/$', views.SparseNodeChildrenList.as_view(), name=views.SparseNodeChildrenList.view_name, ), - url( + re_path( r'^nodes/(?P\w+)/linked_nodes/$', views.SparseLinkedNodesList.as_view(), name=views.SparseLinkedNodesList.view_name, ), - url( + re_path( r'^nodes/(?P\w+)/linked_registrations/$', views.SparseLinkedRegistrationsList.as_view(), name=views.SparseLinkedRegistrationsList.view_name, ), - url( + re_path( r'^registrations/$', views.SparseRegistrationList.as_view(), name=views.SparseRegistrationList.view_name, ), - url( + re_path( r'^registrations/(?P\w+)/$', views.SparseRegistrationDetail.as_view(), name=views.SparseRegistrationDetail.view_name, ), - url( + re_path( r'^registrations/(?P\w+)/children/$', views.SparseRegistrationChildrenList.as_view(), name=views.SparseRegistrationChildrenList.view_name, ), - url( + re_path( r'^registrations/(?P\w+)/linked_nodes/$', views.SparseLinkedNodesList.as_view(), name=views.SparseLinkedNodesList.view_name, ), - url( + re_path( r'^registrations/(?P\w+)/linked_registrations/$', views.SparseLinkedRegistrationsList.as_view(), name=views.SparseLinkedRegistrationsList.view_name, ), - url( + re_path( r'^users/(?P\w+)/nodes/$', views.SparseUserNodeList.as_view(), name=views.SparseUserNodeList.view_name, ), - url( + re_path( r'^users/(?P\w+)/registrations/$', views.SparseUserRegistrationList.as_view(), name=views.SparseUserRegistrationList.view_name, diff --git a/api/subjects/urls.py b/api/subjects/urls.py index ad76bd8125d..e80581e179d 100644 --- a/api/subjects/urls.py +++ b/api/subjects/urls.py @@ -1,10 +1,10 @@ -from django.conf.urls import url +from django.conf.urls import re_path from api.subjects import views app_name = 'osf' urlpatterns = [ - url(r'^(?P\w+)/$', views.SubjectDetail.as_view(), name=views.SubjectDetail.view_name), - url(r'^(?P\w+)/children/$', views.SubjectChildrenList.as_view(), name=views.SubjectChildrenList.view_name), + re_path(r'^(?P\w+)/$', views.SubjectDetail.as_view(), name=views.SubjectDetail.view_name), + re_path(r'^(?P\w+)/children/$', views.SubjectChildrenList.as_view(), name=views.SubjectChildrenList.view_name), ] diff --git a/api/subscriptions/urls.py b/api/subscriptions/urls.py index dee2fe75374..8ac729318c2 100644 --- a/api/subscriptions/urls.py +++ b/api/subscriptions/urls.py @@ -1,10 +1,10 @@ -from django.conf.urls import url +from django.conf.urls import re_path from api.subscriptions import views app_name = 'osf' urlpatterns = [ - url(r'^$', views.SubscriptionList.as_view(), name=views.SubscriptionList.view_name), - url(r'^(?P\w+)/$', views.SubscriptionDetail.as_view(), name=views.SubscriptionDetail.view_name), + re_path(r'^$', views.SubscriptionList.as_view(), name=views.SubscriptionList.view_name), + re_path(r'^(?P\w+)/$', views.SubscriptionDetail.as_view(), name=views.SubscriptionDetail.view_name), ] diff --git a/api/taxonomies/urls.py b/api/taxonomies/urls.py index 920d63c67e3..24d865b74eb 100644 --- a/api/taxonomies/urls.py +++ b/api/taxonomies/urls.py @@ -1,10 +1,10 @@ -from django.conf.urls import url +from django.conf.urls import re_path from api.taxonomies import views app_name = 'osf' urlpatterns = [ - url(r'^$', views.TaxonomyList.as_view(), name=views.TaxonomyList.view_name), - url(r'^(?P\w+)/$', views.TaxonomyDetail.as_view(), name=views.TaxonomyDetail.view_name), + re_path(r'^$', views.TaxonomyList.as_view(), name=views.TaxonomyList.view_name), + re_path(r'^(?P\w+)/$', views.TaxonomyDetail.as_view(), name=views.TaxonomyDetail.view_name), ] diff --git a/api/test/urls.py b/api/test/urls.py index 8d181292311..c4d1b265f39 100644 --- a/api/test/urls.py +++ b/api/test/urls.py @@ -1,9 +1,9 @@ -from django.conf.urls import url +from django.conf.urls import re_path from api.test import views app_name = 'osf' urlpatterns = [ - url(r'^throttle/', views.test_throttling, name='test-throttling'), + re_path(r'^throttle/', views.test_throttling, name='test-throttling'), ] diff --git a/api/tokens/urls.py b/api/tokens/urls.py index a2f1672dc28..241388bec0f 100644 --- a/api/tokens/urls.py +++ b/api/tokens/urls.py @@ -1,11 +1,11 @@ -from django.conf.urls import url +from django.conf.urls import re_path from api.tokens import views app_name = 'osf' urlpatterns = [ - url(r'^$', views.TokenList.as_view(), name='token-list'), - url(r'^(?P<_id>\w+)/$', views.TokenDetail.as_view(), name='token-detail'), - url(r'^(?P<_id>\w+)/scopes/$', views.TokenScopesList.as_view(), name='token-scopes-list'), + re_path(r'^$', views.TokenList.as_view(), name='token-list'), + re_path(r'^(?P<_id>\w+)/$', views.TokenDetail.as_view(), name='token-detail'), + re_path(r'^(?P<_id>\w+)/scopes/$', views.TokenScopesList.as_view(), name='token-scopes-list'), ] diff --git a/api/users/urls.py b/api/users/urls.py index 009baf4927e..d6fea1d2737 100644 --- a/api/users/urls.py +++ b/api/users/urls.py @@ -1,29 +1,29 @@ -from django.conf.urls import url +from django.conf.urls import re_path from . import views app_name = 'osf' urlpatterns = [ - url(r'^$', views.UserList.as_view(), name=views.UserList.view_name), - url(r'^(?P\w+)/$', views.UserDetail.as_view(), name=views.UserDetail.view_name), - url(r'^(?P\w+)/addons/$', views.UserAddonList.as_view(), name=views.UserAddonList.view_name), - url(r'^(?P\w+)/addons/(?P\w+)/$', views.UserAddonDetail.as_view(), name=views.UserAddonDetail.view_name), - url(r'^(?P\w+)/addons/(?P\w+)/accounts/$', views.UserAddonAccountList.as_view(), name=views.UserAddonAccountList.view_name), - url(r'^(?P\w+)/addons/(?P\w+)/accounts/(?P\w+)/$', views.UserAddonAccountDetail.as_view(), name=views.UserAddonAccountDetail.view_name), - url(r'^(?P\w+)/claim/$', views.ClaimUser.as_view(), name=views.ClaimUser.view_name), - url(r'^(?P\w+)/draft_registrations/$', views.UserDraftRegistrations.as_view(), name=views.UserDraftRegistrations.view_name), - url(r'^(?P\w+)/institutions/$', views.UserInstitutions.as_view(), name=views.UserInstitutions.view_name), - url(r'^(?P\w+)/nodes/$', views.UserNodes.as_view(), name=views.UserNodes.view_name), - url(r'^(?P\w+)/groups/$', views.UserGroups.as_view(), name=views.UserGroups.view_name), - url(r'^(?P\w+)/preprints/$', views.UserPreprints.as_view(), name=views.UserPreprints.view_name), - url(r'^(?P\w+)/registrations/$', views.UserRegistrations.as_view(), name=views.UserRegistrations.view_name), - url(r'^(?P\w+)/settings/$', views.UserSettings.as_view(), name=views.UserSettings.view_name), - url(r'^(?P\w+)/quickfiles/$', views.UserQuickFiles.as_view(), name=views.UserQuickFiles.view_name), - url(r'^(?P\w+)/relationships/institutions/$', views.UserInstitutionsRelationship.as_view(), name=views.UserInstitutionsRelationship.view_name), - url(r'^(?P\w+)/settings/emails/$', views.UserEmailsList.as_view(), name=views.UserEmailsList.view_name), - url(r'^(?P\w+)/settings/emails/(?P\w+)/$', views.UserEmailsDetail.as_view(), name=views.UserEmailsDetail.view_name), - url(r'^(?P\w+)/settings/identities/$', views.UserIdentitiesList.as_view(), name=views.UserIdentitiesList.view_name), - url(r'^(?P\w+)/settings/identities/(?P\w+)/$', views.UserIdentitiesDetail.as_view(), name=views.UserIdentitiesDetail.view_name), - url(r'^(?P\w+)/settings/export/$', views.UserAccountExport.as_view(), name=views.UserAccountExport.view_name), - url(r'^(?P\w+)/settings/password/$', views.UserChangePassword.as_view(), name=views.UserChangePassword.view_name), + re_path(r'^$', views.UserList.as_view(), name=views.UserList.view_name), + re_path(r'^(?P\w+)/$', views.UserDetail.as_view(), name=views.UserDetail.view_name), + re_path(r'^(?P\w+)/addons/$', views.UserAddonList.as_view(), name=views.UserAddonList.view_name), + re_path(r'^(?P\w+)/addons/(?P\w+)/$', views.UserAddonDetail.as_view(), name=views.UserAddonDetail.view_name), + re_path(r'^(?P\w+)/addons/(?P\w+)/accounts/$', views.UserAddonAccountList.as_view(), name=views.UserAddonAccountList.view_name), + re_path(r'^(?P\w+)/addons/(?P\w+)/accounts/(?P\w+)/$', views.UserAddonAccountDetail.as_view(), name=views.UserAddonAccountDetail.view_name), + re_path(r'^(?P\w+)/claim/$', views.ClaimUser.as_view(), name=views.ClaimUser.view_name), + re_path(r'^(?P\w+)/draft_registrations/$', views.UserDraftRegistrations.as_view(), name=views.UserDraftRegistrations.view_name), + re_path(r'^(?P\w+)/institutions/$', views.UserInstitutions.as_view(), name=views.UserInstitutions.view_name), + re_path(r'^(?P\w+)/nodes/$', views.UserNodes.as_view(), name=views.UserNodes.view_name), + re_path(r'^(?P\w+)/groups/$', views.UserGroups.as_view(), name=views.UserGroups.view_name), + re_path(r'^(?P\w+)/preprints/$', views.UserPreprints.as_view(), name=views.UserPreprints.view_name), + re_path(r'^(?P\w+)/registrations/$', views.UserRegistrations.as_view(), name=views.UserRegistrations.view_name), + re_path(r'^(?P\w+)/settings/$', views.UserSettings.as_view(), name=views.UserSettings.view_name), + re_path(r'^(?P\w+)/quickfiles/$', views.UserQuickFiles.as_view(), name=views.UserQuickFiles.view_name), + re_path(r'^(?P\w+)/relationships/institutions/$', views.UserInstitutionsRelationship.as_view(), name=views.UserInstitutionsRelationship.view_name), + re_path(r'^(?P\w+)/settings/emails/$', views.UserEmailsList.as_view(), name=views.UserEmailsList.view_name), + re_path(r'^(?P\w+)/settings/emails/(?P\w+)/$', views.UserEmailsDetail.as_view(), name=views.UserEmailsDetail.view_name), + re_path(r'^(?P\w+)/settings/identities/$', views.UserIdentitiesList.as_view(), name=views.UserIdentitiesList.view_name), + re_path(r'^(?P\w+)/settings/identities/(?P\w+)/$', views.UserIdentitiesDetail.as_view(), name=views.UserIdentitiesDetail.view_name), + re_path(r'^(?P\w+)/settings/export/$', views.UserAccountExport.as_view(), name=views.UserAccountExport.view_name), + re_path(r'^(?P\w+)/settings/password/$', views.UserChangePassword.as_view(), name=views.UserChangePassword.view_name), ] diff --git a/api/view_only_links/urls.py b/api/view_only_links/urls.py index 79da5d3bf83..42630cf976a 100644 --- a/api/view_only_links/urls.py +++ b/api/view_only_links/urls.py @@ -1,11 +1,11 @@ -from django.conf.urls import url +from django.conf.urls import re_path from api.view_only_links import views app_name = 'osf' urlpatterns = [ - url(r'^(?P\w+)/$', views.ViewOnlyLinkDetail.as_view(), name=views.ViewOnlyLinkDetail.view_name), - url(r'^(?P\w+)/nodes/$', views.ViewOnlyLinkNodes.as_view(), name=views.ViewOnlyLinkNodes.view_name), - url(r'^(?P\w+)/relationships/nodes/$', views.ViewOnlyLinkNodesRelationships.as_view(), name=views.ViewOnlyLinkNodesRelationships.view_name), + re_path(r'^(?P\w+)/$', views.ViewOnlyLinkDetail.as_view(), name=views.ViewOnlyLinkDetail.view_name), + re_path(r'^(?P\w+)/nodes/$', views.ViewOnlyLinkNodes.as_view(), name=views.ViewOnlyLinkNodes.view_name), + re_path(r'^(?P\w+)/relationships/nodes/$', views.ViewOnlyLinkNodesRelationships.as_view(), name=views.ViewOnlyLinkNodesRelationships.view_name), ] diff --git a/api/waffle/urls.py b/api/waffle/urls.py index 6bb86bcf02d..daf2beb69f1 100644 --- a/api/waffle/urls.py +++ b/api/waffle/urls.py @@ -1,7 +1,7 @@ -from django.conf.urls import url +from django.conf.urls import re_path from . import views urlpatterns = [ - url(r'^$', views.WaffleList.as_view(), name=views.WaffleList.view_name), + re_path(r'^$', views.WaffleList.as_view(), name=views.WaffleList.view_name), ] diff --git a/api/wb/urls.py b/api/wb/urls.py index f203c57b899..1f50368e642 100644 --- a/api/wb/urls.py +++ b/api/wb/urls.py @@ -1,9 +1,9 @@ -from django.conf.urls import url +from django.conf.urls import re_path from api.wb import views app_name = 'osf' urlpatterns = [ - url(r'^hooks/(?P\w+)/move/', views.MoveFileMetadataView.as_view(), name=views.MoveFileMetadataView.view_name), - url(r'^hooks/(?P\w+)/copy/', views.CopyFileMetadataView.as_view(), name=views.CopyFileMetadataView.view_name), + re_path(r'^hooks/(?P\w+)/move/', views.MoveFileMetadataView.as_view(), name=views.MoveFileMetadataView.view_name), + re_path(r'^hooks/(?P\w+)/copy/', views.CopyFileMetadataView.as_view(), name=views.CopyFileMetadataView.view_name), ] diff --git a/api/wikis/urls.py b/api/wikis/urls.py index 290f787f05a..34b7c540ace 100644 --- a/api/wikis/urls.py +++ b/api/wikis/urls.py @@ -1,12 +1,12 @@ -from django.conf.urls import url +from django.conf.urls import re_path from api.wikis import views app_name = 'osf' urlpatterns = [ - url(r'^(?P\w+)/$', views.WikiDetail.as_view(), name=views.WikiDetail.view_name), - url(r'^(?P\w+)/content/$', views.WikiContent.as_view(), name=views.WikiContent.view_name), - url(r'^(?P\w+)/versions/$', views.WikiVersions.as_view(), name=views.WikiVersions.view_name), - url(r'^(?P\w+)/versions/(?P\w+)/$', views.WikiVersionDetail.as_view(), name=views.WikiVersionDetail.view_name), - url(r'^(?P\w+)/versions/(?P\w+)/content/$', views.WikiVersionContent.as_view(), name=views.WikiVersionContent.view_name), + re_path(r'^(?P\w+)/$', views.WikiDetail.as_view(), name=views.WikiDetail.view_name), + re_path(r'^(?P\w+)/content/$', views.WikiContent.as_view(), name=views.WikiContent.view_name), + re_path(r'^(?P\w+)/versions/$', views.WikiVersions.as_view(), name=views.WikiVersions.view_name), + re_path(r'^(?P\w+)/versions/(?P\w+)/$', views.WikiVersionDetail.as_view(), name=views.WikiVersionDetail.view_name), + re_path(r'^(?P\w+)/versions/(?P\w+)/content/$', views.WikiVersionContent.as_view(), name=views.WikiVersionContent.view_name), ] From 95c9c834308fe970670f204b08b8940e1fcdbd14 Mon Sep 17 00:00:00 2001 From: John Tordoff <> Date: Wed, 14 Sep 2022 11:11:19 -0400 Subject: [PATCH 65/72] Fix middleware order and replace deprecated staticfiles with static --- admin/base/settings/defaults.py | 2 +- admin/templates/base.html | 2 +- admin/templates/institutions/register_institutional_admin.html | 2 +- .../templates/preprint_providers/register_moderator_admin.html | 2 +- admin/templates/register.html | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/admin/base/settings/defaults.py b/admin/base/settings/defaults.py index 8b47a06ca49..09cac7f1881 100644 --- a/admin/base/settings/defaults.py +++ b/admin/base/settings/defaults.py @@ -153,8 +153,8 @@ 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', - 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', + 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', 'django.middleware.security.SecurityMiddleware', diff --git a/admin/templates/base.html b/admin/templates/base.html index c3bc9086a07..d85bd31f226 100644 --- a/admin/templates/base.html +++ b/admin/templates/base.html @@ -1,4 +1,4 @@ -{% load staticfiles %} +{% load static %} {% load render_bundle from webpack_loader %} diff --git a/admin/templates/institutions/register_institutional_admin.html b/admin/templates/institutions/register_institutional_admin.html index e191d639a64..c1e94d3105e 100644 --- a/admin/templates/institutions/register_institutional_admin.html +++ b/admin/templates/institutions/register_institutional_admin.html @@ -1,6 +1,6 @@ {% extends 'base.html' %} {% load render_bundle from webpack_loader %} -{% load staticfiles %} +{% load static %} {% block content %}
diff --git a/admin/templates/preprint_providers/register_moderator_admin.html b/admin/templates/preprint_providers/register_moderator_admin.html index 0da303ce1db..999df746786 100644 --- a/admin/templates/preprint_providers/register_moderator_admin.html +++ b/admin/templates/preprint_providers/register_moderator_admin.html @@ -1,6 +1,6 @@ {% extends 'base.html' %} {% load render_bundle from webpack_loader %} -{% load staticfiles %} +{% load static %} {% block content %}
diff --git a/admin/templates/register.html b/admin/templates/register.html index d1e5b4b1855..de587bb552a 100644 --- a/admin/templates/register.html +++ b/admin/templates/register.html @@ -1,6 +1,6 @@ {% extends 'base.html' %} {% load render_bundle from webpack_loader %} -{% load staticfiles %} +{% load static %} {% block content %}
From ba02936dc335e719ae39cd348fb6f62ea5725897 Mon Sep 17 00:00:00 2001 From: John Tordoff <> Date: Wed, 14 Sep 2022 10:49:30 -0400 Subject: [PATCH 66/72] remove nullboolean fields to prevent depreciation warning --- addons/osfstorage/models.py | 2 +- api/preprints/serializers.py | 2 +- osf/migrations/0001_initial.py | 24 ++++++++++++------------ osf/models/mixins.py | 6 +++--- osf/models/node.py | 2 +- osf/models/preprint.py | 2 +- osf/models/provider.py | 6 +++--- osf/models/registrations.py | 4 ++-- 8 files changed, 24 insertions(+), 24 deletions(-) diff --git a/addons/osfstorage/models.py b/addons/osfstorage/models.py index 2a39fd8ceb2..3b386e8b76d 100644 --- a/addons/osfstorage/models.py +++ b/addons/osfstorage/models.py @@ -411,7 +411,7 @@ def save(self, skip_search=False, *args, **kwargs): class OsfStorageFolder(OsfStorageFileNode, Folder): - is_root = models.NullBooleanField() + is_root = models.BooleanField(null=True, blank=True) objects = OsfStorageFolderManager() diff --git a/api/preprints/serializers.py b/api/preprints/serializers.py index 2a379d93bed..a93d8db3472 100644 --- a/api/preprints/serializers.py +++ b/api/preprints/serializers.py @@ -201,7 +201,7 @@ class PreprintSerializer(TaxonomizableSerializerMixin, MetricsSerializerMixin, J }, ) - has_coi = ser.NullBooleanField(required=False) + has_coi = ser.BooleanField(required=False, allow_null=True) conflict_of_interest_statement = ser.CharField(required=False, allow_blank=True, allow_null=True) has_data_links = ser.ChoiceField(Preprint.HAS_LINKS_CHOICES, required=False) why_no_data = ser.CharField(required=False, allow_blank=True, allow_null=True) diff --git a/osf/migrations/0001_initial.py b/osf/migrations/0001_initial.py index fa56ead6091..41a22832a9b 100644 --- a/osf/migrations/0001_initial.py +++ b/osf/migrations/0001_initial.py @@ -118,7 +118,7 @@ class Migration(migrations.Migration): ('description', models.TextField(blank=True, default='')), ('category', models.CharField(blank=True, choices=[('analysis', 'Analysis'), ('communication', 'Communication'), ('data', 'Data'), ('hypothesis', 'Hypothesis'), ('instrumentation', 'Instrumentation'), ('methods and measures', 'Methods and Measures'), ('procedure', 'Procedure'), ('project', 'Project'), ('software', 'Software'), ('other', 'Other'), ('', 'Uncategorized')], default='', max_length=255)), ('registration_responses', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=dict, encoder=osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONEncoder)), - ('registration_responses_migrated', models.NullBooleanField(db_index=True, default=True)), + ('registration_responses_migrated', models.BooleanField(null=True, db_index=True, default=True)), ('type', models.CharField(choices=[('osf.node', 'node'), ('osf.draftnode', 'draft node'), ('osf.registration', 'registration'), ('osf.quickfilesnode', 'quick files node')], db_index=True, max_length=255)), ('child_node_subscriptions', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=dict, encoder=osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONEncoder)), ('deleted_date', osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True)), @@ -128,7 +128,7 @@ class Migration(migrations.Migration): ('is_fork', models.BooleanField(db_index=True, default=False)), ('is_public', models.BooleanField(db_index=True, default=False)), ('is_deleted', models.BooleanField(db_index=True, default=False)), - ('access_requests_enabled', models.NullBooleanField(db_index=True, default=True)), + ('access_requests_enabled', models.BooleanField(null=True, db_index=True, default=True)), ('custom_citation', models.TextField(blank=True, null=True)), ('comment_level', models.CharField(default='public', max_length=10)), ('article_doi', models.CharField(blank=True, max_length=128, null=True, validators=[osf.models.validators.validate_doi])), @@ -139,10 +139,10 @@ class Migration(migrations.Migration): ('wiki_private_uuids', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=dict, encoder=osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONEncoder)), ('keenio_read_key', models.CharField(blank=True, max_length=1000, null=True)), ('registered_date', osf.utils.fields.NonNaiveDateTimeField(blank=True, db_index=True, null=True)), - ('external_registration', models.NullBooleanField(default=False)), + ('external_registration', models.BooleanField(null=True, default=False)), ('registered_meta', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=dict, encoder=osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONEncoder, null=True)), ('files_count', models.PositiveIntegerField(blank=True, null=True)), - ('branched_from_node', models.NullBooleanField()), + ('branched_from_node', models.BooleanField(null=True)), ('moderation_state', models.CharField(choices=[('undefined', 'Undefined'), ('initial', 'Initial'), ('reverted', 'Reverted'), ('pending', 'Pending'), ('rejected', 'Rejected'), ('accepted', 'Accepted'), ('embargo', 'Embargo'), ('pending_embargo_termination', 'PendingEmbargoTermination'), ('pending_withdraw_request', 'PendingWithdrawRequest'), ('pending_withdraw', 'PendingWithdraw'), ('withdrawn', 'Withdrawn')], default='initial', max_length=30, null=True)), ('ia_url', models.URLField(blank=True, help_text='Where the archive.org data for the registration is stored', null=True)), ('additional_metadata', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, encoder=osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONEncoder, null=True)), @@ -161,8 +161,8 @@ class Migration(migrations.Migration): ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), ('_id', models.CharField(db_index=True, default=osf.models.base.generate_object_id, max_length=24)), ('reviews_workflow', models.CharField(blank=True, choices=[(None, 'None'), ('pre-moderation', 'Pre-Moderation'), ('post-moderation', 'Post-Moderation')], max_length=15, null=True)), - ('reviews_comments_private', models.NullBooleanField()), - ('reviews_comments_anonymous', models.NullBooleanField()), + ('reviews_comments_private', models.BooleanField(null=True)), + ('reviews_comments_anonymous', models.BooleanField(null=True)), ('type', models.CharField(choices=[('osf.collectionprovider', 'collection provider'), ('osf.registrationprovider', 'registration provider'), ('osf.preprintprovider', 'preprint provider')], db_index=True, max_length=255)), ('name', models.CharField(max_length=128)), ('advisory_board', models.TextField(blank=True, default='')), @@ -189,9 +189,9 @@ class Migration(migrations.Migration): ('share_title', models.TextField(blank=True, default='')), ('doi_prefix', models.CharField(blank=True, max_length=32, null=True)), ('additional_metadata_fields', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, encoder=osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONEncoder, null=True)), - ('bulk_upload_auto_approval', models.NullBooleanField(default=False)), - ('allow_updates', models.NullBooleanField(default=False)), - ('allow_bulk_uploads', models.NullBooleanField(default=False)), + ('bulk_upload_auto_approval', models.BooleanField(null=True, default=False)), + ('allow_updates', models.BooleanField(null=True, default=False)), + ('allow_bulk_uploads', models.BooleanField(null=True, default=False)), ('additional_providers', django.contrib.postgres.fields.ArrayField(base_field=models.CharField(max_length=200), blank=True, default=list, null=True, size=None)), ('preprint_word', models.CharField(choices=[('preprint', 'Preprint'), ('paper', 'Paper'), ('thesis', 'Thesis'), ('work', 'Work'), ('none', 'None')], default='preprint', max_length=10, null=True)), ('subjects_acceptable', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=list, encoder=osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONEncoder, null=True)), @@ -354,7 +354,7 @@ class Migration(migrations.Migration): ('deleted_on', osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True)), ('deleted', osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True)), ('purged', osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True)), - ('is_root', models.NullBooleanField()), + ('is_root', models.BooleanField(blank=True, null=True)), ('checkout', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), ('copied_from', models.ForeignKey(blank=True, default=None, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='copy_of', to='osf.BaseFileNode')), ('deleted_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='files_deleted_by', to=settings.AUTH_USER_MODEL)), @@ -612,7 +612,7 @@ class Migration(migrations.Migration): ('description', models.TextField(blank=True, default='')), ('category', models.CharField(blank=True, choices=[('analysis', 'Analysis'), ('communication', 'Communication'), ('data', 'Data'), ('hypothesis', 'Hypothesis'), ('instrumentation', 'Instrumentation'), ('methods and measures', 'Methods and Measures'), ('procedure', 'Procedure'), ('project', 'Project'), ('software', 'Software'), ('other', 'Other'), ('', 'Uncategorized')], default='', max_length=255)), ('registration_responses', osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONField(blank=True, default=dict, encoder=osf.utils.datetime_aware_jsonfield.DateTimeAwareJSONEncoder)), - ('registration_responses_migrated', models.NullBooleanField(db_index=True, default=True)), + ('registration_responses_migrated', models.BooleanField(null=True, db_index=True, default=True)), ('title', models.TextField(blank=True, default='', validators=[osf.models.validators.validate_title])), ('datetime_initiated', osf.utils.fields.NonNaiveDateTimeField(auto_now_add=True)), ('datetime_updated', osf.utils.fields.NonNaiveDateTimeField(auto_now=True)), @@ -1238,7 +1238,7 @@ class Migration(migrations.Migration): ('deleted', osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True)), ('migrated', osf.utils.fields.NonNaiveDateTimeField(blank=True, null=True)), ('conflict_of_interest_statement', models.TextField(blank=True, null=True)), - ('has_coi', models.NullBooleanField()), + ('has_coi', models.BooleanField(null=True)), ('has_prereg_links', models.TextField(blank=True, choices=[('available', 'Available'), ('no', 'No'), ('not_applicable', 'Not applicable')], null=True)), ('why_no_prereg', models.TextField(blank=True, null=True)), ('prereg_links', django.contrib.postgres.fields.ArrayField(base_field=models.URLField(blank=True, null=True), blank=True, null=True, size=None)), diff --git a/osf/models/mixins.py b/osf/models/mixins.py index cb6962ad868..f6b9621af7b 100644 --- a/osf/models/mixins.py +++ b/osf/models/mixins.py @@ -966,8 +966,8 @@ class Meta: abstract = True reviews_workflow = models.CharField(null=True, blank=True, max_length=15, choices=Workflows.choices()) - reviews_comments_private = models.NullBooleanField() - reviews_comments_anonymous = models.NullBooleanField() + reviews_comments_private = models.BooleanField(null=True, blank=True) + reviews_comments_anonymous = models.BooleanField(null=True, blank=True) DEFAULT_SUBSCRIPTIONS = ['new_pending_submissions'] @@ -2165,7 +2165,7 @@ class RegistrationResponseMixin(models.Model): Mixin to be shared between DraftRegistrations and Registrations. """ registration_responses = DateTimeAwareJSONField(default=dict, blank=True) - registration_responses_migrated = models.NullBooleanField(default=True, db_index=True) + registration_responses_migrated = models.BooleanField(null=True, default=True, db_index=True) def get_registration_metadata(self, schema): raise NotImplementedError() diff --git a/osf/models/node.py b/osf/models/node.py index 4fa9183f41e..961f62e8416 100644 --- a/osf/models/node.py +++ b/osf/models/node.py @@ -329,7 +329,7 @@ class AbstractNode(DirtyFieldsMixin, TypedModel, AddonModelMixin, IdentifierMixi is_fork = models.BooleanField(default=False, db_index=True) is_public = models.BooleanField(default=False, db_index=True) is_deleted = models.BooleanField(default=False, db_index=True) - access_requests_enabled = models.NullBooleanField(default=True, db_index=True) + access_requests_enabled = models.BooleanField(null=True, default=True, db_index=True) custom_citation = models.TextField(blank=True, null=True) diff --git a/osf/models/preprint.py b/osf/models/preprint.py index 32028eefa3a..157886e475f 100644 --- a/osf/models/preprint.py +++ b/osf/models/preprint.py @@ -206,7 +206,7 @@ class Preprint(DirtyFieldsMixin, GuidMixin, IdentifierMixin, ReviewableMixin, Ba blank=True, null=True, ) - has_coi = models.NullBooleanField( + has_coi = models.BooleanField( blank=True, null=True ) diff --git a/osf/models/provider.py b/osf/models/provider.py index 7791e7f7aed..02a17d2a453 100644 --- a/osf/models/provider.py +++ b/osf/models/provider.py @@ -287,9 +287,9 @@ class RegistrationProvider(AbstractProvider): # [{'field_name': 'foo'}, {'field_name': 'bar'}] additional_metadata_fields = DateTimeAwareJSONField(blank=True, null=True) default_schema = models.ForeignKey('osf.registrationschema', related_name='default_schema', null=True, blank=True, on_delete=models.SET_NULL) - bulk_upload_auto_approval = models.NullBooleanField(default=False) - allow_updates = models.NullBooleanField(default=False) - allow_bulk_uploads = models.NullBooleanField(default=False) + bulk_upload_auto_approval = models.BooleanField(null=True, default=False) + allow_updates = models.BooleanField(null=True, default=False) + allow_bulk_uploads = models.BooleanField(null=True, default=False) def __init__(self, *args, **kwargs): self._meta.get_field('share_publish_type').default = 'Registration' diff --git a/osf/models/registrations.py b/osf/models/registrations.py index bb0e7708e69..dd6f428574d 100644 --- a/osf/models/registrations.py +++ b/osf/models/registrations.py @@ -104,7 +104,7 @@ class Registration(AbstractNode): # This is a NullBooleanField because of inheritance issues with using a BooleanField # TODO: Update to BooleanField(default=False, null=True) when Django is updated to >=2.1 - external_registration = models.NullBooleanField(default=False) + external_registration = models.BooleanField(null=True, default=False) registered_user = models.ForeignKey(OSFUser, related_name='related_to', on_delete=models.SET_NULL, @@ -136,7 +136,7 @@ class Registration(AbstractNode): null=True, blank=True, on_delete=models.SET_NULL) files_count = models.PositiveIntegerField(blank=True, null=True) - branched_from_node = models.NullBooleanField(blank=True, null=True) + branched_from_node = models.BooleanField(null=True, blank=True) moderation_state = models.CharField( max_length=30, From fd42db479298df82d828b0b20c60b5bc56c2ae70 Mon Sep 17 00:00:00 2001 From: John Tordoff <> Date: Wed, 14 Sep 2022 11:11:19 -0400 Subject: [PATCH 67/72] fix admin app depreciating staticfiles for Django 3 upgrade --- admin/base/settings/defaults.py | 2 +- admin/templates/base.html | 2 +- admin/templates/institutions/register_institutional_admin.html | 2 +- .../templates/preprint_providers/register_moderator_admin.html | 2 +- admin/templates/register.html | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/admin/base/settings/defaults.py b/admin/base/settings/defaults.py index 8b47a06ca49..09cac7f1881 100644 --- a/admin/base/settings/defaults.py +++ b/admin/base/settings/defaults.py @@ -153,8 +153,8 @@ 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', - 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', + 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', 'django.middleware.security.SecurityMiddleware', diff --git a/admin/templates/base.html b/admin/templates/base.html index c3bc9086a07..d85bd31f226 100644 --- a/admin/templates/base.html +++ b/admin/templates/base.html @@ -1,4 +1,4 @@ -{% load staticfiles %} +{% load static %} {% load render_bundle from webpack_loader %} diff --git a/admin/templates/institutions/register_institutional_admin.html b/admin/templates/institutions/register_institutional_admin.html index e191d639a64..c1e94d3105e 100644 --- a/admin/templates/institutions/register_institutional_admin.html +++ b/admin/templates/institutions/register_institutional_admin.html @@ -1,6 +1,6 @@ {% extends 'base.html' %} {% load render_bundle from webpack_loader %} -{% load staticfiles %} +{% load static %} {% block content %}
diff --git a/admin/templates/preprint_providers/register_moderator_admin.html b/admin/templates/preprint_providers/register_moderator_admin.html index 0da303ce1db..999df746786 100644 --- a/admin/templates/preprint_providers/register_moderator_admin.html +++ b/admin/templates/preprint_providers/register_moderator_admin.html @@ -1,6 +1,6 @@ {% extends 'base.html' %} {% load render_bundle from webpack_loader %} -{% load staticfiles %} +{% load static %} {% block content %}
diff --git a/admin/templates/register.html b/admin/templates/register.html index d1e5b4b1855..de587bb552a 100644 --- a/admin/templates/register.html +++ b/admin/templates/register.html @@ -1,6 +1,6 @@ {% extends 'base.html' %} {% load render_bundle from webpack_loader %} -{% load staticfiles %} +{% load static %} {% block content %}
From dd377cc72a66e239e9d86978991120a76ab7903d Mon Sep 17 00:00:00 2001 From: Longze Chen Date: Wed, 14 Sep 2022 14:42:36 -0400 Subject: [PATCH 68/72] Fix and rework from_db_value & to_python for EncryptedJSONField --- osf/utils/fields.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/osf/utils/fields.py b/osf/utils/fields.py index d2ac6edd61c..566d482ed5d 100644 --- a/osf/utils/fields.py +++ b/osf/utils/fields.py @@ -98,8 +98,8 @@ def get_prep_value(self, value, **kwargs): return super(EncryptedJSONField, self).get_prep_value(value, **kwargs) def to_python(self, value): - value = rapply(value, decrypt_string, prefix=self.prefix) - return super(EncryptedJSONField, self).from_db_value(value, None, None) + return rapply(value, decrypt_string, prefix=self.prefix) def from_db_value(self, value, expression, connection): + value = super(EncryptedJSONField, self).from_db_value(value, expression, connection) return self.to_python(value) From b57c74e2110153a7d4f93594e6106e18972a967b Mon Sep 17 00:00:00 2001 From: John Tordoff <> Date: Thu, 15 Sep 2022 16:03:42 -0400 Subject: [PATCH 69/72] fix admin login failure for django upgrade --- api/base/authentication/backends.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/api/base/authentication/backends.py b/api/base/authentication/backends.py index 68954988658..1f6adedbb33 100644 --- a/api/base/authentication/backends.py +++ b/api/base/authentication/backends.py @@ -5,8 +5,8 @@ # https://docs.djangoproject.com/en/1.8/topics/auth/customizing/ class ODMBackend(ModelBackend): - def authenticate(self, username=None, password=None): - return get_user(email=username, password=password) or None + def authenticate(self, request, username=None, password=None, email=None): + return get_user(email=email or username, password=password) or None def get_user(self, user_id): try: From 93081d423a73a6b16e5adfb94247ffec23ef667c Mon Sep 17 00:00:00 2001 From: John Tordoff <> Date: Thu, 15 Sep 2022 16:03:42 -0400 Subject: [PATCH 70/72] Fix admin login failure for django upgrade --- api/base/authentication/backends.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/api/base/authentication/backends.py b/api/base/authentication/backends.py index 68954988658..b2766b094a7 100644 --- a/api/base/authentication/backends.py +++ b/api/base/authentication/backends.py @@ -2,10 +2,11 @@ from framework.auth.core import get_user from django.contrib.auth.backends import ModelBackend -# https://docs.djangoproject.com/en/1.8/topics/auth/customizing/ + +# https://docs.djangoproject.com/en/3.2/topics/auth/customizing/ class ODMBackend(ModelBackend): - def authenticate(self, username=None, password=None): + def authenticate(self, request, username=None, password=None, **kwargs): return get_user(email=username, password=password) or None def get_user(self, user_id): From b58c17f160796b43bea5292377ba33fab4c08e55 Mon Sep 17 00:00:00 2001 From: John Tordoff Date: Mon, 19 Sep 2022 09:59:14 -0400 Subject: [PATCH 71/72] upgrade to end dependabot warnings --- requirements.txt | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/requirements.txt b/requirements.txt index 4a4143aecc4..ce9468c2a90 100644 --- a/requirements.txt +++ b/requirements.txt @@ -10,7 +10,7 @@ invoke==0.15.0 Werkzeug==1.0.0 Flask==1.0 gevent==1.2.2 -Mako==1.0.7 +Mako==1.1.6 Markdown==3.3.7 WTForms==1.0.4 # Fork of celery 4.1.1 with https://github.com/celery/celery/pull/4278 backported, @@ -20,7 +20,7 @@ WTForms==1.0.4 git+https://github.com/cos-forks/celery@v4.1.1+cos0 kombu==4.2.0 itsdangerous==1.1.0 -lxml==4.6.5 +lxml==4.9.1 mailchimp==2.0.9 nameparser==0.5.3 bcrypt==3.1.4 @@ -57,9 +57,9 @@ djangorestframework==3.13.1 django-cors-headers==3.10.1 djangorestframework-bulk==0.2.1 hashids==1.2.0 -pyjwt==1.5.3 -django-celery-beat==1.1.1 # BSD 3 Clause -django-celery-results==1.0.1 +pyjwt==2.4.0 +django-celery-beat==4.2.3 # BSD 3 Clause +django-celery-results==2.4.0 pyjwe==1.0.0 # Required by pyjwe and ndg-httpsclient # Building wheel for cryptography >= 3.4.0 requires a Rust version incompatible with Docker base image. @@ -92,7 +92,8 @@ datacite==1.1.2 # Metrics -git+https://github.com/Johnetordoff/django-elasticsearch-metrics.git@update-django-3#egg=django-elasticsearch-metrics +#django-elasticsearch-metrics==5.0.0 +git+https://github.com/CenterForOpenScience/django-elasticsearch-metrics@2022.0.6 # Impact Metrics CSV Export djangorestframework-csv==2.1.0 From 3f6a6655de35280fbc2b820f0e68f9263c417d04 Mon Sep 17 00:00:00 2001 From: John Tordoff <> Date: Mon, 19 Sep 2022 10:29:48 -0400 Subject: [PATCH 72/72] more dependabot updates --- osf/utils/tokens/__init__.py | 2 +- requirements.txt | 6 +++--- tests/test_tokens.py | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/osf/utils/tokens/__init__.py b/osf/utils/tokens/__init__.py index 3554b4a1b4d..14876b05fd9 100644 --- a/osf/utils/tokens/__init__.py +++ b/osf/utils/tokens/__init__.py @@ -90,7 +90,7 @@ def encode(payload): payload, settings.JWT_SECRET, algorithm=settings.JWT_ALGORITHM - ).decode() + ) def decode(encoded_token): diff --git a/requirements.txt b/requirements.txt index ce9468c2a90..80250188df7 100644 --- a/requirements.txt +++ b/requirements.txt @@ -57,9 +57,9 @@ djangorestframework==3.13.1 django-cors-headers==3.10.1 djangorestframework-bulk==0.2.1 hashids==1.2.0 -pyjwt==2.4.0 -django-celery-beat==4.2.3 # BSD 3 Clause -django-celery-results==2.4.0 +pyjwt==1.5.3 +django-celery-beat==1.1.1 # BSD 3 Clause +django-celery-results==1.0.1 pyjwe==1.0.0 # Required by pyjwe and ndg-httpsclient # Building wheel for cryptography >= 3.4.0 requires a Rust version incompatible with Docker base image. diff --git a/tests/test_tokens.py b/tests/test_tokens.py index dcbfdcb0939..fe42432938a 100644 --- a/tests/test_tokens.py +++ b/tests/test_tokens.py @@ -33,7 +33,7 @@ def setUp(self, *args, **kwargs): self.encoded_token = jwt.encode( self.payload, self.secret, - algorithm=settings.JWT_ALGORITHM).decode() + algorithm=settings.JWT_ALGORITHM) def test_encode(self): assert_equal(encode(self.payload), self.encoded_token)