Refactor mobile receiving to use colander/deform
This commit is contained in:
		
							parent
							
								
									ec275b2fe0
								
							
						
					
					
						commit
						a65235c0fd
					
				
					 2 changed files with 35 additions and 27 deletions
				
			
		| 
						 | 
					@ -36,8 +36,7 @@ from deform import widget as dfwidget
 | 
				
			||||||
from pyramid import httpexceptions
 | 
					from pyramid import httpexceptions
 | 
				
			||||||
from webhelpers2.html import tags
 | 
					from webhelpers2.html import tags
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# from tailbone import forms
 | 
					from tailbone import forms2 as forms
 | 
				
			||||||
from tailbone import forms2
 | 
					 | 
				
			||||||
from tailbone.views.batch import BatchMasterView
 | 
					from tailbone.views.batch import BatchMasterView
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -251,7 +250,7 @@ class PurchasingBatchView(BatchMasterView):
 | 
				
			||||||
                    if vendor:
 | 
					                    if vendor:
 | 
				
			||||||
                        vendor_display = six.text_type(vendor)
 | 
					                        vendor_display = six.text_type(vendor)
 | 
				
			||||||
            vendors_url = self.request.route_url('vendors.autocomplete')
 | 
					            vendors_url = self.request.route_url('vendors.autocomplete')
 | 
				
			||||||
            f.set_widget('vendor_uuid', forms2.widgets.JQueryAutocompleteWidget(
 | 
					            f.set_widget('vendor_uuid', forms.widgets.JQueryAutocompleteWidget(
 | 
				
			||||||
                field_display=vendor_display, service_url=vendors_url))
 | 
					                field_display=vendor_display, service_url=vendors_url))
 | 
				
			||||||
            f.set_label('vendor_uuid', "Vendor")
 | 
					            f.set_label('vendor_uuid', "Vendor")
 | 
				
			||||||
        elif self.editing:
 | 
					        elif self.editing:
 | 
				
			||||||
| 
						 | 
					@ -288,7 +287,7 @@ class PurchasingBatchView(BatchMasterView):
 | 
				
			||||||
            elif self.editing:
 | 
					            elif self.editing:
 | 
				
			||||||
                buyer_display = six.text_type(batch.buyer or '')
 | 
					                buyer_display = six.text_type(batch.buyer or '')
 | 
				
			||||||
            buyers_url = self.request.route_url('employees.autocomplete')
 | 
					            buyers_url = self.request.route_url('employees.autocomplete')
 | 
				
			||||||
            f.set_widget('buyer_uuid', forms2.widgets.JQueryAutocompleteWidget(
 | 
					            f.set_widget('buyer_uuid', forms.widgets.JQueryAutocompleteWidget(
 | 
				
			||||||
                field_display=buyer_display, service_url=buyers_url))
 | 
					                field_display=buyer_display, service_url=buyers_url))
 | 
				
			||||||
            f.set_label('buyer_uuid', "Buyer")
 | 
					            f.set_label('buyer_uuid', "Buyer")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -35,10 +35,11 @@ from rattail.db import model, api
 | 
				
			||||||
from rattail.gpc import GPC
 | 
					from rattail.gpc import GPC
 | 
				
			||||||
from rattail.util import pretty_quantity, prettify
 | 
					from rattail.util import pretty_quantity, prettify
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import colander
 | 
				
			||||||
import formencode as fe
 | 
					import formencode as fe
 | 
				
			||||||
from webhelpers2.html import tags
 | 
					from webhelpers2.html import tags
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from tailbone import forms, grids
 | 
					from tailbone import forms2 as forms, grids
 | 
				
			||||||
from tailbone.views.purchasing import PurchasingBatchView
 | 
					from tailbone.views.purchasing import PurchasingBatchView
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -289,12 +290,12 @@ class ReceivingBatchView(PurchasingBatchView):
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if self.request.has_perm('{}.create_row'.format(self.get_permission_prefix())):
 | 
					        if self.request.has_perm('{}.create_row'.format(self.get_permission_prefix())):
 | 
				
			||||||
            update_form = forms.SimpleForm(self.request, schema=ReceivingForm)
 | 
					            update_form = forms.Form(schema=ReceivingForm(), request=self.request)
 | 
				
			||||||
            if update_form.validate():
 | 
					            if update_form.validate(newstyle=True):
 | 
				
			||||||
                row = update_form.data['row']
 | 
					                row = update_form.validated['row']
 | 
				
			||||||
                mode = update_form.data['mode']
 | 
					                mode = update_form.validated['mode']
 | 
				
			||||||
                cases = update_form.data['cases']
 | 
					                cases = update_form.validated['cases']
 | 
				
			||||||
                units = update_form.data['units']
 | 
					                units = update_form.validated['units']
 | 
				
			||||||
                if cases:
 | 
					                if cases:
 | 
				
			||||||
                    setattr(row, 'cases_{}'.format(mode),
 | 
					                    setattr(row, 'cases_{}'.format(mode),
 | 
				
			||||||
                            (getattr(row, 'cases_{}'.format(mode)) or 0) + cases)
 | 
					                            (getattr(row, 'cases_{}'.format(mode)) or 0) + cases)
 | 
				
			||||||
| 
						 | 
					@ -305,7 +306,7 @@ class ReceivingBatchView(PurchasingBatchView):
 | 
				
			||||||
                # if mode in ('damaged', 'expired', 'mispick'):
 | 
					                # if mode in ('damaged', 'expired', 'mispick'):
 | 
				
			||||||
                if mode in ('damaged', 'expired'):
 | 
					                if mode in ('damaged', 'expired'):
 | 
				
			||||||
                    self.attach_credit(row, mode, cases, units,
 | 
					                    self.attach_credit(row, mode, cases, units,
 | 
				
			||||||
                                       expiration_date=update_form.data['expiration_date'],
 | 
					                                       expiration_date=update_form.validated['expiration_date'],
 | 
				
			||||||
                                       # discarded=update_form.data['trash'],
 | 
					                                       # discarded=update_form.data['trash'],
 | 
				
			||||||
                                       # mispick_product=shipped_product)
 | 
					                                       # mispick_product=shipped_product)
 | 
				
			||||||
                    )
 | 
					                    )
 | 
				
			||||||
| 
						 | 
					@ -376,32 +377,40 @@ class ReceivingBatchView(PurchasingBatchView):
 | 
				
			||||||
        cls._defaults(config)
 | 
					        cls._defaults(config)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class ValidBatchRow(forms.validators.ModelValidator):
 | 
					class PurchaseBatchRowType(forms.types.ObjectType):
 | 
				
			||||||
    model_class = model.PurchaseBatchRow
 | 
					    model_class = model.PurchaseBatchRow
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def _to_python(self, value, state):
 | 
					    def deserialize(self, node, cstruct):
 | 
				
			||||||
        row = super(ValidBatchRow, self)._to_python(value, state)
 | 
					        row = super(PurchaseBatchRowType, self).deserialize(node, cstruct)
 | 
				
			||||||
        if row.batch.executed:
 | 
					        if row and row.batch.executed:
 | 
				
			||||||
            raise fe.Invalid("Batch has already been executed", value, state)
 | 
					            raise colander.Invalid(node, "Batch has already been executed")
 | 
				
			||||||
        return row
 | 
					        return row
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class ReceivingForm(forms.Schema):
 | 
					class ReceivingForm(colander.MappingSchema):
 | 
				
			||||||
    allow_extra_fields = True
 | 
					
 | 
				
			||||||
    filter_extra_fields = True
 | 
					    row = colander.SchemaNode(PurchaseBatchRowType())
 | 
				
			||||||
    row = ValidBatchRow()
 | 
					
 | 
				
			||||||
    mode = fe.validators.OneOf(['received', 'damaged', 'expired',
 | 
					    mode = colander.SchemaNode(colander.String(),
 | 
				
			||||||
 | 
					                               validator=colander.OneOf(['received',
 | 
				
			||||||
 | 
					                                                         'damaged',
 | 
				
			||||||
 | 
					                                                         'expired',
 | 
				
			||||||
                                                         # 'mispick',
 | 
					                                                         # 'mispick',
 | 
				
			||||||
    ])
 | 
					                               ]))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # product = forms.validators.ValidProduct()
 | 
					    # product = forms.validators.ValidProduct()
 | 
				
			||||||
    # upc = forms.validators.ValidGPC()
 | 
					    # upc = forms.validators.ValidGPC()
 | 
				
			||||||
    # brand_name = fe.validators.String()
 | 
					    # brand_name = fe.validators.String()
 | 
				
			||||||
    # description = fe.validators.String()
 | 
					    # description = fe.validators.String()
 | 
				
			||||||
    # size = fe.validators.String()
 | 
					    # size = fe.validators.String()
 | 
				
			||||||
    # case_quantity = fe.validators.Number()
 | 
					    # case_quantity = fe.validators.Number()
 | 
				
			||||||
    cases = fe.validators.Number()
 | 
					
 | 
				
			||||||
    units = fe.validators.Number()
 | 
					    cases = colander.SchemaNode(colander.Decimal(), missing=colander.null)
 | 
				
			||||||
    expiration_date = fe.validators.DateValidator()
 | 
					
 | 
				
			||||||
 | 
					    units = colander.SchemaNode(colander.Decimal(), missing=colander.null)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    expiration_date = colander.SchemaNode(colander.Date(), missing=colander.null)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # trash = fe.validators.Bool()
 | 
					    # trash = fe.validators.Bool()
 | 
				
			||||||
    # ordered_product = forms.validators.ValidProduct()
 | 
					    # ordered_product = forms.validators.ValidProduct()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue