resolve conflict
This commit is contained in:
commit
e614908c73
|
@ -3,37 +3,39 @@ import json
|
||||||
from json.decoder import JSONDecodeError
|
from json.decoder import JSONDecodeError
|
||||||
|
|
||||||
from boltons.urlutils import URL
|
from boltons.urlutils import URL
|
||||||
|
from flask import g, request
|
||||||
|
from flask_wtf import FlaskForm
|
||||||
|
from sqlalchemy.util import OrderedSet
|
||||||
|
from wtforms import (
|
||||||
|
BooleanField, DateField, FileField, FloatField, Form, HiddenField,
|
||||||
|
IntegerField, MultipleFileField, SelectField, StringField, TextAreaField,
|
||||||
|
URLField, validators)
|
||||||
|
from wtforms.fields import FormField
|
||||||
|
|
||||||
from ereuse_devicehub.db import db
|
from ereuse_devicehub.db import db
|
||||||
from ereuse_devicehub.resources.action.models import RateComputer, Snapshot
|
from ereuse_devicehub.resources.action.models import RateComputer, Snapshot
|
||||||
from ereuse_devicehub.resources.action.rate.v1_0 import CannotRate
|
from ereuse_devicehub.resources.action.rate.v1_0 import CannotRate
|
||||||
from ereuse_devicehub.resources.action.schemas import \
|
from ereuse_devicehub.resources.action.schemas import \
|
||||||
Snapshot as SnapshotSchema
|
Snapshot as SnapshotSchema
|
||||||
from ereuse_devicehub.resources.action.views.snapshot import move_json, save_json
|
from ereuse_devicehub.resources.action.views.snapshot import (
|
||||||
from ereuse_devicehub.resources.device.models import (SAI, Cellphone, Computer,
|
move_json, save_json)
|
||||||
Device, Keyboard, MemoryCardReader,
|
from ereuse_devicehub.resources.device.models import (
|
||||||
Monitor, Mouse, Smartphone, Tablet)
|
SAI, Cellphone, Computer, Device, Keyboard, MemoryCardReader, Monitor,
|
||||||
from flask import g, request
|
Mouse, Smartphone, Tablet)
|
||||||
from flask_wtf import FlaskForm
|
|
||||||
from sqlalchemy.util import OrderedSet
|
|
||||||
from wtforms import (BooleanField, DateField, FileField, FloatField, Form,
|
|
||||||
HiddenField, IntegerField, MultipleFileField, SelectField,
|
|
||||||
StringField, TextAreaField, URLField, validators)
|
|
||||||
from wtforms.fields import FormField
|
|
||||||
|
|
||||||
from ereuse_devicehub.resources.device.sync import Sync
|
from ereuse_devicehub.resources.device.sync import Sync
|
||||||
from ereuse_devicehub.resources.documents.models import DataWipeDocument
|
from ereuse_devicehub.resources.documents.models import DataWipeDocument
|
||||||
from ereuse_devicehub.resources.enums import Severity, SnapshotSoftware
|
from ereuse_devicehub.resources.enums import Severity, SnapshotSoftware
|
||||||
from ereuse_devicehub.resources.hash_reports import insert_hash
|
from ereuse_devicehub.resources.hash_reports import insert_hash
|
||||||
from ereuse_devicehub.resources.lot.models import Lot
|
from ereuse_devicehub.resources.lot.models import Lot
|
||||||
from ereuse_devicehub.resources.tag.model import Tag
|
from ereuse_devicehub.resources.tag.model import Tag
|
||||||
from ereuse_devicehub.resources.user.models import User
|
|
||||||
from ereuse_devicehub.resources.tradedocument.models import TradeDocument
|
from ereuse_devicehub.resources.tradedocument.models import TradeDocument
|
||||||
from ereuse_devicehub.resources.user.exceptions import InsufficientPermission
|
from ereuse_devicehub.resources.user.exceptions import InsufficientPermission
|
||||||
|
from ereuse_devicehub.resources.user.models import User
|
||||||
|
|
||||||
|
|
||||||
class LotDeviceForm(FlaskForm):
|
class LotDeviceForm(FlaskForm):
|
||||||
lot = StringField(u'Lot', [validators.UUID()])
|
lot = StringField('Lot', [validators.UUID()])
|
||||||
devices = StringField(u'Devices', [validators.length(min=1)])
|
devices = StringField('Devices', [validators.length(min=1)])
|
||||||
|
|
||||||
def validate(self, extra_validators=None):
|
def validate(self, extra_validators=None):
|
||||||
is_valid = super().validate(extra_validators)
|
is_valid = super().validate(extra_validators)
|
||||||
|
@ -41,12 +43,19 @@ class LotDeviceForm(FlaskForm):
|
||||||
if not is_valid:
|
if not is_valid:
|
||||||
return False
|
return False
|
||||||
|
|
||||||
self._lot = Lot.query.filter(Lot.id == self.lot.data).filter(
|
self._lot = (
|
||||||
Lot.owner_id == g.user.id).one()
|
Lot.query.filter(Lot.id == self.lot.data)
|
||||||
|
.filter(Lot.owner_id == g.user.id)
|
||||||
|
.one()
|
||||||
|
)
|
||||||
|
|
||||||
devices = set(self.devices.data.split(","))
|
devices = set(self.devices.data.split(","))
|
||||||
self._devices = Device.query.filter(Device.id.in_(devices)).filter(
|
self._devices = (
|
||||||
Device.owner_id == g.user.id).distinct().all()
|
Device.query.filter(Device.id.in_(devices))
|
||||||
|
.filter(Device.owner_id == g.user.id)
|
||||||
|
.distinct()
|
||||||
|
.all()
|
||||||
|
)
|
||||||
|
|
||||||
return bool(self._devices)
|
return bool(self._devices)
|
||||||
|
|
||||||
|
@ -54,7 +63,7 @@ class LotDeviceForm(FlaskForm):
|
||||||
trade = self._lot.trade
|
trade = self._lot.trade
|
||||||
if trade:
|
if trade:
|
||||||
for dev in self._devices:
|
for dev in self._devices:
|
||||||
if not trade in dev.actions:
|
if trade not in dev.actions:
|
||||||
trade.devices.add(dev)
|
trade.devices.add(dev)
|
||||||
|
|
||||||
self._lot.devices.update(self._devices)
|
self._lot.devices.update(self._devices)
|
||||||
|
@ -68,14 +77,17 @@ class LotDeviceForm(FlaskForm):
|
||||||
|
|
||||||
|
|
||||||
class LotForm(FlaskForm):
|
class LotForm(FlaskForm):
|
||||||
name = StringField(u'Name', [validators.length(min=1)])
|
name = StringField('Name', [validators.length(min=1)])
|
||||||
|
|
||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
self.id = kwargs.pop('id', None)
|
self.id = kwargs.pop('id', None)
|
||||||
self.instance = None
|
self.instance = None
|
||||||
if self.id:
|
if self.id:
|
||||||
self.instance = Lot.query.filter(Lot.id == self.id).filter(
|
self.instance = (
|
||||||
Lot.owner_id == g.user.id).one()
|
Lot.query.filter(Lot.id == self.id)
|
||||||
|
.filter(Lot.owner_id == g.user.id)
|
||||||
|
.one()
|
||||||
|
)
|
||||||
super().__init__(*args, **kwargs)
|
super().__init__(*args, **kwargs)
|
||||||
if self.instance and not self.name.data:
|
if self.instance and not self.name.data:
|
||||||
self.name.data = self.instance.name
|
self.name.data = self.instance.name
|
||||||
|
@ -103,7 +115,7 @@ class LotForm(FlaskForm):
|
||||||
|
|
||||||
|
|
||||||
class UploadSnapshotForm(FlaskForm):
|
class UploadSnapshotForm(FlaskForm):
|
||||||
snapshot = MultipleFileField(u'Select a Snapshot File', [validators.DataRequired()])
|
snapshot = MultipleFileField('Select a Snapshot File', [validators.DataRequired()])
|
||||||
|
|
||||||
def validate(self, extra_validators=None):
|
def validate(self, extra_validators=None):
|
||||||
is_valid = super().validate(extra_validators)
|
is_valid = super().validate(extra_validators)
|
||||||
|
@ -171,8 +183,10 @@ class UploadSnapshotForm(FlaskForm):
|
||||||
# this is a copy adaptated from ereuse_devicehub.resources.action.views.snapshot
|
# this is a copy adaptated from ereuse_devicehub.resources.action.views.snapshot
|
||||||
device = snapshot_json.pop('device') # type: Computer
|
device = snapshot_json.pop('device') # type: Computer
|
||||||
components = None
|
components = None
|
||||||
if snapshot_json['software'] == (SnapshotSoftware.Workbench or SnapshotSoftware.WorkbenchAndroid):
|
if snapshot_json['software'] == (
|
||||||
components = snapshot_json.pop('components', None) # type: List[Component]
|
SnapshotSoftware.Workbench or SnapshotSoftware.WorkbenchAndroid
|
||||||
|
):
|
||||||
|
components = snapshot_json.pop('components', None)
|
||||||
if isinstance(device, Computer) and device.hid:
|
if isinstance(device, Computer) and device.hid:
|
||||||
device.add_mac_to_hid(components_snap=components)
|
device.add_mac_to_hid(components_snap=components)
|
||||||
snapshot = Snapshot(**snapshot_json)
|
snapshot = Snapshot(**snapshot_json)
|
||||||
|
@ -181,7 +195,9 @@ class UploadSnapshotForm(FlaskForm):
|
||||||
actions_device = set(e for e in device.actions_one)
|
actions_device = set(e for e in device.actions_one)
|
||||||
device.actions_one.clear()
|
device.actions_one.clear()
|
||||||
if components:
|
if components:
|
||||||
actions_components = tuple(set(e for e in c.actions_one) for c in components)
|
actions_components = tuple(
|
||||||
|
set(e for e in c.actions_one) for c in components
|
||||||
|
)
|
||||||
for component in components:
|
for component in components:
|
||||||
component.actions_one.clear()
|
component.actions_one.clear()
|
||||||
|
|
||||||
|
@ -227,38 +243,40 @@ class UploadSnapshotForm(FlaskForm):
|
||||||
|
|
||||||
|
|
||||||
class NewDeviceForm(FlaskForm):
|
class NewDeviceForm(FlaskForm):
|
||||||
type = StringField(u'Type', [validators.DataRequired()])
|
type = StringField('Type', [validators.DataRequired()])
|
||||||
label = StringField(u'Label')
|
label = StringField('Label')
|
||||||
serial_number = StringField(u'Seria Number', [validators.DataRequired()])
|
serial_number = StringField('Seria Number', [validators.DataRequired()])
|
||||||
model = StringField(u'Model', [validators.DataRequired()])
|
model = StringField('Model', [validators.DataRequired()])
|
||||||
manufacturer = StringField(u'Manufacturer', [validators.DataRequired()])
|
manufacturer = StringField('Manufacturer', [validators.DataRequired()])
|
||||||
appearance = StringField(u'Appearance', [validators.Optional()])
|
appearance = StringField('Appearance', [validators.Optional()])
|
||||||
functionality = StringField(u'Functionality', [validators.Optional()])
|
functionality = StringField('Functionality', [validators.Optional()])
|
||||||
brand = StringField(u'Brand')
|
brand = StringField('Brand')
|
||||||
generation = IntegerField(u'Generation')
|
generation = IntegerField('Generation')
|
||||||
version = StringField(u'Version')
|
version = StringField('Version')
|
||||||
weight = FloatField(u'Weight', [validators.DataRequired()])
|
weight = FloatField('Weight', [validators.DataRequired()])
|
||||||
width = FloatField(u'Width', [validators.DataRequired()])
|
width = FloatField('Width', [validators.DataRequired()])
|
||||||
height = FloatField(u'Height', [validators.DataRequired()])
|
height = FloatField('Height', [validators.DataRequired()])
|
||||||
depth = FloatField(u'Depth', [validators.DataRequired()])
|
depth = FloatField('Depth', [validators.DataRequired()])
|
||||||
variant = StringField(u'Variant', [validators.Optional()])
|
variant = StringField('Variant', [validators.Optional()])
|
||||||
sku = StringField(u'SKU', [validators.Optional()])
|
sku = StringField('SKU', [validators.Optional()])
|
||||||
image = StringField(u'Image', [validators.Optional(), validators.URL()])
|
image = StringField('Image', [validators.Optional(), validators.URL()])
|
||||||
imei = IntegerField(u'IMEI', [validators.Optional()])
|
imei = IntegerField('IMEI', [validators.Optional()])
|
||||||
meid = StringField(u'MEID', [validators.Optional()])
|
meid = StringField('MEID', [validators.Optional()])
|
||||||
resolution = IntegerField(u'Resolution width', [validators.Optional()])
|
resolution = IntegerField('Resolution width', [validators.Optional()])
|
||||||
screen = FloatField(u'Screen size', [validators.Optional()])
|
screen = FloatField('Screen size', [validators.Optional()])
|
||||||
|
|
||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
super().__init__(*args, **kwargs)
|
super().__init__(*args, **kwargs)
|
||||||
self.devices = {"Smartphone": Smartphone,
|
self.devices = {
|
||||||
"Tablet": Tablet,
|
"Smartphone": Smartphone,
|
||||||
"Cellphone": Cellphone,
|
"Tablet": Tablet,
|
||||||
"Monitor": Monitor,
|
"Cellphone": Cellphone,
|
||||||
"Mouse": Mouse,
|
"Monitor": Monitor,
|
||||||
"Keyboard": Keyboard,
|
"Mouse": Mouse,
|
||||||
"SAI": SAI,
|
"Keyboard": Keyboard,
|
||||||
"MemoryCardReader": MemoryCardReader}
|
"SAI": SAI,
|
||||||
|
"MemoryCardReader": MemoryCardReader,
|
||||||
|
}
|
||||||
|
|
||||||
if not self.generation.data:
|
if not self.generation.data:
|
||||||
self.generation.data = 1
|
self.generation.data = 1
|
||||||
|
@ -335,29 +353,31 @@ class NewDeviceForm(FlaskForm):
|
||||||
'software': 'Web',
|
'software': 'Web',
|
||||||
'version': '11.0',
|
'version': '11.0',
|
||||||
'device': {
|
'device': {
|
||||||
'type': self.type.data,
|
'type': self.type.data,
|
||||||
'model': self.model.data,
|
'model': self.model.data,
|
||||||
'manufacturer': self.manufacturer.data,
|
'manufacturer': self.manufacturer.data,
|
||||||
'serialNumber': self.serial_number.data,
|
'serialNumber': self.serial_number.data,
|
||||||
'brand': self.brand.data,
|
'brand': self.brand.data,
|
||||||
'version': self.version.data,
|
'version': self.version.data,
|
||||||
'generation': self.generation.data,
|
'generation': self.generation.data,
|
||||||
'sku': self.sku.data,
|
'sku': self.sku.data,
|
||||||
'weight': self.weight.data,
|
'weight': self.weight.data,
|
||||||
'width': self.width.data,
|
'width': self.width.data,
|
||||||
'height': self.height.data,
|
'height': self.height.data,
|
||||||
'depth': self.depth.data,
|
'depth': self.depth.data,
|
||||||
'variant': self.variant.data,
|
'variant': self.variant.data,
|
||||||
'image': self.image.data
|
'image': self.image.data,
|
||||||
}
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
if self.appearance.data or self.functionality.data:
|
if self.appearance.data or self.functionality.data:
|
||||||
json_snapshot['device']['actions'] = [{
|
json_snapshot['device']['actions'] = [
|
||||||
'type': 'VisualTest',
|
{
|
||||||
'appearanceRange': self.appearance.data,
|
'type': 'VisualTest',
|
||||||
'functionalityRange': self.functionality.data
|
'appearanceRange': self.appearance.data,
|
||||||
}]
|
'functionalityRange': self.functionality.data,
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
upload_form = UploadSnapshotForm()
|
upload_form = UploadSnapshotForm()
|
||||||
upload_form.sync = Sync()
|
upload_form.sync = Sync()
|
||||||
|
@ -387,14 +407,14 @@ class NewDeviceForm(FlaskForm):
|
||||||
|
|
||||||
|
|
||||||
class TagForm(FlaskForm):
|
class TagForm(FlaskForm):
|
||||||
code = StringField(u'Code', [validators.length(min=1)])
|
code = StringField('Code', [validators.length(min=1)])
|
||||||
|
|
||||||
def validate(self, extra_validators=None):
|
def validate(self, extra_validators=None):
|
||||||
error = ["This value is being used"]
|
error = ["This value is being used"]
|
||||||
is_valid = super().validate(extra_validators)
|
is_valid = super().validate(extra_validators)
|
||||||
if not is_valid:
|
if not is_valid:
|
||||||
return False
|
return False
|
||||||
tag = Tag.query.filter(Tag.id==self.code.data).all()
|
tag = Tag.query.filter(Tag.id == self.code.data).all()
|
||||||
if tag:
|
if tag:
|
||||||
self.code.errors = error
|
self.code.errors = error
|
||||||
return False
|
return False
|
||||||
|
@ -415,7 +435,7 @@ class TagForm(FlaskForm):
|
||||||
|
|
||||||
|
|
||||||
class TagUnnamedForm(FlaskForm):
|
class TagUnnamedForm(FlaskForm):
|
||||||
amount = IntegerField(u'amount')
|
amount = IntegerField('amount')
|
||||||
|
|
||||||
def save(self):
|
def save(self):
|
||||||
num = self.amount.data
|
num = self.amount.data
|
||||||
|
@ -427,8 +447,8 @@ class TagUnnamedForm(FlaskForm):
|
||||||
|
|
||||||
|
|
||||||
class TagDeviceForm(FlaskForm):
|
class TagDeviceForm(FlaskForm):
|
||||||
tag = SelectField(u'Tag', choices=[])
|
tag = SelectField('Tag', choices=[])
|
||||||
device = StringField(u'Device', [validators.Optional()])
|
device = StringField('Device', [validators.Optional()])
|
||||||
|
|
||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
self.delete = kwargs.pop('delete', None)
|
self.delete = kwargs.pop('delete', None)
|
||||||
|
@ -437,9 +457,11 @@ class TagDeviceForm(FlaskForm):
|
||||||
super().__init__(*args, **kwargs)
|
super().__init__(*args, **kwargs)
|
||||||
|
|
||||||
if self.delete:
|
if self.delete:
|
||||||
tags = Tag.query.filter(Tag.owner_id==g.user.id).filter(Tag.device_id==self.device_id)
|
tags = Tag.query.filter(Tag.owner_id == g.user.id).filter_by(
|
||||||
|
device_id=self.device_id
|
||||||
|
)
|
||||||
else:
|
else:
|
||||||
tags = Tag.query.filter(Tag.owner_id==g.user.id).filter(Tag.device_id==None)
|
tags = Tag.query.filter(Tag.owner_id == g.user.id).filter_by(device_id=None)
|
||||||
|
|
||||||
self.tag.choices = [(tag.id, tag.id) for tag in tags]
|
self.tag.choices = [(tag.id, tag.id) for tag in tags]
|
||||||
|
|
||||||
|
@ -449,8 +471,11 @@ class TagDeviceForm(FlaskForm):
|
||||||
if not is_valid:
|
if not is_valid:
|
||||||
return False
|
return False
|
||||||
|
|
||||||
self._tag = Tag.query.filter(Tag.id == self.tag.data).filter(
|
self._tag = (
|
||||||
Tag.owner_id == g.user.id).one()
|
Tag.query.filter(Tag.id == self.tag.data)
|
||||||
|
.filter(Tag.owner_id == g.user.id)
|
||||||
|
.one()
|
||||||
|
)
|
||||||
|
|
||||||
if not self.delete and self._tag.device_id:
|
if not self.delete and self._tag.device_id:
|
||||||
self.tag.errors = [("This tag is actualy in use.")]
|
self.tag.errors = [("This tag is actualy in use.")]
|
||||||
|
@ -464,8 +489,11 @@ class TagDeviceForm(FlaskForm):
|
||||||
|
|
||||||
if self.device_id or self.device.data:
|
if self.device_id or self.device.data:
|
||||||
self.device_id = self.device_id or self.device.data
|
self.device_id = self.device_id or self.device.data
|
||||||
self._device = Device.query.filter(Device.id == self.device_id).filter(
|
self._device = (
|
||||||
Device.owner_id == g.user.id).one()
|
Device.query.filter(Device.id == self.device_id)
|
||||||
|
.filter(Device.owner_id == g.user.id)
|
||||||
|
.one()
|
||||||
|
)
|
||||||
|
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
@ -481,19 +509,28 @@ class TagDeviceForm(FlaskForm):
|
||||||
|
|
||||||
|
|
||||||
class NewActionForm(FlaskForm):
|
class NewActionForm(FlaskForm):
|
||||||
name = StringField(u'Name', [validators.length(max=50)],
|
name = StringField(
|
||||||
description="A name or title of the event. Something to look for.")
|
'Name',
|
||||||
|
[validators.length(max=50)],
|
||||||
|
description="A name or title of the event. Something to look for.",
|
||||||
|
)
|
||||||
devices = HiddenField()
|
devices = HiddenField()
|
||||||
date = DateField(u'Date', [validators.Optional()],
|
date = DateField(
|
||||||
description="""When the action ends. For some actions like booking
|
'Date',
|
||||||
|
[validators.Optional()],
|
||||||
|
description="""When the action ends. For some actions like booking
|
||||||
the time when it expires, for others like renting the
|
the time when it expires, for others like renting the
|
||||||
time that the end rents. For specific actions, it is the
|
time that the end rents. For specific actions, it is the
|
||||||
time in which they are carried out; differs from created
|
time in which they are carried out; differs from created
|
||||||
in that created is where the system receives the action.""")
|
in that created is where the system receives the action.""",
|
||||||
severity = SelectField(u'Severity', choices=[(v.name, v.name) for v in Severity],
|
)
|
||||||
description="""An indicator that evaluates the execution of the event.
|
severity = SelectField(
|
||||||
For example, failed events are set to Error""")
|
'Severity',
|
||||||
description = TextAreaField(u'Description')
|
choices=[(v.name, v.name) for v in Severity],
|
||||||
|
description="""An indicator that evaluates the execution of the event.
|
||||||
|
For example, failed events are set to Error""",
|
||||||
|
)
|
||||||
|
description = TextAreaField('Description')
|
||||||
lot = HiddenField()
|
lot = HiddenField()
|
||||||
type = HiddenField()
|
type = HiddenField()
|
||||||
|
|
||||||
|
@ -506,8 +543,11 @@ class NewActionForm(FlaskForm):
|
||||||
self._devices = OrderedSet()
|
self._devices = OrderedSet()
|
||||||
if self.devices.data:
|
if self.devices.data:
|
||||||
devices = set(self.devices.data.split(","))
|
devices = set(self.devices.data.split(","))
|
||||||
self._devices = OrderedSet(Device.query.filter(Device.id.in_(devices)).filter(
|
self._devices = OrderedSet(
|
||||||
Device.owner_id == g.user.id).all())
|
Device.query.filter(Device.id.in_(devices))
|
||||||
|
.filter(Device.owner_id == g.user.id)
|
||||||
|
.all()
|
||||||
|
)
|
||||||
|
|
||||||
if not self._devices:
|
if not self._devices:
|
||||||
return False
|
return False
|
||||||
|
@ -544,11 +584,11 @@ class NewActionForm(FlaskForm):
|
||||||
|
|
||||||
|
|
||||||
class AllocateForm(NewActionForm):
|
class AllocateForm(NewActionForm):
|
||||||
start_time = DateField(u'Start time')
|
start_time = DateField('Start time')
|
||||||
end_time = DateField(u'End time')
|
end_time = DateField('End time')
|
||||||
final_user_code = StringField(u'Final user code', [validators.length(max=50)])
|
final_user_code = StringField('Final user code', [validators.length(max=50)])
|
||||||
transaction = StringField(u'Transaction', [validators.length(max=50)])
|
transaction = StringField('Transaction', [validators.length(max=50)])
|
||||||
end_users = IntegerField(u'End users')
|
end_users = IntegerField('End users')
|
||||||
|
|
||||||
def validate(self, extra_validators=None):
|
def validate(self, extra_validators=None):
|
||||||
is_valid = super().validate(extra_validators)
|
is_valid = super().validate(extra_validators)
|
||||||
|
@ -569,19 +609,31 @@ class AllocateForm(NewActionForm):
|
||||||
|
|
||||||
|
|
||||||
class DataWipeDocumentForm(Form):
|
class DataWipeDocumentForm(Form):
|
||||||
date = DateField(u'Date', [validators.Optional()],
|
date = DateField(
|
||||||
description="Date when was data wipe")
|
'Date', [validators.Optional()], description="Date when was data wipe"
|
||||||
url = URLField(u'Url', [validators.Optional()],
|
)
|
||||||
description="Url where the document resides")
|
url = URLField(
|
||||||
success = BooleanField(u'Success', [validators.Optional()],
|
'Url', [validators.Optional()], description="Url where the document resides"
|
||||||
description="The erase was success or not?")
|
)
|
||||||
software = StringField(u'Software', [validators.Optional()],
|
success = BooleanField(
|
||||||
description="Which software has you use for erase the disks")
|
'Success', [validators.Optional()], description="The erase was success or not?"
|
||||||
id_document = StringField(u'Document Id', [validators.Optional()],
|
)
|
||||||
description="Identification number of document")
|
software = StringField(
|
||||||
file_name = FileField(u'File', [validators.DataRequired()],
|
'Software',
|
||||||
description="""This file is not stored on our servers, it is only used to
|
[validators.Optional()],
|
||||||
generate a digital signature and obtain the name of the file.""")
|
description="Which software has you use for erase the disks",
|
||||||
|
)
|
||||||
|
id_document = StringField(
|
||||||
|
'Document Id',
|
||||||
|
[validators.Optional()],
|
||||||
|
description="Identification number of document",
|
||||||
|
)
|
||||||
|
file_name = FileField(
|
||||||
|
'File',
|
||||||
|
[validators.DataRequired()],
|
||||||
|
description="""This file is not stored on our servers, it is only used to
|
||||||
|
generate a digital signature and obtain the name of the file.""",
|
||||||
|
)
|
||||||
|
|
||||||
def validate(self, extra_validators=None):
|
def validate(self, extra_validators=None):
|
||||||
is_valid = super().validate(extra_validators)
|
is_valid = super().validate(extra_validators)
|
||||||
|
@ -637,23 +689,39 @@ class DataWipeForm(NewActionForm):
|
||||||
|
|
||||||
|
|
||||||
class TradeForm(NewActionForm):
|
class TradeForm(NewActionForm):
|
||||||
user_from = StringField(u'Supplier', [validators.Optional()],
|
user_from = StringField(
|
||||||
description="Please enter the supplier's email address",
|
'Supplier',
|
||||||
render_kw={'data-email': ""})
|
[validators.Optional()],
|
||||||
user_to = StringField(u'Receiver', [validators.Optional()],
|
description="Please enter the supplier's email address",
|
||||||
description="Please enter the receiver's email address",
|
render_kw={'data-email': ""},
|
||||||
render_kw={'data-email': ""})
|
)
|
||||||
confirm = BooleanField(u'Confirm', [validators.Optional()],
|
user_to = StringField(
|
||||||
default=True,
|
'Receiver',
|
||||||
description="I need confirmation from the other user for every device and document.")
|
[validators.Optional()],
|
||||||
code = StringField(u'Code', [validators.Optional()],
|
description="Please enter the receiver's email address",
|
||||||
description="If you don't need confirm, you need put a code for trace the user in the statistics.")
|
render_kw={'data-email': ""},
|
||||||
|
)
|
||||||
|
confirm = BooleanField(
|
||||||
|
'Confirm',
|
||||||
|
[validators.Optional()],
|
||||||
|
default=True,
|
||||||
|
description="I need confirmation from the other user for every device and document.",
|
||||||
|
)
|
||||||
|
code = StringField(
|
||||||
|
'Code',
|
||||||
|
[validators.Optional()],
|
||||||
|
description="If you don't need confirm, you need put a code for trace the user in the statistics.",
|
||||||
|
)
|
||||||
|
|
||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
super().__init__(*args, **kwargs)
|
super().__init__(*args, **kwargs)
|
||||||
self.user_from.render_kw['data-email'] = g.user.email
|
self.user_from.render_kw['data-email'] = g.user.email
|
||||||
self.user_to.render_kw['data-email'] = g.user.email
|
self.user_to.render_kw['data-email'] = g.user.email
|
||||||
self._lot = Lot.query.filter(Lot.id==self.lot.data).filter(Lot.owner_id==g.user.id).one()
|
self._lot = (
|
||||||
|
Lot.query.filter(Lot.id == self.lot.data)
|
||||||
|
.filter(Lot.owner_id == g.user.id)
|
||||||
|
.one()
|
||||||
|
)
|
||||||
|
|
||||||
def validate(self, extra_validators=None):
|
def validate(self, extra_validators=None):
|
||||||
is_valid = self.generic_validation(extra_validators=extra_validators)
|
is_valid = self.generic_validation(extra_validators=extra_validators)
|
||||||
|
@ -661,11 +729,15 @@ class TradeForm(NewActionForm):
|
||||||
email_to = self.user_to.data
|
email_to = self.user_to.data
|
||||||
|
|
||||||
if not self.confirm.data and not self.code.data:
|
if not self.confirm.data and not self.code.data:
|
||||||
self.code.errors = ["If you don't want confirm, you need a code"]
|
self.code.errors = ["If you don't want to confirm, you need a code"]
|
||||||
is_valid = False
|
is_valid = False
|
||||||
|
|
||||||
if self.confirm.data and not (email_from and email_to) or email_to == email_from or \
|
if (
|
||||||
g.user.email not in [email_from, email_to]:
|
self.confirm.data
|
||||||
|
and not (email_from and email_to)
|
||||||
|
or email_to == email_from
|
||||||
|
or g.user.email not in [email_from, email_to]
|
||||||
|
):
|
||||||
|
|
||||||
errors = ["If you want confirm, you need a correct email"]
|
errors = ["If you want confirm, you need a correct email"]
|
||||||
self.user_to.errors = errors
|
self.user_to.errors = errors
|
||||||
|
@ -682,10 +754,17 @@ class TradeForm(NewActionForm):
|
||||||
self.db_user_to = user_to
|
self.db_user_to = user_to
|
||||||
self.db_user_from = user_from
|
self.db_user_from = user_from
|
||||||
|
|
||||||
|
self.has_errors = not is_valid
|
||||||
return is_valid
|
return is_valid
|
||||||
|
|
||||||
def save(self, commit=True):
|
def save(self, commit=True):
|
||||||
self.create_phantom_account()
|
if self.has_errors:
|
||||||
|
raise ValueError(
|
||||||
|
"The %s could not be saved because the data didn't validate."
|
||||||
|
% (self.instance._meta.object_name)
|
||||||
|
)
|
||||||
|
if not self.confirm.data:
|
||||||
|
self.create_phantom_account()
|
||||||
self.prepare_instance()
|
self.prepare_instance()
|
||||||
self.create_automatic_trade()
|
self.create_automatic_trade()
|
||||||
|
|
||||||
|
@ -718,33 +797,30 @@ class TradeForm(NewActionForm):
|
||||||
The same if exist to but not from
|
The same if exist to but not from
|
||||||
|
|
||||||
"""
|
"""
|
||||||
# Checks
|
|
||||||
if self.confirm.data or not self.code.data:
|
|
||||||
return
|
|
||||||
|
|
||||||
user_from = self.user_from.data
|
user_from = self.user_from.data
|
||||||
user_to = self.user_to.data
|
user_to = self.user_to.data
|
||||||
code = self.code.data
|
code = self.code.data
|
||||||
|
|
||||||
if user_from and user_to:
|
if user_from and user_to:
|
||||||
|
# both users exist, no further action is necessary
|
||||||
return
|
return
|
||||||
|
|
||||||
# Creating receiver phantom account
|
# Create receiver (to) phantom account
|
||||||
if user_from and not user_to:
|
if user_from and not user_to:
|
||||||
assert g.user.email == user_from
|
assert g.user.email == user_from
|
||||||
user = self.create_user(code)
|
|
||||||
self.user_from = g.user
|
self.user_from = g.user
|
||||||
self.user_to = user
|
self.user_to = self.get_or_create_user(code)
|
||||||
return
|
return
|
||||||
|
|
||||||
# Creating supplier phantom account
|
# Create supplier (from) phantom account
|
||||||
if not user_from and user_to:
|
if not user_from and user_to:
|
||||||
assert g.user.email == user_to
|
assert g.user.email == user_to
|
||||||
user = self.create_user(code)
|
|
||||||
self.user_from = user
|
self.user_from = self.get_or_create_user(code)
|
||||||
self.user_to = g.user
|
self.user_to = g.user
|
||||||
|
|
||||||
def create_user(self, code):
|
def get_or_create_user(self, code):
|
||||||
email = "{}_{}@dhub.com".format(str(g.user.id), code)
|
email = "{}_{}@dhub.com".format(str(g.user.id), code)
|
||||||
user = User.query.filter_by(email=email).first()
|
user = User.query.filter_by(email=email).first()
|
||||||
if not user:
|
if not user:
|
||||||
|
@ -774,27 +850,42 @@ class TradeForm(NewActionForm):
|
||||||
|
|
||||||
|
|
||||||
class TradeDocumentForm(FlaskForm):
|
class TradeDocumentForm(FlaskForm):
|
||||||
url = URLField(u'Url', [validators.Optional()],
|
url = URLField(
|
||||||
render_kw={'class': "form-control"},
|
'Url',
|
||||||
description="Url where the document resides")
|
[validators.Optional()],
|
||||||
description = StringField(u'Description', [validators.Optional()],
|
render_kw={'class': "form-control"},
|
||||||
render_kw={'class': "form-control"},
|
description="Url where the document resides",
|
||||||
description="")
|
)
|
||||||
id_document = StringField(u'Document Id', [validators.Optional()],
|
description = StringField(
|
||||||
render_kw={'class': "form-control"},
|
'Description',
|
||||||
description="Identification number of document")
|
[validators.Optional()],
|
||||||
date = DateField(u'Date', [validators.Optional()],
|
render_kw={'class': "form-control"},
|
||||||
render_kw={'class': "form-control"},
|
description="",
|
||||||
description="")
|
)
|
||||||
file_name = FileField(u'File', [validators.DataRequired()],
|
id_document = StringField(
|
||||||
render_kw={'class': "form-control"},
|
'Document Id',
|
||||||
description="""This file is not stored on our servers, it is only used to
|
[validators.Optional()],
|
||||||
generate a digital signature and obtain the name of the file.""")
|
render_kw={'class': "form-control"},
|
||||||
|
description="Identification number of document",
|
||||||
|
)
|
||||||
|
date = DateField(
|
||||||
|
'Date',
|
||||||
|
[validators.Optional()],
|
||||||
|
render_kw={'class': "form-control"},
|
||||||
|
description="",
|
||||||
|
)
|
||||||
|
file_name = FileField(
|
||||||
|
'File',
|
||||||
|
[validators.DataRequired()],
|
||||||
|
render_kw={'class': "form-control"},
|
||||||
|
description="""This file is not stored on our servers, it is only used to
|
||||||
|
generate a digital signature and obtain the name of the file.""",
|
||||||
|
)
|
||||||
|
|
||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
lot_id = kwargs.pop('lot')
|
lot_id = kwargs.pop('lot')
|
||||||
super().__init__(*args, **kwargs)
|
super().__init__(*args, **kwargs)
|
||||||
self._lot = Lot.query.filter(Lot.id==lot_id).one()
|
self._lot = Lot.query.filter(Lot.id == lot_id).one()
|
||||||
|
|
||||||
def validate(self, extra_validators=None):
|
def validate(self, extra_validators=None):
|
||||||
is_valid = super().validate(extra_validators)
|
is_valid = super().validate(extra_validators)
|
||||||
|
|
Reference in New Issue