This repository has been archived on 2024-05-31. You can view files and clone it, but cannot push or open issues or pull requests.
devicehub-teal/ereuse_devicehub/migrations/versions/fbb7e2a0cde0_initial.py

7044 lines
191 KiB
Python
Raw Normal View History

2020-05-15 18:13:49 +00:00
"""Initial
Revision ID: fbb7e2a0cde0
Revises:
Create Date: 2020-05-07 10:04:40.269511
"""
2020-08-17 14:45:18 +00:00
import citext
2020-05-15 18:13:49 +00:00
import sqlalchemy as sa
import sqlalchemy_utils
2023-06-15 14:41:47 +00:00
from alembic import context, op
2020-08-17 14:45:18 +00:00
from sqlalchemy.dialects import postgresql
2023-06-15 14:41:47 +00:00
from ereuse_devicehub import teal
from ereuse_devicehub.resources.enums import Severity, TransferState
2020-05-15 18:13:49 +00:00
# revision identifiers, used by Alembic.
revision = 'fbb7e2a0cde0'
down_revision = None
branch_labels = None
depends_on = None
2020-08-17 14:45:18 +00:00
def get_inv():
INV = context.get_x_argument(as_dictionary=True).get('inventory')
if not INV:
raise ValueError("Inventory value is not specified")
return INV
2020-05-15 18:13:49 +00:00
def upgrade():
# Create Common schema
op.execute("create schema common")
op.execute(f"create schema {get_inv()}")
2020-05-15 18:13:49 +00:00
# Inventory table
2023-03-21 16:31:43 +00:00
op.create_table(
'inventory',
sa.Column(
'updated',
sa.TIMESTAMP(timezone=True),
server_default=sa.text('CURRENT_TIMESTAMP'),
nullable=False,
comment='The last time Devicehub recorded a change for \n this thing.\n ',
),
sa.Column(
'created',
sa.TIMESTAMP(timezone=True),
server_default=sa.text('CURRENT_TIMESTAMP'),
nullable=False,
comment='When Devicehub created this.',
),
sa.Column(
'id',
sa.Unicode(),
nullable=False,
comment='The name of the inventory as in the URL and schema.',
),
sa.Column(
'name',
citext.CIText(),
nullable=False,
comment='The human name of the inventory.',
),
sa.Column('tag_provider', teal.db.URL(), nullable=False),
sa.Column(
'tag_token',
postgresql.UUID(as_uuid=True),
nullable=False,
comment='The token to access a Tag service.',
),
sa.Column('org_id', postgresql.UUID(as_uuid=True), nullable=False),
sa.PrimaryKeyConstraint('id'),
sa.UniqueConstraint('name'),
sa.UniqueConstraint('tag_token'),
schema='common',
)
op.create_index(
'id_hash',
'inventory',
['id'],
unique=False,
schema='common',
postgresql_using='hash',
)
op.create_index(
op.f('ix_common_inventory_created'),
'inventory',
['created'],
unique=False,
schema='common',
)
op.create_index(
op.f('ix_common_inventory_updated'),
'inventory',
['updated'],
unique=False,
schema='common',
)
2020-05-15 18:13:49 +00:00
# Manufacturer table
2023-03-21 16:31:43 +00:00
op.create_table(
'manufacturer',
sa.Column(
'name',
citext.CIText(),
nullable=False,
comment='The normalized name of the manufacturer.',
),
sa.Column(
'url',
teal.db.URL(),
nullable=True,
comment='An URL to a page describing the manufacturer.',
),
sa.Column(
'logo',
teal.db.URL(),
nullable=True,
comment='An URL pointing to the logo of the manufacturer.',
),
sa.PrimaryKeyConstraint('name'),
sa.UniqueConstraint('url'),
schema='common',
)
2020-05-15 18:13:49 +00:00
# User table
2023-03-21 16:31:43 +00:00
op.create_table(
'user',
sa.Column(
'updated',
sa.TIMESTAMP(timezone=True),
server_default=sa.text('CURRENT_TIMESTAMP'),
nullable=False,
comment='The last time Devicehub recorded a change for \n this thing.\n ',
),
sa.Column(
'created',
sa.TIMESTAMP(timezone=True),
server_default=sa.text('CURRENT_TIMESTAMP'),
nullable=False,
comment='When Devicehub created this.',
),
sa.Column('id', postgresql.UUID(as_uuid=True), nullable=False),
sa.Column(
'email', sqlalchemy_utils.types.email.EmailType(length=255), nullable=False
),
sa.Column(
'password',
sqlalchemy_utils.types.password.PasswordType(max_length=64),
nullable=True,
),
sa.Column('token', postgresql.UUID(as_uuid=True), nullable=False),
sa.Column('ethereum_address', citext.CIText(), nullable=True),
sa.PrimaryKeyConstraint('id'),
sa.UniqueConstraint('email'),
sa.UniqueConstraint('ethereum_address'),
sa.UniqueConstraint('token'),
schema='common',
)
op.create_index(
op.f('ix_common_user_created'),
'user',
['created'],
unique=False,
schema='common',
)
op.create_index(
op.f('ix_common_user_updated'),
'user',
['updated'],
unique=False,
schema='common',
)
2020-05-15 18:13:49 +00:00
# User Inventory table
2023-03-21 16:31:43 +00:00
op.create_table(
'user_inventory',
sa.Column('user_id', postgresql.UUID(as_uuid=True), nullable=False),
sa.Column('inventory_id', sa.Unicode(), nullable=False),
sa.ForeignKeyConstraint(
['inventory_id'],
['common.inventory.id'],
),
sa.ForeignKeyConstraint(
['user_id'],
['common.user.id'],
),
sa.PrimaryKeyConstraint('user_id', 'inventory_id'),
schema='common',
)
2020-05-15 18:13:49 +00:00
# Device table
2023-03-21 16:31:43 +00:00
op.create_table(
'device',
sa.Column(
'updated',
sa.TIMESTAMP(timezone=True),
server_default=sa.text('CURRENT_TIMESTAMP'),
nullable=False,
comment='The last time Devicehub recorded a change for \n this thing.\n ',
),
sa.Column(
'created',
sa.TIMESTAMP(timezone=True),
server_default=sa.text('CURRENT_TIMESTAMP'),
nullable=False,
comment='When Devicehub created this.',
),
sa.Column(
'id',
sa.BigInteger(),
nullable=False,
comment='The identifier of the device for this database. Used only\n internally for software; users should not use this.\n ',
),
sa.Column('type', sa.Unicode(length=32), nullable=False),
sa.Column(
'hid',
sa.Unicode(),
nullable=True,
comment='The Hardware ID (HID) is the unique ID traceability\n systems use to ID a device globally. This field is auto-generated\n from Devicehub using literal identifiers from the device,\n so it can re-generated *offline*.\n \n The HID is the result of concatenating,\n in the following order: the type of device (ex. Computer),\n the manufacturer name, the model name, and the S/N. It is joined\n with hyphens, and adapted to comply with the URI specification, so\n it can be used in the URI identifying the device on the Internet.\n The conversion is done as follows:\n \n 1. non-ASCII characters are converted to their ASCII equivalent or\n removed.\n 2. Characterst that are not letters or numbers are converted to \n underscores, in a way that there are no trailing underscores\n and no underscores together, and they are set to lowercase.\n \n Ex. ``laptop-acer-aod270-lusga_0d0242201212c7614``\n ',
),
sa.Column(
'model',
sa.Unicode(),
nullable=True,
comment='The model of the device in lower case.\n\n\n The model is the unambiguous, as technical as possible, denomination\n for the product. This field, among others, is used to identify\n the product.\n ',
),
sa.Column(
'manufacturer',
sa.Unicode(),
nullable=True,
comment='The normalized name of the manufacturer,\n in lower case.\n\n Although as of now Devicehub does not enforce normalization,\n users can choose a list of normalized manufacturer names\n from the own ``/manufacturers`` REST endpoint.\n ',
),
sa.Column(
'serial_number',
sa.Unicode(),
nullable=True,
comment='The serial number of the device in lower case.',
),
sa.Column(
'brand',
citext.CIText(),
nullable=True,
comment='A naming for consumers. This field can represent\n several models, so it can be ambiguous, and it is not used to\n identify the product.\n ',
),
sa.Column(
'generation',
sa.SmallInteger(),
nullable=True,
comment='The generation of the device.',
),
sa.Column(
'version',
citext.CIText(),
nullable=True,
comment='The version code of this device, like v1 or A001.',
),
sa.Column(
'weight',
sa.Float(decimal_return_scale=4),
nullable=True,
comment='The weight of the device in Kg.',
),
sa.Column(
'width',
sa.Float(decimal_return_scale=4),
nullable=True,
comment='The width of the device in meters.',
),
sa.Column(
'height',
sa.Float(decimal_return_scale=4),
nullable=True,
comment='The height of the device in meters.',
),
sa.Column(
'depth',
sa.Float(decimal_return_scale=4),
nullable=True,
comment='The depth of the device in meters.',
),
sa.Column(
'color',
sqlalchemy_utils.types.color.ColorType(length=20),
nullable=True,
comment='The predominant color of the device.',
),
sa.Column(
'production_date',
sa.DateTime(),
nullable=True,
comment='The date of production of the device.\n This is timezone naive, as Workbench cannot report this data with timezone information.\n ',
),
sa.Column(
'variant',
citext.CIText(),
nullable=True,
comment='A variant or sub-model of the device.',
),
sa.Column(
'sku',
citext.CIText(),
nullable=True,
comment='The Stock Keeping Unit (SKU), i.e. a\n merchant-specific identifier for a product or service.\n ',
),
sa.Column(
'image', teal.db.URL(), nullable=True, comment='An image of the device.'
),
sa.Column('max_drill_bit_size', sa.SmallInteger(), nullable=True),
sa.Column(
'size', sa.SmallInteger(), nullable=True, comment='The capacity in Liters.'
),
sa.Column('max_allowed_weight', sa.Integer(), nullable=True),
sa.Column('wheel_size', sa.SmallInteger(), nullable=True),
sa.Column('gears', sa.SmallInteger(), nullable=True),
sa.PrimaryKeyConstraint('id'),
schema=f'{get_inv()}',
)
op.create_index(
'device_id',
'device',
['id'],
unique=False,
postgresql_using='hash',
schema=f'{get_inv()}',
)
op.create_index(
op.f('ix_device_created'),
'device',
['created'],
unique=False,
schema=f'{get_inv()}',
)
op.create_index(
op.f('ix_device_updated'),
'device',
['updated'],
unique=False,
schema=f'{get_inv()}',
)
op.create_index(
'type_index',
'device',
['type'],
unique=False,
postgresql_using='hash',
schema=f'{get_inv()}',
)
2023-06-15 14:41:47 +00:00
op.execute(f"CREATE SEQUENCE {get_inv()}.device_seq START 1;")
2023-03-21 16:31:43 +00:00
op.create_table(
'agent',
sa.Column(
'updated',
sa.TIMESTAMP(timezone=True),
server_default=sa.text('CURRENT_TIMESTAMP'),
nullable=False,
comment='The last time Devicehub recorded a change for \n this thing.\n ',
),
sa.Column(
'created',
sa.TIMESTAMP(timezone=True),
server_default=sa.text('CURRENT_TIMESTAMP'),
nullable=False,
comment='When Devicehub created this.',
),
sa.Column('id', postgresql.UUID(as_uuid=True), nullable=False),
sa.Column('type', sa.Unicode(), nullable=False),
sa.Column(
'name',
citext.CIText(),
nullable=True,
comment='The name of the organization or person.',
),
sa.Column(
'tax_id',
sa.Unicode(length=32),
nullable=True,
comment='The Tax / Fiscal ID of the organization, \n e.g. the TIN in the US or the CIF/NIF in Spain.\n ',
),
sa.Column(
'country',
sa.Enum(
'AF',
'AX',
'AL',
'DZ',
'AS',
'AD',
'AO',
'AI',
'AQ',
'AG',
'AR',
'AM',
'AW',
'AU',
'AT',
'AZ',
'BS',
'BH',
'BD',
'BB',
'BY',
'BE',
'BZ',
'BJ',
'BM',
'BT',
'BO',
'BQ',
'BA',
'BW',
'BV',
'BR',
'IO',
'BN',
'BG',
'BF',
'BI',
'KH',
'CM',
'CA',
'CV',
'KY',
'CF',
'TD',
'CL',
'CN',
'CX',
'CC',
'CO',
'KM',
'CG',
'CD',
'CK',
'CR',
'CI',
'HR',
'CU',
'CW',
'CY',
'CZ',
'DK',
'DJ',
'DM',
'DO',
'EC',
'EG',
'SV',
'GQ',
'ER',
'EE',
'ET',
'FK',
'FO',
'FJ',
'FI',
'FR',
'GF',
'PF',
'TF',
'GA',
'GM',
'GE',
'DE',
'GH',
'GI',
'GR',
'GL',
'GD',
'GP',
'GU',
'GT',
'GG',
'GN',
'GW',
'GY',
'HT',
'HM',
'VA',
'HN',
'HK',
'HU',
'IS',
'IN',
'ID',
'IR',
'IQ',
'IE',
'IM',
'IL',
'IT',
'JM',
'JP',
'JE',
'JO',
'KZ',
'KE',
'KI',
'KP',
'KR',
'KW',
'KG',
'LA',
'LV',
'LB',
'LS',
'LR',
'LY',
'LI',
'LT',
'LU',
'MO',
'MK',
'MG',
'MW',
'MY',
'MV',
'ML',
'MT',
'MH',
'MQ',
'MR',
'MU',
'YT',
'MX',
'FM',
'MD',
'MC',
'MN',
'ME',
'MS',
'MA',
'MZ',
'MM',
'NA',
'NR',
'NP',
'NL',
'NC',
'NZ',
'NI',
'NE',
'NG',
'NU',
'NF',
'MP',
'NO',
'OM',
'PK',
'PW',
'PS',
'PA',
'PG',
'PY',
'PE',
'PH',
'PN',
'PL',
'PT',
'PR',
'QA',
'RE',
'RO',
'RU',
'RW',
'BL',
'SH',
'KN',
'LC',
'MF',
'PM',
'VC',
'WS',
'SM',
'ST',
'SA',
'SN',
'RS',
'SC',
'SL',
'SG',
'SX',
'SK',
'SI',
'SB',
'SO',
'ZA',
'GS',
'SS',
'ES',
'LK',
'SD',
'SR',
'SJ',
'SZ',
'SE',
'CH',
'SY',
'TW',
'TJ',
'TZ',
'TH',
'TL',
'TG',
'TK',
'TO',
'TT',
'TN',
'TR',
'TM',
'TC',
'TV',
'UG',
'UA',
'AE',
'GB',
'US',
'UM',
'UY',
'UZ',
'VU',
'VE',
'VN',
'VG',
'VI',
'WF',
'EH',
'YE',
'ZM',
'ZW',
name='country',
),
nullable=True,
comment='Country issuing the tax_id number.',
),
sa.Column(
'telephone',
sqlalchemy_utils.types.phone_number.PhoneNumberType(length=20),
nullable=True,
),
sa.Column(
'email', sqlalchemy_utils.types.email.EmailType(length=255), nullable=True
),
sa.PrimaryKeyConstraint('id'),
sa.UniqueConstraint('email'),
sa.UniqueConstraint(
'tax_id', 'country', name='Registration Number per country.'
),
sa.UniqueConstraint('tax_id', 'name', name='One tax ID with one name.'),
schema=f'{get_inv()}',
)
op.create_index(
'agent_type',
'agent',
['type'],
unique=False,
postgresql_using='hash',
schema=f'{get_inv()}',
)
op.create_index(
op.f('ix_agent_created'),
'agent',
['created'],
unique=False,
schema=f'{get_inv()}',
)
op.create_index(
op.f('ix_agent_updated'),
'agent',
['updated'],
unique=False,
schema=f'{get_inv()}',
)
2020-05-15 18:13:49 +00:00
# Computer table
2023-03-21 16:31:43 +00:00
op.create_table(
'computer',
sa.Column('id', sa.BigInteger(), nullable=False),
sa.Column(
'chassis',
sa.Enum(
'Tower',
'Docking',
'AllInOne',
'Microtower',
'PizzaBox',
'Lunchbox',
'Stick',
'Netbook',
'Handheld',
'Laptop',
'Convertible',
'Detachable',
'Tablet',
'Virtual',
name='computerchassis',
),
nullable=False,
comment='The physical form of the computer.\n\n It is a subset of the Linux definition of DMI / DMI decode.\n ',
),
sa.Column('ethereum_address', citext.CIText(), nullable=True),
sa.Column('deposit', sa.Integer(), nullable=True),
sa.Column('owner_id', postgresql.UUID(as_uuid=True), nullable=False),
sa.Column(
'transfer_state',
teal.db.IntEnum(TransferState),
nullable=False,
comment='State of transfer for a given Lot of devices.\n ',
),
sa.Column('receiver_id', postgresql.UUID(as_uuid=True), nullable=True),
sa.Column('deliverynote_address', citext.CIText(), nullable=True),
sa.Column(
'layout',
sa.Enum(
'US',
'AF',
'ARA',
'AL',
'AM',
'AT',
'AU',
'AZ',
'BY',
'BE',
'BD',
'BA',
'BR',
'BG',
'DZ',
'MA',
'CM',
'MM',
'CA',
'CD',
'CN',
'HR',
'CZ',
'DK',
'NL',
'BT',
'EE',
'IR',
'IQ',
'FO',
'FI',
'FR',
'GH',
'GN',
'GE',
'DE',
'GR',
'HU',
'IL',
'IT',
'JP',
'KG',
'KH',
'KZ',
'LA',
'LATAM',
'LT',
'LV',
'MAO',
'ME',
'MK',
'MT',
'MN',
'NO',
'PL',
'PT',
'RO',
'RU',
'RS',
'SI',
'SK',
'ES',
'SE',
'CH',
'SY',
'TJ',
'LK',
'TH',
'TR',
'TW',
'UA',
'GB',
'UZ',
'VN',
'KR',
'IE',
'PK',
'MV',
'ZA',
'EPO',
'NP',
'NG',
'ET',
'SN',
'BRAI',
'TM',
'ML',
'TZ',
'TG',
'KE',
'BW',
'PH',
'MD',
'ID',
'MY',
'BN',
'IN',
'IS',
'NEC_VNDR_JP',
name='layouts',
),
nullable=True,
comment='Layout of a built-in keyboard of the computer,\n if any.\n ',
),
sa.ForeignKeyConstraint(
['id'],
[f'{get_inv()}.device.id'],
),
sa.ForeignKeyConstraint(
['owner_id'],
['common.user.id'],
),
sa.ForeignKeyConstraint(
['receiver_id'],
['common.user.id'],
),
sa.PrimaryKeyConstraint('id'),
sa.UniqueConstraint('ethereum_address'),
schema=f'{get_inv()}',
)
2020-05-15 18:13:49 +00:00
# Computer accessory
2023-03-21 16:31:43 +00:00
op.create_table(
'computer_accessory',
sa.Column('id', sa.BigInteger(), nullable=False),
sa.Column(
'layout',
sa.Enum(
'US',
'AF',
'ARA',
'AL',
'AM',
'AT',
'AU',
'AZ',
'BY',
'BE',
'BD',
'BA',
'BR',
'BG',
'DZ',
'MA',
'CM',
'MM',
'CA',
'CD',
'CN',
'HR',
'CZ',
'DK',
'NL',
'BT',
'EE',
'IR',
'IQ',
'FO',
'FI',
'FR',
'GH',
'GN',
'GE',
'DE',
'GR',
'HU',
'IL',
'IT',
'JP',
'KG',
'KH',
'KZ',
'LA',
'LATAM',
'LT',
'LV',
'MAO',
'ME',
'MK',
'MT',
'MN',
'NO',
'PL',
'PT',
'RO',
'RU',
'RS',
'SI',
'SK',
'ES',
'SE',
'CH',
'SY',
'TJ',
'LK',
'TH',
'TR',
'TW',
'UA',
'GB',
'UZ',
'VN',
'KR',
'IE',
'PK',
'MV',
'ZA',
'EPO',
'NP',
'NG',
'ET',
'SN',
'BRAI',
'TM',
'ML',
'TZ',
'TG',
'KE',
'BW',
'PH',
'MD',
'ID',
'MY',
'BN',
'IN',
'IS',
'NEC_VNDR_JP',
name='layouts',
),
nullable=True,
),
sa.ForeignKeyConstraint(
['id'],
[f'{get_inv()}.device.id'],
),
sa.PrimaryKeyConstraint('id'),
schema=f'{get_inv()}',
)
2020-05-15 18:13:49 +00:00
# Device search table
2023-03-21 16:31:43 +00:00
op.create_table(
'device_search',
sa.Column('device_id', sa.BigInteger(), nullable=False),
sa.Column('properties', postgresql.TSVECTOR(), nullable=False),
sa.Column('tags', postgresql.TSVECTOR(), nullable=True),
sa.ForeignKeyConstraint(
['device_id'], [f'{get_inv()}.device.id'], ondelete='CASCADE'
),
sa.PrimaryKeyConstraint('device_id'),
schema=f'{get_inv()}',
)
op.create_index(
'properties gist',
'device_search',
['properties'],
unique=False,
postgresql_using='gist',
schema=f'{get_inv()}',
)
op.create_index(
'tags gist',
'device_search',
['tags'],
unique=False,
postgresql_using='gist',
schema=f'{get_inv()}',
)
2020-05-15 18:13:49 +00:00
# Lot table
2023-03-21 16:31:43 +00:00
op.create_table(
'lot',
sa.Column(
'updated',
sa.TIMESTAMP(timezone=True),
server_default=sa.text('CURRENT_TIMESTAMP'),
nullable=False,
comment='The last time Devicehub recorded a change for \n this thing.\n ',
),
sa.Column(
'created',
sa.TIMESTAMP(timezone=True),
server_default=sa.text('CURRENT_TIMESTAMP'),
nullable=False,
comment='When Devicehub created this.',
),
sa.Column('id', postgresql.UUID(as_uuid=True), nullable=False),
sa.Column('name', citext.CIText(), nullable=False),
sa.Column(
'description',
citext.CIText(),
nullable=True,
comment='A comment about the lot.',
),
sa.Column(
'closed',
sa.Boolean(),
nullable=False,
comment='A closed lot cannot be modified anymore.',
),
sa.Column('deposit', sa.Integer(), nullable=True),
sa.Column('owner_id', postgresql.UUID(as_uuid=True), nullable=False),
sa.Column(
'transfer_state',
teal.db.IntEnum(TransferState),
nullable=False,
comment='State of transfer for a given Lot of devices.\n ',
),
sa.Column('receiver_address', citext.CIText(), nullable=True),
sa.Column('deliverynote_address', citext.CIText(), nullable=True),
sa.ForeignKeyConstraint(
['owner_id'],
['common.user.id'],
),
sa.ForeignKeyConstraint(
['receiver_address'],
['common.user.ethereum_address'],
),
sa.PrimaryKeyConstraint('id'),
schema=f'{get_inv()}',
)
op.create_index(
op.f('ix_lot_created'), 'lot', ['created'], unique=False, schema=f'{get_inv()}'
)
op.create_index(
op.f('ix_lot_updated'), 'lot', ['updated'], unique=False, schema=f'{get_inv()}'
)
2020-05-15 18:13:49 +00:00
# Mobile table
2023-03-21 16:31:43 +00:00
op.create_table(
'mobile',
sa.Column('id', sa.BigInteger(), nullable=False),
sa.Column(
'imei',
sa.BigInteger(),
nullable=True,
comment='The International Mobile Equipment Identity of\n the smartphone as an integer.\n ',
),
sa.Column(
'meid',
sa.Unicode(),
nullable=True,
comment='The Mobile Equipment Identifier as a hexadecimal\n string.\n ',
),
sa.Column(
'ram_size',
sa.Integer(),
nullable=True,
comment='The total of RAM of the device in MB.',
),
sa.Column(
'data_storage_size',
sa.Integer(),
nullable=True,
comment='The total of data storage of the device in MB',
),
sa.Column(
'display_size',
sa.Float(decimal_return_scale=1),
nullable=True,
comment='The total size of the device screen',
),
sa.ForeignKeyConstraint(
['id'],
[f'{get_inv()}.device.id'],
),
sa.PrimaryKeyConstraint('id'),
schema=f'{get_inv()}',
)
2020-05-15 18:13:49 +00:00
# Monitor table
2023-03-21 16:31:43 +00:00
op.create_table(
'monitor',
sa.Column(
'size',
sa.Float(decimal_return_scale=1),
nullable=False,
comment='The size of the monitor in inches.',
),
sa.Column(
'technology',
sa.Enum(
'CRT', 'TFT', 'LED', 'PDP', 'LCD', 'OLED', 'AMOLED', name='displaytech'
),
nullable=True,
comment='The technology the monitor uses to display\n the image.\n ',
),
sa.Column(
'resolution_width',
sa.SmallInteger(),
nullable=False,
comment='The maximum horizontal resolution the\n monitor can natively support in pixels.\n ',
),
sa.Column(
'resolution_height',
sa.SmallInteger(),
nullable=False,
comment='The maximum vertical resolution the\n monitor can natively support in pixels.\n ',
),
sa.Column('refresh_rate', sa.SmallInteger(), nullable=True),
sa.Column('contrast_ratio', sa.SmallInteger(), nullable=True),
sa.Column(
'touchable',
sa.Boolean(),
nullable=True,
comment='Whether it is a touchscreen.',
),
sa.Column('id', sa.BigInteger(), nullable=False),
sa.ForeignKeyConstraint(
['id'],
[f'{get_inv()}.device.id'],
),
sa.PrimaryKeyConstraint('id'),
schema=f'{get_inv()}',
)
2020-05-15 18:13:49 +00:00
# Networtking table
2023-03-21 16:31:43 +00:00
op.create_table(
'networking',
sa.Column(
'speed',
sa.SmallInteger(),
nullable=True,
comment='The maximum speed this network adapter can handle,\n in mbps.\n ',
),
sa.Column(
'wireless',
sa.Boolean(),
nullable=False,
comment='Whether it is a wireless interface.',
),
sa.Column('id', sa.BigInteger(), nullable=False),
sa.ForeignKeyConstraint(
['id'],
[f'{get_inv()}.device.id'],
),
sa.PrimaryKeyConstraint('id'),
schema=f'{get_inv()}',
)
2020-05-15 18:13:49 +00:00
# Organization table
2023-03-21 16:31:43 +00:00
op.create_table(
'organization',
sa.Column('id', postgresql.UUID(as_uuid=True), nullable=False),
sa.ForeignKeyConstraint(
['id'],
[f'{get_inv()}.agent.id'],
),
sa.PrimaryKeyConstraint('id'),
schema=f'{get_inv()}',
)
2020-05-15 18:13:49 +00:00
# Printer table
2023-03-21 16:31:43 +00:00
op.create_table(
'printer',
sa.Column('id', sa.BigInteger(), nullable=False),
sa.Column(
'wireless',
sa.Boolean(),
nullable=False,
comment='Whether it is a wireless printer.',
),
sa.Column(
'scanning',
sa.Boolean(),
nullable=False,
comment='Whether the printer has scanning capabilities.',
),
sa.Column(
'technology',
sa.Enum(
'Toner',
'Inkjet',
'SolidInk',
'Dye',
'Thermal',
name='printertechnology',
),
nullable=True,
comment='Technology used to print.',
),
sa.Column(
'monochrome',
sa.Boolean(),
nullable=False,
comment='Whether the printer is only monochrome.',
),
sa.ForeignKeyConstraint(
['id'],
[f'{get_inv()}.device.id'],
),
sa.PrimaryKeyConstraint('id'),
schema=f'{get_inv()}',
)
2020-05-15 18:13:49 +00:00
# Proof table
2023-03-21 16:31:43 +00:00
op.create_table(
'proof',
sa.Column(
'updated',
sa.TIMESTAMP(timezone=True),
server_default=sa.text('CURRENT_TIMESTAMP'),
nullable=False,
comment='The last time Devicehub recorded a change for \n this thing.\n ',
),
sa.Column(
'created',
sa.TIMESTAMP(timezone=True),
server_default=sa.text('CURRENT_TIMESTAMP'),
nullable=False,
comment='When Devicehub created this.',
),
sa.Column('id', postgresql.UUID(as_uuid=True), nullable=False),
sa.Column('type', sa.Unicode(), nullable=False),
sa.Column('ethereum_hash', citext.CIText(), nullable=False),
sa.Column('device_id', sa.BigInteger(), nullable=False),
sa.ForeignKeyConstraint(
['device_id'],
[f'{get_inv()}.device.id'],
),
sa.PrimaryKeyConstraint('id'),
schema=f'{get_inv()}',
)
op.create_index(
op.f('ix_proof_created'),
'proof',
['created'],
unique=False,
schema=f'{get_inv()}',
)
op.create_index(
op.f('ix_proof_updated'),
'proof',
['updated'],
unique=False,
schema=f'{get_inv()}',
)
2020-05-15 18:13:49 +00:00
# Action table
2023-03-21 16:31:43 +00:00
op.create_table(
'action',
sa.Column(
'updated',
sa.TIMESTAMP(timezone=True),
server_default=sa.text('CURRENT_TIMESTAMP'),
nullable=False,
comment='The last time Devicehub recorded a change for \n this thing.\n ',
),
sa.Column(
'created',
sa.TIMESTAMP(timezone=True),
server_default=sa.text('CURRENT_TIMESTAMP'),
nullable=False,
comment='When Devicehub created this.',
),
sa.Column('id', postgresql.UUID(as_uuid=True), nullable=False),
sa.Column('type', sa.Unicode(), nullable=False),
sa.Column(
'name',
citext.CIText(),
nullable=False,
comment='A name or title for the action. Used when searching\n for actions.\n ',
),
sa.Column(
'severity',
teal.db.IntEnum(Severity),
nullable=False,
comment='A flag evaluating the action execution. Ex. failed actions\n have the value `Severity.Error`. Devicehub uses 4 severity levels:\n\n * Info (Pass): default neutral severity. The action succeeded.\n * Notice: The action succeeded but it is raising awareness.\n Notices are not usually that important but something\n (good or bad) worth checking.\n * Warning: The action succeeded but there is something important\n to check negatively affecting the action.\n * Error (Fail): the action failed.\n\n Devicehub specially raises user awareness when an action\n has a Severity of ``Warning`` or greater.\n ',
),
sa.Column(
'closed',
sa.Boolean(),
nullable=False,
comment='Whether the author has finished the action.\n After this is set to True, no modifications are allowed.\n By default actions are closed when performed.\n ',
),
sa.Column(
'description',
sa.Unicode(),
nullable=False,
comment='A comment about the action.',
),
sa.Column(
'start_time',
sa.TIMESTAMP(timezone=True),
nullable=True,
comment='When the action starts. For some actions like\n reservations the time when they are available, for others like renting\n when the renting starts.\n ',
),
sa.Column(
'end_time',
sa.TIMESTAMP(timezone=True),
nullable=True,
comment='When the action ends. For some actions like reservations\n the time when they expire, for others like renting\n the time the end rents. For punctual actions it is the time \n they are performed; it differs with ``created`` in which\n created is the where the system received the action.\n ',
),
sa.Column('snapshot_id', postgresql.UUID(as_uuid=True), nullable=True),
sa.Column(
'author_id',
postgresql.UUID(as_uuid=True),
nullable=False,
comment='The user that recorded this action in the system.\n \n This does not necessarily has to be the person that produced\n the action in the real world. For that purpose see\n ``agent``.\n ',
),
sa.Column(
'agent_id',
postgresql.UUID(as_uuid=True),
nullable=False,
comment='The direct performer or driver of the action. \n e.g. John wrote a book.\n \n It can differ with the user that registered the action in the\n system, which can be in their behalf.\n ',
),
sa.Column(
'parent_id',
sa.BigInteger(),
nullable=True,
comment='For actions that are performed to components, \n the device parent at that time.\n \n For example: for a ``EraseBasic`` performed on a data storage, this\n would point to the computer that contained this data storage, if any.\n ',
),
sa.ForeignKeyConstraint(
['agent_id'],
[f'{get_inv()}.agent.id'],
),
sa.ForeignKeyConstraint(
['author_id'],
['common.user.id'],
),
sa.ForeignKeyConstraint(
['parent_id'],
[f'{get_inv()}.computer.id'],
),
sa.ForeignKeyConstraint(
['snapshot_id'],
[f'{get_inv()}.snapshot.id'],
name='snapshot_actions',
use_alter=True,
),
sa.PrimaryKeyConstraint('id'),
schema=f'{get_inv()}',
)
op.create_index(
op.f('ix_action_created'),
'action',
['created'],
unique=False,
schema=f'{get_inv()}',
)
op.create_index(
op.f('ix_action_updated'),
'action',
['updated'],
unique=False,
schema=f'{get_inv()}',
)
op.create_index(
'ix_id',
'action',
['id'],
unique=False,
postgresql_using='hash',
schema=f'{get_inv()}',
)
op.create_index(
'ix_parent_id',
'action',
['parent_id'],
unique=False,
postgresql_using='hash',
schema=f'{get_inv()}',
)
op.create_index(
'ix_type',
'action',
['type'],
unique=False,
postgresql_using='hash',
schema=f'{get_inv()}',
)
2020-05-15 18:13:49 +00:00
# Component table
2023-03-21 16:31:43 +00:00
op.create_table(
'component',
sa.Column('id', sa.BigInteger(), nullable=False),
sa.Column('parent_id', sa.BigInteger(), nullable=True),
sa.Column('focal_length', sa.SmallInteger(), nullable=True),
sa.Column('video_height', sa.SmallInteger(), nullable=True),
sa.Column('video_width', sa.Integer(), nullable=True),
sa.Column('horizontal_view_angle', sa.Integer(), nullable=True),
sa.Column(
'facing', sa.Enum('Front', 'Back', name='camerafacing'), nullable=True
),
sa.Column('vertical_view_angle', sa.SmallInteger(), nullable=True),
sa.Column('video_stabilization', sa.Boolean(), nullable=True),
sa.Column('flash', sa.Boolean(), nullable=True),
sa.ForeignKeyConstraint(
['id'],
[f'{get_inv()}.device.id'],
),
sa.ForeignKeyConstraint(
['parent_id'],
[f'{get_inv()}.computer.id'],
),
sa.PrimaryKeyConstraint('id'),
schema=f'{get_inv()}',
)
op.create_index(
'parent_index',
'component',
['parent_id'],
unique=False,
postgresql_using='hash',
schema=f'{get_inv()}',
)
2020-05-15 18:13:49 +00:00
# Deliverynote table
2023-03-21 16:31:43 +00:00
op.create_table(
'deliverynote',
sa.Column(
'updated',
sa.TIMESTAMP(timezone=True),
server_default=sa.text('CURRENT_TIMESTAMP'),
nullable=False,
comment='The last time Devicehub recorded a change for \n this thing.\n ',
),
sa.Column(
'created',
sa.TIMESTAMP(timezone=True),
server_default=sa.text('CURRENT_TIMESTAMP'),
nullable=False,
comment='When Devicehub created this.',
),
sa.Column('id', postgresql.UUID(as_uuid=True), nullable=False),
sa.Column('document_id', citext.CIText(), nullable=False),
sa.Column('creator_id', postgresql.UUID(as_uuid=True), nullable=False),
sa.Column('supplier_email', citext.CIText(), nullable=False),
sa.Column('receiver_address', citext.CIText(), nullable=False),
sa.Column(
'date',
sa.DateTime(),
nullable=False,
comment='The date the DeliveryNote initiated',
),
sa.Column('deposit', sa.Integer(), nullable=True),
sa.Column(
'expected_devices', postgresql.JSONB(astext_type=sa.Text()), nullable=False
),
sa.Column(
'transferred_devices', sa.ARRAY(sa.Integer(), dimensions=1), nullable=True
),
sa.Column(
'transfer_state',
teal.db.IntEnum(TransferState),
nullable=False,
comment='State of transfer for a given Lot of devices.\n ',
),
sa.Column('ethereum_address', citext.CIText(), nullable=True),
sa.Column('lot_id', postgresql.UUID(as_uuid=True), nullable=False),
sa.ForeignKeyConstraint(
['creator_id'],
['common.user.id'],
),
sa.ForeignKeyConstraint(
['lot_id'],
[f'{get_inv()}.lot.id'],
),
sa.ForeignKeyConstraint(
['receiver_address'],
['common.user.email'],
),
sa.ForeignKeyConstraint(
['supplier_email'],
['common.user.email'],
),
sa.PrimaryKeyConstraint('id'),
sa.UniqueConstraint('ethereum_address'),
schema=f'{get_inv()}',
)
op.create_index(
op.f('ix_deliverynote_created'),
'deliverynote',
['created'],
unique=False,
schema=f'{get_inv()}',
)
op.create_index(
op.f('ix_deliverynote_updated'),
'deliverynote',
['updated'],
unique=False,
schema=f'{get_inv()}',
)
2020-05-15 18:13:49 +00:00
# Individual table
2023-03-21 16:31:43 +00:00
op.create_table(
'individual',
sa.Column('active_org_id', postgresql.UUID(as_uuid=True), nullable=True),
sa.Column('user_id', postgresql.UUID(as_uuid=True), nullable=True),
sa.Column('id', postgresql.UUID(as_uuid=True), nullable=False),
sa.ForeignKeyConstraint(
['active_org_id'],
[f'{get_inv()}.organization.id'],
),
sa.ForeignKeyConstraint(
['id'],
[f'{get_inv()}.agent.id'],
),
sa.ForeignKeyConstraint(
['user_id'],
['common.user.id'],
),
sa.PrimaryKeyConstraint('id'),
sa.UniqueConstraint('user_id'),
schema=f'{get_inv()}',
)
2020-05-15 18:13:49 +00:00
# Lot device table
2023-03-21 16:31:43 +00:00
op.create_table(
'lot_device',
sa.Column('device_id', sa.BigInteger(), nullable=False),
sa.Column('lot_id', postgresql.UUID(as_uuid=True), nullable=False),
sa.Column('created', sa.DateTime(), nullable=False),
sa.Column(
'author_id',
postgresql.UUID(as_uuid=True),
nullable=False,
comment='The user that put the device in the lot.',
),
sa.ForeignKeyConstraint(
['author_id'],
['common.user.id'],
),
sa.ForeignKeyConstraint(
['device_id'],
[f'{get_inv()}.device.id'],
),
sa.ForeignKeyConstraint(
['lot_id'],
[f'{get_inv()}.lot.id'],
),
sa.PrimaryKeyConstraint('device_id', 'lot_id'),
schema=f'{get_inv()}',
)
2020-05-15 18:13:49 +00:00
# Path table
2023-03-21 16:31:43 +00:00
op.create_table(
'path',
sa.Column(
'id',
postgresql.UUID(as_uuid=True),
server_default=sa.text('gen_random_uuid()'),
nullable=False,
),
sa.Column('lot_id', postgresql.UUID(as_uuid=True), nullable=False),
sa.Column('path', sqlalchemy_utils.types.ltree.LtreeType(), nullable=False),
sa.Column(
'created',
sa.TIMESTAMP(timezone=True),
server_default=sa.text('CURRENT_TIMESTAMP'),
nullable=True,
comment='When Devicehub created this.',
),
sa.ForeignKeyConstraint(
['lot_id'],
[f'{get_inv()}.lot.id'],
),
sa.PrimaryKeyConstraint('id'),
sa.UniqueConstraint(
'path', deferrable='True', initially='immediate', name='path_unique'
),
schema=f'{get_inv()}',
)
op.create_index(
'lot_id_index',
'path',
['lot_id'],
unique=False,
postgresql_using='hash',
schema=f'{get_inv()}',
)
op.create_index(
'path_btree',
'path',
['path'],
unique=False,
postgresql_using='btree',
schema=f'{get_inv()}',
)
op.create_index(
'path_gist',
'path',
['path'],
unique=False,
postgresql_using='gist',
schema=f'{get_inv()}',
)
2020-05-15 18:13:49 +00:00
# Proof recycling table
2023-03-21 16:31:43 +00:00
op.create_table(
'proof_recycling',
sa.Column('collection_point', citext.CIText(), nullable=False),
sa.Column('date', sa.DateTime(), nullable=False),
sa.Column('contact', citext.CIText(), nullable=False),
sa.Column('ticket', citext.CIText(), nullable=False),
sa.Column('gps_location', citext.CIText(), nullable=False),
sa.Column('recycler_code', citext.CIText(), nullable=False),
sa.Column('id', postgresql.UUID(as_uuid=True), nullable=False),
sa.ForeignKeyConstraint(
['id'],
[f'{get_inv()}.proof.id'],
),
sa.PrimaryKeyConstraint('id'),
schema=f'{get_inv()}',
)
2020-05-15 18:13:49 +00:00
# Proof reuse table
2023-03-21 16:31:43 +00:00
op.create_table(
'proof_reuse',
sa.Column('receiver_segment', citext.CIText(), nullable=False),
sa.Column('id_receipt', citext.CIText(), nullable=False),
sa.Column('supplier_id', postgresql.UUID(as_uuid=True), nullable=True),
sa.Column('receiver_id', postgresql.UUID(as_uuid=True), nullable=True),
sa.Column('price', sa.Integer(), nullable=True),
sa.Column('id', postgresql.UUID(as_uuid=True), nullable=False),
sa.ForeignKeyConstraint(
['id'],
[f'{get_inv()}.proof.id'],
),
sa.ForeignKeyConstraint(
['receiver_id'],
['common.user.id'],
),
sa.ForeignKeyConstraint(
['supplier_id'],
['common.user.id'],
),
sa.PrimaryKeyConstraint('id'),
schema=f'{get_inv()}',
)
2020-05-15 18:13:49 +00:00
# Proof transfer table
2023-03-21 16:31:43 +00:00
op.create_table(
'proof_transfer',
sa.Column('supplier_id', postgresql.UUID(as_uuid=True), nullable=False),
sa.Column('receiver_id', postgresql.UUID(as_uuid=True), nullable=False),
sa.Column('deposit', sa.Integer(), nullable=True),
sa.Column('id', postgresql.UUID(as_uuid=True), nullable=False),
sa.ForeignKeyConstraint(
['id'],
[f'{get_inv()}.proof.id'],
),
sa.ForeignKeyConstraint(
['receiver_id'],
['common.user.id'],
),
sa.ForeignKeyConstraint(
['supplier_id'],
['common.user.id'],
),
sa.PrimaryKeyConstraint('id'),
schema=f'{get_inv()}',
)
2020-05-15 18:13:49 +00:00
# Tag table
2023-03-21 16:31:43 +00:00
op.create_table(
'tag',
sa.Column(
'updated',
sa.TIMESTAMP(timezone=True),
server_default=sa.text('CURRENT_TIMESTAMP'),
nullable=False,
comment='The last time Devicehub recorded a change for \n this thing.\n ',
),
sa.Column(
'created',
sa.TIMESTAMP(timezone=True),
server_default=sa.text('CURRENT_TIMESTAMP'),
nullable=False,
comment='When Devicehub created this.',
),
sa.Column('id', citext.CIText(), nullable=False, comment='The ID of the tag.'),
sa.Column('org_id', postgresql.UUID(as_uuid=True), nullable=False),
sa.Column(
'provider',
teal.db.URL(),
nullable=True,
comment='The tag provider URL. If None, the provider is\n this Devicehub.\n ',
),
sa.Column('device_id', sa.BigInteger(), nullable=True),
sa.Column(
'secondary',
citext.CIText(),
nullable=True,
comment='A secondary identifier for this tag. \n It has the same constraints as the main one. Only needed in special cases.\n ',
),
sa.ForeignKeyConstraint(
['device_id'], [f'{get_inv()}.device.id'], ondelete='SET NULL'
),
sa.ForeignKeyConstraint(
['org_id'],
[f'{get_inv()}.organization.id'],
),
sa.PrimaryKeyConstraint('id', 'org_id'),
sa.UniqueConstraint('id', 'org_id', name='one tag id per organization'),
sa.UniqueConstraint(
'secondary', 'org_id', name='one secondary tag per organization'
),
schema=f'{get_inv()}',
)
op.create_index(
'device_id_index',
'tag',
['device_id'],
unique=False,
postgresql_using='hash',
schema=f'{get_inv()}',
)
op.create_index(
op.f('ix_tag_created'), 'tag', ['created'], unique=False, schema=f'{get_inv()}'
)
op.create_index(
op.f('ix_tag_secondary'),
'tag',
['secondary'],
unique=False,
schema=f'{get_inv()}',
)
op.create_index(
op.f('ix_tag_updated'), 'tag', ['updated'], unique=False, schema=f'{get_inv()}'
)
2020-05-15 18:13:49 +00:00
# ActionComponent table
2023-03-21 16:31:43 +00:00
op.create_table(
'action_component',
sa.Column('device_id', sa.BigInteger(), nullable=False),
sa.Column('action_id', postgresql.UUID(as_uuid=True), nullable=False),
sa.ForeignKeyConstraint(
['action_id'],
[f'{get_inv()}.action.id'],
),
sa.ForeignKeyConstraint(
['device_id'],
[f'{get_inv()}.component.id'],
),
sa.PrimaryKeyConstraint('device_id', 'action_id'),
schema=f'{get_inv()}',
)
2020-05-15 18:13:49 +00:00
# Action device table
2023-03-21 16:31:43 +00:00
op.create_table(
'action_device',
sa.Column('device_id', sa.BigInteger(), nullable=False),
sa.Column('action_id', postgresql.UUID(as_uuid=True), nullable=False),
sa.ForeignKeyConstraint(
['action_id'],
[f'{get_inv()}.action.id'],
),
sa.ForeignKeyConstraint(
['device_id'],
[f'{get_inv()}.device.id'],
),
sa.PrimaryKeyConstraint('device_id', 'action_id'),
schema=f'{get_inv()}',
)
2020-05-15 18:13:49 +00:00
# ActionWithOneDevice table
2023-03-21 16:31:43 +00:00
op.create_table(
'action_with_one_device',
sa.Column('device_id', sa.BigInteger(), nullable=False),
sa.Column('id', postgresql.UUID(as_uuid=True), nullable=False),
sa.ForeignKeyConstraint(
['device_id'],
[f'{get_inv()}.device.id'],
),
sa.ForeignKeyConstraint(
['id'],
[f'{get_inv()}.action.id'],
),
sa.PrimaryKeyConstraint('id'),
schema=f'{get_inv()}',
)
op.create_index(
'action_one_device_id_index',
'action_with_one_device',
['device_id'],
unique=False,
postgresql_using='hash',
schema=f'{get_inv()}',
)
2020-05-15 18:13:49 +00:00
# Allocate table
2023-03-21 16:31:43 +00:00
op.create_table(
'allocate',
sa.Column('to_id', postgresql.UUID(), nullable=True),
sa.Column('organization', citext.CIText(), nullable=True),
sa.Column('id', postgresql.UUID(as_uuid=True), nullable=False),
sa.ForeignKeyConstraint(
['id'],
[f'{get_inv()}.action.id'],
),
sa.ForeignKeyConstraint(
['to_id'],
['common.user.id'],
),
sa.PrimaryKeyConstraint('id'),
schema=f'{get_inv()}',
)
2020-05-15 18:13:49 +00:00
# BAtter table
2023-03-21 16:31:43 +00:00
op.create_table(
'battery',
sa.Column(
'wireless',
sa.Boolean(),
nullable=True,
comment='If the battery can be charged wirelessly.',
),
sa.Column(
'technology',
sa.Enum(
'LiIon',
'NiCd',
'NiMH',
'LiPoly',
'LiFe',
'LiMn',
'Al',
name='batterytechnology',
),
nullable=True,
),
sa.Column(
'size',
sa.Integer(),
nullable=False,
comment='Maximum battery capacity by design, in mAh.\n\n Use BatteryTest\'s "size" to get the actual size of the battery.\n ',
),
sa.Column('id', sa.BigInteger(), nullable=False),
sa.ForeignKeyConstraint(
['id'],
[f'{get_inv()}.component.id'],
),
sa.PrimaryKeyConstraint('id'),
schema=f'{get_inv()}',
)
2020-05-15 18:13:49 +00:00
# DataStorage table
2023-03-21 16:31:43 +00:00
op.create_table(
'data_storage',
sa.Column(
'size',
sa.Integer(),
nullable=True,
comment='The size of the data-storage in MB.',
),
sa.Column(
'interface',
sa.Enum('ATA', 'USB', 'PCI', name='datastorageinterface'),
nullable=True,
),
sa.Column('id', sa.BigInteger(), nullable=False),
sa.ForeignKeyConstraint(
['id'],
[f'{get_inv()}.component.id'],
),
sa.PrimaryKeyConstraint('id'),
schema=f'{get_inv()}',
)
2020-05-15 18:13:49 +00:00
# Deallocate table
2023-03-21 16:31:43 +00:00
op.create_table(
'deallocate',
sa.Column('from_id', postgresql.UUID(), nullable=True),
sa.Column('organization', citext.CIText(), nullable=True),
sa.Column('id', postgresql.UUID(as_uuid=True), nullable=False),
sa.ForeignKeyConstraint(
['from_id'],
['common.user.id'],
),
sa.ForeignKeyConstraint(
['id'],
[f'{get_inv()}.action.id'],
),
sa.PrimaryKeyConstraint('id'),
schema=f'{get_inv()}',
)
2020-05-15 18:13:49 +00:00
# Display table
2023-03-21 16:31:43 +00:00
op.create_table(
'display',
sa.Column(
'size',
sa.Float(decimal_return_scale=1),
nullable=False,
comment='The size of the monitor in inches.',
),
sa.Column(
'technology',
sa.Enum(
'CRT', 'TFT', 'LED', 'PDP', 'LCD', 'OLED', 'AMOLED', name='displaytech'
),
nullable=True,
comment='The technology the monitor uses to display\n the image.\n ',
),
sa.Column(
'resolution_width',
sa.SmallInteger(),
nullable=False,
comment='The maximum horizontal resolution the\n monitor can natively support in pixels.\n ',
),
sa.Column(
'resolution_height',
sa.SmallInteger(),
nullable=False,
comment='The maximum vertical resolution the\n monitor can natively support in pixels.\n ',
),
sa.Column('refresh_rate', sa.SmallInteger(), nullable=True),
sa.Column('contrast_ratio', sa.SmallInteger(), nullable=True),
sa.Column(
'touchable',
sa.Boolean(),
nullable=True,
comment='Whether it is a touchscreen.',
),
sa.Column('id', sa.BigInteger(), nullable=False),
sa.ForeignKeyConstraint(
['id'],
[f'{get_inv()}.component.id'],
),
sa.PrimaryKeyConstraint('id'),
schema=f'{get_inv()}',
)
2020-05-15 18:13:49 +00:00
# GraphiCard table
2023-03-21 16:31:43 +00:00
op.create_table(
'graphic_card',
sa.Column(
'memory',
sa.SmallInteger(),
nullable=True,
comment='The amount of memory of the Graphic Card in MB.',
),
sa.Column('id', sa.BigInteger(), nullable=False),
sa.ForeignKeyConstraint(
['id'],
[f'{get_inv()}.component.id'],
),
sa.PrimaryKeyConstraint('id'),
schema=f'{get_inv()}',
)
2020-05-15 18:13:49 +00:00
# Membership table
2023-03-21 16:31:43 +00:00
op.create_table(
'membership',
sa.Column(
'updated',
sa.TIMESTAMP(timezone=True),
server_default=sa.text('CURRENT_TIMESTAMP'),
nullable=False,
comment='The last time Devicehub recorded a change for \n this thing.\n ',
),
sa.Column(
'created',
sa.TIMESTAMP(timezone=True),
server_default=sa.text('CURRENT_TIMESTAMP'),
nullable=False,
comment='When Devicehub created this.',
),
sa.Column('id', sa.Unicode(), nullable=True),
sa.Column('organization_id', postgresql.UUID(as_uuid=True), nullable=False),
sa.Column('individual_id', postgresql.UUID(as_uuid=True), nullable=False),
sa.ForeignKeyConstraint(
['individual_id'],
[f'{get_inv()}.individual.id'],
),
sa.ForeignKeyConstraint(
['organization_id'],
[f'{get_inv()}.organization.id'],
),
sa.PrimaryKeyConstraint('organization_id', 'individual_id'),
sa.UniqueConstraint(
'id', 'organization_id', name='One member id per organization.'
),
schema=f'{get_inv()}',
)
op.create_index(
op.f('ix_membership_created'),
'membership',
['created'],
unique=False,
schema=f'{get_inv()}',
)
op.create_index(
op.f('ix_membership_updated'),
'membership',
['updated'],
unique=False,
schema=f'{get_inv()}',
)
2020-05-15 18:13:49 +00:00
# Migrate table
2023-03-21 16:31:43 +00:00
op.create_table(
'migrate',
sa.Column(
'other',
teal.db.URL(),
nullable=False,
comment='\n The URL of the Migrate in the other end.\n ',
),
sa.Column('id', postgresql.UUID(as_uuid=True), nullable=False),
sa.ForeignKeyConstraint(
['id'],
[f'{get_inv()}.action.id'],
),
sa.PrimaryKeyConstraint('id'),
schema=f'{get_inv()}',
)
2020-05-15 18:13:49 +00:00
# Motherboard table
2023-03-21 16:31:43 +00:00
op.create_table(
'motherboard',
sa.Column(
'slots',
sa.SmallInteger(),
nullable=True,
comment='PCI slots the motherboard has.',
),
sa.Column('usb', sa.SmallInteger(), nullable=True),
sa.Column('firewire', sa.SmallInteger(), nullable=True),
sa.Column('serial', sa.SmallInteger(), nullable=True),
sa.Column('pcmcia', sa.SmallInteger(), nullable=True),
sa.Column(
'bios_date',
sa.Date(),
nullable=True,
comment='The date of the BIOS version.',
),
sa.Column('ram_slots', sa.SmallInteger(), nullable=True),
sa.Column('ram_max_size', sa.Integer(), nullable=True),
sa.Column('id', sa.BigInteger(), nullable=False),
sa.ForeignKeyConstraint(
['id'],
[f'{get_inv()}.component.id'],
),
sa.PrimaryKeyConstraint('id'),
schema=f'{get_inv()}',
)
2020-05-15 18:13:49 +00:00
# Network adapter
2023-03-21 16:31:43 +00:00
op.create_table(
'network_adapter',
sa.Column(
'speed',
sa.SmallInteger(),
nullable=True,
comment='The maximum speed this network adapter can handle,\n in mbps.\n ',
),
sa.Column(
'wireless',
sa.Boolean(),
nullable=False,
comment='Whether it is a wireless interface.',
),
sa.Column('id', sa.BigInteger(), nullable=False),
sa.ForeignKeyConstraint(
['id'],
[f'{get_inv()}.component.id'],
),
sa.PrimaryKeyConstraint('id'),
schema=f'{get_inv()}',
)
2020-05-15 18:13:49 +00:00
# Organize table
2023-03-21 16:31:43 +00:00
op.create_table(
'organize',
sa.Column('id', postgresql.UUID(as_uuid=True), nullable=False),
sa.ForeignKeyConstraint(
['id'],
[f'{get_inv()}.action.id'],
),
sa.PrimaryKeyConstraint('id'),
schema=f'{get_inv()}',
)
2020-05-15 18:13:49 +00:00
# Processor table
2023-03-21 16:31:43 +00:00
op.create_table(
'processor',
sa.Column('speed', sa.Float(), nullable=True, comment='The regular CPU speed.'),
sa.Column(
'cores',
sa.SmallInteger(),
nullable=True,
comment='The number of regular cores.',
),
sa.Column(
'threads',
sa.SmallInteger(),
nullable=True,
comment='The number of threads per core.',
),
sa.Column(
'address',
sa.SmallInteger(),
nullable=True,
comment='The address of the CPU: 8, 16, 32, 64, 128 or 256 bits.',
),
sa.Column(
'abi',
sa.Unicode(),
nullable=True,
comment='The Application Binary Interface of the processor.',
),
sa.Column('id', sa.BigInteger(), nullable=False),
sa.ForeignKeyConstraint(
['id'],
[f'{get_inv()}.component.id'],
),
sa.PrimaryKeyConstraint('id'),
schema=f'{get_inv()}',
)
2020-05-15 18:13:49 +00:00
# RamModule table
2023-03-21 16:31:43 +00:00
op.create_table(
'ram_module',
sa.Column(
'size',
sa.SmallInteger(),
nullable=True,
comment='The capacity of the RAM stick.',
),
sa.Column('speed', sa.SmallInteger(), nullable=True),
sa.Column(
'interface',
sa.Enum(
'SDRAM',
'DDR',
'DDR2',
'DDR3',
'DDR4',
'DDR5',
'DDR6',
name='raminterface',
),
nullable=True,
),
sa.Column('format', sa.Enum('DIMM', 'SODIMM', name='ramformat'), nullable=True),
sa.Column('id', sa.BigInteger(), nullable=False),
sa.ForeignKeyConstraint(
['id'],
[f'{get_inv()}.component.id'],
),
sa.PrimaryKeyConstraint('id'),
schema=f'{get_inv()}',
)
2020-05-15 18:13:49 +00:00
# Receive table
2023-03-21 16:31:43 +00:00
op.create_table(
'receive',
sa.Column(
'role',
sa.Enum(
'Intermediary',
'FinalUser',
'CollectionPoint',
'RecyclingPoint',
'Transporter',
name='receiverrole',
),
nullable=False,
),
sa.Column('id', postgresql.UUID(as_uuid=True), nullable=False),
sa.ForeignKeyConstraint(
['id'],
[f'{get_inv()}.action.id'],
),
sa.PrimaryKeyConstraint('id'),
schema=f'{get_inv()}',
)
2020-05-15 18:13:49 +00:00
# Sound card table
2023-03-21 16:31:43 +00:00
op.create_table(
'sound_card',
sa.Column('id', sa.BigInteger(), nullable=False),
sa.ForeignKeyConstraint(
['id'],
[f'{get_inv()}.component.id'],
),
sa.PrimaryKeyConstraint('id'),
schema=f'{get_inv()}',
)
2020-05-15 18:13:49 +00:00
# Benchmark table
2023-03-21 16:31:43 +00:00
op.create_table(
'benchmark',
sa.Column('elapsed', sa.Interval(), nullable=True),
sa.Column('id', postgresql.UUID(as_uuid=True), nullable=False),
sa.ForeignKeyConstraint(
['id'],
[f'{get_inv()}.action_with_one_device.id'],
),
sa.PrimaryKeyConstraint('id'),
schema=f'{get_inv()}',
)
2020-05-15 18:13:49 +00:00
# Erase basic table
2023-03-21 16:31:43 +00:00
op.create_table(
'erase_basic',
sa.Column('id', postgresql.UUID(as_uuid=True), nullable=False),
sa.Column(
'method',
sa.Enum('Shred', 'Disintegration', name='physicalerasuremethod'),
nullable=True,
),
sa.ForeignKeyConstraint(
['id'],
[f'{get_inv()}.action_with_one_device.id'],
),
sa.PrimaryKeyConstraint('id'),
schema=f'{get_inv()}',
)
op.create_table(
'install',
sa.Column('elapsed', sa.Interval(), nullable=False),
sa.Column('address', sa.SmallInteger(), nullable=True),
sa.Column('id', postgresql.UUID(as_uuid=True), nullable=False),
sa.ForeignKeyConstraint(
['id'],
[f'{get_inv()}.action_with_one_device.id'],
),
sa.PrimaryKeyConstraint('id'),
schema=f'{get_inv()}',
)
2020-05-15 18:13:49 +00:00
# Live table
2023-03-21 16:31:43 +00:00
op.create_table(
'live',
sa.Column(
'ip',
teal.db.IP(),
nullable=False,
comment='The IP where the live was triggered.',
),
sa.Column('subdivision_confidence', sa.SmallInteger(), nullable=False),
sa.Column(
'subdivision',
sa.Enum(
'AE-AJ',
'AE-AZ',
'AE-DU',
'AE-FU',
'AE-RK',
'AE-SH',
'AE-UQ',
'AF-BAL',
'AF-BAM',
'AF-BDG',
'AF-BDS',
'AF-BGL',
'AF-FRAU',
'AF-FYB',
'AF-GHA',
'AF-GHO',
'AF-HEL',
'AF-HER',
'AF-JOW',
'AF-KAB',
'AF-KANN',
'AF-KAP',
'AF-KDZ',
'AF-KNR',
'AF-LAG',
'AF-LOW',
'AF-NAN',
'AF-NIM',
'AF-ORU',
'AF-PAR',
'AF-PIA',
'AF-PKA',
'AF-SAM',
'AF-SAR',
'AF-TAK',
'AF-WAR',
'AF-ZAB',
'AL-BR',
'AL-BU',
'AL-DI',
'AL-DL',
'AL-DR',
'AL-DV',
'AL-EL',
'AL-ER',
'AL-FR',
'AL-GJ',
'AL-GR',
'AL-HA',
'AL-KA',
'AL-KB',
'AL-KC',
'AL-KO',
'AL-KR',
'AL-KU',
'AL-LA',
'AL-LB',
'AL-LE',
'AL-LU',
'AL-MK',
'AL-MM',
'AL-MR',
'AL-MT',
'AL-PG',
'AL-PQ',
'AL-PR',
'AL-PU',
'AL-SH',
'AL-SK',
'AL-SR',
'AL-TE',
'AL-TP',
'AL-TR',
'AL-VL',
'AM-AG',
'AM-AR',
'AM-AV',
'AM-ER',
'AM-GR',
'AM-KT',
'AM-LO',
'AM-SH',
'AM-SU',
'AM-TV',
'AM-VD',
'AO-BGO',
'AO-BGU',
'AO-BIE',
'AO-CAB',
'AO-CCU',
'AO-CNN',
'AO-CNO',
'AO-CUS',
'AO-HUA',
'AO-HUI',
'AO-LNO',
'AO-LSU',
'AO-LUA',
'AO-MAL',
'AO-MOX',
'AO-NAM',
'AO-UIG',
'AO-ZAI',
'AR-A',
'AR-B',
'AR-C',
'AR-D',
'AR-E',
'AR-F',
'AR-G',
'AR-H',
'AR-J',
'AR-K',
'AR-L',
'AR-M',
'AR-N',
'AR-P',
'AR-Q',
'AR-R',
'AR-S',
'AR-T',
'AR-U',
'AR-V',
'AR-W',
'AR-X',
'AR-Y',
'AR-Z',
'AT-1',
'AT-2',
'AT-3',
'AT-4',
'AT-5',
'AT-6',
'AT-7',
'AT-8',
'AT-9',
'AU-CT',
'AU-NS',
'AU-NT',
'AU-QL',
'AU-SA',
'AU-TS',
'AU-VI',
'AU-WA',
'AZ-AB',
'AZ-ABS',
'AZ-AGA',
'AZ-AGC',
'AZ-AGM',
'AZ-AGS',
'AZ-AGU',
'AZ-AST',
'AZ-BA',
'AZ-BAB',
'AZ-BAL',
'AZ-BAR',
'AZ-BEY',
'AZ-BIL',
'AZ-CAB',
'AZ-CAL',
'AZ-CUL',
'AZ-DAS',
'AZ-DAV',
'AZ-FUZ',
'AZ-GA',
'AZ-GAD',
'AZ-GOR',
'AZ-GOY',
'AZ-HAC',
'AZ-IMI',
'AZ-ISM',
'AZ-KAL',
'AZ-KUR',
'AZ-LA',
'AZ-LAC',
'AZ-LAN',
'AZ-LER',
'AZ-MAS',
'AZ-MI',
'AZ-MM',
'AZ-NA',
'AZ-NEF',
'AZ-OGU',
'AZ-ORD',
'AZ-QAB',
'AZ-QAX',
'AZ-QAZ',
'AZ-QBA',
'AZ-QBI',
'AZ-QOB',
'AZ-QUS',
'AZ-SA',
'AZ-SAB',
'AZ-SAD',
'AZ-SAH',
'AZ-SAK',
'AZ-SAL',
'AZ-SAR',
'AZ-SAT',
'AZ-SIY',
'AZ-SKR',
'AZ-SM',
'AZ-SMI',
'AZ-SMX',
'AZ-SS',
'AZ-SUS',
'AZ-TAR',
'AZ-TOV',
'AZ-UCA',
'AZ-XA',
'AZ-XAC',
'AZ-XAN',
'AZ-XCI',
'AZ-XIZ',
'AZ-XVD',
'AZ-YAR',
'AZ-YE',
'AZ-YEV',
'AZ-ZAN',
'AZ-ZAQ',
'AZ-ZAR',
'BA-BIH',
'BA-SRP',
'BD-01',
'BD-02',
'BD-03',
'BD-04',
'BD-05',
'BD-06',
'BD-07',
'BD-08',
'BD-09',
'BD-1',
'BD-10',
'BD-11',
'BD-12',
'BD-13',
'BD-14',
'BD-15',
'BD-16',
'BD-17',
'BD-18',
'BD-19',
'BD-2',
'BD-20',
'BD-21',
'BD-22',
'BD-23',
'BD-24',
'BD-25',
'BD-26',
'BD-27',
'BD-28',
'BD-29',
'BD-3',
'BD-30',
'BD-31',
'BD-32',
'BD-33',
'BD-34',
'BD-35',
'BD-36',
'BD-37',
'BD-38',
'BD-39',
'BD-4',
'BD-40',
'BD-41',
'BD-42',
'BD-43',
'BD-44',
'BD-45',
'BD-46',
'BD-47',
'BD-48',
'BD-49',
'BD-5',
'BD-50',
'BD-51',
'BD-52',
'BD-53',
'BD-54',
'BD-55',
'BD-56',
'BD-57',
'BD-58',
'BD-59',
'BD-6',
'BD-60',
'BD-61',
'BD-62',
'BD-63',
'BD-64',
'BE-BRU',
'BE-VAN',
'BE-VBR',
'BE-VLG',
'BE-VLI',
'BE-VOV',
'BE-VWV',
'BE-WAL',
'BE-WBR',
'BE-WHT',
'BE-WLG',
'BE-WLX',
'BE-WNA',
'BF-BAL',
'BF-BAM',
'BF-BAN',
'BF-BAZ',
'BF-BGR',
'BF-BLG',
'BF-BLK',
'BF-COM',
'BF-GAN',
'BF-GNA',
'BF-GOU',
'BF-HOU',
'BF-IOB',
'BF-KAD',
'BF-KEN',
'BF-KMD',
'BF-KMP',
'BF-KOP',
'BF-KOS',
'BF-KOT',
'BF-KOW',
'BF-LER',
'BF-LOR',
'BF-MOU',
'BF-NAM',
'BF-NAO',
'BF-NAY',
'BF-NOU',
'BF-OUB',
'BF-OUD',
'BF-PAS',
'BF-PON',
'BF-SEN',
'BF-SIS',
'BF-SMT',
'BF-SNG',
'BF-SOM',
'BF-SOR',
'BF-TAP',
'BF-TUI',
'BF-YAG',
'BF-YAT',
'BF-ZIR',
'BF-ZON',
'BF-ZOU',
'BG-01',
'BG-02',
'BG-03',
'BG-04',
'BG-05',
'BG-06',
'BG-07',
'BG-08',
'BG-09',
'BG-10',
'BG-11',
'BG-12',
'BG-13',
'BG-14',
'BG-15',
'BG-16',
'BG-17',
'BG-18',
'BG-19',
'BG-20',
'BG-21',
'BG-22',
'BG-23',
'BG-24',
'BG-25',
'BG-26',
'BG-27',
'BG-28',
'BH-01',
'BH-02',
'BH-03',
'BH-04',
'BH-05',
'BH-06',
'BH-07',
'BH-08',
'BH-09',
'BH-10',
'BH-11',
'BH-12',
'BI-BB',
'BI-BJ',
'BI-BR',
'BI-CA',
'BI-CI',
'BI-GI',
'BI-KI',
'BI-KR',
'BI-KY',
'BI-MA',
'BI-MU',
'BI-MW',
'BI-MY',
'BI-NG',
'BI-RT',
'BI-RY',
'BJ-AK',
'BJ-AL',
'BJ-AQ',
'BJ-BO',
'BJ-CO',
'BJ-DO',
'BJ-KO',
'BJ-LI',
'BJ-MO',
'BJ-OU',
'BJ-PL',
'BJ-ZO',
'BN-BE',
'BN-BM',
'BN-TE',
'BN-TU',
'BO-B',
'BO-C',
'BO-H',
'BO-L',
'BO-N',
'BO-O',
'BO-P',
'BO-S',
'BO-T',
'BR-AC',
'BR-AL',
'BR-AM',
'BR-AP',
'BR-BA',
'BR-CE',
'BR-DF',
'BR-ES',
'BR-GO',
'BR-MA',
'BR-MG',
'BR-MS',
'BR-MT',
'BR-PA',
'BR-PB',
'BR-PE',
'BR-PI',
'BR-PR',
'BR-RJ',
'BR-RN',
'BR-RO',
'BR-RR',
'BR-RS',
'BR-SC',
'BR-SE',
'BR-SP',
'BR-TO',
'BS-AC',
'BS-BI',
'BS-CI',
'BS-EX',
'BS-FC',
'BS-FP',
'BS-GH',
'BS-GT',
'BS-HI',
'BS-HR',
'BS-IN',
'BS-KB',
'BS-LI',
'BS-MG',
'BS-MH',
'BS-NB',
'BS-NP',
'BS-RI',
'BS-RS',
'BS-SP',
'BS-SR',
'BT-11',
'BT-12',
'BT-13',
'BT-14',
'BT-15',
'BT-21',
'BT-22',
'BT-23',
'BT-24',
'BT-31',
'BT-32',
'BT-33',
'BT-34',
'BT-41',
'BT-42',
'BT-43',
'BT-44',
'BT-45',
'BT-GA',
'BT-TY',
'BW-CE',
'BW-CH',
'BW-GH',
'BW-KG',
'BW-KL',
'BW-KW',
'BW-NE',
'BW-NG',
'BW-SE',
'BW-SO',
'BY-BR',
'BY-HO',
'BY-HR',
'BY-MA',
'BY-MI',
'BY-VI',
'BZ-BZ',
'BZ-CY',
'BZ-CZL',
'BZ-OW',
'BZ-SC',
'BZ-TOL',
'CA-AB',
'CA-BC',
'CA-MB',
'CA-NB',
'CA-NL',
'CA-NS',
'CA-NT',
'CA-NU',
'CA-ON',
'CA-PE',
'CA-QC',
'CA-SK',
'CA-YT',
'CD-BC',
'CD-BN',
'CD-EQ',
'CD-KA',
'CD-KE',
'CD-KN',
'CD-KW',
'CD-MA',
'CD-NK',
'CD-OR',
'CD-SK',
'CF-AC',
'CF-BB',
'CF-BGF',
'CF-BK',
'CF-HK',
'CF-HM',
'CF-HS',
'CF-KB',
'CF-KG',
'CF-LB',
'CF-MB',
'CF-MP',
'CF-NM',
'CF-OP',
'CF-SE',
'CF-UK',
'CF-VK',
'CG-11',
'CG-12',
'CG-13',
'CG-14',
'CG-15',
'CG-2',
'CG-5',
'CG-7',
'CG-8',
'CG-9',
'CG-BZV',
'CH-AG',
'CH-AI',
'CH-AR',
'CH-BE',
'CH-BL',
'CH-BS',
'CH-FR',
'CH-GE',
'CH-GL',
'CH-GR',
'CH-JU',
'CH-LU',
'CH-NE',
'CH-NW',
'CH-OW',
'CH-SG',
'CH-SH',
'CH-SO',
'CH-SZ',
'CH-TG',
'CH-TI',
'CH-UR',
'CH-VD',
'CH-VS',
'CH-ZG',
'CH-ZH',
'CI-01',
'CI-02',
'CI-03',
'CI-04',
'CI-05',
'CI-06',
'CI-07',
'CI-08',
'CI-09',
'CI-10',
'CI-11',
'CI-12',
'CI-13',
'CI-14',
'CI-15',
'CI-16',
'CL-AI',
'CL-AN',
'CL-AR',
'CL-AT',
'CL-BI',
'CL-CO',
'CL-LI',
'CL-LL',
'CL-MA',
'CL-ML',
'CL-RM',
'CL-TA',
'CL-VS',
'CM-AD',
'CM-CE',
'CM-EN',
'CM-ES',
'CM-LT',
'CM-NO',
'CM-NW',
'CM-OU',
'CM-SU',
'CM-SW',
'CN-11',
'CN-12',
'CN-13',
'CN-14',
'CN-15',
'CN-21',
'CN-22',
'CN-23',
'CN-31',
'CN-32',
'CN-33',
'CN-34',
'CN-35',
'CN-36',
'CN-37',
'CN-41',
'CN-42',
'CN-43',
'CN-44',
'CN-45',
'CN-46',
'CN-50',
'CN-51',
'CN-52',
'CN-53',
'CN-54',
'CN-61',
'CN-62',
'CN-63',
'CN-64',
'CN-65',
'CN-71',
'CN-91',
'CN-92',
'CO-AMA',
'CO-ANT',
'CO-ARA',
'CO-ATL',
'CO-BOL',
'CO-BOY',
'CO-CAL',
'CO-CAQ',
'CO-CAS',
'CO-CAU',
'CO-CES',
'CO-CHO',
'CO-COR',
'CO-CUN',
'CO-DC',
'CO-GUA',
'CO-GUV',
'CO-HUI',
'CO-LAG',
'CO-MAG',
'CO-MET',
'CO-NAR',
'CO-NSA',
'CO-PUT',
'CO-QUI',
'CO-RIS',
'CO-SAN',
'CO-SAP',
'CO-SUC',
'CO-TOL',
'CO-VAC',
'CO-VAU',
'CO-VID',
'CR-A',
'CR-C',
'CR-G',
'CR-H',
'CR-L',
'CR-P',
'CR-SJ',
'CU-01',
'CU-02',
'CU-03',
'CU-04',
'CU-05',
'CU-06',
'CU-07',
'CU-08',
'CU-09',
'CU-10',
'CU-11',
'CU-12',
'CU-13',
'CU-14',
'CU-99',
'CV-B',
'CV-BR',
'CV-BV',
'CV-CA',
'CV-CR',
'CV-CS',
'CV-FO',
'CV-MA',
'CV-MO',
'CV-PA',
'CV-PN',
'CV-PR',
'CV-RG',
'CV-S',
'CV-SF',
'CV-SL',
'CV-SN',
'CV-SV',
'CV-TA',
'CY-01',
'CY-02',
'CY-03',
'CY-04',
'CY-05',
'CY-06',
'CZ-JC',
'CZ-JM',
'CZ-KA',
'CZ-KR',
'CZ-LI',
'CZ-MO',
'CZ-OL',
'CZ-PA',
'CZ-PL',
'CZ-PR',
'CZ-ST',
'CZ-US',
'CZ-VY',
'CZ-ZL',
'DE-BB',
'DE-BE',
'DE-BW',
'DE-BY',
'DE-HB',
'DE-HE',
'DE-HH',
'DE-MV',
'DE-NI',
'DE-NW',
'DE-RP',
'DE-SH',
'DE-SL',
'DE-SN',
'DE-ST',
'DE-TH',
'DJ-AS',
'DJ-DI',
'DJ-DJ',
'DJ-OB',
'DJ-TA',
'DK-015',
'DK-020',
'DK-025',
'DK-030',
'DK-035',
'DK-040',
'DK-042',
'DK-050',
'DK-055',
'DK-060',
'DK-065',
'DK-070',
'DK-076',
'DK-080',
'DK-101',
'DK-147',
'DO-01',
'DO-02',
'DO-03',
'DO-04',
'DO-05',
'DO-06',
'DO-07',
'DO-08',
'DO-09',
'DO-10',
'DO-11',
'DO-12',
'DO-13',
'DO-14',
'DO-15',
'DO-16',
'DO-17',
'DO-18',
'DO-19',
'DO-20',
'DO-21',
'DO-22',
'DO-23',
'DO-24',
'DO-25',
'DO-26',
'DO-27',
'DO-28',
'DO-29',
'DO-30',
'DZ-01',
'DZ-02',
'DZ-03',
'DZ-04',
'DZ-05',
'DZ-06',
'DZ-07',
'DZ-08',
'DZ-09',
'DZ-10',
'DZ-11',
'DZ-12',
'DZ-13',
'DZ-14',
'DZ-15',
'DZ-16',
'DZ-17',
'DZ-18',
'DZ-19',
'DZ-20',
'DZ-21',
'DZ-22',
'DZ-23',
'DZ-24',
'DZ-25',
'DZ-26',
'DZ-27',
'DZ-28',
'DZ-29',
'DZ-30',
'DZ-31',
'DZ-32',
'DZ-33',
'DZ-34',
'DZ-35',
'DZ-36',
'DZ-37',
'DZ-38',
'DZ-39',
'DZ-40',
'DZ-41',
'DZ-42',
'DZ-43',
'DZ-44',
'DZ-45',
'DZ-46',
'DZ-47',
'DZ-48',
'EC-A',
'EC-B',
'EC-C',
'EC-D',
'EC-E',
'EC-F',
'EC-G',
'EC-H',
'EC-I',
'EC-L',
'EC-M',
'EC-N',
'EC-O',
'EC-P',
'EC-R',
'EC-S',
'EC-T',
'EC-U',
'EC-W',
'EC-X',
'EC-Y',
'EC-Z',
'EE-37',
'EE-39',
'EE-44',
'EE-49',
'EE-51',
'EE-57',
'EE-59',
'EE-65',
'EE-67',
'EE-70',
'EE-74',
'EE-78',
'EE-82',
'EE-84',
'EE-86',
'EG-ALX',
'EG-ASN',
'EG-AST',
'EG-BA',
'EG-BH',
'EG-BNS',
'EG-C',
'EG-DK',
'EG-DT',
'EG-FYM',
'EG-GH',
'EG-GZ',
'EG-IS',
'EG-JS',
'EG-KB',
'EG-KFS',
'EG-KN',
'EG-MN',
'EG-MNF',
'EG-MT',
'EG-PTS',
'EG-SHG',
'EG-SHR',
'EG-SIN',
'EG-SUZ',
'EG-WAD',
'ER-AN',
'ER-DK',
'ER-DU',
'ER-GB',
'ER-MA',
'ER-SK',
'ES-A',
'ES-AB',
'ES-AL',
'ES-AN',
'ES-AR',
'ES-AV',
'ES-B',
'ES-BA',
'ES-BI',
'ES-BU',
'ES-C',
'ES-CA',
'ES-CC',
'ES-CE',
'ES-CL',
'ES-CM',
'ES-CN',
'ES-CO',
'ES-CR',
'ES-CS',
'ES-CT',
'ES-CU',
'ES-EX',
'ES-GA',
'ES-GC',
'ES-GI',
'ES-GR',
'ES-GU',
'ES-H',
'ES-HU',
'ES-J',
'ES-L',
'ES-LE',
'ES-LO',
'ES-LU',
'ES-M',
'ES-MA',
'ES-ML',
'ES-MU',
'ES-NA',
'ES-O',
'ES-OR',
'ES-P',
'ES-PM',
'ES-PO',
'ES-PV',
'ES-S',
'ES-SA',
'ES-SE',
'ES-SG',
'ES-SO',
'ES-SS',
'ES-T',
'ES-TE',
'ES-TF',
'ES-TO',
'ES-V',
'ES-VA',
'ES-VC',
'ES-VI',
'ES-Z',
'ES-ZA',
'ET-AA',
'ET-AF',
'ET-AM',
'ET-BE',
'ET-DD',
'ET-GA',
'ET-HA',
'ET-OR',
'ET-SN',
'ET-SO',
'ET-TI',
'FI-AL',
'FI-ES',
'FI-IS',
'FI-LL',
'FI-LS',
'FI-OL',
'FJ-C',
'FJ-E',
'FJ-N',
'FJ-R',
'FJ-W',
'FM-KSA',
'FM-PNI',
'FM-TRK',
'FM-YAP',
'FR-01',
'FR-02',
'FR-03',
'FR-04',
'FR-05',
'FR-06',
'FR-07',
'FR-08',
'FR-09',
'FR-10',
'FR-11',
'FR-12',
'FR-13',
'FR-14',
'FR-15',
'FR-16',
'FR-17',
'FR-18',
'FR-19',
'FR-21',
'FR-22',
'FR-23',
'FR-24',
'FR-25',
'FR-26',
'FR-27',
'FR-28',
'FR-29',
'FR-2A',
'FR-2B',
'FR-30',
'FR-31',
'FR-32',
'FR-33',
'FR-34',
'FR-35',
'FR-36',
'FR-37',
'FR-38',
'FR-39',
'FR-40',
'FR-41',
'FR-42',
'FR-43',
'FR-44',
'FR-45',
'FR-46',
'FR-47',
'FR-48',
'FR-49',
'FR-50',
'FR-51',
'FR-52',
'FR-53',
'FR-54',
'FR-55',
'FR-56',
'FR-57',
'FR-58',
'FR-59',
'FR-60',
'FR-61',
'FR-62',
'FR-63',
'FR-64',
'FR-65',
'FR-66',
'FR-67',
'FR-68',
'FR-69',
'FR-70',
'FR-71',
'FR-72',
'FR-73',
'FR-74',
'FR-75',
'FR-76',
'FR-77',
'FR-78',
'FR-79',
'FR-80',
'FR-81',
'FR-82',
'FR-83',
'FR-84',
'FR-85',
'FR-86',
'FR-87',
'FR-88',
'FR-89',
'FR-90',
'FR-91',
'FR-92',
'FR-93',
'FR-94',
'FR-95',
'FR-A',
'FR-B',
'FR-C',
'FR-D',
'FR-E',
'FR-F',
'FR-G',
'FR-GF',
'FR-GP',
'FR-H',
'FR-I',
'FR-J',
'FR-K',
'FR-L',
'FR-M',
'FR-MQ',
'FR-N',
'FR-NC',
'FR-O',
'FR-P',
'FR-PF',
'FR-PM',
'FR-Q',
'FR-R',
'FR-RE',
'FR-S',
'FR-T',
'FR-TF',
'FR-U',
'FR-V',
'FR-WF',
'FR-YT',
'GA-1',
'GA-2',
'GA-3',
'GA-4',
'GA-5',
'GA-6',
'GA-7',
'GA-8',
'GA-9',
'GB-ABD',
'GB-ABE',
'GB-AGB',
'GB-AGY',
'GB-ANS',
'GB-ANT',
'GB-ARD',
'GB-ARM',
'GB-BAS',
'GB-BBD',
'GB-BDF',
'GB-BDG',
'GB-BEN',
'GB-BEX',
'GB-BFS',
'GB-BGE',
'GB-BGW',
'GB-BIR',
'GB-BKM',
'GB-BLA',
'GB-BLY',
'GB-BMH',
'GB-BNB',
'GB-BNE',
'GB-BNH',
'GB-BNS',
'GB-BOL',
'GB-BPL',
'GB-BRC',
'GB-BRD',
'GB-BRY',
'GB-BST',
'GB-BUR',
'GB-CAM',
'GB-CAY',
'GB-CGN',
'GB-CGV',
'GB-CHA',
'GB-CHS',
'GB-CKF',
'GB-CKT',
'GB-CLD',
'GB-CLK',
'GB-CLR',
'GB-CMA',
'GB-CMD',
'GB-CMN',
'GB-CON',
'GB-COV',
'GB-CRF',
'GB-CRY',
'GB-CSR',
'GB-CWY',
'GB-DAL',
'GB-DBY',
'GB-DEN',
'GB-DER',
'GB-DEV',
'GB-DGN',
'GB-DGY',
'GB-DNC',
'GB-DND',
'GB-DOR',
'GB-DOW',
'GB-DRY',
'GB-DUD',
'GB-DUR',
'GB-EAL',
'GB-EAW',
'GB-EAY',
'GB-EDH',
'GB-EDU',
'GB-ELN',
'GB-ELS',
'GB-ENF',
'GB-ENG',
'GB-ERW',
'GB-ERY',
'GB-ESS',
'GB-ESX',
'GB-FAL',
'GB-FER',
'GB-FIF',
'GB-FLN',
'GB-GAT',
'GB-GBN',
'GB-GLG',
'GB-GLS',
'GB-GRE',
'GB-GSY',
'GB-GWN',
'GB-HAL',
'GB-HAM',
'GB-HAV',
'GB-HCK',
'GB-HEF',
'GB-HIL',
'GB-HLD',
'GB-HMF',
'GB-HNS',
'GB-HPL',
'GB-HRT',
'GB-HRW',
'GB-HRY',
'GB-IOM',
'GB-IOS',
'GB-IOW',
'GB-ISL',
'GB-IVC',
'GB-JSY',
'GB-KEC',
'GB-KEN',
'GB-KHL',
'GB-KIR',
'GB-KTT',
'GB-KWL',
'GB-LAN',
'GB-LBH',
'GB-LCE',
'GB-LDS',
'GB-LEC',
'GB-LEW',
'GB-LIN',
'GB-LIV',
'GB-LMV',
'GB-LND',
'GB-LRN',
'GB-LSB',
'GB-LUT',
'GB-MAN',
'GB-MDB',
'GB-MDW',
'GB-MFT',
'GB-MIK',
'GB-MLN',
'GB-MON',
'GB-MRT',
'GB-MRY',
'GB-MTY',
'GB-MYL',
'GB-NAY',
'GB-NBL',
'GB-NDN',
'GB-NEL',
'GB-NET',
'GB-NFK',
'GB-NGM',
'GB-NIR',
'GB-NLK',
'GB-NLN',
'GB-NSM',
'GB-NTA',
'GB-NTH',
'GB-NTL',
'GB-NTT',
'GB-NTY',
'GB-NWM',
'GB-NWP',
'GB-NYK',
'GB-NYM',
'GB-OLD',
'GB-OMH',
'GB-ORK',
'GB-OXF',
'GB-PEM',
'GB-PKN',
'GB-PLY',
'GB-POL',
'GB-POR',
'GB-POW',
'GB-PTE',
'GB-RCC',
'GB-RCH',
'GB-RCT',
'GB-RDB',
'GB-RDG',
'GB-RFW',
'GB-RIC',
'GB-ROT',
'GB-RUT',
'GB-SAW',
'GB-SAY',
'GB-SCB',
'GB-SCT',
'GB-SFK',
'GB-SFT',
'GB-SGC',
'GB-SHF',
'GB-SHN',
'GB-SHR',
'GB-SKP',
'GB-SLF',
'GB-SLG',
'GB-SLK',
'GB-SND',
'GB-SOL',
'GB-SOM',
'GB-SOS',
'GB-SRY',
'GB-STB',
'GB-STE',
'GB-STG',
'GB-STH',
'GB-STN',
'GB-STS',
'GB-STT',
'GB-STY',
'GB-SWA',
'GB-SWD',
'GB-SWK',
'GB-TAM',
'GB-TFW',
'GB-THR',
'GB-TOB',
'GB-TOF',
'GB-TRF',
'GB-TWH',
'GB-UKM',
'GB-VGL',
'GB-WAR',
'GB-WBK',
'GB-WDU',
'GB-WFT',
'GB-WGN',
'GB-WILL',
'GB-WKF',
'GB-WLL',
'GB-WLN',
'GB-WLS',
'GB-WLV',
'GB-WND',
'GB-WNM',
'GB-WOK',
'GB-WOR',
'GB-WRL',
'GB-WRT',
'GB-WRX',
'GB-WSM',
'GB-WSX',
'GB-YOR',
'GB-ZET',
'GE-AB',
'GE-AJ',
'GE-GU',
'GE-IM',
'GE-KA',
'GE-KK',
'GE-MM',
'GE-RL',
'GE-SJ',
'GE-SK',
'GE-SZ',
'GE-TB',
'GH-AA',
'GH-AH',
'GH-BA',
'GH-CP',
'GH-EP',
'GH-NP',
'GH-TV',
'GH-UE',
'GH-UW',
'GH-WP',
'GM-B',
'GM-L',
'GM-M',
'GM-N',
'GM-U',
'GM-W',
'GN-B',
'GN-BE',
'GN-BF',
'GN-BK',
'GN-C',
'GN-CO',
'GN-D',
'GN-DB',
'GN-DI',
'GN-DL',
'GN-DU',
'GN-F',
'GN-FA',
'GN-FO',
'GN-FR',
'GN-GA',
'GN-GU',
'GN-K',
'GN-KA',
'GN-KB',
'GN-KD; 2',
'GN-KE',
'GN-KN',
'GN-KO',
'GN-KS',
'GN-L',
'GN-LA',
'GN-LE',
'GN-LO',
'GN-M',
'GN-MC',
'GN-MD',
'GN-ML',
'GN-MM',
'GN-N',
'GN-NZ',
'GN-PI',
'GN-SI',
'GN-TE',
'GN-TO',
'GN-YO',
'GQ-AN',
'GQ-BN',
'GQ-BS',
'GQ-C',
'GQ-CS',
'GQ-I',
'GQ-KN',
'GQ-LI',
'GQ-WN',
'GR-01',
'GR-03',
'GR-04',
'GR-05',
'GR-06',
'GR-07',
'GR-11',
'GR-12',
'GR-13',
'GR-14',
'GR-15',
'GR-16',
'GR-17',
'GR-21',
'GR-22',
'GR-23',
'GR-24',
'GR-31',
'GR-32',
'GR-33',
'GR-34',
'GR-41',
'GR-42',
'GR-43',
'GR-44',
'GR-51',
'GR-52',
'GR-53',
'GR-54',
'GR-55',
'GR-56',
'GR-57',
'GR-58',
'GR-59',
'GR-61',
'GR-62',
'GR-63',
'GR-64',
'GR-69',
'GR-71',
'GR-72',
'GR-73',
'GR-81',
'GR-82',
'GR-83',
'GR-84',
'GR-85',
'GR-91',
'GR-92',
'GR-93',
'GR-94',
'GR-A1',
'GR-I',
'GR-II',
'GR-III',
'GR-IV',
'GR-IX',
'GR-V',
'GR-VI',
'GR-VII',
'GR-VIII',
'GR-X',
'GR-XI',
'GR-XII',
'GR-XIII',
'GT-AV',
'GT-BV',
'GT-CM',
'GT-CQ',
'GT-ES',
'GT-GU',
'GT-HU',
'GT-IZ',
'GT-JA',
'GT-JU',
'GT-PE',
'GT-PR',
'GT-QC',
'GT-QZ',
'GT-RE',
'GT-SA',
'GT-SM',
'GT-SO',
'GT-SR',
'GT-SU',
'GT-TO',
'GT-ZA',
'GW-BA',
'GW-BL',
'GW-BM',
'GW-BS',
'GW-CA',
'GW-GA',
'GW-L',
'GW-N',
'GW-OI',
'GW-QU',
'GW-S',
'GW-TO',
'GY-BA',
'GY-CU',
'GY-DE',
'GY-EB',
'GY-ES',
'GY-MA',
'GY-PM',
'GY-PT',
'GY-UD',
'GY-UT',
'HN-AT',
'HN-CH',
'HN-CL',
'HN-CM',
'HN-CP',
'HN-CR',
'HN-EP',
'HN-FM',
'HN-GD',
'HN-IB',
'HN-IN',
'HN-LE',
'HN-LP',
'HN-OC',
'HN-OL',
'HN-SB',
'HN-VA',
'HN-YO',
'HR-01',
'HR-02',
'HR-03',
'HR-04',
'HR-05',
'HR-06',
'HR-07',
'HR-08',
'HR-09',
'HR-10',
'HR-11',
'HR-12',
'HR-13',
'HR-14',
'HR-15',
'HR-16',
'HR-17',
'HR-18',
'HR-19',
'HR-20',
'HR-21',
'HT-AR',
'HT-CE',
'HT-GA',
'HT-ND',
'HT-NE',
'HT-NO',
'HT-OU',
'HT-SD',
'HT-SE',
'HU-BA',
'HU-BC',
'HU-BE',
'HU-BK',
'HU-BU',
'HU-BZ',
'HU-CS',
'HU-DE',
'HU-DU',
'HU-EG',
'HU-FE',
'HU-GS',
'HU-GY',
'HU-HB',
'HU-HE',
'HU-HV',
'HU-JN',
'HU-KE',
'HU-KM',
'HU-KV',
'HU-MI',
'HU-NK',
'HU-NO',
'HU-NY',
'HU-PE',
'HU-PS',
'HU-SD',
'HU-SF',
'HU-SH',
'HU-SK',
'HU-SN',
'HU-SO',
'HU-SS',
'HU-ST',
'HU-SZ',
'HU-TB',
'HU-TO',
'HU-VA',
'HU-VE',
'HU-VM',
'HU-ZA',
'HU-ZE',
'ID-AC',
'ID-BA',
'ID-BB',
'ID-BE',
'ID-BT',
'ID-GO',
'ID-IJ',
'ID-JA',
'ID-JB',
'ID-JI',
'ID-JK',
'ID-JT',
'ID-JW',
'ID-KA',
'ID-KB',
'ID-KI',
'ID-KS',
'ID-KT',
'ID-LA',
'ID-MA',
'ID-MU',
'ID-NB',
'ID-NT',
'ID-NU',
'ID-PA',
'ID-RI',
'ID-SA',
'ID-SB',
'ID-SG',
'ID-SL',
'ID-SM',
'ID-SN',
'ID-SS',
'ID-ST',
'ID-SU',
'ID-YO',
'IE-C',
'IE-C; 2',
'IE-CE',
'IE-CN',
'IE-CW',
'IE-D',
'IE-DL',
'IE-G',
'IE-KE',
'IE-KK',
'IE-KY',
'IE-L',
'IE-LD',
'IE-LH',
'IE-LK',
'IE-LM',
'IE-LS',
'IE-M',
'IE-MH',
'IE-MN',
'IE-MO',
'IE-OY',
'IE-RN',
'IE-SO',
'IE-TA',
'IE-U',
'IE-WD',
'IE-WH',
'IE-WW',
'IE-WX',
'IL-D',
'IL-HA',
'IL-JM',
'IL-M',
'IL-TA',
'IL-Z',
'IN-AN',
'IN-AP',
'IN-AR',
'IN-AS',
'IN-BR',
'IN-CH',
'IN-CT',
'IN-DD',
'IN-DL',
'IN-DN',
'IN-GA',
'IN-GJ',
'IN-HP',
'IN-HR',
'IN-JH',
'IN-JK',
'IN-KA',
'IN-KL',
'IN-LD',
'IN-MH',
'IN-ML',
'IN-MN',
'IN-MP',
'IN-MZ',
'IN-NL',
'IN-OR',
'IN-PB',
'IN-PY',
'IN-RJ',
'IN-SK',
'IN-TN',
'IN-TR',
'IN-UL',
'IN-UP',
'IN-WB',
'IQ-AN',
'IQ-AR',
'IQ-BA',
'IQ-BB',
'IQ-BG',
'IQ-DA',
'IQ-DI',
'IQ-DQ',
'IQ-KA',
'IQ-MA',
'IQ-MU',
'IQ-NA',
'IQ-NI',
'IQ-QA',
'IQ-SD',
'IQ-SU',
'IQ-TS',
'IQ-WA',
'IR-01',
'IR-02',
'IR-03',
'IR-04',
'IR-05',
'IR-06',
'IR-07',
'IR-08',
'IR-09',
'IR-10',
'IR-11',
'IR-12',
'IR-13',
'IR-14',
'IR-15',
'IR-16',
'IR-17',
'IR-18',
'IR-19',
'IR-20',
'IR-21',
'IR-22',
'IR-23',
'IR-24',
'IR-25',
'IR-26',
'IR-27',
'IR-28',
'IS-0',
'IS-1',
'IS-2',
'IS-3',
'IS-4',
'IS-5',
'IS-6',
'IS-7',
'IS-8',
'IT-21',
'IT-23',
'IT-25',
'IT-32',
'IT-34',
'IT-36',
'IT-42',
'IT-45',
'IT-52',
'IT-55',
'IT-57',
'IT-62',
'IT-65',
'IT-67',
'IT-72',
'IT-75',
'IT-77',
'IT-78',
'IT-82',
'IT-88',
'IT-AG',
'IT-AL',
'IT-AN',
'IT-AO',
'IT-AP',
'IT-AQ',
'IT-AR',
'IT-AT',
'IT-AV',
'IT-BA',
'IT-BG',
'IT-BI',
'IT-BL',
'IT-BN',
'IT-BO',
'IT-BR',
'IT-BS',
'IT-BZ',
'IT-CA',
'IT-CB',
'IT-CE',
'IT-CH',
'IT-CL',
'IT-CN',
'IT-CO',
'IT-CR',
'IT-CS',
'IT-CT',
'IT-CZ',
'IT-DU',
'IT-EN',
'IT-FE',
'IT-FG',
'IT-FI',
'IT-FO',
'IT-FR',
'IT-GE',
'IT-GO',
'IT-GR',
'IT-IM',
'IT-IS',
'IT-KR',
'IT-LC',
'IT-LE',
'IT-LI',
'IT-LO',
'IT-LT',
'IT-LU',
'IT-MC',
'IT-ME',
'IT-MI',
'IT-MN',
'IT-MO',
'IT-MS',
'IT-MT',
'IT-NA',
'IT-NO',
'IT-NU',
'IT-OR',
'IT-PA',
'IT-PC',
'IT-PD',
'IT-PE',
'IT-PG',
'IT-PI',
'IT-PN',
'IT-PO',
'IT-PR',
'IT-PS',
'IT-PT',
'IT-PV',
'IT-PZ',
'IT-RA',
'IT-RC',
'IT-RE',
'IT-RG',
'IT-RI',
'IT-RM',
'IT-RN',
'IT-RO',
'IT-SA',
'IT-SI',
'IT-SO',
'IT-SP',
'IT-SR',
'IT-SS',
'IT-SV',
'IT-TA',
'IT-TE',
'IT-TN',
'IT-TO',
'IT-TP',
'IT-TR',
'IT-TS',
'IT-TV',
'IT-VA',
'IT-VB',
'IT-VC',
'IT-VE',
'IT-VI',
'IT-VR',
'IT-VT',
'IT-VV',
'JM-01',
'JM-02',
'JM-03',
'JM-04',
'JM-05',
'JM-06',
'JM-07',
'JM-08',
'JM-09',
'JM-10',
'JM-11',
'JM-12',
'JM-13',
'JM-14',
'JO-AJ',
'JO-AM',
'JO-AQ',
'JO-AT',
'JO-AZ',
'JO-BA',
'JO-IR',
'JO-JA',
'JO-KA',
'JO-MA',
'JO-MD',
'JO-MN',
'JP-01',
'JP-02',
'JP-03',
'JP-04',
'JP-05',
'JP-06',
'JP-07',
'JP-08',
'JP-09',
'JP-10',
'JP-11',
'JP-12',
'JP-13',
'JP-14',
'JP-15',
'JP-16',
'JP-17',
'JP-18',
'JP-19',
'JP-20',
'JP-21',
'JP-22',
'JP-23',
'JP-24',
'JP-25',
'JP-26',
'JP-27',
'JP-28',
'JP-29',
'JP-30',
'JP-31',
'JP-32',
'JP-33',
'JP-34',
'JP-35',
'JP-36',
'JP-37',
'JP-38',
'JP-39',
'JP-40',
'JP-41',
'JP-42',
'JP-43',
'JP-44',
'JP-45',
'JP-46',
'JP-47',
'KE-110',
'KE-200',
'KE-300',
'KE-400',
'KE-500',
'KE-600',
'KE-700',
'KE-900',
'KG-B',
'KG-C',
'KG-GB',
'KG-J',
'KG-N',
'KG-O',
'KG-T',
'KG-Y',
'KH-1',
'KH-10',
'KH-11',
'KH-12',
'KH-13',
'KH-14',
'KH-15',
'KH-16',
'KH-17',
'KH-18',
'KH-19',
'KH-2',
'KH-20',
'KH-21',
'KH-22',
'KH-23',
'KH-24',
'KH-3',
'KH-4',
'KH-5',
'KH-6',
'KH-7',
'KH-8',
'KH-9',
'KI-G',
'KI-L',
'KI-P',
'KM-A',
'KM-G',
'KM-M',
'KP-CHA',
'KP-HAB',
'KP-HAN',
'KP-HWB',
'KP-HWN',
'KP-KAE',
'KP-KAN',
'KP-NAJ',
'KP-NAM',
'KP-PYB',
'KP-PYN',
'KP-PYO',
'KP-YAN',
'KR-11',
'KR-26',
'KR-27',
'KR-28',
'KR-29',
'KR-30',
'KR-31',
'KR-41',
'KR-42',
'KR-43',
'KR-44',
'KR-45',
'KR-46',
'KR-47',
'KR-48',
'KR-49',
'KW-AH',
'KW-FA',
'KW-HA',
'KW-JA',
'KW-KU',
'KZ-AKM',
'KZ-AKT',
'KZ-ALA',
'KZ-ALM',
'KZ-AST',
'KZ-ATY',
'KZ-KAR',
'KZ-KUS',
'KZ-KZY',
'KZ-MAN',
'KZ-PAV',
'KZ-SEV',
'KZ-VOS',
'KZ-YUZ',
'KZ-ZAP',
'KZ-ZHA',
'LA-AT',
'LA-BK',
'LA-BL',
'LA-CH',
'LA-HO',
'LA-KH',
'LA-LM',
'LA-LP',
'LA-OU',
'LA-PH',
'LA-SL',
'LA-SV',
'LA-VI',
'LA-VT',
'LA-XA',
'LA-XE',
'LA-XI',
'LA-XN',
'LB-AS',
'LB-BA',
'LB-BI',
'LB-JA',
'LB-JL',
'LB-NA',
'LK-1',
'LK-11',
'LK-12',
'LK-13',
'LK-2',
'LK-21',
'LK-22',
'LK-23',
'LK-3',
'LK-31',
'LK-32',
'LK-33',
'LK-4',
'LK-41',
'LK-42',
'LK-43',
'LK-44',
'LK-45',
'LK-5',
'LK-51',
'LK-52',
'LK-53',
'LK-6',
'LK-61',
'LK-62',
'LK-7',
'LK-71',
'LK-72',
'LK-8',
'LK-81',
'LK-82',
'LK-9',
'LK-91',
'LK-92',
'LR-BG',
'LR-BM',
'LR-CM',
'LR-GB',
'LR-GG',
'LR-GK',
'LR-LO',
'LR-MG',
'LR-MO',
'LR-MY',
'LR-NI',
'LR-RI',
'LR-SI',
'LS-A',
'LS-B',
'LS-C',
'LS-D',
'LS-E',
'LS-F',
'LS-G',
'LS-H',
'LS-J',
'LS-K',
'LT-AL',
'LT-KL',
'LT-KU',
'LT-MR',
'LT-PN',
'LT-SA',
'LT-TA',
'LT-TE',
'LT-UT',
'LT-VL',
'LU-D',
'LU-G',
'LU-L',
'LV-AI',
'LV-AL',
'LV-BL',
'LV-BU',
'LV-CE',
'LV-DA',
'LV-DGV',
'LV-DO',
'LV-GU',
'LV-JEL',
'LV-JK',
'LV-JL',
'LV-JUR',
'LV-KR',
'LV-KU',
'LV-LE',
'LV-LM',
'LV-LPX',
'LV-LU',
'LV-MA',
'LV-OG',
'LV-PR',
'LV-RE',
'LV-REZ',
'LV-RI',
'LV-RIX',
'LV-SA',
'LV-TA',
'LV-TU',
'LV-VE',
'LV-VEN',
'LV-VK',
'LV-VM',
'LY-BA',
'LY-BU',
'LY-FA',
'LY-JA',
'LY-JG',
'LY-JU',
'LY-MI',
'LY-NA',
'LY-SF',
'LY-TB',
'LY-WA',
'LY-WU',
'LY-ZA',
'MA-01',
'MA-02',
'MA-03',
'MA-04',
'MA-05',
'MA-06',
'MA-07',
'MA-08',
'MA-09',
'MA-10',
'MA-11',
'MA-12',
'MA-13',
'MA-14',
'MA-15',
'MA-16',
'MA-AGD',
'MA-ASZ',
'MA-AZI',
'MA-BAH',
'MA-BEM',
'MA-BER',
'MA-BES',
'MA-BOD',
'MA-BOM',
'MA-CAS',
'MA-CHE',
'MA-CHI',
'MA-ERR',
'MA-ESI',
'MA-ESM',
'MA-FES',
'MA-FIG',
'MA-GUE',
'MA-HAJ',
'MA-HAO',
'MA-HOC',
'MA-IFR',
'MA-JDI',
'MA-JRA',
'MA-KEN',
'MA-KES',
'MA-KHE',
'MA-KHN',
'MA-KHO',
'MA-LAA',
'MA-LAR',
'MA-MAR',
'MA-MEK',
'MA-MEL',
'MA-NAD',
'MA-OUA',
'MA-OUD',
'MA-OUJ',
'MA-RBA',
'MA-SAF',
'MA-SEF',
'MA-SET',
'MA-SIK',
'MA-TAO',
'MA-TAR',
'MA-TAT',
'MA-TAZ',
'MA-TET',
'MA-TIZ',
'MA-TNG',
'MA-TNT',
'MD-BA',
'MD-CA',
'MD-CH',
'MD-CU',
'MD-ED',
'MD-GA',
'MD-LA',
'MD-OR',
'MD-SN',
'MD-SO',
'MD-TA',
'MD-TI',
'MD-UN',
'MG-A',
'MG-D',
'MG-F',
'MG-M',
'MG-T',
'MG-U',
'MH-ALK',
'MH-ALL',
'MH-ARN',
'MH-AUR',
'MH-EBO',
'MH-ENI',
'MH-JAL',
'MH-KIL',
'MH-KWA',
'MH-L',
'MH-LAE',
'MH-LIB',
'MH-LIK',
'MH-MAJ',
'MH-MAL',
'MH-MEJ',
'MH-MIL',
'MH-NMK',
'MH-NMU',
'MH-RON',
'MH-T',
'MH-UJA',
'MH-UJL',
'MH-UTI',
'MH-WTH',
'MH-WTJ',
'ML-1',
'ML-2',
'ML-3',
'ML-4',
'ML-5',
'ML-6',
'ML-7',
'ML-8',
'ML-BKO',
'MM-01',
'MM-02',
'MM-03',
'MM-04',
'MM-05',
'MM-06',
'MM-07',
'MM-11',
'MM-12',
'MM-13',
'MM-14',
'MM-15',
'MM-16',
'MM-17',
'MN-035',
'MN-037',
'MN-039',
'MN-041',
'MN-043',
'MN-046',
'MN-047',
'MN-049',
'MN-051',
'MN-053',
'MN-055',
'MN-057',
'MN-059',
'MN-061',
'MN-063',
'MN-064',
'MN-065',
'MN-067',
'MN-069',
'MN-071',
'MN-073',
'MN-1',
'MR-01',
'MR-02',
'MR-03',
'MR-04',
'MR-05',
'MR-06',
'MR-07',
'MR-08',
'MR-09',
'MR-10',
'MR-11',
'MR-12',
'MR-NKC',
'MU-AG',
'MU-BL',
'MU-BR',
'MU-CC',
'MU-CU',
'MU-FL',
'MU-GP',
'MU-MO',
'MU-PA',
'MU-PL',
'MU-PU',
'MU-PW',
'MU-QB',
'MU-RO',
'MU-RR',
'MU-SA',
'MU-VP',
'MV-01',
'MV-02',
'MV-03',
'MV-04',
'MV-05',
'MV-07',
'MV-08',
'MV-12',
'MV-13',
'MV-14',
'MV-17',
'MV-20',
'MV-23',
'MV-24',
'MV-25',
'MV-26',
'MV-27',
'MV-28',
'MV-29',
'MV-MLE',
'MW-BA',
'MW-BL',
'MW-C',
'MW-CK',
'MW-CR',
'MW-CT',
'MW-DE',
'MW-DO',
'MW-KR',
'MW-KS',
'MW-LI',
'MW-LK',
'MW-MC',
'MW-MG',
'MW-MH',
'MW-MU',
'MW-MW',
'MW-MZ',
'MW-N',
'MW-NB',
'MW-NI',
'MW-NK',
'MW-NS',
'MW-NU',
'MW-PH',
'MW-RU',
'MW-S',
'MW-SA',
'MW-TH',
'MW-ZO',
'MX-AGU',
'MX-BCN',
'MX-BCS',
'MX-CAM',
'MX-CHH',
'MX-CHP',
'MX-COA',
'MX-COL',
'MX-DIF',
'MX-DUR',
'MX-GRO',
'MX-GUA',
'MX-HID',
'MX-JAL',
'MX-MEX',
'MX-MIC',
'MX-MOR',
'MX-NAY',
'MX-NLE',
'MX-OAX',
'MX-PUE',
'MX-QUE',
'MX-ROO',
'MX-SIN',
'MX-SLP',
'MX-SON',
'MX-TAB',
'MX-TAM',
'MX-TLA',
'MX-VER',
'MX-YUC',
'MX-ZAC',
'MY-A',
'MY-B',
'MY-C',
'MY-D',
'MY-J',
'MY-K',
'MY-L',
'MY-M',
'MY-N',
'MY-P',
'MY-R',
'MY-SA',
'MY-SK',
'MY-T',
'MY-W',
'MZ-A',
'MZ-B',
'MZ-G',
'MZ-I',
'MZ-L',
'MZ-MPM',
'MZ-N',
'MZ-P',
'MZ-Q',
'MZ-S',
'MZ-T',
'NA-CA',
'NA-ER',
'NA-HA',
'NA-KA',
'NA-KH',
'NA-KU',
'NA-OD',
'NA-OH',
'NA-OK',
'NA-ON',
'NA-OS',
'NA-OT',
'NA-OW',
'NE-1',
'NE-2',
'NE-3',
'NE-4',
'NE-5',
'NE-6',
'NE-7',
'NE-8',
'NG-AB',
'NG-AD',
'NG-AK',
'NG-AN',
'NG-BA',
'NG-BE',
'NG-BO',
'NG-BY',
'NG-CR',
'NG-DE',
'NG-EB',
'NG-ED',
'NG-EK',
'NG-EN',
'NG-FC',
'NG-GO',
'NG-IM',
'NG-JI',
'NG-KD',
'NG-KE',
'NG-KN',
'NG-KO',
'NG-KT',
'NG-KW',
'NG-LA',
'NG-NA',
'NG-NI',
'NG-OG',
'NG-ON',
'NG-OS',
'NG-OY',
'NG-PL',
'NG-RI',
'NG-SO',
'NG-TA',
'NG-YO',
'NG-ZA',
'NI-AN',
'NI-AS',
'NI-BO',
'NI-CA',
'NI-CI',
'NI-CO',
'NI-ES',
'NI-GR',
'NI-JI',
'NI-LE',
'NI-MD',
'NI-MN',
'NI-MS',
'NI-MT',
'NI-NS',
'NI-RI',
'NI-SJ',
'NL-DR',
'NL-FL',
'NL-FR',
'NL-GE',
'NL-GR',
'NL-LI',
'NL-NB',
'NL-NH',
'NL-OV',
'NL-UT',
'NL-ZE',
'NL-ZH',
'NO-01',
'NO-02',
'NO-03',
'NO-04',
'NO-05',
'NO-06',
'NO-07',
'NO-08',
'NO-09',
'NO-10',
'NO-11',
'NO-12',
'NO-14',
'NO-15',
'NO-16',
'NO-17',
'NO-18',
'NO-19',
'NO-20',
'NO-21',
'NO-22',
'NP-1',
'NP-2',
'NP-3',
'NP-4',
'NP-5',
'NP-BA',
'NP-BH',
'NP-DH',
'NP-GA',
'NP-JA',
'NP-KA',
'NP-KO',
'NP-LU',
'NP-MA',
'NP-ME',
'NP-NA',
'NP-RA',
'NP-SA',
'NP-SE',
'NZ-AUK',
'NZ-BOP',
'NZ-CAN',
'NZ-GIS',
'NZ-HKB',
'NZ-MBH',
'NZ-MWT',
'NZ-N',
'NZ-NSN',
'NZ-NTL',
'NZ-OTA',
'NZ-S',
'NZ-STL',
'NZ-TAS',
'NZ-TKI',
'NZ-WGN',
'NZ-WKO',
'NZ-WTC',
'OM-BA',
'OM-DA',
'OM-JA',
'OM-MA',
'OM-MU',
'OM-SH',
'OM-WU',
'OM-ZA',
'PA-0',
'PA-1',
'PA-2',
'PA-3',
'PA-4',
'PA-5',
'PA-6',
'PA-7',
'PA-8',
'PA-9',
'PE-AMA',
'PE-ANC',
'PE-APU',
'PE-ARE',
'PE-AYA',
'PE-CAJ',
'PE-CAL',
'PE-CUS',
'PE-HUC',
'PE-HUV',
'PE-ICA',
'PE-JUN',
'PE-LAL',
'PE-LAM',
'PE-LIM',
'PE-LOR',
'PE-MDD',
'PE-MOQ',
'PE-PAS',
'PE-PIU',
'PE-PUN',
'PE-SAM',
'PE-TAC',
'PE-TUM',
'PE-UCA',
'PG-CPK',
'PG-CPM',
'PG-EBR',
'PG-EHG',
'PG-EPW',
'PG-ESW',
'PG-GPK',
'PG-MBA',
'PG-MPL',
'PG-MPM',
'PG-MRL',
'PG-NCD',
'PG-NIK',
'PG-NPP',
'PG-NSA',
'PG-SAN',
'PG-SHM',
'PG-WBK',
'PG-WHM',
'PG-WPD',
'PH-00',
'PH-01',
'PH-02',
'PH-03',
'PH-04',
'PH-05',
'PH-06',
'PH-07',
'PH-08',
'PH-09',
'PH-10',
'PH-11',
'PH-12',
'PH-13',
'PH-14',
'PH-15',
'PH-ABR',
'PH-AGN',
'PH-AGS',
'PH-AKL',
'PH-ALB',
'PH-ANT',
'PH-APA',
'PH-AUR',
'PH-BAN',
'PH-BAS',
'PH-BEN',
'PH-BIL',
'PH-BOH',
'PH-BTG',
'PH-BTN',
'PH-BUK',
'PH-BUL',
'PH-CAG',
'PH-CAM',
'PH-CAN',
'PH-CAP',
'PH-CAS',
'PH-CAT',
'PH-CAV',
'PH-CEB',
'PH-COM',
'PH-DAO',
'PH-DAS',
'PH-DAV',
'PH-EAS',
'PH-GUI',
'PH-IFU',
'PH-ILI',
'PH-ILN',
'PH-ILS',
'PH-ISA',
'PH-KAL',
'PH-LAG',
'PH-LAN',
'PH-LAS',
'PH-LEY',
'PH-LUN',
'PH-MAD',
'PH-MAG',
'PH-MAS',
'PH-MDC',
'PH-MDR',
'PH-MOU',
'PH-MSC',
'PH-MSR',
'PH-NCO',
'PH-NEC',
'PH-NER',
'PH-NSA',
'PH-NUE',
'PH-NUV',
'PH-PAM',
'PH-PAN',
'PH-PLW',
'PH-QUE',
'PH-QUI',
'PH-RIZ',
'PH-ROM',
'PH-SAR',
'PH-SCO',
'PH-SIG',
'PH-SLE',
'PH-SLU',
'PH-SOR',
'PH-SUK',
'PH-SUN',
'PH-SUR',
'PH-TAR',
'PH-TAW',
'PH-WSA',
'PH-ZAN',
'PH-ZAS',
'PH-ZMB',
'PH-ZSI',
'PK-BA',
'PK-IS',
'PK-JK',
'PK-NA',
'PK-NW',
'PK-PB',
'PK-SD',
'PK-TA',
'PL-DS',
'PL-KP',
'PL-LB',
'PL-LD',
'PL-LU',
'PL-MA',
'PL-MZ',
'PL-OP',
'PL-PD',
'PL-PK',
'PL-PM',
'PL-SK',
'PL-SL',
'PL-WN',
'PL-WP',
'PL-ZP',
'PT-01',
'PT-02',
'PT-03',
'PT-04',
'PT-05',
'PT-06',
'PT-07',
'PT-08',
'PT-09',
'PT-10',
'PT-11',
'PT-12',
'PT-13',
'PT-14',
'PT-15',
'PT-16',
'PT-17',
'PT-18',
'PT-20',
'PT-30',
'PY-1',
'PY-10',
'PY-11',
'PY-12',
'PY-13',
'PY-14',
'PY-15',
'PY-16',
'PY-19',
'PY-2',
'PY-3',
'PY-4',
'PY-5',
'PY-6',
'PY-7',
'PY-8',
'PY-9',
'PY-ASU',
'QA-DA',
'QA-GH',
'QA-JB',
'QA-JU',
'QA-KH',
'QA-MS',
'QA-RA',
'QA-US',
'QA-WA',
'RO-AB',
'RO-AG',
'RO-AR',
'RO-B',
'RO-BC',
'RO-BH',
'RO-BN',
'RO-BR',
'RO-BT',
'RO-BV',
'RO-BZ',
'RO-CJ',
'RO-CL',
'RO-CS',
'RO-CT',
'RO-CV',
'RO-DB',
'RO-DJ',
'RO-GJ',
'RO-GL',
'RO-GR',
'RO-HD',
'RO-HR',
'RO-IF',
'RO-IL',
'RO-IS',
'RO-MH',
'RO-MM',
'RO-MS',
'RO-NT',
'RO-OT',
'RO-PH',
'RO-SB',
'RO-SJ',
'RO-SM',
'RO-SV',
'RO-TL',
'RO-TM',
'RO-TR',
'RO-VL',
'RO-VN',
'RO-VS',
'RU-AD',
'RU-AGB',
'RU-AL',
'RU-ALT',
'RU-AMU',
'RU-ARK',
'RU-AST',
'RU-BA',
'RU-BEL',
'RU-BRY',
'RU-BU',
'RU-CE',
'RU-CHE',
'RU-CHI',
'RU-CHU',
'RU-CU',
'RU-DA',
'RU-DU',
'RU-EVE',
'RU-IN',
'RU-IRK',
'RU-IVA',
'RU-KAM',
'RU-KB',
'RU-KC',
'RU-KDA',
'RU-KEM',
'RU-KGD',
'RU-KGN',
'RU-KHA',
'RU-KHM',
'RU-KIR',
'RU-KK',
'RU-KL',
'RU-KLU',
'RU-KO',
'RU-KOP',
'RU-KOR',
'RU-KOS',
'RU-KR',
'RU-KRS',
'RU-KYA',
'RU-LEN',
'RU-LIP',
'RU-MAG',
'RU-ME',
'RU-MO',
'RU-MOS',
'RU-MOW',
'RU-MUR',
'RU-NEN',
'RU-NGR',
'RU-NIZ',
'RU-NVS',
'RU-OMS',
'RU-ORE',
'RU-ORL',
'RU-PER',
'RU-PNZ',
'RU-PRI',
'RU-PSK',
'RU-ROS',
'RU-RYA',
'RU-SA',
'RU-SAK',
'RU-SAM',
'RU-SAR',
'RU-SE',
'RU-SMO',
'RU-SPE',
'RU-STA',
'RU-SVE',
'RU-TA',
'RU-TAM',
'RU-TAY',
'RU-TOM',
'RU-TUL',
'RU-TVE',
'RU-TY',
'RU-TYU',
'RU-ULY',
'RU-UOB',
'RU-VGG',
'RU-VLA',
'RU-VLG',
'RU-VOR',
'RU-YAN',
'RU-YAR',
'RU-YEV',
'RW-B',
'RW-C',
'RW-D',
'RW-E',
'RW-F',
'RW-G',
'RW-H',
'RW-I',
'RW-J',
'RW-K',
'RW-L',
'RW-M',
'SA-01',
'SA-02',
'SA-03',
'SA-04',
'SA-05',
'SA-06',
'SA-07',
'SA-08',
'SA-09',
'SA-10',
'SA-11',
'SA-12',
'SA-14',
'SB-CE',
'SB-CT',
'SB-GU',
'SB-IS',
'SB-MK',
'SB-ML',
'SB-TE',
'SB-WE',
'SD-01',
'SD-02',
'SD-03',
'SD-04',
'SD-05',
'SD-06',
'SD-07',
'SD-08',
'SD-09',
'SD-10',
'SD-11',
'SD-12',
'SD-13',
'SD-14',
'SD-15',
'SD-16',
'SD-17',
'SD-18',
'SD-19',
'SD-20',
'SD-21',
'SD-22',
'SD-23',
'SD-24',
'SD-25',
'SD-26',
'SE-AB',
'SE-AC',
'SE-BD',
'SE-C',
'SE-D',
'SE-E',
'SE-F',
'SE-G',
'SE-H',
'SE-I',
'SE-K',
'SE-M',
'SE-N',
'SE-O',
'SE-S',
'SE-T',
'SE-U',
'SE-W',
'SE-X',
'SE-Y',
'SE-Z',
'SH-AC',
'SH-SH',
'SH-TA',
'SI-01',
'SI-02',
'SI-03',
'SI-04',
'SI-05',
'SI-06',
'SI-07',
'SI-08',
'SI-09',
'SI-10',
'SI-11',
'SI-12',
'SK-BC',
'SK-BL',
'SK-KI',
'SK-NI',
'SK-PV',
'SK-TA',
'SK-TC',
'SK-ZI',
'SL-E',
'SL-N',
'SL-S',
'SL-W',
'SN-DB',
'SN-DK',
'SN-FK',
'SN-KD',
'SN-KL',
'SN-LG',
'SN-SL',
'SN-TC',
'SN-TH',
'SN-ZG',
'SO-AW',
'SO-BK',
'SO-BN',
'SO-BR',
'SO-BY',
'SO-GA',
'SO-GE',
'SO-HI',
'SO-JD',
'SO-JH',
'SO-MU',
'SO-NU',
'SO-SA',
'SO-SD',
'SO-SH',
'SO-SO',
'SO-TO',
'SO-WO',
'SR-BR',
'SR-CM',
'SR-CR',
'SR-MA',
'SR-NI',
'SR-PM',
'SR-PR',
'SR-SA',
'SR-SI',
'SR-WA',
'ST-P',
'ST-S',
'SV-AH',
'SV-CA',
'SV-CH',
'SV-CU',
'SV-LI',
'SV-MO',
'SV-PA',
'SV-SA',
'SV-SM',
'SV-SO',
'SV-SS',
'SV-SV',
'SV-UN',
'SV-US',
'SY-DI',
'SY-DR',
'SY-DY',
'SY-HA',
'SY-HI',
'SY-HL',
'SY-HM',
'SY-ID',
'SY-LA',
'SY-QU',
'SY-RA',
'SY-RD',
'SY-SU',
'SY-TA',
'SZ-HH',
'SZ-LU',
'SZ-MA',
'SZ-SH',
'TD-BA',
'TD-BET',
'TD-BI',
'TD-CB',
'TD-GR',
'TD-KA',
'TD-LC',
'TD-LO',
'TD-LR',
'TD-MC',
'TD-MK',
'TD-OD',
'TD-SA',
'TD-TA',
'TG-C',
'TG-K',
'TG-M',
'TG-P',
'TG-S',
'TH-10',
'TH-11',
'TH-12',
'TH-13',
'TH-14',
'TH-15',
'TH-16',
'TH-17',
'TH-18',
'TH-19',
'TH-20',
'TH-21',
'TH-22',
'TH-23',
'TH-24',
'TH-25',
'TH-26',
'TH-27',
'TH-30',
'TH-31',
'TH-32',
'TH-33',
'TH-34',
'TH-35',
'TH-36',
'TH-37',
'TH-39',
'TH-40',
'TH-41',
'TH-42',
'TH-43',
'TH-44',
'TH-45',
'TH-46',
'TH-47',
'TH-48',
'TH-49',
'TH-50',
'TH-51',
'TH-52',
'TH-53',
'TH-54',
'TH-55',
'TH-56',
'TH-57',
'TH-58',
'TH-60',
'TH-61',
'TH-62',
'TH-63',
'TH-64',
'TH-65',
'TH-66',
'TH-67',
'TH-70',
'TH-71',
'TH-72',
'TH-73',
'TH-74',
'TH-75',
'TH-76',
'TH-77',
'TH-80',
'TH-81',
'TH-82',
'TH-83',
'TH-84',
'TH-85',
'TH-86',
'TH-90',
'TH-91',
'TH-92',
'TH-93',
'TH-94',
'TH-95',
'TH-96',
'TH-S',
'TJ-GB',
'TJ-KT',
'TJ-SU',
'TL-AL',
'TL-AN',
'TL-BA',
'TL-BO',
'TL-CO',
'TL-DI',
'TL-ER',
'TL-LA',
'TL-LI',
'TL-MF',
'TL-MT',
'TL-OE',
'TL-VI',
'TM-A',
'TM-B',
'TM-D',
'TM-L',
'TM-M',
'TN-11',
'TN-12',
'TN-13',
'TN-21',
'TN-22',
'TN-23',
'TN-31',
'TN-32',
'TN-33',
'TN-34',
'TN-41',
'TN-42',
'TN-43',
'TN-51',
'TN-52',
'TN-53',
'TN-61',
'TN-71',
'TN-72',
'TN-73',
'TN-81',
'TN-82',
'TN-83',
'TR-01',
'TR-02',
'TR-03',
'TR-04',
'TR-05',
'TR-06',
'TR-07',
'TR-08',
'TR-09',
'TR-10',
'TR-11',
'TR-12',
'TR-13',
'TR-14',
'TR-15',
'TR-16',
'TR-17',
'TR-18',
'TR-19',
'TR-20',
'TR-21',
'TR-22',
'TR-23',
'TR-24',
'TR-25',
'TR-26',
'TR-27',
'TR-28',
'TR-29',
'TR-30',
'TR-31',
'TR-32',
'TR-33',
'TR-34',
'TR-35',
'TR-36',
'TR-37',
'TR-38',
'TR-39',
'TR-40',
'TR-41',
'TR-42',
'TR-43',
'TR-44',
'TR-45',
'TR-46',
'TR-47',
'TR-48',
'TR-49',
'TR-50',
'TR-51',
'TR-52',
'TR-53',
'TR-54',
'TR-55',
'TR-56',
'TR-57',
'TR-58',
'TR-59',
'TR-60',
'TR-61',
'TR-62',
'TR-63',
'TR-64',
'TR-65',
'TR-66',
'TR-67',
'TR-68',
'TR-69',
'TR-70',
'TR-71',
'TR-72',
'TR-73',
'TR-74',
'TR-75',
'TR-76',
'TR-77',
'TR-78',
'TR-79',
'TR-80',
'TR-81',
'TT-ARI',
'TT-CHA',
'TT-CTT',
'TT-DMN',
'TT-ETO',
'TT-PED',
'TT-POS',
'TT-PRT',
'TT-PTF',
'TT-RCM',
'TT-SFO',
'TT-SGE',
'TT-SIP',
'TT-SJL',
'TT-TUP',
'TT-WTO',
'TW-CHA',
'TW-CYQ',
'TW-HSQ',
'TW-HUA',
'TW-ILA',
'TW-KEE',
'TW-KHQ',
'TW-MIA',
'TW-NAN',
'TW-PEN',
'TW-PIF',
'TW-TAO',
'TW-TNQ',
'TW-TPQ',
'TW-TTT',
'TW-TXQ',
'TW-YUN',
'TZ-01',
'TZ-02',
'TZ-03',
'TZ-04',
'TZ-05',
'TZ-06',
'TZ-07',
'TZ-08',
'TZ-09',
'TZ-10',
'TZ-11',
'TZ-12',
'TZ-13',
'TZ-14',
'TZ-15',
'TZ-16',
'TZ-17',
'TZ-18',
'TZ-19',
'TZ-20',
'TZ-21',
'TZ-22',
'TZ-23',
'TZ-24',
'TZ-25',
'UA-05',
'UA-07',
'UA-09',
'UA-12',
'UA-14',
'UA-18',
'UA-21',
'UA-23',
'UA-26',
'UA-30',
'UA-32',
'UA-35',
'UA-40',
'UA-43',
'UA-46',
'UA-48',
'UA-51',
'UA-53',
'UA-56',
'UA-59',
'UA-61',
'UA-63',
'UA-65',
'UA-68',
'UA-71',
'UA-74',
'UA-77',
'UG-AJM',
'UG-APA',
'UG-ARU',
'UG-BUA',
'UG-BUG',
'UG-BUN',
'UG-BUS',
'UG-C',
'UG-E',
'UG-GUL',
'UG-HOI',
'UG-IGA',
'UG-JIN',
'UG-KAP',
'UG-KAS',
'UG-KAT',
'UG-KBL',
'UG-KBR',
'UG-KIB',
'UG-KIS',
'UG-KIT',
'UG-KLA',
'UG-KLE',
'UG-KLG',
'UG-KLI',
'UG-KOT',
'UG-KUM',
'UG-LIR',
'UG-LUW',
'UG-MBL',
'UG-MBR',
'UG-MOR',
'UG-MOY',
'UG-MPI',
'UG-MSI',
'UG-MSK',
'UG-MUB',
'UG-MUK',
'UG-N',
'UG-NAK',
'UG-NEB',
'UG-NTU',
'UG-PAL',
'UG-RAK',
'UG-RUK',
'UG-SEM',
'UG-SOR',
'UG-TOR',
'UG-W',
'UM-67',
'UM-71',
'UM-76',
'UM-79',
'UM-81',
'UM-84',
'UM-86',
'UM-89',
'UM-95',
'US-AK',
'US-AL',
'US-AR',
'US-AS',
'US-AZ',
'US-CA',
'US-CO',
'US-CT',
'US-DC',
'US-DE',
'US-FL',
'US-GA',
'US-GU',
'US-HI',
'US-IA',
'US-ID',
'US-IL',
'US-IN',
'US-KS',
'US-KY',
'US-LA',
'US-MA',
'US-MD',
'US-ME',
'US-MI',
'US-MN',
'US-MO',
'US-MP',
'US-MS',
'US-MT',
'US-NC',
'US-ND',
'US-NE',
'US-NH',
'US-NJ',
'US-NM',
'US-NV',
'US-NY',
'US-OH',
'US-OK',
'US-OR',
'US-PA',
'US-PR',
'US-RI',
'US-SC',
'US-SD',
'US-TN',
'US-TX',
'US-UM',
'US-UT',
'US-VA',
'US-VI',
'US-VT',
'US-WA',
'US-WI',
'US-WV',
'US-WY',
'UY-AR',
'UY-CA',
'UY-CL',
'UY-CO',
'UY-DU',
'UY-FD',
'UY-FS',
'UY-LA',
'UY-MA',
'UY-MO',
'UY-PA',
'UY-RN',
'UY-RO',
'UY-RV',
'UY-SA',
'UY-SJ',
'UY-SO',
'UY-TA',
'UY-TT',
'UZ-AN',
'UZ-BU',
'UZ-FA',
'UZ-JI',
'UZ-NG',
'UZ-NW',
'UZ-QA',
'UZ-QR',
'UZ-SA',
'UZ-SI',
'UZ-SU',
'UZ-TK',
'UZ-TO',
'UZ-XO',
'VE-A',
'VE-B',
'VE-C',
'VE-D',
'VE-E',
'VE-F',
'VE-G',
'VE-H',
'VE-I',
'VE-J',
'VE-K',
'VE-L',
'VE-M',
'VE-N',
'VE-O',
'VE-P',
'VE-R',
'VE-S',
'VE-T',
'VE-U',
'VE-V',
'VE-W',
'VE-X',
'VE-Y',
'VE-Z',
'VN-01',
'VN-02',
'VN-03',
'VN-04',
'VN-05',
'VN-06',
'VN-07',
'VN-09',
'VN-13',
'VN-14',
'VN-15',
'VN-18',
'VN-20',
'VN-21',
'VN-22',
'VN-23',
'VN-24',
'VN-25',
'VN-26',
'VN-27',
'VN-28',
'VN-29',
'VN-30',
'VN-31',
'VN-32',
'VN-33',
'VN-34',
'VN-35',
'VN-36',
'VN-37',
'VN-39',
'VN-40',
'VN-41',
'VN-43',
'VN-44',
'VN-45',
'VN-46',
'VN-47',
'VN-48',
'VN-49',
'VN-50',
'VN-51',
'VN-52',
'VN-53',
'VN-54',
'VN-55',
'VN-56',
'VN-57',
'VN-58',
'VN-59',
'VN-60',
'VN-61',
'VN-62',
'VN-63',
'VN-64',
'VN-65',
'VN-66',
'VN-67',
'VN-68',
'VN-69',
'VN-70',
'VU-MAP',
'VU-PAM',
'VU-SAM',
'VU-SEE',
'VU-TAE',
'VU-TOB',
'WS-AA',
'WS-AL',
'WS-AT',
'WS-FA',
'WS-GE',
'WS-GI',
'WS-PA',
'WS-SA',
'WS-TU',
'WS-VF',
'WS-VS',
'YE-AB',
'YE-AD',
'YE-AM',
'YE-BA',
'YE-DA',
'YE-DH',
'YE-HD',
'YE-HJ',
'YE-HU',
'YE-IB',
'YE-JA',
'YE-LA',
'YE-MA',
'YE-MR',
'YE-MW',
'YE-SD',
'YE-SH',
'YE-SN',
'YE-TA',
'YU-CG',
'YU-KM',
'YU-SR',
'YU-VO',
'ZA-EC',
'ZA-FS',
'ZA-GT',
'ZA-MP',
'ZA-NC',
'ZA-NL',
'ZA-NP',
'ZA-NW',
'ZA-WC',
'ZM-01',
'ZM-02',
'ZM-03',
'ZM-04',
'ZM-05',
'ZM-06',
'ZM-07',
'ZM-08',
'ZM-09',
'ZW-BU',
'ZW-HA',
'ZW-MA',
'ZW-MC',
'ZW-ME',
'ZW-MI',
'ZW-MN',
'ZW-MS',
'ZW-MV',
'ZW-MW',
name='subdivision',
),
nullable=False,
),
sa.Column('city', sa.Unicode(length=32), nullable=False),
sa.Column('city_confidence', sa.SmallInteger(), nullable=False),
sa.Column('isp', sa.Unicode(length=32), nullable=False),
sa.Column('organization', sa.Unicode(length=32), nullable=True),
sa.Column('organization_type', sa.Unicode(length=32), nullable=True),
sa.Column('id', postgresql.UUID(as_uuid=True), nullable=False),
sa.ForeignKeyConstraint(
['id'],
[f'{get_inv()}.action_with_one_device.id'],
),
sa.PrimaryKeyConstraint('id'),
schema=f'{get_inv()}',
)
2020-05-15 18:13:49 +00:00
# Rate table
2023-03-21 16:31:43 +00:00
op.create_table(
'rate',
sa.Column(
'rating',
sa.Float(decimal_return_scale=2),
nullable=True,
comment='The rating for the content.',
),
sa.Column(
'version',
teal.db.StrictVersionType(),
nullable=True,
comment='The version of the software.',
),
sa.Column(
'appearance',
sa.Float(decimal_return_scale=2),
nullable=True,
comment='Subjective value representing aesthetic aspects.',
),
sa.Column(
'functionality',
sa.Float(decimal_return_scale=2),
nullable=True,
comment='Subjective value representing usage aspects.',
),
sa.Column('id', postgresql.UUID(as_uuid=True), nullable=False),
sa.ForeignKeyConstraint(
['id'],
[f'{get_inv()}.action_with_one_device.id'],
),
sa.PrimaryKeyConstraint('id'),
schema=f'{get_inv()}',
)
2020-05-15 18:13:49 +00:00
# Snapshot table
2023-03-21 16:31:43 +00:00
op.create_table(
'snapshot',
sa.Column('uuid', postgresql.UUID(as_uuid=True), nullable=True),
sa.Column('version', teal.db.StrictVersionType(length=32), nullable=False),
sa.Column(
'software',
sa.Enum(
'Workbench',
'WorkbenchAndroid',
'AndroidApp',
'Web',
'DesktopApp',
name='snapshotsoftware',
),
nullable=False,
),
sa.Column(
'elapsed',
sa.Interval(),
nullable=True,
comment='For Snapshots made with Workbench, the total amount \n of time it took to complete.\n ',
),
sa.Column('id', postgresql.UUID(as_uuid=True), nullable=False),
sa.ForeignKeyConstraint(
['id'],
[f'{get_inv()}.action_with_one_device.id'],
),
sa.PrimaryKeyConstraint('id'),
sa.UniqueConstraint('uuid'),
schema=f'{get_inv()}',
)
2020-05-15 18:13:49 +00:00
# Test table
2023-03-21 16:31:43 +00:00
op.create_table(
'test',
sa.Column('id', postgresql.UUID(as_uuid=True), nullable=False),
sa.ForeignKeyConstraint(
['id'],
[f'{get_inv()}.action_with_one_device.id'],
),
sa.PrimaryKeyConstraint('id'),
schema=f'{get_inv()}',
)
2020-05-15 18:13:49 +00:00
# BenchmarkDataStorage table
2023-03-21 16:31:43 +00:00
op.create_table(
'benchmark_data_storage',
sa.Column('id', postgresql.UUID(as_uuid=True), nullable=False),
sa.Column('read_speed', sa.Float(decimal_return_scale=2), nullable=False),
sa.Column('write_speed', sa.Float(decimal_return_scale=2), nullable=False),
sa.ForeignKeyConstraint(
['id'],
[f'{get_inv()}.benchmark.id'],
),
sa.PrimaryKeyConstraint('id'),
schema=f'{get_inv()}',
)
2020-05-15 18:13:49 +00:00
# BenchmarkWithRate table
2023-03-21 16:31:43 +00:00
op.create_table(
'benchmark_with_rate',
sa.Column('id', postgresql.UUID(as_uuid=True), nullable=False),
sa.Column('rate', sa.Float(), nullable=False),
sa.ForeignKeyConstraint(
['id'],
[f'{get_inv()}.benchmark.id'],
),
sa.PrimaryKeyConstraint('id'),
schema=f'{get_inv()}',
)
2020-05-15 18:13:49 +00:00
# MeasureBattery table
2023-03-21 16:31:43 +00:00
op.create_table(
'measure_battery',
sa.Column(
'size',
sa.Integer(),
nullable=False,
comment='Maximum battery capacity, in mAh.',
),
sa.Column(
'voltage',
sa.Integer(),
nullable=False,
comment='The actual voltage of the battery, in mV.',
),
sa.Column(
'cycle_count',
sa.Integer(),
nullable=True,
comment='The number of full charges discharges \n cycles.\n ',
),
sa.Column(
'health',
sa.Enum(
'Cold',
'Dead',
'Good',
'Overheat',
'OverVoltage',
'UnspecifiedValue',
name='batteryhealth',
),
nullable=True,
comment='The health of the Battery. \n Only reported in Android.\n ',
),
sa.Column('id', postgresql.UUID(as_uuid=True), nullable=False),
sa.ForeignKeyConstraint(
['id'],
[f'{get_inv()}.test.id'],
),
sa.PrimaryKeyConstraint('id'),
schema=f'{get_inv()}',
)
2020-05-15 18:13:49 +00:00
# Price table
2023-03-21 16:31:43 +00:00
op.create_table(
'price',
sa.Column(
'currency',
sa.Enum(
'AFN',
'ARS',
'AWG',
'AUD',
'AZN',
'BSD',
'BBD',
'BDT',
'BYR',
'BZD',
'BMD',
'BOB',
'BAM',
'BWP',
'BGN',
'BRL',
'BND',
'KHR',
'CAD',
'KYD',
'CLP',
'CNY',
'COP',
'CRC',
'HRK',
'CUP',
'CZK',
'DKK',
'DOP',
'XCD',
'EGP',
'SVC',
'EEK',
'EUR',
'FKP',
'FJD',
'GHC',
'GIP',
'GTQ',
'GGP',
'GYD',
'HNL',
'HKD',
'HUF',
'ISK',
'INR',
'IDR',
'IRR',
'IMP',
'ILS',
'JMD',
'JPY',
'JEP',
'KZT',
'KPW',
'KRW',
'KGS',
'LAK',
'LVL',
'LBP',
'LRD',
'LTL',
'MKD',
'MYR',
'MUR',
'MXN',
'MNT',
'MZN',
'NAD',
'NPR',
'ANG',
'NZD',
'NIO',
'NGN',
'NOK',
'OMR',
'PKR',
'PAB',
'PYG',
'PEN',
'PHP',
'PLN',
'QAR',
'RON',
'RUB',
'SHP',
'SAR',
'RSD',
'SCR',
'SGD',
'SBD',
'SOS',
'ZAR',
'LKR',
'SEK',
'CHF',
'SRD',
'SYP',
'TWD',
'THB',
'TTD',
'TRY',
'TRL',
'TVD',
'UAH',
'GBP',
'USD',
'UYU',
'UZS',
'VEF',
'VND',
'YER',
'ZWD',
name='currency',
),
nullable=False,
comment='The currency of this price as for ISO 4217.',
),
sa.Column(
'price',
sa.Numeric(precision=19, scale=4),
nullable=False,
comment='The value.',
),
sa.Column(
'software',
sa.Enum('Ereuse', name='pricesoftware'),
nullable=True,
comment='The software used to compute this price,\n if the price was computed automatically. This field is None\n if the price has been manually set.\n ',
),
sa.Column(
'version',
teal.db.StrictVersionType(),
nullable=True,
comment='The version of the software, or None.',
),
sa.Column(
'rating_id',
postgresql.UUID(as_uuid=True),
nullable=True,
comment='The Rate used to auto-compute\n this price, if it has not been set manually.\n ',
),
sa.Column('id', postgresql.UUID(as_uuid=True), nullable=False),
sa.ForeignKeyConstraint(
['id'],
[f'{get_inv()}.action_with_one_device.id'],
),
sa.ForeignKeyConstraint(
['rating_id'],
[f'{get_inv()}.rate.id'],
),
sa.PrimaryKeyConstraint('id'),
schema=f'{get_inv()}',
)
2020-05-15 18:13:49 +00:00
# ProofDataWipe table
2023-03-21 16:31:43 +00:00
op.create_table(
'proof_data_wipe',
sa.Column('date', sa.DateTime(), nullable=False),
sa.Column(
'result',
sa.Boolean(),
nullable=False,
comment='Identifies proof datawipe as a result.',
),
sa.Column('proof_author_id', postgresql.UUID(as_uuid=True), nullable=False),
sa.Column('erasure_id', postgresql.UUID(as_uuid=True), nullable=False),
sa.Column('id', postgresql.UUID(as_uuid=True), nullable=False),
sa.ForeignKeyConstraint(
['erasure_id'],
[f'{get_inv()}.erase_basic.id'],
),
sa.ForeignKeyConstraint(
['id'],
[f'{get_inv()}.proof.id'],
),
sa.ForeignKeyConstraint(
['proof_author_id'],
['common.user.id'],
),
sa.PrimaryKeyConstraint('id'),
schema=f'{get_inv()}',
)
2020-05-15 18:13:49 +00:00
# PRoofFuntion
2023-03-21 16:31:43 +00:00
op.create_table(
'proof_function',
sa.Column('disk_usage', sa.Integer(), nullable=True),
sa.Column('proof_author_id', postgresql.UUID(as_uuid=True), nullable=False),
sa.Column('rate_id', postgresql.UUID(as_uuid=True), nullable=False),
sa.Column('id', postgresql.UUID(as_uuid=True), nullable=False),
sa.ForeignKeyConstraint(
['id'],
[f'{get_inv()}.proof.id'],
),
sa.ForeignKeyConstraint(
['proof_author_id'],
['common.user.id'],
),
sa.ForeignKeyConstraint(
['rate_id'],
[f'{get_inv()}.rate.id'],
),
sa.PrimaryKeyConstraint('id'),
schema=f'{get_inv()}',
)
2020-05-15 18:13:49 +00:00
# RateComputer table
2023-03-21 16:31:43 +00:00
op.create_table(
'rate_computer',
sa.Column(
'processor',
sa.Float(decimal_return_scale=2),
nullable=True,
comment='The rate of the Processor.',
),
sa.Column(
'ram',
sa.Float(decimal_return_scale=2),
nullable=True,
comment='The rate of the RAM.',
),
sa.Column(
'data_storage',
sa.Float(decimal_return_scale=2),
nullable=True,
comment="'Data storage rate, like HHD, SSD.'",
),
sa.Column(
'graphic_card',
sa.Float(decimal_return_scale=2),
nullable=True,
comment='Graphic card rate.',
),
sa.Column('id', postgresql.UUID(as_uuid=True), nullable=False),
sa.ForeignKeyConstraint(
['id'],
[f'{get_inv()}.rate.id'],
),
sa.PrimaryKeyConstraint('id'),
schema=f'{get_inv()}',
)
2020-05-15 18:13:49 +00:00
# SnapshotRequest table
2023-03-21 16:31:43 +00:00
op.create_table(
'snapshot_request',
sa.Column('id', postgresql.UUID(as_uuid=True), nullable=False),
sa.Column('request', sa.JSON(), nullable=False),
sa.ForeignKeyConstraint(
['id'],
[f'{get_inv()}.snapshot.id'],
),
sa.PrimaryKeyConstraint('id'),
schema=f'{get_inv()}',
)
2020-05-15 18:13:49 +00:00
# Step table
2023-03-21 16:31:43 +00:00
op.create_table(
'step',
sa.Column('erasure_id', postgresql.UUID(as_uuid=True), nullable=False),
sa.Column('type', sa.Unicode(length=32), nullable=False),
sa.Column('num', sa.SmallInteger(), nullable=False),
sa.Column('severity', teal.db.IntEnum(Severity), nullable=False),
sa.Column(
'start_time',
sa.TIMESTAMP(timezone=True),
nullable=False,
comment='When the action starts. For some actions like\n reservations the time when they are available, for others like renting\n when the renting starts.\n ',
),
sa.Column(
'end_time',
sa.TIMESTAMP(timezone=True),
nullable=False,
comment='When the action ends. For some actions like reservations\n the time when they expire, for others like renting\n the time the end rents. For punctual actions it is the time \n they are performed; it differs with ``created`` in which\n created is the where the system received the action.\n ',
),
sa.ForeignKeyConstraint(
['erasure_id'], [f'{get_inv()}.erase_basic.id'], ondelete='CASCADE'
),
sa.PrimaryKeyConstraint('erasure_id', 'num'),
schema=f'{get_inv()}',
)
op.create_table(
'stress_test',
sa.Column('elapsed', sa.Interval(), nullable=False),
sa.Column('id', postgresql.UUID(as_uuid=True), nullable=False),
sa.ForeignKeyConstraint(
['id'],
[f'{get_inv()}.test.id'],
),
sa.PrimaryKeyConstraint('id'),
schema=f'{get_inv()}',
)
op.create_table(
'test_audio',
sa.Column(
'speaker',
sa.Boolean(),
nullable=True,
comment='Whether the speaker works as expected.',
),
sa.Column(
'microphone',
sa.Boolean(),
nullable=True,
comment='Whether the microphone works as expected.',
),
sa.Column('id', postgresql.UUID(as_uuid=True), nullable=False),
sa.ForeignKeyConstraint(
['id'],
[f'{get_inv()}.test.id'],
),
sa.PrimaryKeyConstraint('id'),
schema=f'{get_inv()}',
)
op.create_table(
'test_bios',
sa.Column(
'beeps_power_on',
sa.Boolean(),
nullable=True,
comment='Whether there are no beeps or error\n codes when booting up.\n \n Reference: R2 provision 6 page 23.\n ',
),
sa.Column(
'access_range',
sa.Enum('A', 'B', 'C', 'D', 'E', name='biosaccessrange'),
nullable=True,
comment='Difficulty to modify the boot menu.\n \n This is used as an usability measure for accessing and modifying\n a bios, specially as something as important as modifying the boot\n menu.\n ',
),
sa.Column('id', postgresql.UUID(as_uuid=True), nullable=False),
sa.ForeignKeyConstraint(
['id'],
[f'{get_inv()}.test.id'],
),
sa.PrimaryKeyConstraint('id'),
schema=f'{get_inv()}',
)
op.create_table(
'test_camera',
sa.Column('id', postgresql.UUID(as_uuid=True), nullable=False),
sa.ForeignKeyConstraint(
['id'],
[f'{get_inv()}.test.id'],
),
sa.PrimaryKeyConstraint('id'),
schema=f'{get_inv()}',
)
op.create_table(
'test_connectivity',
sa.Column('id', postgresql.UUID(as_uuid=True), nullable=False),
sa.ForeignKeyConstraint(
['id'],
[f'{get_inv()}.test.id'],
),
sa.PrimaryKeyConstraint('id'),
schema=f'{get_inv()}',
)
op.create_table(
'test_data_storage',
sa.Column(
'length',
sa.Enum('Short', 'Extended', name='testdatastoragelength'),
nullable=False,
),
sa.Column('status', sa.Unicode(), nullable=False),
sa.Column('lifetime', sa.Interval(), nullable=True),
sa.Column('assessment', sa.Boolean(), nullable=True),
sa.Column('reallocated_sector_count', sa.SmallInteger(), nullable=True),
sa.Column('power_cycle_count', sa.SmallInteger(), nullable=True),
sa.Column('reported_uncorrectable_errors', sa.Integer(), nullable=True),
sa.Column('command_timeout', sa.Integer(), nullable=True),
sa.Column('current_pending_sector_count', sa.SmallInteger(), nullable=True),
sa.Column('offline_uncorrectable', sa.SmallInteger(), nullable=True),
sa.Column('remaining_lifetime_percentage', sa.SmallInteger(), nullable=True),
sa.Column('elapsed', sa.Interval(), nullable=False),
sa.Column('id', postgresql.UUID(as_uuid=True), nullable=False),
sa.ForeignKeyConstraint(
['id'],
[f'{get_inv()}.test.id'],
),
sa.PrimaryKeyConstraint('id'),
schema=f'{get_inv()}',
)
2020-05-15 18:13:49 +00:00
# TestDisplayHinge table
2023-03-21 16:31:43 +00:00
op.create_table(
'test_display_hinge',
sa.Column('id', postgresql.UUID(as_uuid=True), nullable=False),
sa.ForeignKeyConstraint(
['id'],
[f'{get_inv()}.test.id'],
),
sa.PrimaryKeyConstraint('id'),
schema=f'{get_inv()}',
)
2020-05-15 18:13:49 +00:00
# TestKeyboard table
2023-03-21 16:31:43 +00:00
op.create_table(
'test_keyboard',
sa.Column('id', postgresql.UUID(as_uuid=True), nullable=False),
sa.ForeignKeyConstraint(
['id'],
[f'{get_inv()}.test.id'],
),
sa.PrimaryKeyConstraint('id'),
schema=f'{get_inv()}',
)
2020-05-15 18:13:49 +00:00
# TestPowerAdapter table
2023-03-21 16:31:43 +00:00
op.create_table(
'test_power_adapter',
sa.Column('id', postgresql.UUID(as_uuid=True), nullable=False),
sa.ForeignKeyConstraint(
['id'],
[f'{get_inv()}.test.id'],
),
sa.PrimaryKeyConstraint('id'),
schema=f'{get_inv()}',
)
2020-05-15 18:13:49 +00:00
# TestTrackpad table
2023-03-21 16:31:43 +00:00
op.create_table(
'test_trackpad',
sa.Column('id', postgresql.UUID(as_uuid=True), nullable=False),
sa.ForeignKeyConstraint(
['id'],
[f'{get_inv()}.test.id'],
),
sa.PrimaryKeyConstraint('id'),
schema=f'{get_inv()}',
)
2020-05-15 18:13:49 +00:00
# VisualTest table
2023-03-21 16:31:43 +00:00
op.create_table(
'visual_test',
sa.Column(
'appearance_range',
sa.Enum('Z', 'A', 'B', 'C', 'D', 'E', name='appearancerange'),
nullable=True,
comment='Grades the imperfections that aesthetically affect the device, but not its usage.',
),
sa.Column(
'functionality_range',
sa.Enum('A', 'B', 'C', 'D', name='functionalityrange'),
nullable=True,
comment='Grades the defects of a device that affect its usage.',
),
sa.Column(
'labelling',
sa.Boolean(),
nullable=True,
comment='Whether there are tags to be removed.',
),
sa.Column('id', postgresql.UUID(as_uuid=True), nullable=False),
sa.ForeignKeyConstraint(
['id'],
[f'{get_inv()}.test.id'],
),
sa.PrimaryKeyConstraint('id'),
schema=f'{get_inv()}',
)
2020-05-15 18:13:49 +00:00
# Trade table
2023-03-21 16:31:43 +00:00
op.create_table(
'trade',
sa.Column(
'shipping_date',
sa.TIMESTAMP(timezone=True),
nullable=True,
comment='When are the devices going to be ready \n for shipping?\n ',
),
sa.Column(
'invoice_number',
citext.CIText(),
nullable=True,
comment='The id of the invoice so they can be linked.',
),
sa.Column(
'price_id',
postgresql.UUID(as_uuid=True),
nullable=True,
comment='The price set for this trade. \n If no price is set it is supposed that the trade was\n not payed, usual in donations.\n ',
),
sa.Column('to_id', postgresql.UUID(as_uuid=True), nullable=False),
sa.Column(
'confirms_id',
postgresql.UUID(as_uuid=True),
nullable=True,
comment='An organize action that this association confirms. \n \n For example, a ``Sell`` or ``Rent``\n can confirm a ``Reserve`` action.\n ',
),
sa.Column('id', postgresql.UUID(as_uuid=True), nullable=False),
sa.ForeignKeyConstraint(
['confirms_id'],
[f'{get_inv()}.organize.id'],
),
sa.ForeignKeyConstraint(
['id'],
[f'{get_inv()}.action.id'],
),
sa.ForeignKeyConstraint(
['price_id'],
[f'{get_inv()}.price.id'],
),
sa.ForeignKeyConstraint(
['to_id'],
[f'{get_inv()}.agent.id'],
),
sa.PrimaryKeyConstraint('id'),
schema=f'{get_inv()}',
)
2020-05-15 18:13:49 +00:00
# ### end Alembic commands ###
def downgrade():
# Drop table, indexes in inventory schema
op.drop_table('trade', schema=f'{get_inv()}')
op.drop_table('visual_test', schema=f'{get_inv()}')
2020-05-15 18:13:49 +00:00
op.drop_table('test_trackpad', schema=f'{get_inv()}')
2020-05-15 18:13:49 +00:00
op.drop_table('test_power_adapter', schema=f'{get_inv()}')
2020-05-15 18:13:49 +00:00
op.drop_table('test_keyboard', schema=f'{get_inv()}')
2020-05-15 18:13:49 +00:00
op.drop_table('test_display_hinge', schema=f'{get_inv()}')
2020-05-15 18:13:49 +00:00
op.drop_table('test_data_storage', schema=f'{get_inv()}')
2020-05-15 18:13:49 +00:00
op.drop_table('test_connectivity', schema=f'{get_inv()}')
2020-05-15 18:13:49 +00:00
op.drop_table('test_camera', schema=f'{get_inv()}')
2020-05-15 18:13:49 +00:00
op.drop_table('test_bios', schema=f'{get_inv()}')
2020-05-15 18:13:49 +00:00
op.drop_table('test_audio', schema=f'{get_inv()}')
2020-05-15 18:13:49 +00:00
op.drop_table('stress_test', schema=f'{get_inv()}')
2020-05-15 18:13:49 +00:00
op.drop_table('step', schema=f'{get_inv()}')
2020-05-15 18:13:49 +00:00
op.drop_table('snapshot_request', schema=f'{get_inv()}')
2020-05-15 18:13:49 +00:00
op.drop_table('rate_computer', schema=f'{get_inv()}')
2020-05-15 18:13:49 +00:00
op.drop_table('proof_function', schema=f'{get_inv()}')
2020-05-15 18:13:49 +00:00
op.drop_table('proof_data_wipe', schema=f'{get_inv()}')
2020-05-15 18:13:49 +00:00
op.drop_table('price', schema=f'{get_inv()}')
2020-05-15 18:13:49 +00:00
op.drop_table('measure_battery', schema=f'{get_inv()}')
2020-05-15 18:13:49 +00:00
op.drop_table('benchmark_with_rate', schema=f'{get_inv()}')
2020-05-15 18:13:49 +00:00
op.drop_table('benchmark_data_storage', schema=f'{get_inv()}')
2020-05-15 18:13:49 +00:00
op.drop_table('test', schema=f'{get_inv()}')
2020-05-15 18:13:49 +00:00
2023-03-21 16:31:43 +00:00
op.drop_constraint(
"snapshot_actions", "action", type_="foreignkey", schema=f'{get_inv()}'
)
op.drop_table('snapshot', schema=f'{get_inv()}')
2020-05-15 18:13:49 +00:00
op.drop_table('rate', schema=f'{get_inv()}')
2020-05-15 18:13:49 +00:00
op.drop_table('live', schema=f'{get_inv()}')
2020-05-15 18:13:49 +00:00
op.drop_table('install', schema=f'{get_inv()}')
2020-05-15 18:13:49 +00:00
op.drop_table('erase_basic', schema=f'{get_inv()}')
2020-05-15 18:13:49 +00:00
op.drop_table('benchmark', schema=f'{get_inv()}')
2020-05-15 18:13:49 +00:00
op.drop_table('sound_card', schema=f'{get_inv()}')
2020-05-15 18:13:49 +00:00
op.drop_table('receive', schema=f'{get_inv()}')
2020-05-15 18:13:49 +00:00
op.drop_table('ram_module', schema=f'{get_inv()}')
2020-05-15 18:13:49 +00:00
op.drop_table('processor', schema=f'{get_inv()}')
2020-05-15 18:13:49 +00:00
op.drop_table('organize', schema=f'{get_inv()}')
2020-05-15 18:13:49 +00:00
op.drop_table('network_adapter', schema=f'{get_inv()}')
2020-05-15 18:13:49 +00:00
op.drop_table('motherboard', schema=f'{get_inv()}')
2020-05-15 18:13:49 +00:00
op.drop_table('migrate', schema=f'{get_inv()}')
2020-05-15 18:13:49 +00:00
2023-03-21 16:31:43 +00:00
op.drop_index(
op.f('ix_membership_updated'), table_name='membership', schema=f'{get_inv()}'
)
op.drop_index(
op.f('ix_membership_created'), table_name='membership', schema=f'{get_inv()}'
)
op.drop_table('membership', schema=f'{get_inv()}')
2020-05-15 18:13:49 +00:00
op.drop_table('graphic_card', schema=f'{get_inv()}')
2020-05-15 18:13:49 +00:00
op.drop_table('display', schema=f'{get_inv()}')
2020-05-15 18:13:49 +00:00
op.drop_table('deallocate', schema=f'{get_inv()}')
2020-05-15 18:13:49 +00:00
op.drop_table('data_storage', schema=f'{get_inv()}')
2020-05-15 18:13:49 +00:00
op.drop_table('battery', schema=f'{get_inv()}')
2020-05-15 18:13:49 +00:00
op.drop_table('allocate', schema=f'{get_inv()}')
2020-05-15 18:13:49 +00:00
2023-03-21 16:31:43 +00:00
op.drop_index(
'action_one_device_id_index',
table_name='action_with_one_device',
schema=f'{get_inv()}',
)
op.drop_table('action_with_one_device', schema=f'{get_inv()}')
2020-05-15 18:13:49 +00:00
op.drop_table('action_device', schema=f'{get_inv()}')
2020-05-15 18:13:49 +00:00
op.drop_table('action_component', schema=f'{get_inv()}')
2020-05-15 18:13:49 +00:00
op.drop_index(op.f('ix_tag_updated'), table_name='tag', schema=f'{get_inv()}')
op.drop_index(op.f('ix_tag_secondary'), table_name='tag', schema=f'{get_inv()}')
op.drop_index(op.f('ix_tag_created'), table_name='tag', schema=f'{get_inv()}')
op.drop_index('device_id_index', table_name='tag', schema=f'{get_inv()}')
op.drop_table('tag', schema=f'{get_inv()}')
2020-05-15 18:13:49 +00:00
op.drop_table('proof_transfer', schema=f'{get_inv()}')
2020-05-15 18:13:49 +00:00
op.drop_table('proof_reuse', schema=f'{get_inv()}')
2020-05-15 18:13:49 +00:00
op.drop_table('proof_recycling', schema=f'{get_inv()}')
2020-05-15 18:13:49 +00:00
op.drop_index('path_gist', table_name='path', schema=f'{get_inv()}')
op.drop_index('path_btree', table_name='path', schema=f'{get_inv()}')
op.drop_index('lot_id_index', table_name='path', schema=f'{get_inv()}')
2020-05-15 18:13:49 +00:00
op.execute(f"DROP VIEW {get_inv()}.lot_device_descendants")
op.execute(f"DROP VIEW {get_inv()}.lot_parent")
2020-05-15 18:13:49 +00:00
op.drop_table('path', schema=f'{get_inv()}')
2020-05-15 18:13:49 +00:00
op.drop_table('lot_device', schema=f'{get_inv()}')
2020-05-15 18:13:49 +00:00
op.drop_table('individual', schema=f'{get_inv()}')
2020-05-15 18:13:49 +00:00
2023-03-21 16:31:43 +00:00
op.drop_index(
op.f('ix_deliverynote_updated'),
table_name='deliverynote',
schema=f'{get_inv()}',
)
op.drop_index(
op.f('ix_deliverynote_created'),
table_name='deliverynote',
schema=f'{get_inv()}',
)
op.drop_table('deliverynote', schema=f'{get_inv()}')
2020-05-15 18:13:49 +00:00
op.drop_index('parent_index', table_name='component', schema=f'{get_inv()}')
op.drop_table('component', schema=f'{get_inv()}')
2020-05-15 18:13:49 +00:00
op.drop_index('ix_type', table_name='action', schema=f'{get_inv()}')
op.drop_index('ix_parent_id', table_name='action', schema=f'{get_inv()}')
op.drop_index('ix_id', table_name='action', schema=f'{get_inv()}')
op.drop_index(op.f('ix_action_updated'), table_name='action', schema=f'{get_inv()}')
op.drop_index(op.f('ix_action_created'), table_name='action', schema=f'{get_inv()}')
op.drop_table('action', schema=f'{get_inv()}')
2020-05-15 18:13:49 +00:00
op.drop_index(op.f('ix_proof_updated'), table_name='proof', schema=f'{get_inv()}')
op.drop_index(op.f('ix_proof_created'), table_name='proof', schema=f'{get_inv()}')
op.drop_table('proof', schema=f'{get_inv()}')
2020-05-15 18:13:49 +00:00
op.drop_table('printer', schema=f'{get_inv()}')
2020-05-15 18:13:49 +00:00
op.drop_table('organization', schema=f'{get_inv()}')
2020-05-15 18:13:49 +00:00
op.drop_table('networking', schema=f'{get_inv()}')
2020-05-15 18:13:49 +00:00
op.drop_table('monitor', schema=f'{get_inv()}')
2020-05-15 18:13:49 +00:00
op.drop_table('mobile', schema=f'{get_inv()}')
2020-05-15 18:13:49 +00:00
op.drop_index(op.f('ix_lot_updated'), table_name='lot', schema=f'{get_inv()}')
op.drop_index(op.f('ix_lot_created'), table_name='lot', schema=f'{get_inv()}')
op.drop_table('lot', schema=f'{get_inv()}')
2020-05-15 18:13:49 +00:00
op.drop_index('tags gist', table_name='device_search', schema=f'{get_inv()}')
op.drop_index('properties gist', table_name='device_search', schema=f'{get_inv()}')
op.drop_table('device_search', schema=f'{get_inv()}')
2020-05-15 18:13:49 +00:00
op.drop_table('computer_accessory', schema=f'{get_inv()}')
2020-05-15 18:13:49 +00:00
op.drop_table('computer', schema=f'{get_inv()}')
2020-05-15 18:13:49 +00:00
op.drop_index('type_index', table_name='device', schema=f'{get_inv()}')
op.drop_index(op.f('ix_device_updated'), table_name='device', schema=f'{get_inv()}')
op.drop_index(op.f('ix_device_created'), table_name='device', schema=f'{get_inv()}')
op.drop_index('device_id', table_name='device', schema=f'{get_inv()}')
op.drop_table('device', schema=f'{get_inv()}')
2020-05-15 18:13:49 +00:00
op.drop_index(op.f('ix_agent_updated'), table_name='agent', schema=f'{get_inv()}')
op.drop_index(op.f('ix_agent_created'), table_name='agent', schema=f'{get_inv()}')
op.drop_index('agent_type', table_name='agent', schema=f'{get_inv()}')
op.drop_table('agent', schema=f'{get_inv()}')
2020-05-15 18:13:49 +00:00
# Drop table, indexes in common schema
op.drop_table('user_inventory', schema='common')
op.drop_index(op.f('ix_common_user_updated'), table_name='user', schema='common')
op.drop_index(op.f('ix_common_user_created'), table_name='user', schema='common')
op.drop_table('user', schema='common')
op.drop_table('manufacturer', schema='common')
2023-03-21 16:31:43 +00:00
op.drop_index(
op.f('ix_common_inventory_updated'), table_name='inventory', schema='common'
)
op.drop_index(
op.f('ix_common_inventory_created'), table_name='inventory', schema='common'
)
2020-05-15 18:13:49 +00:00
op.drop_index('id_hash', table_name='inventory', schema='common')
op.drop_table('inventory', schema='common')
# Drop sequences
op.execute(f"DROP SEQUENCE {get_inv()}.device_seq;")
# Drop functions
op.execute(f"DROP FUNCTION IF EXISTS {get_inv()}.add_edge")
op.execute(f"DROP FUNCTION IF EXISTS {get_inv()}.delete_edge")
# Drop Create Common schema
op.execute("drop schema common")
op.execute(f"drop schema {get_inv()}")