def METHOD_NAME(self, event: Event, fileid: str, confirm_code: str, user: int=None, locale: str='en') -> None:
    steps = []
    if user:
        user = User.objects.get(pk=user)
    def set_progress(val):
        if not self.request.called_directly:
            self.update_state(
                state='PROGRESS',
                meta={'value': val, 'steps': steps}
            )
    known_shredders = event.get_data_shredders()
    try:
        cf = CachedFile.objects.get(pk=fileid)
    except CachedFile.DoesNotExist:
        raise ShredError(_("The download file could no longer be found on the server, please try to start again."))
    with ZipFile(cf.file.file, 'r') as zipfile:
        indexdata = json.loads(zipfile.read('index.json').decode())
    if indexdata['organizer'] != event.organizer.slug or indexdata['event'] != event.slug:
        raise ShredError(_("This file is from a different event."))
    shredders = []
    for s in indexdata['shredders']:
        shredder = known_shredders.get(s)
        if not shredder:
            continue
        shredders.append(shredder)
    if confirm_code is not True and any(shredder.require_download_confirmation for shredder in shredders):
        if indexdata['confirm_code'] != confirm_code:
            raise ShredError(_("The confirm code you entered was incorrect."))
    if event.logentry_set.filter(datetime__gte=parse(indexdata['time'])):
        raise ShredError(_("Something happened in your event after the export, please try again."))
    event.log_action(
        'pretix.event.shredder.started', user=user, data={
            'indexdata': indexdata
        }
    )
    for i, shredder in enumerate(shredders):
        with language(locale):
            steps.append({'label': str(shredder.verbose_name), 'done': False})
        set_progress(i * 100 / len(shredders))
        if 'progress_callback' in inspect.signature(shredder.shred_data).parameters:
            shredder.shred_data(
                progress_callback=lambda y: set_progress(
                    i * 100 / len(shredders) + min(max(y, 0), 100) / 100 * 100 / len(shredders)
                )
            )
        else:
            shredder.shred_data()
        steps[-1]['done'] = True
    cf.file.delete(save=False)
    cf.delete()
    event.log_action(
        'pretix.event.shredder.completed', user=user, data={
            'indexdata': indexdata
        }
    )
    if user:
        with language(user.locale):
            try:
                mail(
                    user.email,
                    _('Data shredding completed'),
                    'pretixbase/email/shred_completed.txt',
                    {
                        'user': user,
                        'organizer': event.organizer.name,
                        'event': str(event.name),
                        'start_time': date_format(parse(indexdata['time']).astimezone(event.timezone), 'SHORT_DATETIME_FORMAT'),
                        'shredders': ', '.join([str(s.verbose_name) for s in shredders])
                    },
                    event=None,
                    user=user,
                    locale=user.locale,
                )
            except SendMailException:
                pass  # Already logged