def close_bills(modeladmin, request, queryset, action='close_bills'): # Validate bills for bill in queryset: if not validate_contact(request, bill): return False if not bill.is_open: messages.warning(request, _("Selected bills should be in open state")) return False SelectSourceFormSet = adminmodelformset_factory(modeladmin, SelectSourceForm, extra=0) formset = SelectSourceFormSet(queryset=queryset) if request.POST.get('post') == 'generic_confirmation': formset = SelectSourceFormSet(request.POST, request.FILES, queryset=queryset) if formset.is_valid(): transactions = [] for form in formset.forms: source = form.cleaned_data['source'] transaction = form.instance.close(payment=source) if transaction: transactions.append(transaction) for bill in queryset: modeladmin.log_change(request, bill, 'Closed') messages.success(request, _("Selected bills have been closed")) if transactions: num = len(transactions) if num == 1: url = change_url(transactions[0]) else: url = reverse('admin:payments_transaction_changelist') url += 'id__in=%s' % ','.join([str(t.id) for t in transactions]) context = { 'url': url, 'num': num, } message = ungettext( _('<a href="%(url)s">One related transaction</a> has been created') % context, _('<a href="%(url)s">%(num)i related transactions</a> have been created') % context, num) messages.success(request, mark_safe(message)) return opts = modeladmin.model._meta context = { 'title': _("Are you sure about closing the following bills?"), 'content_message': _("Once a bill is closed it can not be further modified.</p>" "<p>Please select a payment source for the selected bills"), 'action_name': 'Close bills', 'action_value': action, 'display_objects': [], 'queryset': queryset, 'opts': opts, 'app_label': opts.app_label, 'action_checkbox_name': helpers.ACTION_CHECKBOX_NAME, 'formset': formset, 'obj': get_object_from_url(modeladmin, request), } return render(request, 'admin/orchestra/generic_confirmation.html', context)
def edit_records(modeladmin, request, queryset): selected_ids = queryset.values_list('id', flat=True) # Include subodmains queryset = queryset.model.objects.filter( Q(top__id__in=selected_ids) | Q(id__in=selected_ids) ).annotate( structured_id=Coalesce('top__id', 'id'), structured_name=Concat('top__name', 'name') ).order_by('-structured_id', 'structured_name') formsets = [] for domain in queryset.prefetch_related('records'): modeladmin_copy = copy.copy(modeladmin) modeladmin_copy.model = Record prefix = '' if domain.is_top else ' '*8 context = { 'url': change_url(domain), 'name': prefix+domain.name, 'title': '', } if domain.id not in selected_ids: context['name'] += '*' context['title'] = _("This subdomain was not explicitly selected " "but has been automatically added to this list.") link = '<a href="%(url)s" title="%(title)s">%(name)s</a>' % context modeladmin_copy.verbose_name_plural = mark_safe(link) RecordFormSet = adminmodelformset_factory( modeladmin_copy, RecordForm, formset=RecordEditFormSet, extra=1, can_delete=True) formset = RecordFormSet(queryset=domain.records.all(), prefix=domain.id) formset.instance = domain formset.cls = RecordFormSet formsets.append(formset) if request.POST.get('post') == 'generic_confirmation': posted_formsets = [] all_valid = True for formset in formsets: instance = formset.instance formset = formset.cls( request.POST, request.FILES, queryset=formset.queryset, prefix=instance.id) formset.instance = instance if not formset.is_valid(): all_valid = False posted_formsets.append(formset) formsets = posted_formsets if all_valid: for formset in formsets: for form in formset.forms: form.instance.domain_id = formset.instance.id formset.save() fake_form = AttrDict({ 'changed_data': False }) change_message = modeladmin.construct_change_message(request, fake_form, [formset]) modeladmin.log_change(request, formset.instance, change_message) num = len(formsets) message = ungettext( _("Records for one selected domain have been updated."), _("Records for %i selected domains have been updated.") % num, num) modeladmin.message_user(request, message) return opts = modeladmin.model._meta context = { 'title': _("Edit records"), 'action_name': _("Edit records"), 'action_value': 'edit_records', 'display_objects': [], 'queryset': queryset, 'opts': opts, 'app_label': opts.app_label, 'action_checkbox_name': helpers.ACTION_CHECKBOX_NAME, 'formsets': formsets, 'obj': get_object_from_url(modeladmin, request), } return render(request, 'admin/domains/domain/edit_records.html', context)