def form_valid_bridge(self, form, field, model, related_field, error_message): """ call from form_valid. @form: it is form of form_valid (type: form) @field: name of the form field referring to the brigde (type: string) @model: form's model (type class) @related_field: name of the related_name of the brigde (type: string) @error_message: list of message errors (type list) two items, example: ["The selected entry is already a storage, select another entry!", "The selected entry is not available anymore, please, try again!"] """ # get instance of selected external object external = form.cleaned_data[field] related_object = get_external_model(model).objects.filter( pk=external.pk).first() if related_object: # form valid try: with transaction.atomic(): result = super(GenCreateBridge, self).form_valid(form) if get_external_model(model).objects.filter( **{ "pk": external.pk, "{}__isnull".format(related_field): False }).exists(): errors = form._errors.setdefault(field, ErrorList()) errors.append(error_message[0]) raise CodenerixException() else: setattr(related_object, related_field, form.instance) related_object.save() if hasattr(self.object, 'CDNX_refresh_permissions_CDNX'): self.object.CDNX_refresh_permissions_CDNX() # Return the object already saved properly answer = HttpResponseRedirect(self.get_success_url()) except CodenerixException: answer = super(GenCreateBridge, self).form_invalid(form) except IOError as e: errors = form._errors.setdefault("codenerix_external_field", ErrorList()) errors.append(e) answer = super(GenCreateBridge, self).form_invalid(form) else: errors = form._errors.setdefault(field, ErrorList()) errors.append(error_message[1]) answer = super(GenCreateBridge, self).form_invalid(form) # Return return answer
class StorageContactForm(GenModelForm): codenerix_external_field = forms.ModelChoiceField( label=StorageContact.foreignkey_external()['label'], queryset=get_external_model(StorageContact).objects.all()) class Meta: model = StorageContact exclude = ['storage'] autofill = { 'codenerix_external_field': ['select', 3, StorageContact.foreignkey_external()['related']], } def __groups__(self): g = [( _('Details'), 12, ['codenerix_external_field', 6], )] return g @staticmethod def __groups_details__(): g = [( _('Details'), 12, ['external_contact', 6], )] return g
class CustomerForm(GenModelForm): codenerix_external_field = forms.ModelChoiceField( label=Customer.foreignkey_external()['label'], queryset=get_external_model(Customer).objects.all()) class Meta: model = Customer exclude = [ 'balance', 'default_customer', ] autofill = { 'codenerix_external_field': ['select', 3, Customer.foreignkey_external()['related']], } def __groups__(self): g = [( _('Details'), 12, ['codenerix_external_field', 8], ['billing_series', 2], ['currency', 2], ['credit', 3], ['final_balance', 3], ['type_tax', 3], ['apply_equivalence_surcharge', 3], )] return g @staticmethod def __groups_details__(): g = [( _('Details'), 12, ['codenerix_external_field', 6], ['credit', 6], ['currency', 6], ['billing_series', 6], ['final_balance', 6], ['apply_equivalence_surcharge', 3], ['type_tax', 3], )] return g @staticmethod def __groups_details_profile__(): g = [( _('Details'), 12, ['billing_series', 6], ['credit', 6], ['currency', 6], ['final_balance', 6], ['apply_equivalence_surcharge', 3], ['type_tax', 3], )] return g
class POSOperatorForm(GenModelForm): codenerix_external_field = forms.ModelChoiceField( label=POSOperator.foreignkey_external()['label'], queryset=get_external_model(POSOperator).objects.all()) pos = forms.ModelMultipleChoiceField( queryset=POS.objects.all().order_by('name'), label=_('POS it can use'), required=False, widget=MultiStaticSelect(attrs={ 'manytomany': True, })) password1 = forms.CharField(label=_("Pin for vending"), min_length=4, widget=forms.PasswordInput, required=False) password2 = forms.CharField(label=_("Confirm pin"), min_length=4, widget=forms.PasswordInput, required=False) class Meta: model = POSOperator exclude = [] autofill = { 'codenerix_external_field': ['select', 3, POSOperator.foreignkey_external()['related']], } def __groups__(self): return [( _('Details'), 12, ['codenerix_external_field', 6], ['pos', 4], ['enable', 2], ['password1', 6], ['password2', 6], )] @staticmethod def __groups_details__(): return [( _('Details'), 12, ['codenerix_external_field', 6], ['pos', 4], ['enable', 2], )] def clean(self): cleaned_data = super(POSOperatorForm, self).clean() if cleaned_data.get('password1') != cleaned_data.get('password2'): del cleaned_data['password1'] del cleaned_data['password2'] raise forms.ValidationError(_("Passwords do not match"))
class ProviderForm(GenModelForm): codenerix_external_field = forms.ModelChoiceField( label=Provider.foreignkey_external()['label'], queryset=get_external_model(Provider).objects.all()) categories = forms.ModelMultipleChoiceField( queryset=Category.objects.all(), label=_('Categories'), required=False, widget=MultiStaticSelect(attrs={'manytomany': True})) class Meta: model = Provider exclude = [] autofill = { 'codenerix_external_field': ['select', 3, Provider.foreignkey_external()['related']], } def __groups__(self): g = [( _('Details'), 12, ['codenerix_external_field', 4], ['balance', 4], ['billing_series', 4], ['currency', 4], ['type_tax', 4], ['shipping_tax', 4], ['finance_surcharge', 4], ['credit', 4], ['payment_methods', 4], ['delivery_time', 4], ['categories', 8], )] return g @staticmethod def __groups_details__(): g = [( _('Details'), 12, ['codenerix_external_field', 6], ['balance', 6], ['currency', 6], ['billing_series', 6], ['type_tax', 6], ['shipping_tax', 6], ['finance_surcharge', 6], ['credit', 6], ['payment_methods', 6], ['delivery_time', 6], )] return g
def form_valid_bridge(self, form, field, model, related_field, error_message): """ call from form_valid. @form: it is form of form_valid (type: form) @field: name of the form field referring to the brigde (type: string) @model: form's model (type class) @related_field: name of the related_name of the brigde (type: string) @error_message: list of message errors (type list) one item, example: ["The selected entry is not available anymore, please, try again!", ] """ # get instance of selected external object external = form.cleaned_data[field] object_edit = model.objects.get(pk=form.instance.pk) if object_edit.external == external: answer = super(GenUpdateBridge, self).form_valid(form) else: related_object = get_external_model(model).objects.filter( **{ "pk": external.pk, "{}__isnull".format(related_field): False }).exclude(**{ "{}".format(related_field): form.instance, }).first() if not related_object: # form valid try: with transaction.atomic(): result = super(GenUpdateBridge, self).form_valid(form) field = object_edit.external setattr(field, related_field, None) field.save() setattr(external, related_field, form.instance) external.save() # Return success url answer = HttpResponseRedirect(self.get_success_url()) except CodenerixException: answer = super(GenUpdateBridge, self).form_invalid(form) else: errors = form._errors.setdefault(field, ErrorList()) errors.append(error_message[0]) answer = super(GenUpdateBridge, self).form_invalid(form) # Return result return answer