diff --git a/ereuse_devicehub/inventory/forms.py b/ereuse_devicehub/inventory/forms.py index 5523f00a..d2107d92 100644 --- a/ereuse_devicehub/inventory/forms.py +++ b/ereuse_devicehub/inventory/forms.py @@ -1104,41 +1104,54 @@ class TradeDocumentForm(FlaskForm): class TransferForm(FlaskForm): code = StringField( 'Code', - [validators.Optional()], + [validators.DataRequired()], render_kw={'class': "form-control"}, description="You need put a code for transfer the external user", ) - date = DateField( - 'Date', - [validators.Optional()], - render_kw={'class': "form-control"}, - description="""Date when the transfer is closed""", - ) description = TextAreaField( 'Description', + [validators.Optional()], render_kw={'class': "form-control"}, ) type = HiddenField() def __init__(self, *args, **kwargs): - lot_id = kwargs.pop('lot_id') - super().__init__(*args, **kwargs) + self._type = kwargs.get('type') + lot_id = kwargs.pop('lot_id', None) self._tmp_lot = Lot.query.filter(Lot.id == lot_id).one() + super().__init__(*args, **kwargs) + self._obj = None def validate(self, extra_validators=None): is_valid = super().validate(extra_validators) + if not self._tmp_lot: + return False - if self.type.data not in ['incoming', 'outgoing']: - is_valid = False + if self._type and self.type.data not in ['incoming', 'outgoing']: + return False + + if self._obj and self.date.data: + if self.date.data > datetime.datetime.now().date(): + return False return is_valid def save(self, commit=True): + self.set_obj() + db.session.add(self._obj) + + if commit: + db.session.commit() + + return self._obj + + def set_obj(self): self.newlot = Lot(name=self._tmp_lot.name) self.newlot.devices = self._tmp_lot.devices db.session.add(self.newlot) self._obj = Transfer(lot=self.newlot) + self.populate_obj(self._obj) if self.type.data == 'incoming': @@ -1146,9 +1159,25 @@ class TransferForm(FlaskForm): elif self.type.data == 'outgoing': self._obj.user_from = g.user - db.session.add(self._obj) - if commit: - db.session.commit() +class EditTransferForm(TransferForm): + date = DateField( + 'Date', + [validators.Optional()], + render_kw={'class': "form-control"}, + description="""Date when the transfer is closed""", + ) - return self._obj + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + del self.type + + self._obj = self._tmp_lot.transfer + + if not self.data['csrf_token']: + self.code.data = self._obj.code + self.description.data = self._obj.description + self.date.data = self._obj.date + + def set_obj(self, commit=True): + self.populate_obj(self._obj) diff --git a/ereuse_devicehub/inventory/views.py b/ereuse_devicehub/inventory/views.py index e05239ff..978b02d0 100644 --- a/ereuse_devicehub/inventory/views.py +++ b/ereuse_devicehub/inventory/views.py @@ -15,6 +15,7 @@ from ereuse_devicehub.db import db from ereuse_devicehub.inventory.forms import ( AllocateForm, DataWipeForm, + EditTransferForm, FilterForm, LotForm, NewActionForm, @@ -48,16 +49,12 @@ class DeviceListMix(GenericMixView): form_filter = FilterForm(lots, lot_id, only_unassigned=only_unassigned) devices = form_filter.search() lot = None + form_transfer = '' if lot_id: lot = lots.filter(Lot.id == lot_id).one() - form_new_trade = TradeForm( - lot=lot.id, - user_to=g.user.email, - user_from=g.user.email, - ) - else: - form_new_trade = '' + if not lot.is_temporary and lot.transfer: + form_transfer = EditTransferForm(lot_id=lot.id, id=lot.transfer.id) form_new_action = NewActionForm(lot=lot_id) self.context.update( @@ -67,7 +64,7 @@ class DeviceListMix(GenericMixView): 'form_new_action': form_new_action, 'form_new_allocate': AllocateForm(lot=lot_id), 'form_new_datawipe': DataWipeForm(lot=lot_id), - 'form_new_trade': form_new_trade, + 'form_transfer': form_transfer, 'form_filter': form_filter, 'form_print_labels': PrintLabelsForm(), 'lot': lot, @@ -416,6 +413,7 @@ class NewTransferView(GenericMixView): new_lot_id = lot_id if self.form.newlot.id: new_lot_id = self.form.newlot.id + Lot.query.filter(Lot.id == new_lot_id).one() messages.success('Transfer created successfully!') next_url = url_for('inventory.lotdevicelist', lot_id=new_lot_id) return flask.redirect(next_url) @@ -424,6 +422,24 @@ class NewTransferView(GenericMixView): return flask.render_template(self.template_name, **self.context) +class EditTransferView(GenericMixView): + methods = ['POST'] + form_class = EditTransferForm + + def dispatch_request(self, lot_id): + self.get_context() + form = self.form_class(request.form, lot_id=lot_id) + next_url = url_for('inventory.lotdevicelist', lot_id=lot_id) + + if form.validate_on_submit(): + form.save() + messages.success('Transfer updated successfully!') + return flask.redirect(next_url) + + messages.error('Transfer updated error!') + return flask.redirect(next_url) + + class ExportsView(View): methods = ['GET'] decorators = [login_required] @@ -585,3 +601,7 @@ devices.add_url_rule( '/lot//transfer//', view_func=NewTransferView.as_view('new_transfer'), ) +devices.add_url_rule( + '/lot//transfer/', + view_func=EditTransferView.as_view('edit_transfer'), +)