def test_nocommit(): with compat.nocommit(): G(Group, name='name') assert not Group.objects.filter(name='name').exists()
def merge(modeladmin, request, queryset): """ Merge two model instances. Move all foreign keys. """ opts = modeladmin.model._meta perm = "{0}.{1}".format( opts.app_label.lower(), get_permission_codename('adminactions_merge', opts)) if not request.user.has_perm(perm): messages.error( request, _('Sorry you do not have rights to execute this action (%s)' % perm)) return def raw_widget(field, **kwargs): """ force all fields as not required""" kwargs['widget'] = TextInput({'class': 'raw-value'}) return field.formfield(**kwargs) merge_form = getattr(modeladmin, 'merge_form', MergeForm) MForm = modelform_factory(modeladmin.model, form=merge_form, exclude=('pk', ), formfield_callback=raw_widget) OForm = modelform_factory(modeladmin.model, exclude=('pk', ), formfield_callback=raw_widget) tpl = 'adminactions/merge.html' # transaction_supported = model_supports_transactions(modeladmin.model) ctx = { '_selected_action': request.POST.getlist(helpers.ACTION_CHECKBOX_NAME), 'transaction_supported': 'Un', 'select_across': request.POST.get('select_across') == '1', 'action': request.POST.get('action'), 'fields': [ f for f in queryset.model._meta.fields if not f.primary_key and f.editable ], 'app_label': queryset.model._meta.app_label, 'result': '', 'opts': queryset.model._meta } if 'preview' in request.POST: master = queryset.get(pk=request.POST.get('master_pk')) original = clone_instance(master) other = queryset.get(pk=request.POST.get('other_pk')) formset = formset_factory(OForm)( initial=[model_to_dict(master), model_to_dict(other)]) with transaction.nocommit(): form = MForm(request.POST, instance=master) other.delete() form_is_valid = form.is_valid() if form_is_valid: ctx.update({'original': original}) tpl = 'adminactions/merge_preview.html' else: master = queryset.get(pk=request.POST.get('master_pk')) other = queryset.get(pk=request.POST.get('other_pk')) elif 'apply' in request.POST: master = queryset.get(pk=request.POST.get('master_pk')) other = queryset.get(pk=request.POST.get('other_pk')) formset = formset_factory(OForm)( initial=[model_to_dict(master), model_to_dict(other)]) with transaction.nocommit(): form = MForm(request.POST, instance=master) stored_pk = other.pk other.delete() ok = form.is_valid() other.pk = stored_pk if ok: if form.cleaned_data['dependencies'] == MergeForm.DEP_MOVE: related = api.ALL_FIELDS else: related = None fields = form.cleaned_data['field_names'] api.merge(master, other, fields=fields, commit=True, related=related) return HttpResponseRedirect(request.path) else: messages.error(request, form.errors) else: try: master, other = queryset.all() # django 1.4 need to remove the trailing milliseconds for field in master._meta.fields: if isinstance(field, models.DateTimeField): for target in (master, other): raw_value = getattr(target, field.name) fixed_value = datetime(raw_value.year, raw_value.month, raw_value.day, raw_value.hour, raw_value.minute, raw_value.second) setattr(target, field.name, fixed_value) except ValueError: messages.error(request, _('Please select exactly 2 records')) return initial = { '_selected_action': request.POST.getlist(helpers.ACTION_CHECKBOX_NAME), 'select_across': 0, 'generic': MergeForm.GEN_IGNORE, 'dependencies': MergeForm.DEP_MOVE, 'action': 'merge', 'master_pk': master.pk, 'other_pk': other.pk } formset = formset_factory(OForm)( initial=[model_to_dict(master), model_to_dict(other)]) form = MForm(initial=initial, instance=master) adminForm = helpers.AdminForm(form, modeladmin.get_fieldsets(request), {}, [], model_admin=modeladmin) media = modeladmin.media + adminForm.media ctx.update({ 'adminform': adminForm, 'formset': formset, 'media': mark_safe(media), 'title': u"Merge %s" % force_unicode(modeladmin.opts.verbose_name_plural), 'master': master, 'other': other }) return render_to_response(tpl, RequestContext(request, ctx))
def merge(modeladmin, request, queryset): # noqa """ Merge two model instances. Move all foreign keys. """ opts = modeladmin.model._meta perm = "{0}.{1}".format(opts.app_label, get_permission_codename('adminactions_merge', opts)) if not request.user.has_perm(perm): messages.error(request, _('Sorry you do not have rights to execute this action (%s)' % perm)) return def raw_widget(field, **kwargs): """ force all fields as not required""" kwargs['widget'] = TextInput({'class': 'raw-value'}) return field.formfield(**kwargs) merge_form = getattr(modeladmin, 'merge_form', MergeForm) MForm = modelform_factory(modeladmin.model, form=merge_form, exclude=('pk', ), formfield_callback=raw_widget) OForm = modelform_factory(modeladmin.model, exclude=('pk', ), formfield_callback=raw_widget) tpl = 'adminactions/merge.html' # transaction_supported = model_supports_transactions(modeladmin.model) ctx = { '_selected_action': request.POST.getlist(helpers.ACTION_CHECKBOX_NAME), 'transaction_supported': 'Un', 'select_across': request.POST.get('select_across') == '1', 'action': request.POST.get('action'), 'fields': [f for f in queryset.model._meta.fields if not f.primary_key and f.editable], 'app_label': queryset.model._meta.app_label, 'result': '', 'opts': queryset.model._meta} if 'preview' in request.POST: master = queryset.get(pk=request.POST.get('master_pk')) original = clone_instance(master) other = queryset.get(pk=request.POST.get('other_pk')) formset = formset_factory(OForm)(initial=[model_to_dict(master), model_to_dict(other)]) with transaction.nocommit(): form = MForm(request.POST, instance=master) other.delete() form_is_valid = form.is_valid() if form_is_valid: ctx.update({'original': original}) tpl = 'adminactions/merge_preview.html' else: master = queryset.get(pk=request.POST.get('master_pk')) other = queryset.get(pk=request.POST.get('other_pk')) elif 'apply' in request.POST: master = queryset.get(pk=request.POST.get('master_pk')) other = queryset.get(pk=request.POST.get('other_pk')) formset = formset_factory(OForm)(initial=[model_to_dict(master), model_to_dict(other)]) with transaction.nocommit(): form = MForm(request.POST, instance=master) stored_pk = other.pk other.delete() ok = form.is_valid() other.pk = stored_pk if ok: if form.cleaned_data['dependencies'] == MergeForm.DEP_MOVE: related = api.ALL_FIELDS else: related = None fields = form.cleaned_data['field_names'] api.merge(master, other, fields=fields, commit=True, related=related) return HttpResponseRedirect(request.path) else: messages.error(request, form.errors) else: try: master, other = queryset.all() # django 1.4 need to remove the trailing milliseconds for field in master._meta.fields: if isinstance(field, models.DateTimeField): for target in (master, other): raw_value = getattr(target, field.name) fixed_value = datetime(raw_value.year, raw_value.month, raw_value.day, raw_value.hour, raw_value.minute, raw_value.second) setattr(target, field.name, fixed_value) except ValueError: messages.error(request, _('Please select exactly 2 records')) return initial = {'_selected_action': request.POST.getlist(helpers.ACTION_CHECKBOX_NAME), 'select_across': 0, 'generic': MergeForm.GEN_IGNORE, 'dependencies': MergeForm.DEP_MOVE, 'action': 'merge', 'master_pk': master.pk, 'other_pk': other.pk} formset = formset_factory(OForm)(initial=[model_to_dict(master), model_to_dict(other)]) form = MForm(initial=initial, instance=master) adminForm = helpers.AdminForm(form, modeladmin.get_fieldsets(request), {}, [], model_admin=modeladmin) media = modeladmin.media + adminForm.media ctx.update({'adminform': adminForm, 'formset': formset, 'media': mark_safe(media), 'title': u"Merge %s" % smart_text(modeladmin.opts.verbose_name_plural), 'master': master, 'other': other}) return render_to_response(tpl, RequestContext(request, ctx))