save customer datas in transfers
This commit is contained in:
parent
8207ca9ab2
commit
12d64aefdc
|
@ -129,7 +129,6 @@ class SanitizationEntityForm(FlaskForm):
|
||||||
|
|
||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
super().__init__(*args, **kwargs)
|
super().__init__(*args, **kwargs)
|
||||||
# import pdb; pdb.set_trace()
|
|
||||||
if isinstance(self.logo.data, URL):
|
if isinstance(self.logo.data, URL):
|
||||||
self.logo.data = self.logo.data.to_text()
|
self.logo.data = self.logo.data.to_text()
|
||||||
|
|
||||||
|
|
|
@ -30,7 +30,12 @@ from wtforms import (
|
||||||
from wtforms.fields import FormField
|
from wtforms.fields import FormField
|
||||||
|
|
||||||
from ereuse_devicehub.db import db
|
from ereuse_devicehub.db import db
|
||||||
from ereuse_devicehub.inventory.models import DeliveryNote, ReceiverNote, Transfer
|
from ereuse_devicehub.inventory.models import (
|
||||||
|
DeliveryNote,
|
||||||
|
ReceiverNote,
|
||||||
|
Transfer,
|
||||||
|
TransferCustomerDetails,
|
||||||
|
)
|
||||||
from ereuse_devicehub.parser.models import PlaceholdersLog, SnapshotsLog
|
from ereuse_devicehub.parser.models import PlaceholdersLog, SnapshotsLog
|
||||||
from ereuse_devicehub.parser.parser import ParseSnapshotLsHw
|
from ereuse_devicehub.parser.parser import ParseSnapshotLsHw
|
||||||
from ereuse_devicehub.parser.schemas import Snapshot_lite
|
from ereuse_devicehub.parser.schemas import Snapshot_lite
|
||||||
|
@ -1518,6 +1523,54 @@ class NotesForm(FlaskForm):
|
||||||
return self._obj
|
return self._obj
|
||||||
|
|
||||||
|
|
||||||
|
class CustomerDetailsForm(FlaskForm):
|
||||||
|
company_name = StringField(
|
||||||
|
'Company name',
|
||||||
|
[validators.Optional()],
|
||||||
|
render_kw={'class': "form-control"},
|
||||||
|
description="Name of the company",
|
||||||
|
)
|
||||||
|
location = StringField(
|
||||||
|
'Location',
|
||||||
|
[validators.Optional()],
|
||||||
|
render_kw={'class': "form-control"},
|
||||||
|
description="""Location where is the company""",
|
||||||
|
)
|
||||||
|
logo = URLField(
|
||||||
|
'Logo',
|
||||||
|
[validators.Optional()],
|
||||||
|
render_kw={'class': "form-control"},
|
||||||
|
description="Url where is the logo",
|
||||||
|
)
|
||||||
|
|
||||||
|
def __init__(self, *args, **kwargs):
|
||||||
|
lot_id = kwargs.pop('lot_id', None)
|
||||||
|
self._tmp_lot = Lot.query.filter(Lot.id == lot_id).one()
|
||||||
|
self._obj = self._tmp_lot.transfer.customer_details
|
||||||
|
if self._obj:
|
||||||
|
kwargs['obj'] = self._obj
|
||||||
|
if not self._obj:
|
||||||
|
self._obj = TransferCustomerDetails(transfer_id=self._tmp_lot.transfer.id)
|
||||||
|
|
||||||
|
super().__init__(*args, **kwargs)
|
||||||
|
if isinstance(self.logo.data, URL):
|
||||||
|
self.logo.data = URL(self.logo.data).to_text()
|
||||||
|
|
||||||
|
def validate(self, extra_validators=None):
|
||||||
|
is_valid = super().validate(extra_validators)
|
||||||
|
return is_valid
|
||||||
|
|
||||||
|
def save(self, commit=True):
|
||||||
|
self.populate_obj(self._obj)
|
||||||
|
self._obj.logo = URL(self._obj.logo)
|
||||||
|
db.session.add(self._obj)
|
||||||
|
|
||||||
|
if commit:
|
||||||
|
db.session.commit()
|
||||||
|
|
||||||
|
return self._obj
|
||||||
|
|
||||||
|
|
||||||
class UploadPlaceholderForm(FlaskForm):
|
class UploadPlaceholderForm(FlaskForm):
|
||||||
type = StringField('Type', [validators.DataRequired()])
|
type = StringField('Type', [validators.DataRequired()])
|
||||||
placeholder_file = FileField(
|
placeholder_file = FileField(
|
||||||
|
|
|
@ -5,7 +5,7 @@ from flask import g
|
||||||
from sqlalchemy import Column, Integer
|
from sqlalchemy import Column, Integer
|
||||||
from sqlalchemy.dialects.postgresql import UUID
|
from sqlalchemy.dialects.postgresql import UUID
|
||||||
from sqlalchemy.orm import backref, relationship
|
from sqlalchemy.orm import backref, relationship
|
||||||
from teal.db import CASCADE_OWN
|
from teal.db import CASCADE_OWN, URL
|
||||||
|
|
||||||
from ereuse_devicehub.db import db
|
from ereuse_devicehub.db import db
|
||||||
from ereuse_devicehub.resources.models import Thing
|
from ereuse_devicehub.resources.models import Thing
|
||||||
|
@ -90,3 +90,23 @@ class ReceiverNote(Thing):
|
||||||
backref=backref('receiver_note', lazy=True, uselist=False, cascade=CASCADE_OWN),
|
backref=backref('receiver_note', lazy=True, uselist=False, cascade=CASCADE_OWN),
|
||||||
primaryjoin='ReceiverNote.transfer_id == Transfer.id',
|
primaryjoin='ReceiverNote.transfer_id == Transfer.id',
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class TransferCustomerDetails(Thing):
|
||||||
|
id = Column(UUID(as_uuid=True), primary_key=True, default=uuid4)
|
||||||
|
company_name = Column(CIText(), nullable=True)
|
||||||
|
location = Column(CIText(), nullable=True)
|
||||||
|
logo = Column(URL(), nullable=True)
|
||||||
|
|
||||||
|
transfer_id = db.Column(
|
||||||
|
UUID(as_uuid=True),
|
||||||
|
db.ForeignKey('transfer.id'),
|
||||||
|
nullable=False,
|
||||||
|
)
|
||||||
|
transfer = relationship(
|
||||||
|
'Transfer',
|
||||||
|
backref=backref(
|
||||||
|
'customer_details', lazy=True, uselist=False, cascade=CASCADE_OWN
|
||||||
|
),
|
||||||
|
primaryjoin='TransferCustomerDetails.transfer_id == Transfer.id',
|
||||||
|
)
|
||||||
|
|
|
@ -20,6 +20,7 @@ from ereuse_devicehub.inventory.forms import (
|
||||||
AdvancedSearchForm,
|
AdvancedSearchForm,
|
||||||
AllocateForm,
|
AllocateForm,
|
||||||
BindingForm,
|
BindingForm,
|
||||||
|
CustomerDetailsForm,
|
||||||
DataWipeForm,
|
DataWipeForm,
|
||||||
EditTransferForm,
|
EditTransferForm,
|
||||||
FilterForm,
|
FilterForm,
|
||||||
|
@ -79,6 +80,7 @@ class DeviceListMixin(GenericMixin):
|
||||||
form_transfer = ''
|
form_transfer = ''
|
||||||
form_delivery = ''
|
form_delivery = ''
|
||||||
form_receiver = ''
|
form_receiver = ''
|
||||||
|
form_customer_details = ''
|
||||||
|
|
||||||
if lot_id:
|
if lot_id:
|
||||||
lot = lots.filter(Lot.id == lot_id).one()
|
lot = lots.filter(Lot.id == lot_id).one()
|
||||||
|
@ -86,6 +88,7 @@ class DeviceListMixin(GenericMixin):
|
||||||
form_transfer = EditTransferForm(lot_id=lot.id)
|
form_transfer = EditTransferForm(lot_id=lot.id)
|
||||||
form_delivery = NotesForm(lot_id=lot.id, type='Delivery')
|
form_delivery = NotesForm(lot_id=lot.id, type='Delivery')
|
||||||
form_receiver = NotesForm(lot_id=lot.id, type='Receiver')
|
form_receiver = NotesForm(lot_id=lot.id, type='Receiver')
|
||||||
|
form_customer_details = CustomerDetailsForm(lot_id=lot.id)
|
||||||
|
|
||||||
form_new_action = NewActionForm(lot=lot_id)
|
form_new_action = NewActionForm(lot=lot_id)
|
||||||
self.context.update(
|
self.context.update(
|
||||||
|
@ -97,6 +100,7 @@ class DeviceListMixin(GenericMixin):
|
||||||
'form_transfer': form_transfer,
|
'form_transfer': form_transfer,
|
||||||
'form_delivery': form_delivery,
|
'form_delivery': form_delivery,
|
||||||
'form_receiver': form_receiver,
|
'form_receiver': form_receiver,
|
||||||
|
'form_customer_details': form_customer_details,
|
||||||
'form_filter': form_filter,
|
'form_filter': form_filter,
|
||||||
'form_print_labels': PrintLabelsForm(),
|
'form_print_labels': PrintLabelsForm(),
|
||||||
'lot': lot,
|
'lot': lot,
|
||||||
|
@ -1257,6 +1261,28 @@ class SnapshotDetailView(GenericMixin):
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class CustomerDetailsView(GenericMixin):
|
||||||
|
methods = ['POST']
|
||||||
|
form_class = CustomerDetailsForm
|
||||||
|
|
||||||
|
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('Customer details updated successfully!')
|
||||||
|
return flask.redirect(next_url)
|
||||||
|
|
||||||
|
messages.error('Customer details updated error!')
|
||||||
|
for k, v in form.errors.items():
|
||||||
|
value = ';'.join(v)
|
||||||
|
key = form[k].label.text
|
||||||
|
messages.error('Error {key}: {value}!'.format(key=key, value=value))
|
||||||
|
return flask.redirect(next_url)
|
||||||
|
|
||||||
|
|
||||||
class DeliveryNoteView(GenericMixin):
|
class DeliveryNoteView(GenericMixin):
|
||||||
methods = ['POST']
|
methods = ['POST']
|
||||||
form_class = NotesForm
|
form_class = NotesForm
|
||||||
|
@ -1448,6 +1474,10 @@ devices.add_url_rule(
|
||||||
'/lot/<string:lot_id>/transfer/',
|
'/lot/<string:lot_id>/transfer/',
|
||||||
view_func=EditTransferView.as_view('edit_transfer'),
|
view_func=EditTransferView.as_view('edit_transfer'),
|
||||||
)
|
)
|
||||||
|
devices.add_url_rule(
|
||||||
|
'/lot/<string:lot_id>/customerdetails/',
|
||||||
|
view_func=CustomerDetailsView.as_view('customer_details'),
|
||||||
|
)
|
||||||
devices.add_url_rule(
|
devices.add_url_rule(
|
||||||
'/lot/<string:lot_id>/deliverynote/',
|
'/lot/<string:lot_id>/deliverynote/',
|
||||||
view_func=DeliveryNoteView.as_view('delivery_note'),
|
view_func=DeliveryNoteView.as_view('delivery_note'),
|
||||||
|
|
|
@ -5,6 +5,7 @@ Revises: 93daff872771
|
||||||
Create Date: 2023-02-13 18:01:00.092527
|
Create Date: 2023-02-13 18:01:00.092527
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
import citext
|
||||||
import sqlalchemy as sa
|
import sqlalchemy as sa
|
||||||
import teal
|
import teal
|
||||||
from alembic import context, op
|
from alembic import context, op
|
||||||
|
@ -54,6 +55,31 @@ def upgrade():
|
||||||
schema=f'{get_inv()}',
|
schema=f'{get_inv()}',
|
||||||
)
|
)
|
||||||
|
|
||||||
|
op.create_table(
|
||||||
|
'transfer_customer_details',
|
||||||
|
sa.Column('id', postgresql.UUID(as_uuid=True), nullable=False),
|
||||||
|
sa.Column(
|
||||||
|
'updated',
|
||||||
|
sa.TIMESTAMP(timezone=True),
|
||||||
|
server_default=sa.text('CURRENT_TIMESTAMP'),
|
||||||
|
nullable=False,
|
||||||
|
),
|
||||||
|
sa.Column(
|
||||||
|
'created',
|
||||||
|
sa.TIMESTAMP(timezone=True),
|
||||||
|
server_default=sa.text('CURRENT_TIMESTAMP'),
|
||||||
|
nullable=False,
|
||||||
|
),
|
||||||
|
sa.Column('company_name', citext.CIText(), nullable=True),
|
||||||
|
sa.Column('logo', teal.db.URL(), nullable=True),
|
||||||
|
sa.Column('location', citext.CIText(), nullable=True),
|
||||||
|
sa.Column('transfer_id', postgresql.UUID(as_uuid=True), nullable=False),
|
||||||
|
sa.ForeignKeyConstraint(['transfer_id'], [f'{get_inv()}.transfer.id']),
|
||||||
|
sa.PrimaryKeyConstraint('id'),
|
||||||
|
schema=f'{get_inv()}',
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
def downgrade():
|
def downgrade():
|
||||||
op.drop_table('sanitization_entity', schema=f'{get_inv()}')
|
op.drop_table('sanitization_entity', schema=f'{get_inv()}')
|
||||||
|
op.drop_table('transfer_customer_details', schema=f'{get_inv()}')
|
||||||
|
|
|
@ -93,6 +93,11 @@
|
||||||
Receiver Note
|
Receiver Note
|
||||||
</button>
|
</button>
|
||||||
</li>
|
</li>
|
||||||
|
<li class="nav-item">
|
||||||
|
<button class="nav-link" data-bs-toggle="tab" data-bs-target="#edit-customer-details">
|
||||||
|
Customer Details
|
||||||
|
</button>
|
||||||
|
</li>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
|
@ -656,6 +661,37 @@
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div id="edit-customer-details" class="tab-pane fade edit-customer-details">
|
||||||
|
<h5 class="card-title">Customer Details</h5>
|
||||||
|
<form method="post" action="{{ url_for('inventory.customer_details', lot_id=lot.id) }}" class="row g-3 needs-validation" novalidate>
|
||||||
|
{{ form_customer_details.csrf_token }}
|
||||||
|
|
||||||
|
{% for field in form_customer_details %}
|
||||||
|
{% if field != form_customer_details.csrf_token %}
|
||||||
|
<div class="col-12">
|
||||||
|
{% if field != form_customer_details.type %}
|
||||||
|
{{ field.label(class_="form-label") }}
|
||||||
|
{{ field }}
|
||||||
|
<small class="text-muted">{{ field.description }}</small>
|
||||||
|
{% if field.errors %}
|
||||||
|
<p class="text-danger">
|
||||||
|
{% for error in field.errors %}
|
||||||
|
{{ error }}<br/>
|
||||||
|
{% endfor %}
|
||||||
|
</p>
|
||||||
|
{% endif %}
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<a href="{{ url_for('inventory.lotdevicelist', lot_id=lot.id) }}" class="btn btn-danger">Cancel</a>
|
||||||
|
<button class="btn btn-primary" type="submit">Save</button>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
</div><!-- End Bordered Tabs -->
|
</div><!-- End Bordered Tabs -->
|
||||||
|
|
|
@ -71,6 +71,7 @@ def test_api_docs(client: Client):
|
||||||
'/inventory/lot/{lot_id}/transfer/',
|
'/inventory/lot/{lot_id}/transfer/',
|
||||||
'/inventory/lot/transfer/{type_id}/',
|
'/inventory/lot/transfer/{type_id}/',
|
||||||
'/inventory/lot/{lot_id}/upload-snapshot/',
|
'/inventory/lot/{lot_id}/upload-snapshot/',
|
||||||
|
'/inventory/lot/{lot_id}/customerdetails/',
|
||||||
'/inventory/snapshots/{snapshot_uuid}/',
|
'/inventory/snapshots/{snapshot_uuid}/',
|
||||||
'/inventory/snapshots/',
|
'/inventory/snapshots/',
|
||||||
'/inventory/tag/devices/{dhid}/add/',
|
'/inventory/tag/devices/{dhid}/add/',
|
||||||
|
@ -98,6 +99,7 @@ def test_api_docs(client: Client):
|
||||||
'/metrics/',
|
'/metrics/',
|
||||||
'/profile/',
|
'/profile/',
|
||||||
'/set_password/',
|
'/set_password/',
|
||||||
|
'/set_sanitization/',
|
||||||
'/tags/',
|
'/tags/',
|
||||||
'/tags/{tag_id}/device/{device_id}',
|
'/tags/{tag_id}/device/{device_id}',
|
||||||
'/trade-documents/',
|
'/trade-documents/',
|
||||||
|
|
Reference in New Issue