def changeform_view(self, request, obj_id=None, form_url='', extra_context=None): extra_context = extra_context or {} if obj_id: obj = ( self.get_object(request, obj_id) # if we can't find the obj_id maybe it's a guid instead or self.get_object(request, obj_id, 'guid')) if obj and str(obj_id) != str(obj.id): # we found it from the guid if the obj_id != obj.id so redirect url = request.path.replace(obj_id, str(obj.id), 1) return http.HttpResponsePermanentRedirect(url) else: obj = None if obj and request.method == 'POST': if not self.has_change_permission(request, obj): raise PermissionDenied ModelForm = self.get_form(request, obj, change=bool(obj_id)) form = ModelForm(request.POST, request.FILES, instance=obj) if form.is_valid(): return HttpResponseTemporaryRedirect( reverse('admin:blocklist_blocklistsubmission_add')) extra_context['show_save_and_continue'] = False extra_context['is_imported_from_legacy_regex'] = ( obj and obj.is_imported_from_legacy_regex) return super().changeform_view(request, object_id=obj_id, form_url=form_url, extra_context=extra_context)
def _multi_input_view(self, request, *, add, form_url='', extra_context=None): MultiForm = MultiAddForm if add else MultiDeleteForm if request.method == 'POST': form = MultiForm(request.POST) if form.is_valid(): guids = splitlines(form.data.get('guids')) if len(guids) == 1 and form.existing_block: # If the guid already has a Block go to the change view return redirect( 'admin:blocklist_block_change', form.existing_block.id) elif len(guids) > 0: # Otherwise go to multi view. return HttpResponseTemporaryRedirect( reverse('admin:blocklist_blocklistsubmission_add')) else: form = MultiForm() context = { 'form': form, 'add': add, 'change': False, 'has_view_permission': self.has_view_permission(request, None), 'has_add_permission': self.has_add_permission(request), 'has_change_permission': self.has_change_permission(request, None), 'app_label': 'blocklist', 'opts': self.model._meta, 'title': 'Block Add-ons' if add else 'Delete Blocks', 'save_as': False, } return TemplateResponse( request, 'admin/blocklist/multi_guid_input.html', context)
def input_guids_view(self, request, form_url='', extra_context=None): errors = [] if request.method == 'POST': guids_data = request.POST.get('guids') guids = guids_data.splitlines() if guids_data else [] if len(guids) == 1: guid = guids[0] # If the guid already has a Block go to the change view existing = Block.objects.filter(guid=guid).first() if existing: return redirect('admin:blocklist_block_change', existing.id) if not Addon.unfiltered.filter(guid=guid).exists(): # We might want to do something better than this eventually # - e.g. go to the multi_view once implemented. errors.append( _('Addon with specified GUID does not exist')) else: # Otherwise proceed to the single guid add view return redirect( reverse('admin:blocklist_block_add_single') + f'?guid={guid}') elif len(guids) > 1: # If there's > 1 guid go to multi view. return HttpResponseTemporaryRedirect( reverse('admin:blocklist_block_add_multiple')) context = {} context.update({ 'add': True, 'change': False, 'has_view_permission': self.has_view_permission(request, None), 'has_add_permission': self.has_add_permission(request), 'has_change_permission': self.has_change_permission(request, None), 'app_label': 'blocklist', 'opts': self.model._meta, 'title': 'Block Add-ons', 'save_as': False, 'errors': errors, }) return TemplateResponse(request, "blocklist/add_guids.html", context)
def delete_multiple_view(self, request, form_url='', extra_context=None): if request.method == 'POST': if request.POST.get('action') == 'delete_selected': # it's the confirmation so redirect to changelist to handle return HttpResponseTemporaryRedirect( reverse('admin:blocklist_block_changelist')) form = MultiDeleteForm(request.POST) if form.is_valid(): return admin.actions.delete_selected(self, request, form.existing_block_qs) else: form = MultiDeleteForm() return self._render_multi_guid_input(request, form, title='Delete Blocks', add=False)
def changeform_view(self, request, obj_id=None, form_url='', extra_context=None): extra_context = extra_context or {} obj = self.get_object(request, obj_id) if obj_id else None if obj and request.method == 'POST': if not self.has_change_permission(request, obj): raise PermissionDenied ModelForm = self.get_form(request, obj, change=bool(obj_id)) form = ModelForm(request.POST, request.FILES, instance=obj) if form.is_valid(): return HttpResponseTemporaryRedirect( reverse('admin:blocklist_blocklistsubmission_add')) extra_context['show_save_and_continue'] = False extra_context['is_imported_from_legacy_regex'] = ( obj and obj.is_imported_from_legacy_regex) return super().changeform_view( request, object_id=obj_id, form_url=form_url, extra_context=extra_context)
def input_guids_view(self, request, form_url='', extra_context=None): if request.method == 'POST': form = MultiAddForm(request.POST) if form.is_valid(): guids = splitlines(form.data.get('guids')) if len(guids) == 1: # If the guid already has a Block go to the change view if form.existing_block: return redirect('admin:blocklist_block_change', form.existing_block.id) else: # Otherwise proceed to the single guid add view return redirect( reverse('admin:blocklist_block_add_single') + f'?guid={guids[0]}') elif len(guids) > 1: # If there's > 1 guid go to multi view. return HttpResponseTemporaryRedirect( reverse('admin:blocklist_blocksubmission_add')) else: form = MultiAddForm() return self._render_multi_guid_input(request, form, title='Block Add-ons')