diff --git a/admin/collection_providers/forms.py b/admin/collection_providers/forms.py index feae16aa695..7d0e8dadf46 100644 --- a/admin/collection_providers/forms.py +++ b/admin/collection_providers/forms.py @@ -3,7 +3,7 @@ from django import forms from framework.utils import sanitize_html -from osf.models import CollectionProvider, CollectionSubmission +from osf.models import CollectionProvider from admin.base.utils import get_nodelicense_choices, get_defaultlicense_choices, validate_slug @@ -74,12 +74,6 @@ def clean_collected_type_choices(self): type_choices_new = {c.strip(' ') for c in json.loads(self.data.get('collected_type_choices'))} type_choices_added = type_choices_new - type_choices_old type_choices_removed = type_choices_old - type_choices_new - for item in type_choices_removed: - if CollectionSubmission.objects.filter(collection=collection_provider.primary_collection, - collected_type=item).exists(): - raise forms.ValidationError( - f'Cannot delete "{item}" because it is used as metadata on objects.' - ) else: # if this is creating a CollectionProvider type_choices_added = [] @@ -104,12 +98,6 @@ def clean_status_choices(self): status_choices_new = {c.strip(' ') for c in json.loads(self.data.get('status_choices'))} status_choices_added = status_choices_new - status_choices_old status_choices_removed = status_choices_old - status_choices_new - for item in status_choices_removed: - if CollectionSubmission.objects.filter(collection=collection_provider.primary_collection, - status=item).exists(): - raise forms.ValidationError( - f'Cannot delete "{item}" because it is used as metadata on objects.' - ) else: # if this is creating a CollectionProvider status_choices_added = [] @@ -134,12 +122,6 @@ def clean_volume_choices(self): volume_choices_new = {c.strip(' ') for c in json.loads(self.data.get('volume_choices'))} volume_choices_added = volume_choices_new - volume_choices_old volume_choices_removed = volume_choices_old - volume_choices_new - for item in volume_choices_removed: - if CollectionSubmission.objects.filter(collection=collection_provider.primary_collection, - volume=item).exists(): - raise forms.ValidationError( - f'Cannot delete "{item}" because it is used as metadata on objects.' - ) else: # if this is creating a CollectionProvider volume_choices_added = [] @@ -164,12 +146,6 @@ def clean_issue_choices(self): issue_choices_new = {c.strip(' ') for c in json.loads(self.data.get('issue_choices'))} issue_choices_added = issue_choices_new - issue_choices_old issue_choices_removed = issue_choices_old - issue_choices_new - for item in issue_choices_removed: - if CollectionSubmission.objects.filter(collection=collection_provider.primary_collection, - issue=item).exists(): - raise forms.ValidationError( - f'Cannot delete "{item}" because it is used as metadata on objects.' - ) else: # if this is creating a CollectionProvider issue_choices_added = [] @@ -194,12 +170,6 @@ def clean_program_area_choices(self): program_area_choices_new = {c.strip(' ') for c in json.loads(self.data.get('program_area_choices'))} program_area_choices_added = program_area_choices_new - program_area_choices_old program_area_choices_removed = program_area_choices_old - program_area_choices_new - for item in program_area_choices_removed: - if CollectionSubmission.objects.filter(collection=collection_provider.primary_collection, - program_area=item).exists(): - raise forms.ValidationError( - f'Cannot delete "{item}" because it is used as metadata on objects.' - ) else: # if this is creating a CollectionProvider program_area_choices_added = [] @@ -224,16 +194,6 @@ def clean_school_type_choices(self): updated_choices = {c.strip(' ') for c in json.loads(self.data.get('school_type_choices'))} added_choices = updated_choices - old_choices removed_choices = old_choices - updated_choices - active_removed_choices = set( - primary_collection.collectionsubmission_set.filter( - school_type__in=removed_choices - ).values_list('school_type', flat=True) - ) - if active_removed_choices: - raise forms.ValidationError( - 'Cannot remove the following choices for "school_type", as they are ' - f'currently in use: {active_removed_choices}' - ) else: # Creating a new CollectionProvider added_choices = set() removed_choices = set() @@ -253,17 +213,6 @@ def clean_study_design_choices(self): updated_choices = {c.strip(' ') for c in json.loads(self.data.get('study_design_choices'))} added_choices = updated_choices - old_choices removed_choices = old_choices - updated_choices - - active_removed_choices = set( - primary_collection.collectionsubmission_set.filter( - study_design__in=removed_choices - ).values_list('school_type', flat=True) - ) - if active_removed_choices: - raise forms.ValidationError( - 'Cannot remove the following choices for "study_design", as they are ' - f'currently in use: {active_removed_choices}' - ) else: # Creating a new CollectionProvider added_choices = set() removed_choices = set() @@ -283,17 +232,6 @@ def clean_disease_choices(self): updated_choices = {c.strip(' ') for c in json.loads(self.data.get('disease_choices'))} added_choices = updated_choices - old_choices removed_choices = old_choices - updated_choices - - active_removed_choices = set( - primary_collection.collectionsubmission_set.filter( - disease__in=removed_choices - ).values_list('disease', flat=True) - ) - if active_removed_choices: - raise forms.ValidationError( - 'Cannot remove the following choices for "disease", as they are ' - f'currently in use: {active_removed_choices}' - ) else: # Creating a new CollectionProvider added_choices = set() removed_choices = set() @@ -313,17 +251,6 @@ def clean_data_type_choices(self): updated_choices = {c.strip(' ') for c in json.loads(self.data.get('data_type_choices'))} added_choices = updated_choices - old_choices removed_choices = old_choices - updated_choices - - active_removed_choices = set( - primary_collection.collectionsubmission_set.filter( - data_type__in=removed_choices - ).values_list('data_type', flat=True) - ) - if active_removed_choices: - raise forms.ValidationError( - 'Cannot remove the following choices for "data_type", as they are ' - f'currently in use: {active_removed_choices}' - ) else: # Creating a new CollectionProvider added_choices = set() removed_choices = set() @@ -343,17 +270,6 @@ def clean_grade_levels_choices(self): updated_choices = {c.strip(' ') for c in json.loads(self.data.get('grade_levels_choices'))} added_choices = updated_choices - old_choices removed_choices = old_choices - updated_choices - - active_removed_choices = set( - primary_collection.collectionsubmission_set.filter( - data_type__in=removed_choices - ).values_list('grade_levels', flat=True) - ) - if active_removed_choices: - raise forms.ValidationError( - 'Cannot remove the following choices for "grade_levels", as they are ' - f'currently in use: {active_removed_choices}' - ) else: # Creating a new CollectionProvider added_choices = set() removed_choices = set() diff --git a/admin/management/views.py b/admin/management/views.py index 16057f147ca..525f0d8d64a 100644 --- a/admin/management/views.py +++ b/admin/management/views.py @@ -150,10 +150,12 @@ def post(self, request): class BulkResync(ManagementCommandPermissionView): def post(self, request): + missing_dois_only = request.POST.get('missing_preprint_dois_only', False) sync_doi_metadata.apply_async(kwargs={ 'modified_date': timezone.now(), 'batch_size': None, - 'dry_run': False + 'dry_run': False, + 'missing_preprint_dois_only': missing_dois_only }) messages.success(request, 'Resyncing with CrossRef and DataCite! It will take some time.') return redirect(reverse('management:commands')) diff --git a/admin/preprint_providers/forms.py b/admin/preprint_providers/forms.py index 06d27052098..1393aae41ef 100644 --- a/admin/preprint_providers/forms.py +++ b/admin/preprint_providers/forms.py @@ -112,11 +112,12 @@ class PreprintProviderRegisterModeratorOrAdminForm(forms.Form): """ A form that finds an existing OSF User, and grants permissions to that user so that they can use the admin app""" - def __init__(self, *args, **kwargs): - provider_id = kwargs.pop('provider_id') + def __init__(self, *args, provider_groups=None, **kwargs): super().__init__(*args, **kwargs) + + provider_groups = provider_groups or Group.objects.none() self.fields['group_perms'] = forms.ModelMultipleChoiceField( - queryset=Group.objects.filter(name__startswith=f'reviews_preprint_{provider_id}'), + queryset=provider_groups, required=False, widget=forms.CheckboxSelectMultiple ) diff --git a/admin/preprint_providers/views.py b/admin/preprint_providers/views.py index e98aed1ecfa..4c7439f4554 100644 --- a/admin/preprint_providers/views.py +++ b/admin/preprint_providers/views.py @@ -12,6 +12,7 @@ from django.contrib.auth.mixins import PermissionRequiredMixin from django.forms.models import model_to_dict from django.shortcuts import redirect, render +from django.utils.functional import cached_property from admin.base import settings from admin.base.forms import ImportFileForm @@ -459,14 +460,18 @@ class PreprintProviderRegisterModeratorOrAdmin(PermissionRequiredMixin, FormView template_name = 'preprint_providers/register_moderator_admin.html' form_class = PreprintProviderRegisterModeratorOrAdminForm + @cached_property + def target_provider(self): + return PreprintProvider.objects.get(id=self.kwargs['preprint_provider_id']) + def get_form_kwargs(self): kwargs = super().get_form_kwargs() - kwargs['provider_id'] = self.kwargs['preprint_provider_id'] + kwargs['provider_groups'] = self.target_provider.group_objects return kwargs def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) - context['provider_name'] = PreprintProvider.objects.get(id=self.kwargs['preprint_provider_id']).name + context['provider_name'] = self.target_provider.name return context def form_valid(self, form): @@ -477,13 +482,7 @@ def form_valid(self, form): raise Http404(f'OSF user with id "{user_id}" not found. Please double check.') for group in form.cleaned_data.get('group_perms'): - osf_user.groups.add(group) - split = group.name.split('_') - group_type = split[0] - if group_type == 'reviews': - provider_id = split[2] - provider = PreprintProvider.objects.get(id=provider_id) - provider.notification_subscriptions.get(event_name='new_pending_submissions').add_user_to_subscription(osf_user, 'email_transactional') + self.target_provider.add_to_group(osf_user, group) osf_user.save() messages.success(self.request, f'Permissions update successful for OSF User {osf_user.username}!') diff --git a/admin/templates/management/commands.html b/admin/templates/management/commands.html index beaaf9cfb5d..93eeaf24c18 100644 --- a/admin/templates/management/commands.html +++ b/admin/templates/management/commands.html @@ -74,7 +74,7 @@