def ownership()

in src/olympia/devhub/views.py [0:0]


def ownership(request, addon_id, addon):
    fs = []
    ctx = {
        'addon': addon,
        # Override editable_body_class, because this page is not editable by
        # regular developers, but can be edited by owners even if it's a site
        # permission add-on.
        'editable_body_class': 'no-edit'
        if not acl.check_addon_ownership(request.user, addon)
        else '',
    }
    post_data = request.POST if request.method == 'POST' else None
    # Authors.
    user_form = forms.AuthorFormSet(
        post_data,
        prefix='user_form',
        queryset=AddonUser.objects.filter(addon=addon).order_by('position'),
        form_kwargs={'addon': addon},
    )
    fs.append(user_form)
    ctx['user_form'] = user_form
    # Authors pending confirmation (owner can still remove them before they
    # accept).
    authors_pending_confirmation_form = forms.AuthorWaitingConfirmationFormSet(
        post_data,
        prefix='authors_pending_confirmation',
        queryset=AddonUserPendingConfirmation.objects.filter(addon=addon).order_by(
            'id'
        ),
        form_kwargs={'addon': addon},
    )
    fs.append(authors_pending_confirmation_form)
    ctx['authors_pending_confirmation_form'] = authors_pending_confirmation_form
    # Versions.
    license_form = forms.LicenseForm(post_data, version=addon.current_version)
    ctx.update(license_form.get_context())
    if ctx['license_form']:  # if addon has a version
        fs.append(ctx['license_form'])
    # Policy.
    if addon.type != amo.ADDON_STATICTHEME:
        policy_form = forms.PolicyForm(post_data, addon=addon)
        ctx['policy_form'] = policy_form
        fs.append(policy_form)
    else:
        policy_form = None

    def process_author_changes(source_form, existing_authors_emails):
        addon_users_to_process = source_form.save(commit=False)
        for addon_user in addon_users_to_process:
            addon_user.addon = addon
            if not addon_user.pk:
                send_addon_author_add_mail(addon_user, existing_authors_emails)
                messages.success(
                    request,
                    gettext('A confirmation email has been sent to {email}').format(
                        email=addon_user.user.email
                    ),
                )
            elif addon_user.role != addon_user._initial_attrs.get('role'):
                send_addon_author_change_mail(addon_user, existing_authors_emails)
            addon_user.save()
        for addon_user in source_form.deleted_objects:
            send_addon_author_remove_mail(addon_user, existing_authors_emails)
            addon_user.delete()

    if request.method == 'POST' and all([form.is_valid() for form in fs]):
        if license_form in fs:
            license_form.save()
        if policy_form and policy_form in fs:
            policy_form.save()
            ActivityLog.objects.create(amo.LOG.EDIT_PROPERTIES, addon)
        messages.success(request, gettext('Changes successfully saved.'))

        existing_authors_emails = list(addon.authors.values_list('email', flat=True))

        process_author_changes(
            authors_pending_confirmation_form, existing_authors_emails
        )
        process_author_changes(user_form, existing_authors_emails)

        return redirect(addon.get_dev_url('owner'))

    return TemplateResponse(request, 'devhub/addons/owner.html', context=ctx)