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)