| POST | /{Workspace}/AssetQuery |
|---|
import datetime
import decimal
from marshmallow.fields import *
from servicestack import *
from typing import *
from dataclasses import dataclass, field
from dataclasses_json import dataclass_json, LetterCase, Undefined, config
from enum import Enum, IntEnum
@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class QueryFilter:
field: Optional[str] = None
operator: Optional[str] = None
value: Optional[Object] = None
@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class SortCriteria:
field: Optional[str] = None
direction: Optional[str] = None
@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class AssetQuery:
"""
/{Workspace}/AssetQuery allows flexible querying of assets using structured filters.Supports various operators (eq, ne, contains, in, gt, lt, exists) for precise asset searches.Can query by core fields (type, name, created) and custom data fields (data.EID, data.FDH_ID, etc.).Example: POST with filters for exact matches on type='FDH' and data.EID='specific-value'
"""
workspace: Optional[str] = None
filters: Optional[List[QueryFilter]] = None
rec_start: Optional[int] = None
rec_count: Optional[int] = None
sort: Optional[List[SortCriteria]] = None
suppress_geometry: Optional[bool] = None
@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class Schedule:
workspace: Optional[str] = None
object_id: Optional[str] = None
version_id: Optional[str] = None
based_on: Optional[str] = None
start: Optional[str] = None
end: Optional[str] = None
time_zone: Optional[str] = None
users: Optional[List[str]] = None
teams: Optional[List[str]] = None
data: Optional[Dict[str, Object]] = None
@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class DomainItem:
workspace: Optional[str] = None
object_id: Optional[str] = None
version_id: Optional[str] = None
last_updated: Optional[str] = None
@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class Location:
y: float = 0.0
x: float = 0.0
@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class Geometry:
type: Optional[str] = None
coordinates: Optional[List[Location]] = None
@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class MaintenanceRecord:
date_time: Optional[str] = None
notes: Optional[str] = None
@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class LocationHistory:
date: Optional[str] = None
location: Optional[Location] = None
barcode: Optional[str] = None
notes: Optional[str] = None
is_scan: bool = False
@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class ClassedItem:
object_id: Optional[str] = None
class_: Optional[str] = field(metadata=config(field_name='class'), default=None)
version_id: Optional[str] = None
ancestors: Optional[List[str]] = None
type: Optional[str] = None
@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class EventItem:
object_id: Optional[str] = None
date: Optional[str] = None
location: Optional[Location] = None
barcode: Optional[str] = None
details: Optional[str] = None
type: Optional[str] = None
is_scan: bool = False
user: Optional[str] = None
selected_by: Optional[str] = None
status: Optional[str] = None
status_type: Optional[str] = None
date_created: Optional[str] = None
automatic: bool = False
@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class Anno:
x: float = 0.0
y: float = 0.0
r: float = 0.0
s: float = 0.0
t: Optional[str] = None
@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class AddressBasic:
street: Optional[str] = None
unit: Optional[str] = None
city: Optional[str] = None
state: Optional[str] = None
zip: Optional[str] = None
country: Optional[str] = None
location: Optional[Location] = None
@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class CustomDataField:
binding: Optional[str] = None
label: Optional[str] = None
value: Optional[Object] = None
data_type: Optional[str] = None
is_read_only: bool = False
is_hidden: bool = False
values: Optional[str] = None
@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class Asset:
"""
Contains the data for an asset within the system.
"""
workspace: Optional[str] = None
time_zone: Optional[str] = None
assigned_workspace: Optional[str] = None
object_id: Optional[str] = None
version_id: Optional[str] = None
based_on: Optional[str] = None
external_id: Optional[str] = None
created: Optional[str] = None
last_updated: Optional[str] = None
name: Optional[str] = None
schedules: Optional[List[Schedule]] = None
documents: Optional[List[DomainItem]] = None
tasks: Optional[List[DomainItem]] = None
task_series: Optional[List[str]] = None
task_series_templates: Optional[List[str]] = None
users: Optional[List[DomainItem]] = None
type: Optional[str] = None
symbol: Optional[str] = None
data: Optional[Dict[str, str]] = None
geometry: Optional[Geometry] = None
maintenance_history: Optional[List[MaintenanceRecord]] = None
parent: Optional[str] = None
ancestors: Optional[List[str]] = None
location_history: Optional[List[LocationHistory]] = None
owner: Optional[ClassedItem] = None
is_parent: bool = False
assets: Optional[List[str]] = None
contacts: Optional[List[str]] = None
geometry_string: Optional[str] = None
source_projection: Optional[str] = None
events: Optional[List[EventItem]] = None
anno: Optional[Anno] = None
teams: Optional[List[str]] = None
address: Optional[AddressBasic] = None
created_by: Optional[str] = None
inventory_items: Optional[List[str]] = None
active_labor_types: Optional[Dict[str, Object]] = None
levels: int = 0
all_assests: int = 0
barcode: Optional[str] = None
custom_data_fields: Optional[List[CustomDataField]] = None
@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class AssetQueryResponse:
assets: Optional[List[Asset]] = None
total_count: int = 0
rec_start: int = 0
rec_count: int = 0
To override the Content-type in your clients, use the HTTP Accept Header, append the .jsv suffix or ?format=jsv
The following are sample HTTP requests and responses. The placeholders shown need to be replaced with actual values.
POST /{Workspace}/AssetQuery HTTP/1.1
Host: dev.fieldsquared.com
Accept: text/jsv
Content-Type: text/jsv
Content-Length: length
{
Workspace: String,
Filters:
[
{
Field: String,
Operator: String,
Value: {}
}
],
RecStart: 0,
RecCount: 0,
Sort:
[
{
Field: String,
Direction: String
}
],
SuppressGeometry: False
}
HTTP/1.1 200 OK
Content-Type: text/jsv
Content-Length: length
{
Assets:
[
{
Workspace: String,
TimeZone: String,
AssignedWorkspace: String,
ObjectId: String,
VersionId: String,
BasedOn: String,
ExternalId: String,
Created: String,
LastUpdated: String,
Name: String,
Schedules:
[
{
Workspace: String,
ObjectId: String,
VersionId: String,
BasedOn: String,
Start: String,
End: String,
TimeZone: String,
Users:
[
String
],
Teams:
[
String
],
Data:
{
String: {}
}
}
],
Documents:
[
{
Workspace: String,
ObjectId: String,
VersionId: String,
LastUpdated: String
}
],
Tasks:
[
{
Workspace: String,
ObjectId: String,
VersionId: String,
LastUpdated: String
}
],
TaskSeries:
[
String
],
TaskSeriesTemplates:
[
String
],
Users:
[
{
Workspace: String,
ObjectId: String,
VersionId: String,
LastUpdated: String
}
],
Type: String,
Symbol: String,
Data:
{
String: String
},
Geometry:
{
Type: String,
Coordinates:
[
{
y: 0,
x: 0
}
]
},
MaintenanceHistory:
[
{
DateTime: String,
Notes: String
}
],
Parent: String,
Ancestors:
[
String
],
LocationHistory:
[
{
Date: String,
Location:
{
y: 0,
x: 0
},
Barcode: String,
Notes: String,
IsScan: False
}
],
Owner:
{
ObjectId: String,
Class: String,
VersionId: String,
Ancestors:
[
String
],
Type: String
},
IsParent: False,
Assets:
[
String
],
Contacts:
[
String
],
GeometryString: String,
SourceProjection: String,
Events:
[
{
ObjectId: String,
Date: String,
Location:
{
y: 0,
x: 0
},
Barcode: String,
Details: String,
Type: String,
IsScan: False,
User: String,
SelectedBy: String,
Status: String,
StatusType: String,
DateCreated: String,
Automatic: False
}
],
Anno:
{
X: 0,
Y: 0,
R: 0,
S: 0,
T: String
},
Teams:
[
String
],
Address:
{
Street: String,
Unit: String,
City: String,
State: String,
Zip: String,
Country: String,
Location:
{
y: 0,
x: 0
}
},
CreatedBy: String,
InventoryItems:
[
String
],
ActiveLaborTypes:
{
String: {}
},
Levels: 0,
AllAssests: 0,
Barcode: String,
CustomDataFields:
[
{
Binding: String,
Label: String,
Value: {},
DataType: String,
IsReadOnly: False,
IsHidden: False,
Values: String
}
]
}
],
TotalCount: 0,
RecStart: 0,
RecCount: 0
}