aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFilipp Lepalaan <filipp@mac.com>2021-05-12 16:24:02 +0300
committerFilipp Lepalaan <filipp@mac.com>2021-05-12 16:24:02 +0300
commit7dd0cb9acd46fcfb1936e81b6d9f53e40df9cdb5 (patch)
treeeb293e30916c6697725dca2068e7e81146ad4c9b
parent71226657449ae821f6a89682eb2a8873aaad8210 (diff)
downloadServo-7dd0cb9acd46fcfb1936e81b6d9f53e40df9cdb5.tar.gz
Servo-7dd0cb9acd46fcfb1936e81b6d9f53e40df9cdb5.tar.bz2
Servo-7dd0cb9acd46fcfb1936e81b6d9f53e40df9cdb5.zip
Flattened migrations
-rw-r--r--servo/migrations/0001_initial.py1106
1 files changed, 1106 insertions, 0 deletions
diff --git a/servo/migrations/0001_initial.py b/servo/migrations/0001_initial.py
new file mode 100644
index 0000000..93f414a
--- /dev/null
+++ b/servo/migrations/0001_initial.py
@@ -0,0 +1,1106 @@
+# Generated by Django 3.2.2 on 2021-05-12 13:23
+
+from django.conf import settings
+import django.contrib.auth.models
+import django.contrib.auth.validators
+import django.contrib.postgres.fields
+import django.core.validators
+from django.db import migrations, models
+import django.db.models.deletion
+import django.utils.timezone
+import mptt.fields
+import servo.defaults
+import servo.lib.shorturl
+import servo.models.account
+import servo.models.note
+import servo.models.product
+import servo.validators
+
+
+class Migration(migrations.Migration):
+
+ initial = True
+
+ dependencies = [
+ ('auth', '0012_alter_user_first_name_max_length'),
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name='User',
+ fields=[
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('password', models.CharField(max_length=128, verbose_name='password')),
+ ('last_login', models.DateTimeField(blank=True, null=True, verbose_name='last login')),
+ ('is_superuser', models.BooleanField(default=False, help_text='Designates that this user has all permissions without explicitly assigning them.', verbose_name='superuser status')),
+ ('username', models.CharField(error_messages={'unique': 'A user with that username already exists.'}, help_text='Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.', max_length=150, unique=True, validators=[django.contrib.auth.validators.UnicodeUsernameValidator()], verbose_name='username')),
+ ('first_name', models.CharField(blank=True, max_length=150, verbose_name='first name')),
+ ('last_name', models.CharField(blank=True, max_length=150, verbose_name='last name')),
+ ('email', models.EmailField(blank=True, max_length=254, verbose_name='email address')),
+ ('is_staff', models.BooleanField(default=False, help_text='Designates whether the user can log into this admin site.', verbose_name='staff status')),
+ ('is_active', models.BooleanField(default=True, help_text='Designates whether this user should be treated as active. Unselect this instead of deleting accounts.', verbose_name='active')),
+ ('date_joined', models.DateTimeField(default=django.utils.timezone.now, verbose_name='date joined')),
+ ('full_name', models.CharField(default='New User', editable=False, max_length=128)),
+ ('locale', models.CharField(choices=[('da_DK.UTF-8', 'Danish'), ('nl_NL.UTF-8', 'Dutch'), ('en_US.UTF-8', 'English'), ('et_EE.UTF-8', 'Estonian'), ('fi_FI.UTF-8', 'Finnish'), ('sv_SE.UTF-8', 'Swedish')], default='da_DK.UTF-8', help_text='Select which language you want to use Servo in.', max_length=32, verbose_name='Language')),
+ ('timezone', models.CharField(choices=[('Africa/Abidjan', 'Africa/Abidjan'), ('Africa/Accra', 'Africa/Accra'), ('Africa/Addis_Ababa', 'Africa/Addis_Ababa'), ('Africa/Algiers', 'Africa/Algiers'), ('Africa/Asmara', 'Africa/Asmara'), ('Africa/Bamako', 'Africa/Bamako'), ('Africa/Bangui', 'Africa/Bangui'), ('Africa/Banjul', 'Africa/Banjul'), ('Africa/Bissau', 'Africa/Bissau'), ('Africa/Blantyre', 'Africa/Blantyre'), ('Africa/Brazzaville', 'Africa/Brazzaville'), ('Africa/Bujumbura', 'Africa/Bujumbura'), ('Africa/Cairo', 'Africa/Cairo'), ('Africa/Casablanca', 'Africa/Casablanca'), ('Africa/Ceuta', 'Africa/Ceuta'), ('Africa/Conakry', 'Africa/Conakry'), ('Africa/Dakar', 'Africa/Dakar'), ('Africa/Dar_es_Salaam', 'Africa/Dar_es_Salaam'), ('Africa/Djibouti', 'Africa/Djibouti'), ('Africa/Douala', 'Africa/Douala'), ('Africa/El_Aaiun', 'Africa/El_Aaiun'), ('Africa/Freetown', 'Africa/Freetown'), ('Africa/Gaborone', 'Africa/Gaborone'), ('Africa/Harare', 'Africa/Harare'), ('Africa/Johannesburg', 'Africa/Johannesburg'), ('Africa/Juba', 'Africa/Juba'), ('Africa/Kampala', 'Africa/Kampala'), ('Africa/Khartoum', 'Africa/Khartoum'), ('Africa/Kigali', 'Africa/Kigali'), ('Africa/Kinshasa', 'Africa/Kinshasa'), ('Africa/Lagos', 'Africa/Lagos'), ('Africa/Libreville', 'Africa/Libreville'), ('Africa/Lome', 'Africa/Lome'), ('Africa/Luanda', 'Africa/Luanda'), ('Africa/Lubumbashi', 'Africa/Lubumbashi'), ('Africa/Lusaka', 'Africa/Lusaka'), ('Africa/Malabo', 'Africa/Malabo'), ('Africa/Maputo', 'Africa/Maputo'), ('Africa/Maseru', 'Africa/Maseru'), ('Africa/Mbabane', 'Africa/Mbabane'), ('Africa/Mogadishu', 'Africa/Mogadishu'), ('Africa/Monrovia', 'Africa/Monrovia'), ('Africa/Nairobi', 'Africa/Nairobi'), ('Africa/Ndjamena', 'Africa/Ndjamena'), ('Africa/Niamey', 'Africa/Niamey'), ('Africa/Nouakchott', 'Africa/Nouakchott'), ('Africa/Ouagadougou', 'Africa/Ouagadougou'), ('Africa/Porto-Novo', 'Africa/Porto-Novo'), ('Africa/Sao_Tome', 'Africa/Sao_Tome'), ('Africa/Tripoli', 'Africa/Tripoli'), ('Africa/Tunis', 'Africa/Tunis'), ('Africa/Windhoek', 'Africa/Windhoek'), ('America/Adak', 'America/Adak'), ('America/Anchorage', 'America/Anchorage'), ('America/Anguilla', 'America/Anguilla'), ('America/Antigua', 'America/Antigua'), ('America/Araguaina', 'America/Araguaina'), ('America/Argentina/Buenos_Aires', 'America/Argentina/Buenos_Aires'), ('America/Argentina/Catamarca', 'America/Argentina/Catamarca'), ('America/Argentina/Cordoba', 'America/Argentina/Cordoba'), ('America/Argentina/Jujuy', 'America/Argentina/Jujuy'), ('America/Argentina/La_Rioja', 'America/Argentina/La_Rioja'), ('America/Argentina/Mendoza', 'America/Argentina/Mendoza'), ('America/Argentina/Rio_Gallegos', 'America/Argentina/Rio_Gallegos'), ('America/Argentina/Salta', 'America/Argentina/Salta'), ('America/Argentina/San_Juan', 'America/Argentina/San_Juan'), ('America/Argentina/San_Luis', 'America/Argentina/San_Luis'), ('America/Argentina/Tucuman', 'America/Argentina/Tucuman'), ('America/Argentina/Ushuaia', 'America/Argentina/Ushuaia'), ('America/Aruba', 'America/Aruba'), ('America/Asuncion', 'America/Asuncion'), ('America/Atikokan', 'America/Atikokan'), ('America/Bahia', 'America/Bahia'), ('America/Bahia_Banderas', 'America/Bahia_Banderas'), ('America/Barbados', 'America/Barbados'), ('America/Belem', 'America/Belem'), ('America/Belize', 'America/Belize'), ('America/Blanc-Sablon', 'America/Blanc-Sablon'), ('America/Boa_Vista', 'America/Boa_Vista'), ('America/Bogota', 'America/Bogota'), ('America/Boise', 'America/Boise'), ('America/Cambridge_Bay', 'America/Cambridge_Bay'), ('America/Campo_Grande', 'America/Campo_Grande'), ('America/Cancun', 'America/Cancun'), ('America/Caracas', 'America/Caracas'), ('America/Cayenne', 'America/Cayenne'), ('America/Cayman', 'America/Cayman'), ('America/Chicago', 'America/Chicago'), ('America/Chihuahua', 'America/Chihuahua'), ('America/Costa_Rica', 'America/Costa_Rica'), ('America/Creston', 'America/Creston'), ('America/Cuiaba', 'America/Cuiaba'), ('America/Curacao', 'America/Curacao'), ('America/Danmarkshavn', 'America/Danmarkshavn'), ('America/Dawson', 'America/Dawson'), ('America/Dawson_Creek', 'America/Dawson_Creek'), ('America/Denver', 'America/Denver'), ('America/Detroit', 'America/Detroit'), ('America/Dominica', 'America/Dominica'), ('America/Edmonton', 'America/Edmonton'), ('America/Eirunepe', 'America/Eirunepe'), ('America/El_Salvador', 'America/El_Salvador'), ('America/Fort_Nelson', 'America/Fort_Nelson'), ('America/Fortaleza', 'America/Fortaleza'), ('America/Glace_Bay', 'America/Glace_Bay'), ('America/Goose_Bay', 'America/Goose_Bay'), ('America/Grand_Turk', 'America/Grand_Turk'), ('America/Grenada', 'America/Grenada'), ('America/Guadeloupe', 'America/Guadeloupe'), ('America/Guatemala', 'America/Guatemala'), ('America/Guayaquil', 'America/Guayaquil'), ('America/Guyana', 'America/Guyana'), ('America/Halifax', 'America/Halifax'), ('America/Havana', 'America/Havana'), ('America/Hermosillo', 'America/Hermosillo'), ('America/Indiana/Indianapolis', 'America/Indiana/Indianapolis'), ('America/Indiana/Knox', 'America/Indiana/Knox'), ('America/Indiana/Marengo', 'America/Indiana/Marengo'), ('America/Indiana/Petersburg', 'America/Indiana/Petersburg'), ('America/Indiana/Tell_City', 'America/Indiana/Tell_City'), ('America/Indiana/Vevay', 'America/Indiana/Vevay'), ('America/Indiana/Vincennes', 'America/Indiana/Vincennes'), ('America/Indiana/Winamac', 'America/Indiana/Winamac'), ('America/Inuvik', 'America/Inuvik'), ('America/Iqaluit', 'America/Iqaluit'), ('America/Jamaica', 'America/Jamaica'), ('America/Juneau', 'America/Juneau'), ('America/Kentucky/Louisville', 'America/Kentucky/Louisville'), ('America/Kentucky/Monticello', 'America/Kentucky/Monticello'), ('America/Kralendijk', 'America/Kralendijk'), ('America/La_Paz', 'America/La_Paz'), ('America/Lima', 'America/Lima'), ('America/Los_Angeles', 'America/Los_Angeles'), ('America/Lower_Princes', 'America/Lower_Princes'), ('America/Maceio', 'America/Maceio'), ('America/Managua', 'America/Managua'), ('America/Manaus', 'America/Manaus'), ('America/Marigot', 'America/Marigot'), ('America/Martinique', 'America/Martinique'), ('America/Matamoros', 'America/Matamoros'), ('America/Mazatlan', 'America/Mazatlan'), ('America/Menominee', 'America/Menominee'), ('America/Merida', 'America/Merida'), ('America/Metlakatla', 'America/Metlakatla'), ('America/Mexico_City', 'America/Mexico_City'), ('America/Miquelon', 'America/Miquelon'), ('America/Moncton', 'America/Moncton'), ('America/Monterrey', 'America/Monterrey'), ('America/Montevideo', 'America/Montevideo'), ('America/Montserrat', 'America/Montserrat'), ('America/Nassau', 'America/Nassau'), ('America/New_York', 'America/New_York'), ('America/Nipigon', 'America/Nipigon'), ('America/Nome', 'America/Nome'), ('America/Noronha', 'America/Noronha'), ('America/North_Dakota/Beulah', 'America/North_Dakota/Beulah'), ('America/North_Dakota/Center', 'America/North_Dakota/Center'), ('America/North_Dakota/New_Salem', 'America/North_Dakota/New_Salem'), ('America/Nuuk', 'America/Nuuk'), ('America/Ojinaga', 'America/Ojinaga'), ('America/Panama', 'America/Panama'), ('America/Pangnirtung', 'America/Pangnirtung'), ('America/Paramaribo', 'America/Paramaribo'), ('America/Phoenix', 'America/Phoenix'), ('America/Port-au-Prince', 'America/Port-au-Prince'), ('America/Port_of_Spain', 'America/Port_of_Spain'), ('America/Porto_Velho', 'America/Porto_Velho'), ('America/Puerto_Rico', 'America/Puerto_Rico'), ('America/Punta_Arenas', 'America/Punta_Arenas'), ('America/Rainy_River', 'America/Rainy_River'), ('America/Rankin_Inlet', 'America/Rankin_Inlet'), ('America/Recife', 'America/Recife'), ('America/Regina', 'America/Regina'), ('America/Resolute', 'America/Resolute'), ('America/Rio_Branco', 'America/Rio_Branco'), ('America/Santarem', 'America/Santarem'), ('America/Santiago', 'America/Santiago'), ('America/Santo_Domingo', 'America/Santo_Domingo'), ('America/Sao_Paulo', 'America/Sao_Paulo'), ('America/Scoresbysund', 'America/Scoresbysund'), ('America/Sitka', 'America/Sitka'), ('America/St_Barthelemy', 'America/St_Barthelemy'), ('America/St_Johns', 'America/St_Johns'), ('America/St_Kitts', 'America/St_Kitts'), ('America/St_Lucia', 'America/St_Lucia'), ('America/St_Thomas', 'America/St_Thomas'), ('America/St_Vincent', 'America/St_Vincent'), ('America/Swift_Current', 'America/Swift_Current'), ('America/Tegucigalpa', 'America/Tegucigalpa'), ('America/Thule', 'America/Thule'), ('America/Thunder_Bay', 'America/Thunder_Bay'), ('America/Tijuana', 'America/Tijuana'), ('America/Toronto', 'America/Toronto'), ('America/Tortola', 'America/Tortola'), ('America/Vancouver', 'America/Vancouver'), ('America/Whitehorse', 'America/Whitehorse'), ('America/Winnipeg', 'America/Winnipeg'), ('America/Yakutat', 'America/Yakutat'), ('America/Yellowknife', 'America/Yellowknife'), ('Antarctica/Casey', 'Antarctica/Casey'), ('Antarctica/Davis', 'Antarctica/Davis'), ('Antarctica/DumontDUrville', 'Antarctica/DumontDUrville'), ('Antarctica/Macquarie', 'Antarctica/Macquarie'), ('Antarctica/Mawson', 'Antarctica/Mawson'), ('Antarctica/McMurdo', 'Antarctica/McMurdo'), ('Antarctica/Palmer', 'Antarctica/Palmer'), ('Antarctica/Rothera', 'Antarctica/Rothera'), ('Antarctica/Syowa', 'Antarctica/Syowa'), ('Antarctica/Troll', 'Antarctica/Troll'), ('Antarctica/Vostok', 'Antarctica/Vostok'), ('Arctic/Longyearbyen', 'Arctic/Longyearbyen'), ('Asia/Aden', 'Asia/Aden'), ('Asia/Almaty', 'Asia/Almaty'), ('Asia/Amman', 'Asia/Amman'), ('Asia/Anadyr', 'Asia/Anadyr'), ('Asia/Aqtau', 'Asia/Aqtau'), ('Asia/Aqtobe', 'Asia/Aqtobe'), ('Asia/Ashgabat', 'Asia/Ashgabat'), ('Asia/Atyrau', 'Asia/Atyrau'), ('Asia/Baghdad', 'Asia/Baghdad'), ('Asia/Bahrain', 'Asia/Bahrain'), ('Asia/Baku', 'Asia/Baku'), ('Asia/Bangkok', 'Asia/Bangkok'), ('Asia/Barnaul', 'Asia/Barnaul'), ('Asia/Beirut', 'Asia/Beirut'), ('Asia/Bishkek', 'Asia/Bishkek'), ('Asia/Brunei', 'Asia/Brunei'), ('Asia/Chita', 'Asia/Chita'), ('Asia/Choibalsan', 'Asia/Choibalsan'), ('Asia/Colombo', 'Asia/Colombo'), ('Asia/Damascus', 'Asia/Damascus'), ('Asia/Dhaka', 'Asia/Dhaka'), ('Asia/Dili', 'Asia/Dili'), ('Asia/Dubai', 'Asia/Dubai'), ('Asia/Dushanbe', 'Asia/Dushanbe'), ('Asia/Famagusta', 'Asia/Famagusta'), ('Asia/Gaza', 'Asia/Gaza'), ('Asia/Hebron', 'Asia/Hebron'), ('Asia/Ho_Chi_Minh', 'Asia/Ho_Chi_Minh'), ('Asia/Hong_Kong', 'Asia/Hong_Kong'), ('Asia/Hovd', 'Asia/Hovd'), ('Asia/Irkutsk', 'Asia/Irkutsk'), ('Asia/Jakarta', 'Asia/Jakarta'), ('Asia/Jayapura', 'Asia/Jayapura'), ('Asia/Jerusalem', 'Asia/Jerusalem'), ('Asia/Kabul', 'Asia/Kabul'), ('Asia/Kamchatka', 'Asia/Kamchatka'), ('Asia/Karachi', 'Asia/Karachi'), ('Asia/Kathmandu', 'Asia/Kathmandu'), ('Asia/Khandyga', 'Asia/Khandyga'), ('Asia/Kolkata', 'Asia/Kolkata'), ('Asia/Krasnoyarsk', 'Asia/Krasnoyarsk'), ('Asia/Kuala_Lumpur', 'Asia/Kuala_Lumpur'), ('Asia/Kuching', 'Asia/Kuching'), ('Asia/Kuwait', 'Asia/Kuwait'), ('Asia/Macau', 'Asia/Macau'), ('Asia/Magadan', 'Asia/Magadan'), ('Asia/Makassar', 'Asia/Makassar'), ('Asia/Manila', 'Asia/Manila'), ('Asia/Muscat', 'Asia/Muscat'), ('Asia/Nicosia', 'Asia/Nicosia'), ('Asia/Novokuznetsk', 'Asia/Novokuznetsk'), ('Asia/Novosibirsk', 'Asia/Novosibirsk'), ('Asia/Omsk', 'Asia/Omsk'), ('Asia/Oral', 'Asia/Oral'), ('Asia/Phnom_Penh', 'Asia/Phnom_Penh'), ('Asia/Pontianak', 'Asia/Pontianak'), ('Asia/Pyongyang', 'Asia/Pyongyang'), ('Asia/Qatar', 'Asia/Qatar'), ('Asia/Qostanay', 'Asia/Qostanay'), ('Asia/Qyzylorda', 'Asia/Qyzylorda'), ('Asia/Riyadh', 'Asia/Riyadh'), ('Asia/Sakhalin', 'Asia/Sakhalin'), ('Asia/Samarkand', 'Asia/Samarkand'), ('Asia/Seoul', 'Asia/Seoul'), ('Asia/Shanghai', 'Asia/Shanghai'), ('Asia/Singapore', 'Asia/Singapore'), ('Asia/Srednekolymsk', 'Asia/Srednekolymsk'), ('Asia/Taipei', 'Asia/Taipei'), ('Asia/Tashkent', 'Asia/Tashkent'), ('Asia/Tbilisi', 'Asia/Tbilisi'), ('Asia/Tehran', 'Asia/Tehran'), ('Asia/Thimphu', 'Asia/Thimphu'), ('Asia/Tokyo', 'Asia/Tokyo'), ('Asia/Tomsk', 'Asia/Tomsk'), ('Asia/Ulaanbaatar', 'Asia/Ulaanbaatar'), ('Asia/Urumqi', 'Asia/Urumqi'), ('Asia/Ust-Nera', 'Asia/Ust-Nera'), ('Asia/Vientiane', 'Asia/Vientiane'), ('Asia/Vladivostok', 'Asia/Vladivostok'), ('Asia/Yakutsk', 'Asia/Yakutsk'), ('Asia/Yangon', 'Asia/Yangon'), ('Asia/Yekaterinburg', 'Asia/Yekaterinburg'), ('Asia/Yerevan', 'Asia/Yerevan'), ('Atlantic/Azores', 'Atlantic/Azores'), ('Atlantic/Bermuda', 'Atlantic/Bermuda'), ('Atlantic/Canary', 'Atlantic/Canary'), ('Atlantic/Cape_Verde', 'Atlantic/Cape_Verde'), ('Atlantic/Faroe', 'Atlantic/Faroe'), ('Atlantic/Madeira', 'Atlantic/Madeira'), ('Atlantic/Reykjavik', 'Atlantic/Reykjavik'), ('Atlantic/South_Georgia', 'Atlantic/South_Georgia'), ('Atlantic/St_Helena', 'Atlantic/St_Helena'), ('Atlantic/Stanley', 'Atlantic/Stanley'), ('Australia/Adelaide', 'Australia/Adelaide'), ('Australia/Brisbane', 'Australia/Brisbane'), ('Australia/Broken_Hill', 'Australia/Broken_Hill'), ('Australia/Darwin', 'Australia/Darwin'), ('Australia/Eucla', 'Australia/Eucla'), ('Australia/Hobart', 'Australia/Hobart'), ('Australia/Lindeman', 'Australia/Lindeman'), ('Australia/Lord_Howe', 'Australia/Lord_Howe'), ('Australia/Melbourne', 'Australia/Melbourne'), ('Australia/Perth', 'Australia/Perth'), ('Australia/Sydney', 'Australia/Sydney'), ('Canada/Atlantic', 'Canada/Atlantic'), ('Canada/Central', 'Canada/Central'), ('Canada/Eastern', 'Canada/Eastern'), ('Canada/Mountain', 'Canada/Mountain'), ('Canada/Newfoundland', 'Canada/Newfoundland'), ('Canada/Pacific', 'Canada/Pacific'), ('Europe/Amsterdam', 'Europe/Amsterdam'), ('Europe/Andorra', 'Europe/Andorra'), ('Europe/Astrakhan', 'Europe/Astrakhan'), ('Europe/Athens', 'Europe/Athens'), ('Europe/Belgrade', 'Europe/Belgrade'), ('Europe/Berlin', 'Europe/Berlin'), ('Europe/Bratislava', 'Europe/Bratislava'), ('Europe/Brussels', 'Europe/Brussels'), ('Europe/Bucharest', 'Europe/Bucharest'), ('Europe/Budapest', 'Europe/Budapest'), ('Europe/Busingen', 'Europe/Busingen'), ('Europe/Chisinau', 'Europe/Chisinau'), ('Europe/Copenhagen', 'Europe/Copenhagen'), ('Europe/Dublin', 'Europe/Dublin'), ('Europe/Gibraltar', 'Europe/Gibraltar'), ('Europe/Guernsey', 'Europe/Guernsey'), ('Europe/Helsinki', 'Europe/Helsinki'), ('Europe/Isle_of_Man', 'Europe/Isle_of_Man'), ('Europe/Istanbul', 'Europe/Istanbul'), ('Europe/Jersey', 'Europe/Jersey'), ('Europe/Kaliningrad', 'Europe/Kaliningrad'), ('Europe/Kiev', 'Europe/Kiev'), ('Europe/Kirov', 'Europe/Kirov'), ('Europe/Lisbon', 'Europe/Lisbon'), ('Europe/Ljubljana', 'Europe/Ljubljana'), ('Europe/London', 'Europe/London'), ('Europe/Luxembourg', 'Europe/Luxembourg'), ('Europe/Madrid', 'Europe/Madrid'), ('Europe/Malta', 'Europe/Malta'), ('Europe/Mariehamn', 'Europe/Mariehamn'), ('Europe/Minsk', 'Europe/Minsk'), ('Europe/Monaco', 'Europe/Monaco'), ('Europe/Moscow', 'Europe/Moscow'), ('Europe/Oslo', 'Europe/Oslo'), ('Europe/Paris', 'Europe/Paris'), ('Europe/Podgorica', 'Europe/Podgorica'), ('Europe/Prague', 'Europe/Prague'), ('Europe/Riga', 'Europe/Riga'), ('Europe/Rome', 'Europe/Rome'), ('Europe/Samara', 'Europe/Samara'), ('Europe/San_Marino', 'Europe/San_Marino'), ('Europe/Sarajevo', 'Europe/Sarajevo'), ('Europe/Saratov', 'Europe/Saratov'), ('Europe/Simferopol', 'Europe/Simferopol'), ('Europe/Skopje', 'Europe/Skopje'), ('Europe/Sofia', 'Europe/Sofia'), ('Europe/Stockholm', 'Europe/Stockholm'), ('Europe/Tallinn', 'Europe/Tallinn'), ('Europe/Tirane', 'Europe/Tirane'), ('Europe/Ulyanovsk', 'Europe/Ulyanovsk'), ('Europe/Uzhgorod', 'Europe/Uzhgorod'), ('Europe/Vaduz', 'Europe/Vaduz'), ('Europe/Vatican', 'Europe/Vatican'), ('Europe/Vienna', 'Europe/Vienna'), ('Europe/Vilnius', 'Europe/Vilnius'), ('Europe/Volgograd', 'Europe/Volgograd'), ('Europe/Warsaw', 'Europe/Warsaw'), ('Europe/Zagreb', 'Europe/Zagreb'), ('Europe/Zaporozhye', 'Europe/Zaporozhye'), ('Europe/Zurich', 'Europe/Zurich'), ('GMT', 'GMT'), ('Indian/Antananarivo', 'Indian/Antananarivo'), ('Indian/Chagos', 'Indian/Chagos'), ('Indian/Christmas', 'Indian/Christmas'), ('Indian/Cocos', 'Indian/Cocos'), ('Indian/Comoro', 'Indian/Comoro'), ('Indian/Kerguelen', 'Indian/Kerguelen'), ('Indian/Mahe', 'Indian/Mahe'), ('Indian/Maldives', 'Indian/Maldives'), ('Indian/Mauritius', 'Indian/Mauritius'), ('Indian/Mayotte', 'Indian/Mayotte'), ('Indian/Reunion', 'Indian/Reunion'), ('Pacific/Apia', 'Pacific/Apia'), ('Pacific/Auckland', 'Pacific/Auckland'), ('Pacific/Bougainville', 'Pacific/Bougainville'), ('Pacific/Chatham', 'Pacific/Chatham'), ('Pacific/Chuuk', 'Pacific/Chuuk'), ('Pacific/Easter', 'Pacific/Easter'), ('Pacific/Efate', 'Pacific/Efate'), ('Pacific/Enderbury', 'Pacific/Enderbury'), ('Pacific/Fakaofo', 'Pacific/Fakaofo'), ('Pacific/Fiji', 'Pacific/Fiji'), ('Pacific/Funafuti', 'Pacific/Funafuti'), ('Pacific/Galapagos', 'Pacific/Galapagos'), ('Pacific/Gambier', 'Pacific/Gambier'), ('Pacific/Guadalcanal', 'Pacific/Guadalcanal'), ('Pacific/Guam', 'Pacific/Guam'), ('Pacific/Honolulu', 'Pacific/Honolulu'), ('Pacific/Kiritimati', 'Pacific/Kiritimati'), ('Pacific/Kosrae', 'Pacific/Kosrae'), ('Pacific/Kwajalein', 'Pacific/Kwajalein'), ('Pacific/Majuro', 'Pacific/Majuro'), ('Pacific/Marquesas', 'Pacific/Marquesas'), ('Pacific/Midway', 'Pacific/Midway'), ('Pacific/Nauru', 'Pacific/Nauru'), ('Pacific/Niue', 'Pacific/Niue'), ('Pacific/Norfolk', 'Pacific/Norfolk'), ('Pacific/Noumea', 'Pacific/Noumea'), ('Pacific/Pago_Pago', 'Pacific/Pago_Pago'), ('Pacific/Palau', 'Pacific/Palau'), ('Pacific/Pitcairn', 'Pacific/Pitcairn'), ('Pacific/Pohnpei', 'Pacific/Pohnpei'), ('Pacific/Port_Moresby', 'Pacific/Port_Moresby'), ('Pacific/Rarotonga', 'Pacific/Rarotonga'), ('Pacific/Saipan', 'Pacific/Saipan'), ('Pacific/Tahiti', 'Pacific/Tahiti'), ('Pacific/Tarawa', 'Pacific/Tarawa'), ('Pacific/Tongatapu', 'Pacific/Tongatapu'), ('Pacific/Wake', 'Pacific/Wake'), ('Pacific/Wallis', 'Pacific/Wallis'), ('US/Alaska', 'US/Alaska'), ('US/Arizona', 'US/Arizona'), ('US/Central', 'US/Central'), ('US/Eastern', 'US/Eastern'), ('US/Hawaii', 'US/Hawaii'), ('US/Mountain', 'US/Mountain'), ('US/Pacific', 'US/Pacific'), ('UTC', 'UTC')], default='Europe/Stockholm', help_text='Your current timezone', max_length=128, verbose_name='Time zone')),
+ ('region', models.CharField(choices=[('da_DK.UTF-8', 'Denmark'), ('et_EE.UTF-8', 'Estonia'), ('fi_FI.UTF-8', 'Finland'), ('en_US.UTF-8', 'United States'), ('nl_NL.UTF-8', 'Netherlands'), ('sv_SE.UTF-8', 'Sweden')], default=servo.defaults.locale, help_text='Affects formatting of numbers, dates and currencies.', max_length=32, verbose_name='region')),
+ ('should_notify', models.BooleanField(default=True, help_text='Enable notifications in the toolbar.', verbose_name='Enable notifications')),
+ ('notify_by_email', models.BooleanField(default=False, help_text='Event notifications will also be emailed to you.', verbose_name='Email notifications')),
+ ('autoprint', models.BooleanField(default=True, help_text='Opens print dialog automatically.', verbose_name='print automatically')),
+ ('tech_id', models.CharField(blank=True, default='', max_length=16, verbose_name='Tech ID')),
+ ('gsx_userid', models.CharField(blank=True, default='', max_length=128, verbose_name='User ID')),
+ ('gsx_poprefix', models.CharField(blank=True, default='', help_text='GSX repairs you create will be prefixed', max_length=8, verbose_name='PO prefix')),
+ ('photo', models.ImageField(blank=True, help_text='Maximum avatar size is 1MB', null=True, upload_to='avatars', verbose_name='Photo')),
+ ('is_visible', models.BooleanField(default=True, editable=False)),
+ ],
+ options={
+ 'verbose_name': 'User',
+ 'verbose_name_plural': 'Users & Groups',
+ 'ordering': ('full_name',),
+ },
+ managers=[
+ ('objects', django.contrib.auth.models.UserManager()),
+ ('techies', servo.models.account.TechieManager()),
+ ('active', servo.models.account.ActiveManager()),
+ ],
+ ),
+ migrations.CreateModel(
+ name='Attachment',
+ fields=[
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('ref', models.CharField(max_length=32)),
+ ('ref_id', models.IntegerField()),
+ ('mime_type', models.CharField(editable=False, max_length=64)),
+ ('content', models.FileField(upload_to='attachments', validators=[servo.validators.file_upload_validator], verbose_name='file')),
+ ],
+ options={
+ 'get_latest_by': 'id',
+ },
+ ),
+ migrations.CreateModel(
+ name='Checklist',
+ fields=[
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('title', models.CharField(default='New Checklist', max_length=255, unique=True, verbose_name='title')),
+ ('enabled', models.BooleanField(default=True, verbose_name='Enabled')),
+ ],
+ options={
+ 'verbose_name': 'Checklist',
+ 'verbose_name_plural': 'Checklists',
+ 'ordering': ('title',),
+ },
+ ),
+ migrations.CreateModel(
+ name='ChecklistItem',
+ fields=[
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('title', models.CharField(max_length=255, verbose_name='Task')),
+ ('description', models.TextField(blank=True, default='', verbose_name='Description')),
+ ('checklist', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='servo.checklist')),
+ ],
+ ),
+ migrations.CreateModel(
+ name='Configuration',
+ fields=[
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('key', models.CharField(max_length=255)),
+ ('value', models.TextField(blank=True, default='')),
+ ],
+ ),
+ migrations.CreateModel(
+ name='Customer',
+ fields=[
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('name', models.CharField(default='New Customer', max_length=255, verbose_name='name')),
+ ('fullname', models.CharField(default='', editable=False, max_length=255)),
+ ('phone', models.CharField(blank=True, default='', max_length=32, verbose_name='phone')),
+ ('email', models.EmailField(blank=True, default='', max_length=254, verbose_name='email')),
+ ('street_address', models.CharField(blank=True, default='', max_length=128, verbose_name='address')),
+ ('zip_code', models.CharField(blank=True, default='', max_length=32, verbose_name='ZIP Code')),
+ ('city', models.CharField(blank=True, default='', max_length=32, verbose_name='city')),
+ ('country', models.CharField(blank=True, choices=[('AD', 'Andorra'), ('AE', 'United Arab Emirates'), ('AF', 'Afghanistan'), ('AG', 'Antigua & Barbuda'), ('AI', 'Anguilla'), ('AL', 'Albania'), ('AM', 'Armenia'), ('AO', 'Angola'), ('AQ', 'Antarctica'), ('AR', 'Argentina'), ('AS', 'Samoa (American)'), ('AT', 'Austria'), ('AU', 'Australia'), ('AW', 'Aruba'), ('AX', 'Åland Islands'), ('AZ', 'Azerbaijan'), ('BA', 'Bosnia & Herzegovina'), ('BB', 'Barbados'), ('BD', 'Bangladesh'), ('BE', 'Belgium'), ('BF', 'Burkina Faso'), ('BG', 'Bulgaria'), ('BH', 'Bahrain'), ('BI', 'Burundi'), ('BJ', 'Benin'), ('BL', 'St Barthelemy'), ('BM', 'Bermuda'), ('BN', 'Brunei'), ('BO', 'Bolivia'), ('BQ', 'Caribbean NL'), ('BR', 'Brazil'), ('BS', 'Bahamas'), ('BT', 'Bhutan'), ('BV', 'Bouvet Island'), ('BW', 'Botswana'), ('BY', 'Belarus'), ('BZ', 'Belize'), ('CA', 'Canada'), ('CC', 'Cocos (Keeling) Islands'), ('CD', 'Congo (Dem. Rep.)'), ('CF', 'Central African Rep.'), ('CG', 'Congo (Rep.)'), ('CH', 'Switzerland'), ('CI', "Côte d'Ivoire"), ('CK', 'Cook Islands'), ('CL', 'Chile'), ('CM', 'Cameroon'), ('CN', 'China'), ('CO', 'Colombia'), ('CR', 'Costa Rica'), ('CU', 'Cuba'), ('CV', 'Cape Verde'), ('CW', 'Curaçao'), ('CX', 'Christmas Island'), ('CY', 'Cyprus'), ('CZ', 'Czech Republic'), ('DE', 'Germany'), ('DJ', 'Djibouti'), ('DK', 'Denmark'), ('DM', 'Dominica'), ('DO', 'Dominican Republic'), ('DZ', 'Algeria'), ('EC', 'Ecuador'), ('EE', 'Estonia'), ('EG', 'Egypt'), ('EH', 'Western Sahara'), ('ER', 'Eritrea'), ('ES', 'Spain'), ('ET', 'Ethiopia'), ('FI', 'Finland'), ('FJ', 'Fiji'), ('FK', 'Falkland Islands'), ('FM', 'Micronesia'), ('FO', 'Faroe Islands'), ('FR', 'France'), ('GA', 'Gabon'), ('GB', 'Britain (UK)'), ('GD', 'Grenada'), ('GE', 'Georgia'), ('GF', 'French Guiana'), ('GG', 'Guernsey'), ('GH', 'Ghana'), ('GI', 'Gibraltar'), ('GL', 'Greenland'), ('GM', 'Gambia'), ('GN', 'Guinea'), ('GP', 'Guadeloupe'), ('GQ', 'Equatorial Guinea'), ('GR', 'Greece'), ('GS', 'South Georgia & the South Sandwich Islands'), ('GT', 'Guatemala'), ('GU', 'Guam'), ('GW', 'Guinea-Bissau'), ('GY', 'Guyana'), ('HK', 'Hong Kong'), ('HM', 'Heard Island & McDonald Islands'), ('HN', 'Honduras'), ('HR', 'Croatia'), ('HT', 'Haiti'), ('HU', 'Hungary'), ('ID', 'Indonesia'), ('IE', 'Ireland'), ('IL', 'Israel'), ('IM', 'Isle of Man'), ('IN', 'India'), ('IO', 'British Indian Ocean Territory'), ('IQ', 'Iraq'), ('IR', 'Iran'), ('IS', 'Iceland'), ('IT', 'Italy'), ('JE', 'Jersey'), ('JM', 'Jamaica'), ('JO', 'Jordan'), ('JP', 'Japan'), ('KE', 'Kenya'), ('KG', 'Kyrgyzstan'), ('KH', 'Cambodia'), ('KI', 'Kiribati'), ('KM', 'Comoros'), ('KN', 'St Kitts & Nevis'), ('KP', 'Korea (North)'), ('KR', 'Korea (South)'), ('KW', 'Kuwait'), ('KY', 'Cayman Islands'), ('KZ', 'Kazakhstan'), ('LA', 'Laos'), ('LB', 'Lebanon'), ('LC', 'St Lucia'), ('LI', 'Liechtenstein'), ('LK', 'Sri Lanka'), ('LR', 'Liberia'), ('LS', 'Lesotho'), ('LT', 'Lithuania'), ('LU', 'Luxembourg'), ('LV', 'Latvia'), ('LY', 'Libya'), ('MA', 'Morocco'), ('MC', 'Monaco'), ('MD', 'Moldova'), ('ME', 'Montenegro'), ('MF', 'St Martin (French)'), ('MG', 'Madagascar'), ('MH', 'Marshall Islands'), ('MK', 'North Macedonia'), ('ML', 'Mali'), ('MM', 'Myanmar (Burma)'), ('MN', 'Mongolia'), ('MO', 'Macau'), ('MP', 'Northern Mariana Islands'), ('MQ', 'Martinique'), ('MR', 'Mauritania'), ('MS', 'Montserrat'), ('MT', 'Malta'), ('MU', 'Mauritius'), ('MV', 'Maldives'), ('MW', 'Malawi'), ('MX', 'Mexico'), ('MY', 'Malaysia'), ('MZ', 'Mozambique'), ('NA', 'Namibia'), ('NC', 'New Caledonia'), ('NE', 'Niger'), ('NF', 'Norfolk Island'), ('NG', 'Nigeria'), ('NI', 'Nicaragua'), ('NL', 'Netherlands'), ('NO', 'Norway'), ('NP', 'Nepal'), ('NR', 'Nauru'), ('NU', 'Niue'), ('NZ', 'New Zealand'), ('OM', 'Oman'), ('PA', 'Panama'), ('PE', 'Peru'), ('PF', 'French Polynesia'), ('PG', 'Papua New Guinea'), ('PH', 'Philippines'), ('PK', 'Pakistan'), ('PL', 'Poland'), ('PM', 'St Pierre & Miquelon'), ('PN', 'Pitcairn'), ('PR', 'Puerto Rico'), ('PS', 'Palestine'), ('PT', 'Portugal'), ('PW', 'Palau'), ('PY', 'Paraguay'), ('QA', 'Qatar'), ('RE', 'Réunion'), ('RO', 'Romania'), ('RS', 'Serbia'), ('RU', 'Russia'), ('RW', 'Rwanda'), ('SA', 'Saudi Arabia'), ('SB', 'Solomon Islands'), ('SC', 'Seychelles'), ('SD', 'Sudan'), ('SE', 'Sweden'), ('SG', 'Singapore'), ('SH', 'St Helena'), ('SI', 'Slovenia'), ('SJ', 'Svalbard & Jan Mayen'), ('SK', 'Slovakia'), ('SL', 'Sierra Leone'), ('SM', 'San Marino'), ('SN', 'Senegal'), ('SO', 'Somalia'), ('SR', 'Suriname'), ('SS', 'South Sudan'), ('ST', 'Sao Tome & Principe'), ('SV', 'El Salvador'), ('SX', 'St Maarten (Dutch)'), ('SY', 'Syria'), ('SZ', 'Eswatini (Swaziland)'), ('TC', 'Turks & Caicos Is'), ('TD', 'Chad'), ('TF', 'French Southern & Antarctic Lands'), ('TG', 'Togo'), ('TH', 'Thailand'), ('TJ', 'Tajikistan'), ('TK', 'Tokelau'), ('TL', 'East Timor'), ('TM', 'Turkmenistan'), ('TN', 'Tunisia'), ('TO', 'Tonga'), ('TR', 'Turkey'), ('TT', 'Trinidad & Tobago'), ('TV', 'Tuvalu'), ('TW', 'Taiwan'), ('TZ', 'Tanzania'), ('UA', 'Ukraine'), ('UG', 'Uganda'), ('UM', 'US minor outlying islands'), ('US', 'United States'), ('UY', 'Uruguay'), ('UZ', 'Uzbekistan'), ('VA', 'Vatican City'), ('VC', 'St Vincent'), ('VE', 'Venezuela'), ('VG', 'Virgin Islands (UK)'), ('VI', 'Virgin Islands (US)'), ('VN', 'Vietnam'), ('VU', 'Vanuatu'), ('WF', 'Wallis & Futuna'), ('WS', 'Samoa (western)'), ('YE', 'Yemen'), ('YT', 'Mayotte'), ('ZA', 'South Africa'), ('ZM', 'Zambia'), ('ZW', 'Zimbabwe')], default=servo.defaults.country, max_length=2, verbose_name='Country')),
+ ('photo', models.ImageField(blank=True, null=True, upload_to='photos', verbose_name='photo')),
+ ('notes', models.TextField(blank=True, default='', verbose_name='notes')),
+ ('created_at', models.DateTimeField(auto_now=True)),
+ ('is_company', models.BooleanField(default=False, help_text='Companies can contain contacts', verbose_name='company')),
+ ('lft', models.PositiveIntegerField(editable=False)),
+ ('rght', models.PositiveIntegerField(editable=False)),
+ ('tree_id', models.PositiveIntegerField(db_index=True, editable=False)),
+ ('level', models.PositiveIntegerField(editable=False)),
+ ],
+ ),
+ migrations.CreateModel(
+ name='CustomerGroup',
+ fields=[
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('name', models.CharField(default='New Group', max_length=255, unique=True, verbose_name='name')),
+ ('slug', models.SlugField(editable=False)),
+ ],
+ options={
+ 'ordering': ('id',),
+ 'get_latest_by': 'id',
+ },
+ ),
+ migrations.CreateModel(
+ name='Device',
+ fields=[
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('sn', models.CharField(blank=True, default='', max_length=32, validators=[servo.validators.sn_validator], verbose_name='Serial Number')),
+ ('description', models.CharField(default='New Device', max_length=128, verbose_name='Description')),
+ ('brand', models.CharField(blank=True, default='Apple', max_length=128, verbose_name='Brand')),
+ ('reseller', models.CharField(blank=True, default='', max_length=128, verbose_name='Reseller')),
+ ('created_at', models.DateTimeField(auto_now_add=True, null=True)),
+ ('imei', models.CharField(blank=True, default='', max_length=15, verbose_name='IMEI Number')),
+ ('initial_activation_policy', models.CharField(default='', editable=False, max_length=128, verbose_name='Initial Activation Policy')),
+ ('applied_activation_policy', models.CharField(default='', editable=False, max_length=128, verbose_name='Applied Activation Policy')),
+ ('next_tether_policy', models.CharField(default='', editable=False, max_length=128, verbose_name='Next Tether Policy')),
+ ('unlocked', models.BooleanField(default=None, editable=False, null=True)),
+ ('slug', models.SlugField(editable=False, max_length=128, null=True)),
+ ('product_line', models.CharField(choices=[('APPLETV', 'Apple TV'), ('DISPLAYS', 'Display'), ('IMAC', 'iMac'), ('IPAD', 'iPad'), ('IPADACCESSORY', 'iPad Accessory'), ('IPHONE', 'iPhone'), ('IPHONEACCESSORY', 'iPhone Accessory'), ('MACACCESSORY', 'Mac Accessory'), ('IPODCLASSIC', 'iPod Classic'), ('IPODNANO', 'iPod nano'), ('IPODSHUFFLE', 'iPod Shuffle'), ('IPODTOUCH', 'iPod Touch'), ('MACMINI', 'Mac mini'), ('MACPRO', 'Mac Pro'), ('MACBOOK', 'MacBook'), ('MACBOOKLEGACY', 'MacBook (Legacy)'), ('MACBOOKAIR', 'MacBook Air'), ('MACBOOKPRO', 'MacBook Pro'), ('SERVERS', 'Server'), ('POWERMAC', 'Power Mac'), ('BEATS', 'Beats Products'), ('OTHER', 'Other Products'), ('WATCH', 'Apple Watch'), ('AUDIO', 'Audio')], default='OTHER', max_length=16, verbose_name='Product Line')),
+ ('config_code', models.CharField(default='', editable=False, max_length=8)),
+ ('configuration', models.CharField(blank=True, default='', max_length=256, verbose_name='Configuration')),
+ ('warranty_status', models.CharField(choices=[('QP', 'Quality Program'), ('CS', 'Customer Satisfaction'), ('ALW', 'Apple Limited Warranty'), ('APP', 'AppleCare Protection Plan'), ('CC', 'Custom Bid Contracts'), ('CBC', 'Custom Bid Contracts'), ('WTY', "3'rd Party Warranty"), ('OOW', 'Out Of Warranty (No Coverage)'), ('NA', 'Unknown')], default='NA', max_length=3, verbose_name='Warranty Status')),
+ ('username', models.CharField(blank=True, default='', max_length=32, verbose_name='Username')),
+ ('password', models.CharField(blank=True, default='', max_length=32, verbose_name='Password')),
+ ('purchased_on', models.DateField(blank=True, null=True, verbose_name='Date of Purchase')),
+ ('purchase_country', models.CharField(blank=True, choices=[('AF', 'Afghanistan'), ('AX', 'Åland Islands'), ('AL', 'Albania'), ('DZ', 'Algeria'), ('AS', 'American Samoa'), ('AD', 'Andorra'), ('AO', 'Angola'), ('AI', 'Anguilla'), ('AQ', 'Antarctica'), ('AG', 'Antigua and Barbuda'), ('AR', 'Argentina'), ('AM', 'Armenia'), ('AW', 'Aruba'), ('AU', 'Australia'), ('AT', 'Austria'), ('AZ', 'Azerbaijan'), ('BS', 'Bahamas'), ('BH', 'Bahrain'), ('BD', 'Bangladesh'), ('BB', 'Barbados'), ('BY', 'Belarus'), ('BE', 'Belgium'), ('BZ', 'Belize'), ('BJ', 'Benin'), ('BM', 'Bermuda'), ('BT', 'Bhutan'), ('BO', 'Bolivia'), ('BQ', 'Bonaire, Sint Eustatius and Saba'), ('BA', 'Bosnia and Herzegovina'), ('BW', 'Botswana'), ('BV', 'Bouvet Island'), ('BR', 'Brazil'), ('IO', 'British Indian Ocean Territory'), ('BN', 'Brunei'), ('BG', 'Bulgaria'), ('BF', 'Burkina Faso'), ('BI', 'Burundi'), ('CV', 'Cabo Verde'), ('KH', 'Cambodia'), ('CM', 'Cameroon'), ('CA', 'Canada'), ('KY', 'Cayman Islands'), ('CF', 'Central African Republic'), ('TD', 'Chad'), ('CL', 'Chile'), ('CN', 'China'), ('CX', 'Christmas Island'), ('CC', 'Cocos (Keeling) Islands'), ('CO', 'Colombia'), ('KM', 'Comoros'), ('CG', 'Congo'), ('CD', 'Congo (the Democratic Republic of the)'), ('CK', 'Cook Islands'), ('CR', 'Costa Rica'), ('CI', "Côte d'Ivoire"), ('HR', 'Croatia'), ('CU', 'Cuba'), ('CW', 'Curaçao'), ('CY', 'Cyprus'), ('CZ', 'Czechia'), ('DK', 'Denmark'), ('DJ', 'Djibouti'), ('DM', 'Dominica'), ('DO', 'Dominican Republic'), ('EC', 'Ecuador'), ('EG', 'Egypt'), ('SV', 'El Salvador'), ('GQ', 'Equatorial Guinea'), ('ER', 'Eritrea'), ('EE', 'Estonia'), ('SZ', 'Eswatini'), ('ET', 'Ethiopia'), ('FK', 'Falkland Islands (Malvinas)'), ('FO', 'Faroe Islands'), ('FJ', 'Fiji'), ('FI', 'Finland'), ('FR', 'France'), ('GF', 'French Guiana'), ('PF', 'French Polynesia'), ('TF', 'French Southern Territories'), ('GA', 'Gabon'), ('GM', 'Gambia'), ('GE', 'Georgia'), ('DE', 'Germany'), ('GH', 'Ghana'), ('GI', 'Gibraltar'), ('GR', 'Greece'), ('GL', 'Greenland'), ('GD', 'Grenada'), ('GP', 'Guadeloupe'), ('GU', 'Guam'), ('GT', 'Guatemala'), ('GG', 'Guernsey'), ('GN', 'Guinea'), ('GW', 'Guinea-Bissau'), ('GY', 'Guyana'), ('HT', 'Haiti'), ('HM', 'Heard Island and McDonald Islands'), ('VA', 'Holy See'), ('HN', 'Honduras'), ('HK', 'Hong Kong'), ('HU', 'Hungary'), ('IS', 'Iceland'), ('IN', 'India'), ('ID', 'Indonesia'), ('IR', 'Iran'), ('IQ', 'Iraq'), ('IE', 'Ireland'), ('IM', 'Isle of Man'), ('IL', 'Israel'), ('IT', 'Italy'), ('JM', 'Jamaica'), ('JP', 'Japan'), ('JE', 'Jersey'), ('JO', 'Jordan'), ('KZ', 'Kazakhstan'), ('KE', 'Kenya'), ('KI', 'Kiribati'), ('KW', 'Kuwait'), ('KG', 'Kyrgyzstan'), ('LA', 'Laos'), ('LV', 'Latvia'), ('LB', 'Lebanon'), ('LS', 'Lesotho'), ('LR', 'Liberia'), ('LY', 'Libya'), ('LI', 'Liechtenstein'), ('LT', 'Lithuania'), ('LU', 'Luxembourg'), ('MO', 'Macao'), ('MG', 'Madagascar'), ('MW', 'Malawi'), ('MY', 'Malaysia'), ('MV', 'Maldives'), ('ML', 'Mali'), ('MT', 'Malta'), ('MH', 'Marshall Islands'), ('MQ', 'Martinique'), ('MR', 'Mauritania'), ('MU', 'Mauritius'), ('YT', 'Mayotte'), ('MX', 'Mexico'), ('FM', 'Micronesia (Federated States of)'), ('MD', 'Moldova'), ('MC', 'Monaco'), ('MN', 'Mongolia'), ('ME', 'Montenegro'), ('MS', 'Montserrat'), ('MA', 'Morocco'), ('MZ', 'Mozambique'), ('MM', 'Myanmar'), ('NA', 'Namibia'), ('NR', 'Nauru'), ('NP', 'Nepal'), ('NL', 'Netherlands'), ('NC', 'New Caledonia'), ('NZ', 'New Zealand'), ('NI', 'Nicaragua'), ('NE', 'Niger'), ('NG', 'Nigeria'), ('NU', 'Niue'), ('NF', 'Norfolk Island'), ('KP', 'North Korea'), ('MK', 'North Macedonia'), ('MP', 'Northern Mariana Islands'), ('NO', 'Norway'), ('OM', 'Oman'), ('PK', 'Pakistan'), ('PW', 'Palau'), ('PS', 'Palestine, State of'), ('PA', 'Panama'), ('PG', 'Papua New Guinea'), ('PY', 'Paraguay'), ('PE', 'Peru'), ('PH', 'Philippines'), ('PN', 'Pitcairn'), ('PL', 'Poland'), ('PT', 'Portugal'), ('PR', 'Puerto Rico'), ('QA', 'Qatar'), ('RE', 'Réunion'), ('RO', 'Romania'), ('RU', 'Russia'), ('RW', 'Rwanda'), ('BL', 'Saint Barthélemy'), ('SH', 'Saint Helena, Ascension and Tristan da Cunha'), ('KN', 'Saint Kitts and Nevis'), ('LC', 'Saint Lucia'), ('MF', 'Saint Martin (French part)'), ('PM', 'Saint Pierre and Miquelon'), ('VC', 'Saint Vincent and the Grenadines'), ('WS', 'Samoa'), ('SM', 'San Marino'), ('ST', 'Sao Tome and Principe'), ('SA', 'Saudi Arabia'), ('SN', 'Senegal'), ('RS', 'Serbia'), ('SC', 'Seychelles'), ('SL', 'Sierra Leone'), ('SG', 'Singapore'), ('SX', 'Sint Maarten (Dutch part)'), ('SK', 'Slovakia'), ('SI', 'Slovenia'), ('SB', 'Solomon Islands'), ('SO', 'Somalia'), ('ZA', 'South Africa'), ('GS', 'South Georgia and the South Sandwich Islands'), ('KR', 'South Korea'), ('SS', 'South Sudan'), ('ES', 'Spain'), ('LK', 'Sri Lanka'), ('SD', 'Sudan'), ('SR', 'Suriname'), ('SJ', 'Svalbard and Jan Mayen'), ('SE', 'Sweden'), ('CH', 'Switzerland'), ('SY', 'Syria'), ('TW', 'Taiwan'), ('TJ', 'Tajikistan'), ('TZ', 'Tanzania'), ('TH', 'Thailand'), ('TL', 'Timor-Leste'), ('TG', 'Togo'), ('TK', 'Tokelau'), ('TO', 'Tonga'), ('TT', 'Trinidad and Tobago'), ('TN', 'Tunisia'), ('TR', 'Turkey'), ('TM', 'Turkmenistan'), ('TC', 'Turks and Caicos Islands'), ('TV', 'Tuvalu'), ('UG', 'Uganda'), ('UA', 'Ukraine'), ('AE', 'United Arab Emirates'), ('GB', 'United Kingdom'), ('UM', 'United States Minor Outlying Islands'), ('US', 'United States of America'), ('UY', 'Uruguay'), ('UZ', 'Uzbekistan'), ('VU', 'Vanuatu'), ('VE', 'Venezuela'), ('VN', 'Vietnam'), ('VG', 'Virgin Islands (British)'), ('VI', 'Virgin Islands (U.S.)'), ('WF', 'Wallis and Futuna'), ('EH', 'Western Sahara'), ('YE', 'Yemen'), ('ZM', 'Zambia'), ('ZW', 'Zimbabwe')], default=servo.defaults.country, max_length=128, verbose_name='Purchase Country')),
+ ('sla_description', models.TextField(editable=False, null=True)),
+ ('has_onsite', models.BooleanField(default=False, help_text='Device is eligible for onsite repairs in GSX')),
+ ('contract_start_date', models.DateField(editable=False, null=True)),
+ ('contract_end_date', models.DateField(editable=False, null=True)),
+ ('onsite_start_date', models.DateField(editable=False, null=True)),
+ ('onsite_end_date', models.DateField(editable=False, null=True)),
+ ('parts_and_labor_covered', models.BooleanField(default=False, editable=False)),
+ ('notes', models.TextField(blank=True, default='', verbose_name='notes')),
+ ('photo', models.ImageField(blank=True, null=True, upload_to='devices', verbose_name='Photo')),
+ ('image_url', models.URLField(blank=True, null=True, verbose_name='Image URL')),
+ ('manual_url', models.URLField(blank=True, null=True, verbose_name='Manual URL')),
+ ('exploded_view_url', models.URLField(blank=True, null=True, verbose_name='Exploded View')),
+ ('is_vintage', models.BooleanField(default=False, help_text='Device is considered vintage in GSX', verbose_name='Vintage')),
+ ('fmip_active', models.BooleanField(default=False, editable=False)),
+ ],
+ options={
+ 'get_latest_by': 'id',
+ },
+ ),
+ migrations.CreateModel(
+ name='DeviceGroup',
+ fields=[
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('title', models.CharField(max_length=128, unique=True)),
+ ],
+ ),
+ migrations.CreateModel(
+ name='Escalation',
+ fields=[
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('escalation_id', models.CharField(default='', editable=False, max_length=22)),
+ ('contexts', models.TextField(blank=True, default='{}')),
+ ('issue_type', models.CharField(blank=True, choices=[('AMQ', 'Account Management Question'), ('UQ', 'GSX Usage Question'), ('OSI', 'Order Status Issue'), ('PRI', 'Part Return Issue'), ('PPOR', 'Problem Placing Order/Repair'), ('PUR', 'Problem Updating Repair'), ('SCI', 'Shipping Carrier Issue'), ('SES', 'Service Excellence Scoring'), ('ARF', 'Apple Retail Feedback'), ('DF', 'Depot Feedback'), ('FS', 'GSX Feedback/Suggestion'), ('WS', 'GSX Web Services (API)'), ('SEPI', 'Service Excellence Program Information'), ('TTI', 'Technical or Troubleshooting Issue'), ('DTA', 'Diagnostic Tool Assistance'), ('BIQ', 'Billing or Invoice Question'), ('SESC', 'Safety Issue')], default='', max_length=4)),
+ ('status', models.CharField(choices=[('O', 'Open'), ('C', 'Closed'), ('E', 'Escalated')], default='O', max_length=1)),
+ ('submitted_at', models.DateTimeField(null=True)),
+ ('updated_at', models.DateTimeField(auto_now=True)),
+ ('created_by', models.ForeignKey(editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL)),
+ ],
+ ),
+ migrations.CreateModel(
+ name='GsxAccount',
+ fields=[
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('title', models.CharField(default='New GSX Account', max_length=128)),
+ ('sold_to', models.CharField(max_length=10, verbose_name='Sold-To')),
+ ('ship_to', models.CharField(max_length=10, verbose_name='Ship-To')),
+ ('user_id', models.CharField(blank=True, default='', max_length=128, verbose_name='User ID')),
+ ('region', models.CharField(choices=[('002', 'Asia/Pacific'), ('003', 'Japan'), ('004', 'Europe'), ('005', 'United States'), ('006', 'Canadia'), ('007', 'Latin America')], max_length=3, verbose_name='Region')),
+ ('timezone', models.CharField(choices=[('PST', 'UTC - 8h (Pacific Standard Time)'), ('PDT', 'UTC - 7h (Pacific Daylight Time)'), ('CST', 'UTC - 6h (Central Standard Time)'), ('CDT', 'UTC - 5h (Central Daylight Time)'), ('EST', 'UTC - 5h (Eastern Standard Time)'), ('EDT', 'UTC - 4h (Eastern Daylight Time)'), ('GMT', 'UTC (Greenwich Mean Time)'), ('CET', 'UTC + 1h (Central European Time)'), ('CEST', 'UTC + 2h (Central European Summer Time)'), ('USZ1', 'UTC + 3h (Kaliningrad Time)'), ('MSK', 'UTC + 4h (Moscow Time)'), ('IST', 'UTC + 5.5h (Indian Standard Time)'), ('YEKST', 'UTC + 6h (Yekaterinburg Time)'), ('OMSST', 'UTC + 7h (Omsk Time)'), ('KRAST', 'UTC + 8h (Krasnoyarsk Time)'), ('CCT', 'UTC + 8h (Chinese Coast Time)'), ('IRKST', 'UTC + 9h (Irkutsk Time)'), ('JST', 'UTC + 9h (Japan Standard Time)'), ('YAKST', 'UTC + 10h (Yakutsk Time)'), ('AEST', 'UTC + 10h (Australian Eastern Standard Time)'), ('VLAST', 'UTC + 11h (Vladivostok Time)'), ('AEDT', 'UTC + 11h (Australian Eastern Daylight Time)'), ('ACST', 'UTC + 9.5h (Austrailian Central Standard Time)'), ('ACDT', 'UTC + 10.5h (Australian Central Daylight Time)'), ('NZST', 'UTC + 12h (New Zealand Standard Time)'), ('MAGST', 'UTC + 12h (Magadan Time)')], default='CEST', max_length=8, verbose_name='Timezone')),
+ ('environment', models.CharField(choices=[('pr', 'Production'), ('ut', 'Development'), ('it', 'Testing')], default='pr', max_length=2, verbose_name='Environment')),
+ ],
+ options={
+ 'verbose_name': 'GSX Account',
+ 'verbose_name_plural': 'GSX Accounts',
+ 'ordering': ['title'],
+ 'get_latest_by': 'id',
+ 'unique_together': {('sold_to', 'ship_to', 'environment')},
+ },
+ ),
+ migrations.CreateModel(
+ name='Invoice',
+ fields=[
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('created_at', models.DateTimeField(auto_now_add=True)),
+ ('payment_method', models.IntegerField(choices=[(0, 'No Charge'), (1, 'Cash'), (2, 'Invoice'), (3, 'Credit Card'), (4, 'Mail payment'), (5, 'Online payment')], default=0, editable=False, verbose_name='Payment Method')),
+ ('is_paid', models.BooleanField(default=False, verbose_name='Paid')),
+ ('paid_at', models.DateTimeField(editable=False, null=True)),
+ ('customer_name', models.CharField(default='Walk-in', max_length=255, verbose_name='Name')),
+ ('customer_phone', models.CharField(blank=True, max_length=128, null=True, verbose_name='Phone')),
+ ('customer_email', models.CharField(blank=True, max_length=128, null=True, verbose_name='Email')),
+ ('customer_address', models.CharField(blank=True, max_length=255, null=True, verbose_name='Address')),
+ ('reference', models.CharField(blank=True, max_length=255, null=True, verbose_name='Reference')),
+ ('total_net', models.DecimalField(decimal_places=2, max_digits=8)),
+ ('total_tax', models.DecimalField(decimal_places=2, max_digits=8)),
+ ('total_gross', models.DecimalField(decimal_places=2, max_digits=8)),
+ ('total_margin', models.DecimalField(decimal_places=2, editable=False, max_digits=8)),
+ ('created_by', models.ForeignKey(editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL)),
+ ('customer', models.ForeignKey(editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, to='servo.customer')),
+ ],
+ options={
+ 'ordering': ('-id',),
+ 'get_latest_by': 'id',
+ },
+ ),
+ migrations.CreateModel(
+ name='Location',
+ fields=[
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('title', models.CharField(default='New Location', max_length=255, unique=True, verbose_name='Name')),
+ ('phone', models.CharField(blank=True, default='', max_length=32, verbose_name='Phone')),
+ ('email', models.EmailField(blank=True, default='', max_length=254, verbose_name='Email')),
+ ('address', models.CharField(blank=True, default='', max_length=32, verbose_name='Address')),
+ ('zip_code', models.CharField(blank=True, default='', max_length=8, verbose_name='ZIP Code')),
+ ('city', models.CharField(blank=True, default='', max_length=16, verbose_name='City')),
+ ('timezone', models.CharField(choices=[('Africa/Abidjan', 'Africa/Abidjan'), ('Africa/Accra', 'Africa/Accra'), ('Africa/Addis_Ababa', 'Africa/Addis_Ababa'), ('Africa/Algiers', 'Africa/Algiers'), ('Africa/Asmara', 'Africa/Asmara'), ('Africa/Bamako', 'Africa/Bamako'), ('Africa/Bangui', 'Africa/Bangui'), ('Africa/Banjul', 'Africa/Banjul'), ('Africa/Bissau', 'Africa/Bissau'), ('Africa/Blantyre', 'Africa/Blantyre'), ('Africa/Brazzaville', 'Africa/Brazzaville'), ('Africa/Bujumbura', 'Africa/Bujumbura'), ('Africa/Cairo', 'Africa/Cairo'), ('Africa/Casablanca', 'Africa/Casablanca'), ('Africa/Ceuta', 'Africa/Ceuta'), ('Africa/Conakry', 'Africa/Conakry'), ('Africa/Dakar', 'Africa/Dakar'), ('Africa/Dar_es_Salaam', 'Africa/Dar_es_Salaam'), ('Africa/Djibouti', 'Africa/Djibouti'), ('Africa/Douala', 'Africa/Douala'), ('Africa/El_Aaiun', 'Africa/El_Aaiun'), ('Africa/Freetown', 'Africa/Freetown'), ('Africa/Gaborone', 'Africa/Gaborone'), ('Africa/Harare', 'Africa/Harare'), ('Africa/Johannesburg', 'Africa/Johannesburg'), ('Africa/Juba', 'Africa/Juba'), ('Africa/Kampala', 'Africa/Kampala'), ('Africa/Khartoum', 'Africa/Khartoum'), ('Africa/Kigali', 'Africa/Kigali'), ('Africa/Kinshasa', 'Africa/Kinshasa'), ('Africa/Lagos', 'Africa/Lagos'), ('Africa/Libreville', 'Africa/Libreville'), ('Africa/Lome', 'Africa/Lome'), ('Africa/Luanda', 'Africa/Luanda'), ('Africa/Lubumbashi', 'Africa/Lubumbashi'), ('Africa/Lusaka', 'Africa/Lusaka'), ('Africa/Malabo', 'Africa/Malabo'), ('Africa/Maputo', 'Africa/Maputo'), ('Africa/Maseru', 'Africa/Maseru'), ('Africa/Mbabane', 'Africa/Mbabane'), ('Africa/Mogadishu', 'Africa/Mogadishu'), ('Africa/Monrovia', 'Africa/Monrovia'), ('Africa/Nairobi', 'Africa/Nairobi'), ('Africa/Ndjamena', 'Africa/Ndjamena'), ('Africa/Niamey', 'Africa/Niamey'), ('Africa/Nouakchott', 'Africa/Nouakchott'), ('Africa/Ouagadougou', 'Africa/Ouagadougou'), ('Africa/Porto-Novo', 'Africa/Porto-Novo'), ('Africa/Sao_Tome', 'Africa/Sao_Tome'), ('Africa/Tripoli', 'Africa/Tripoli'), ('Africa/Tunis', 'Africa/Tunis'), ('Africa/Windhoek', 'Africa/Windhoek'), ('America/Adak', 'America/Adak'), ('America/Anchorage', 'America/Anchorage'), ('America/Anguilla', 'America/Anguilla'), ('America/Antigua', 'America/Antigua'), ('America/Araguaina', 'America/Araguaina'), ('America/Argentina/Buenos_Aires', 'America/Argentina/Buenos_Aires'), ('America/Argentina/Catamarca', 'America/Argentina/Catamarca'), ('America/Argentina/Cordoba', 'America/Argentina/Cordoba'), ('America/Argentina/Jujuy', 'America/Argentina/Jujuy'), ('America/Argentina/La_Rioja', 'America/Argentina/La_Rioja'), ('America/Argentina/Mendoza', 'America/Argentina/Mendoza'), ('America/Argentina/Rio_Gallegos', 'America/Argentina/Rio_Gallegos'), ('America/Argentina/Salta', 'America/Argentina/Salta'), ('America/Argentina/San_Juan', 'America/Argentina/San_Juan'), ('America/Argentina/San_Luis', 'America/Argentina/San_Luis'), ('America/Argentina/Tucuman', 'America/Argentina/Tucuman'), ('America/Argentina/Ushuaia', 'America/Argentina/Ushuaia'), ('America/Aruba', 'America/Aruba'), ('America/Asuncion', 'America/Asuncion'), ('America/Atikokan', 'America/Atikokan'), ('America/Bahia', 'America/Bahia'), ('America/Bahia_Banderas', 'America/Bahia_Banderas'), ('America/Barbados', 'America/Barbados'), ('America/Belem', 'America/Belem'), ('America/Belize', 'America/Belize'), ('America/Blanc-Sablon', 'America/Blanc-Sablon'), ('America/Boa_Vista', 'America/Boa_Vista'), ('America/Bogota', 'America/Bogota'), ('America/Boise', 'America/Boise'), ('America/Cambridge_Bay', 'America/Cambridge_Bay'), ('America/Campo_Grande', 'America/Campo_Grande'), ('America/Cancun', 'America/Cancun'), ('America/Caracas', 'America/Caracas'), ('America/Cayenne', 'America/Cayenne'), ('America/Cayman', 'America/Cayman'), ('America/Chicago', 'America/Chicago'), ('America/Chihuahua', 'America/Chihuahua'), ('America/Costa_Rica', 'America/Costa_Rica'), ('America/Creston', 'America/Creston'), ('America/Cuiaba', 'America/Cuiaba'), ('America/Curacao', 'America/Curacao'), ('America/Danmarkshavn', 'America/Danmarkshavn'), ('America/Dawson', 'America/Dawson'), ('America/Dawson_Creek', 'America/Dawson_Creek'), ('America/Denver', 'America/Denver'), ('America/Detroit', 'America/Detroit'), ('America/Dominica', 'America/Dominica'), ('America/Edmonton', 'America/Edmonton'), ('America/Eirunepe', 'America/Eirunepe'), ('America/El_Salvador', 'America/El_Salvador'), ('America/Fort_Nelson', 'America/Fort_Nelson'), ('America/Fortaleza', 'America/Fortaleza'), ('America/Glace_Bay', 'America/Glace_Bay'), ('America/Goose_Bay', 'America/Goose_Bay'), ('America/Grand_Turk', 'America/Grand_Turk'), ('America/Grenada', 'America/Grenada'), ('America/Guadeloupe', 'America/Guadeloupe'), ('America/Guatemala', 'America/Guatemala'), ('America/Guayaquil', 'America/Guayaquil'), ('America/Guyana', 'America/Guyana'), ('America/Halifax', 'America/Halifax'), ('America/Havana', 'America/Havana'), ('America/Hermosillo', 'America/Hermosillo'), ('America/Indiana/Indianapolis', 'America/Indiana/Indianapolis'), ('America/Indiana/Knox', 'America/Indiana/Knox'), ('America/Indiana/Marengo', 'America/Indiana/Marengo'), ('America/Indiana/Petersburg', 'America/Indiana/Petersburg'), ('America/Indiana/Tell_City', 'America/Indiana/Tell_City'), ('America/Indiana/Vevay', 'America/Indiana/Vevay'), ('America/Indiana/Vincennes', 'America/Indiana/Vincennes'), ('America/Indiana/Winamac', 'America/Indiana/Winamac'), ('America/Inuvik', 'America/Inuvik'), ('America/Iqaluit', 'America/Iqaluit'), ('America/Jamaica', 'America/Jamaica'), ('America/Juneau', 'America/Juneau'), ('America/Kentucky/Louisville', 'America/Kentucky/Louisville'), ('America/Kentucky/Monticello', 'America/Kentucky/Monticello'), ('America/Kralendijk', 'America/Kralendijk'), ('America/La_Paz', 'America/La_Paz'), ('America/Lima', 'America/Lima'), ('America/Los_Angeles', 'America/Los_Angeles'), ('America/Lower_Princes', 'America/Lower_Princes'), ('America/Maceio', 'America/Maceio'), ('America/Managua', 'America/Managua'), ('America/Manaus', 'America/Manaus'), ('America/Marigot', 'America/Marigot'), ('America/Martinique', 'America/Martinique'), ('America/Matamoros', 'America/Matamoros'), ('America/Mazatlan', 'America/Mazatlan'), ('America/Menominee', 'America/Menominee'), ('America/Merida', 'America/Merida'), ('America/Metlakatla', 'America/Metlakatla'), ('America/Mexico_City', 'America/Mexico_City'), ('America/Miquelon', 'America/Miquelon'), ('America/Moncton', 'America/Moncton'), ('America/Monterrey', 'America/Monterrey'), ('America/Montevideo', 'America/Montevideo'), ('America/Montserrat', 'America/Montserrat'), ('America/Nassau', 'America/Nassau'), ('America/New_York', 'America/New_York'), ('America/Nipigon', 'America/Nipigon'), ('America/Nome', 'America/Nome'), ('America/Noronha', 'America/Noronha'), ('America/North_Dakota/Beulah', 'America/North_Dakota/Beulah'), ('America/North_Dakota/Center', 'America/North_Dakota/Center'), ('America/North_Dakota/New_Salem', 'America/North_Dakota/New_Salem'), ('America/Nuuk', 'America/Nuuk'), ('America/Ojinaga', 'America/Ojinaga'), ('America/Panama', 'America/Panama'), ('America/Pangnirtung', 'America/Pangnirtung'), ('America/Paramaribo', 'America/Paramaribo'), ('America/Phoenix', 'America/Phoenix'), ('America/Port-au-Prince', 'America/Port-au-Prince'), ('America/Port_of_Spain', 'America/Port_of_Spain'), ('America/Porto_Velho', 'America/Porto_Velho'), ('America/Puerto_Rico', 'America/Puerto_Rico'), ('America/Punta_Arenas', 'America/Punta_Arenas'), ('America/Rainy_River', 'America/Rainy_River'), ('America/Rankin_Inlet', 'America/Rankin_Inlet'), ('America/Recife', 'America/Recife'), ('America/Regina', 'America/Regina'), ('America/Resolute', 'America/Resolute'), ('America/Rio_Branco', 'America/Rio_Branco'), ('America/Santarem', 'America/Santarem'), ('America/Santiago', 'America/Santiago'), ('America/Santo_Domingo', 'America/Santo_Domingo'), ('America/Sao_Paulo', 'America/Sao_Paulo'), ('America/Scoresbysund', 'America/Scoresbysund'), ('America/Sitka', 'America/Sitka'), ('America/St_Barthelemy', 'America/St_Barthelemy'), ('America/St_Johns', 'America/St_Johns'), ('America/St_Kitts', 'America/St_Kitts'), ('America/St_Lucia', 'America/St_Lucia'), ('America/St_Thomas', 'America/St_Thomas'), ('America/St_Vincent', 'America/St_Vincent'), ('America/Swift_Current', 'America/Swift_Current'), ('America/Tegucigalpa', 'America/Tegucigalpa'), ('America/Thule', 'America/Thule'), ('America/Thunder_Bay', 'America/Thunder_Bay'), ('America/Tijuana', 'America/Tijuana'), ('America/Toronto', 'America/Toronto'), ('America/Tortola', 'America/Tortola'), ('America/Vancouver', 'America/Vancouver'), ('America/Whitehorse', 'America/Whitehorse'), ('America/Winnipeg', 'America/Winnipeg'), ('America/Yakutat', 'America/Yakutat'), ('America/Yellowknife', 'America/Yellowknife'), ('Antarctica/Casey', 'Antarctica/Casey'), ('Antarctica/Davis', 'Antarctica/Davis'), ('Antarctica/DumontDUrville', 'Antarctica/DumontDUrville'), ('Antarctica/Macquarie', 'Antarctica/Macquarie'), ('Antarctica/Mawson', 'Antarctica/Mawson'), ('Antarctica/McMurdo', 'Antarctica/McMurdo'), ('Antarctica/Palmer', 'Antarctica/Palmer'), ('Antarctica/Rothera', 'Antarctica/Rothera'), ('Antarctica/Syowa', 'Antarctica/Syowa'), ('Antarctica/Troll', 'Antarctica/Troll'), ('Antarctica/Vostok', 'Antarctica/Vostok'), ('Arctic/Longyearbyen', 'Arctic/Longyearbyen'), ('Asia/Aden', 'Asia/Aden'), ('Asia/Almaty', 'Asia/Almaty'), ('Asia/Amman', 'Asia/Amman'), ('Asia/Anadyr', 'Asia/Anadyr'), ('Asia/Aqtau', 'Asia/Aqtau'), ('Asia/Aqtobe', 'Asia/Aqtobe'), ('Asia/Ashgabat', 'Asia/Ashgabat'), ('Asia/Atyrau', 'Asia/Atyrau'), ('Asia/Baghdad', 'Asia/Baghdad'), ('Asia/Bahrain', 'Asia/Bahrain'), ('Asia/Baku', 'Asia/Baku'), ('Asia/Bangkok', 'Asia/Bangkok'), ('Asia/Barnaul', 'Asia/Barnaul'), ('Asia/Beirut', 'Asia/Beirut'), ('Asia/Bishkek', 'Asia/Bishkek'), ('Asia/Brunei', 'Asia/Brunei'), ('Asia/Chita', 'Asia/Chita'), ('Asia/Choibalsan', 'Asia/Choibalsan'), ('Asia/Colombo', 'Asia/Colombo'), ('Asia/Damascus', 'Asia/Damascus'), ('Asia/Dhaka', 'Asia/Dhaka'), ('Asia/Dili', 'Asia/Dili'), ('Asia/Dubai', 'Asia/Dubai'), ('Asia/Dushanbe', 'Asia/Dushanbe'), ('Asia/Famagusta', 'Asia/Famagusta'), ('Asia/Gaza', 'Asia/Gaza'), ('Asia/Hebron', 'Asia/Hebron'), ('Asia/Ho_Chi_Minh', 'Asia/Ho_Chi_Minh'), ('Asia/Hong_Kong', 'Asia/Hong_Kong'), ('Asia/Hovd', 'Asia/Hovd'), ('Asia/Irkutsk', 'Asia/Irkutsk'), ('Asia/Jakarta', 'Asia/Jakarta'), ('Asia/Jayapura', 'Asia/Jayapura'), ('Asia/Jerusalem', 'Asia/Jerusalem'), ('Asia/Kabul', 'Asia/Kabul'), ('Asia/Kamchatka', 'Asia/Kamchatka'), ('Asia/Karachi', 'Asia/Karachi'), ('Asia/Kathmandu', 'Asia/Kathmandu'), ('Asia/Khandyga', 'Asia/Khandyga'), ('Asia/Kolkata', 'Asia/Kolkata'), ('Asia/Krasnoyarsk', 'Asia/Krasnoyarsk'), ('Asia/Kuala_Lumpur', 'Asia/Kuala_Lumpur'), ('Asia/Kuching', 'Asia/Kuching'), ('Asia/Kuwait', 'Asia/Kuwait'), ('Asia/Macau', 'Asia/Macau'), ('Asia/Magadan', 'Asia/Magadan'), ('Asia/Makassar', 'Asia/Makassar'), ('Asia/Manila', 'Asia/Manila'), ('Asia/Muscat', 'Asia/Muscat'), ('Asia/Nicosia', 'Asia/Nicosia'), ('Asia/Novokuznetsk', 'Asia/Novokuznetsk'), ('Asia/Novosibirsk', 'Asia/Novosibirsk'), ('Asia/Omsk', 'Asia/Omsk'), ('Asia/Oral', 'Asia/Oral'), ('Asia/Phnom_Penh', 'Asia/Phnom_Penh'), ('Asia/Pontianak', 'Asia/Pontianak'), ('Asia/Pyongyang', 'Asia/Pyongyang'), ('Asia/Qatar', 'Asia/Qatar'), ('Asia/Qostanay', 'Asia/Qostanay'), ('Asia/Qyzylorda', 'Asia/Qyzylorda'), ('Asia/Riyadh', 'Asia/Riyadh'), ('Asia/Sakhalin', 'Asia/Sakhalin'), ('Asia/Samarkand', 'Asia/Samarkand'), ('Asia/Seoul', 'Asia/Seoul'), ('Asia/Shanghai', 'Asia/Shanghai'), ('Asia/Singapore', 'Asia/Singapore'), ('Asia/Srednekolymsk', 'Asia/Srednekolymsk'), ('Asia/Taipei', 'Asia/Taipei'), ('Asia/Tashkent', 'Asia/Tashkent'), ('Asia/Tbilisi', 'Asia/Tbilisi'), ('Asia/Tehran', 'Asia/Tehran'), ('Asia/Thimphu', 'Asia/Thimphu'), ('Asia/Tokyo', 'Asia/Tokyo'), ('Asia/Tomsk', 'Asia/Tomsk'), ('Asia/Ulaanbaatar', 'Asia/Ulaanbaatar'), ('Asia/Urumqi', 'Asia/Urumqi'), ('Asia/Ust-Nera', 'Asia/Ust-Nera'), ('Asia/Vientiane', 'Asia/Vientiane'), ('Asia/Vladivostok', 'Asia/Vladivostok'), ('Asia/Yakutsk', 'Asia/Yakutsk'), ('Asia/Yangon', 'Asia/Yangon'), ('Asia/Yekaterinburg', 'Asia/Yekaterinburg'), ('Asia/Yerevan', 'Asia/Yerevan'), ('Atlantic/Azores', 'Atlantic/Azores'), ('Atlantic/Bermuda', 'Atlantic/Bermuda'), ('Atlantic/Canary', 'Atlantic/Canary'), ('Atlantic/Cape_Verde', 'Atlantic/Cape_Verde'), ('Atlantic/Faroe', 'Atlantic/Faroe'), ('Atlantic/Madeira', 'Atlantic/Madeira'), ('Atlantic/Reykjavik', 'Atlantic/Reykjavik'), ('Atlantic/South_Georgia', 'Atlantic/South_Georgia'), ('Atlantic/St_Helena', 'Atlantic/St_Helena'), ('Atlantic/Stanley', 'Atlantic/Stanley'), ('Australia/Adelaide', 'Australia/Adelaide'), ('Australia/Brisbane', 'Australia/Brisbane'), ('Australia/Broken_Hill', 'Australia/Broken_Hill'), ('Australia/Darwin', 'Australia/Darwin'), ('Australia/Eucla', 'Australia/Eucla'), ('Australia/Hobart', 'Australia/Hobart'), ('Australia/Lindeman', 'Australia/Lindeman'), ('Australia/Lord_Howe', 'Australia/Lord_Howe'), ('Australia/Melbourne', 'Australia/Melbourne'), ('Australia/Perth', 'Australia/Perth'), ('Australia/Sydney', 'Australia/Sydney'), ('Canada/Atlantic', 'Canada/Atlantic'), ('Canada/Central', 'Canada/Central'), ('Canada/Eastern', 'Canada/Eastern'), ('Canada/Mountain', 'Canada/Mountain'), ('Canada/Newfoundland', 'Canada/Newfoundland'), ('Canada/Pacific', 'Canada/Pacific'), ('Europe/Amsterdam', 'Europe/Amsterdam'), ('Europe/Andorra', 'Europe/Andorra'), ('Europe/Astrakhan', 'Europe/Astrakhan'), ('Europe/Athens', 'Europe/Athens'), ('Europe/Belgrade', 'Europe/Belgrade'), ('Europe/Berlin', 'Europe/Berlin'), ('Europe/Bratislava', 'Europe/Bratislava'), ('Europe/Brussels', 'Europe/Brussels'), ('Europe/Bucharest', 'Europe/Bucharest'), ('Europe/Budapest', 'Europe/Budapest'), ('Europe/Busingen', 'Europe/Busingen'), ('Europe/Chisinau', 'Europe/Chisinau'), ('Europe/Copenhagen', 'Europe/Copenhagen'), ('Europe/Dublin', 'Europe/Dublin'), ('Europe/Gibraltar', 'Europe/Gibraltar'), ('Europe/Guernsey', 'Europe/Guernsey'), ('Europe/Helsinki', 'Europe/Helsinki'), ('Europe/Isle_of_Man', 'Europe/Isle_of_Man'), ('Europe/Istanbul', 'Europe/Istanbul'), ('Europe/Jersey', 'Europe/Jersey'), ('Europe/Kaliningrad', 'Europe/Kaliningrad'), ('Europe/Kiev', 'Europe/Kiev'), ('Europe/Kirov', 'Europe/Kirov'), ('Europe/Lisbon', 'Europe/Lisbon'), ('Europe/Ljubljana', 'Europe/Ljubljana'), ('Europe/London', 'Europe/London'), ('Europe/Luxembourg', 'Europe/Luxembourg'), ('Europe/Madrid', 'Europe/Madrid'), ('Europe/Malta', 'Europe/Malta'), ('Europe/Mariehamn', 'Europe/Mariehamn'), ('Europe/Minsk', 'Europe/Minsk'), ('Europe/Monaco', 'Europe/Monaco'), ('Europe/Moscow', 'Europe/Moscow'), ('Europe/Oslo', 'Europe/Oslo'), ('Europe/Paris', 'Europe/Paris'), ('Europe/Podgorica', 'Europe/Podgorica'), ('Europe/Prague', 'Europe/Prague'), ('Europe/Riga', 'Europe/Riga'), ('Europe/Rome', 'Europe/Rome'), ('Europe/Samara', 'Europe/Samara'), ('Europe/San_Marino', 'Europe/San_Marino'), ('Europe/Sarajevo', 'Europe/Sarajevo'), ('Europe/Saratov', 'Europe/Saratov'), ('Europe/Simferopol', 'Europe/Simferopol'), ('Europe/Skopje', 'Europe/Skopje'), ('Europe/Sofia', 'Europe/Sofia'), ('Europe/Stockholm', 'Europe/Stockholm'), ('Europe/Tallinn', 'Europe/Tallinn'), ('Europe/Tirane', 'Europe/Tirane'), ('Europe/Ulyanovsk', 'Europe/Ulyanovsk'), ('Europe/Uzhgorod', 'Europe/Uzhgorod'), ('Europe/Vaduz', 'Europe/Vaduz'), ('Europe/Vatican', 'Europe/Vatican'), ('Europe/Vienna', 'Europe/Vienna'), ('Europe/Vilnius', 'Europe/Vilnius'), ('Europe/Volgograd', 'Europe/Volgograd'), ('Europe/Warsaw', 'Europe/Warsaw'), ('Europe/Zagreb', 'Europe/Zagreb'), ('Europe/Zaporozhye', 'Europe/Zaporozhye'), ('Europe/Zurich', 'Europe/Zurich'), ('GMT', 'GMT'), ('Indian/Antananarivo', 'Indian/Antananarivo'), ('Indian/Chagos', 'Indian/Chagos'), ('Indian/Christmas', 'Indian/Christmas'), ('Indian/Cocos', 'Indian/Cocos'), ('Indian/Comoro', 'Indian/Comoro'), ('Indian/Kerguelen', 'Indian/Kerguelen'), ('Indian/Mahe', 'Indian/Mahe'), ('Indian/Maldives', 'Indian/Maldives'), ('Indian/Mauritius', 'Indian/Mauritius'), ('Indian/Mayotte', 'Indian/Mayotte'), ('Indian/Reunion', 'Indian/Reunion'), ('Pacific/Apia', 'Pacific/Apia'), ('Pacific/Auckland', 'Pacific/Auckland'), ('Pacific/Bougainville', 'Pacific/Bougainville'), ('Pacific/Chatham', 'Pacific/Chatham'), ('Pacific/Chuuk', 'Pacific/Chuuk'), ('Pacific/Easter', 'Pacific/Easter'), ('Pacific/Efate', 'Pacific/Efate'), ('Pacific/Enderbury', 'Pacific/Enderbury'), ('Pacific/Fakaofo', 'Pacific/Fakaofo'), ('Pacific/Fiji', 'Pacific/Fiji'), ('Pacific/Funafuti', 'Pacific/Funafuti'), ('Pacific/Galapagos', 'Pacific/Galapagos'), ('Pacific/Gambier', 'Pacific/Gambier'), ('Pacific/Guadalcanal', 'Pacific/Guadalcanal'), ('Pacific/Guam', 'Pacific/Guam'), ('Pacific/Honolulu', 'Pacific/Honolulu'), ('Pacific/Kiritimati', 'Pacific/Kiritimati'), ('Pacific/Kosrae', 'Pacific/Kosrae'), ('Pacific/Kwajalein', 'Pacific/Kwajalein'), ('Pacific/Majuro', 'Pacific/Majuro'), ('Pacific/Marquesas', 'Pacific/Marquesas'), ('Pacific/Midway', 'Pacific/Midway'), ('Pacific/Nauru', 'Pacific/Nauru'), ('Pacific/Niue', 'Pacific/Niue'), ('Pacific/Norfolk', 'Pacific/Norfolk'), ('Pacific/Noumea', 'Pacific/Noumea'), ('Pacific/Pago_Pago', 'Pacific/Pago_Pago'), ('Pacific/Palau', 'Pacific/Palau'), ('Pacific/Pitcairn', 'Pacific/Pitcairn'), ('Pacific/Pohnpei', 'Pacific/Pohnpei'), ('Pacific/Port_Moresby', 'Pacific/Port_Moresby'), ('Pacific/Rarotonga', 'Pacific/Rarotonga'), ('Pacific/Saipan', 'Pacific/Saipan'), ('Pacific/Tahiti', 'Pacific/Tahiti'), ('Pacific/Tarawa', 'Pacific/Tarawa'), ('Pacific/Tongatapu', 'Pacific/Tongatapu'), ('Pacific/Wake', 'Pacific/Wake'), ('Pacific/Wallis', 'Pacific/Wallis'), ('US/Alaska', 'US/Alaska'), ('US/Arizona', 'US/Arizona'), ('US/Central', 'US/Central'), ('US/Eastern', 'US/Eastern'), ('US/Hawaii', 'US/Hawaii'), ('US/Mountain', 'US/Mountain'), ('US/Pacific', 'US/Pacific'), ('UTC', 'UTC')], default='UTC', max_length=128, verbose_name='Time zone')),
+ ('gsx_shipto', models.CharField(blank=True, default='', max_length=10, verbose_name='Ship-To')),
+ ('gsx_tz', models.CharField(choices=[('PST', 'UTC - 8h (Pacific Standard Time)'), ('PDT', 'UTC - 7h (Pacific Daylight Time)'), ('CST', 'UTC - 6h (Central Standard Time)'), ('CDT', 'UTC - 5h (Central Daylight Time)'), ('EST', 'UTC - 5h (Eastern Standard Time)'), ('EDT', 'UTC - 4h (Eastern Daylight Time)'), ('GMT', 'UTC (Greenwich Mean Time)'), ('CET', 'UTC + 1h (Central European Time)'), ('CEST', 'UTC + 2h (Central European Summer Time)'), ('USZ1', 'UTC + 3h (Kaliningrad Time)'), ('MSK', 'UTC + 4h (Moscow Time)'), ('IST', 'UTC + 5.5h (Indian Standard Time)'), ('YEKST', 'UTC + 6h (Yekaterinburg Time)'), ('OMSST', 'UTC + 7h (Omsk Time)'), ('KRAST', 'UTC + 8h (Krasnoyarsk Time)'), ('CCT', 'UTC + 8h (Chinese Coast Time)'), ('IRKST', 'UTC + 9h (Irkutsk Time)'), ('JST', 'UTC + 9h (Japan Standard Time)'), ('YAKST', 'UTC + 10h (Yakutsk Time)'), ('AEST', 'UTC + 10h (Australian Eastern Standard Time)'), ('VLAST', 'UTC + 11h (Vladivostok Time)'), ('AEDT', 'UTC + 11h (Australian Eastern Daylight Time)'), ('ACST', 'UTC + 9.5h (Austrailian Central Standard Time)'), ('ACDT', 'UTC + 10.5h (Australian Central Daylight Time)'), ('NZST', 'UTC + 12h (New Zealand Standard Time)'), ('MAGST', 'UTC + 12h (Magadan Time)')], default='CEST', max_length=8, verbose_name='Timezone')),
+ ('notes', models.TextField(blank=True, default='Business hours between 9:00 - 18:00', help_text='Will be shown on print templates', verbose_name='Notes')),
+ ('enabled', models.BooleanField(default=True, verbose_name='Enabled')),
+ ('checkin', models.BooleanField(default=True, verbose_name='Use for check-in')),
+ ('gsx_accounts', models.ManyToManyField(blank=True, to='servo.GsxAccount', verbose_name='Accounts')),
+ ('manager', models.ForeignKey(blank=True, limit_choices_to={'is_visible': True}, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='managed_locations', to=settings.AUTH_USER_MODEL)),
+ ],
+ options={
+ 'verbose_name': 'Location',
+ 'verbose_name_plural': 'Locations',
+ 'ordering': ('title',),
+ 'get_latest_by': 'id',
+ },
+ ),
+ migrations.CreateModel(
+ name='Notification',
+ fields=[
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('kind', models.CharField(max_length=16)),
+ ('action', models.CharField(max_length=16)),
+ ('message', models.TextField()),
+ ],
+ ),
+ migrations.CreateModel(
+ name='Order',
+ fields=[
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('code', models.CharField(max_length=8, null=True, unique=True)),
+ ('url_code', models.CharField(max_length=8, null=True, unique=True)),
+ ('description', models.CharField(default='', max_length=128)),
+ ('status_icon', models.CharField(default='undefined', max_length=16)),
+ ('priority', models.IntegerField(choices=[(2, 'High'), (1, 'Normal'), (0, 'Low')], default=1, verbose_name='priority')),
+ ('created_at', models.DateTimeField(auto_now_add=True)),
+ ('started_at', models.DateTimeField(null=True)),
+ ('closed_at', models.DateTimeField(null=True)),
+ ('place', models.CharField(default='', max_length=128)),
+ ('customer_name', models.CharField(default='', max_length=128)),
+ ('state', models.IntegerField(choices=[(0, 'Unassigned'), (1, 'Open'), (2, 'Closed'), (3, 'Waiting')], default=0)),
+ ('status_name', models.CharField(default='', max_length=128)),
+ ('status_started_at', models.DateTimeField(null=True)),
+ ('status_limit_green', models.DateTimeField(null=True)),
+ ('status_limit_yellow', models.DateTimeField(null=True)),
+ ('checkin_location', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='servo.location')),
+ ('checkout_location', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='servo.location')),
+ ('closed_by', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='closed_orders', to=settings.AUTH_USER_MODEL)),
+ ('created_by', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='created_orders', to=settings.AUTH_USER_MODEL)),
+ ('customer', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='orders', to='servo.customer')),
+ ],
+ options={
+ 'ordering': ('-priority', 'id'),
+ 'permissions': (('change_user', 'Can set assignee'), ('change_status', 'Can change status'), ('follow_order', 'Can follow order'), ('copy_order', 'Can copy order'), ('batch_process', 'Can batch process')),
+ },
+ ),
+ migrations.CreateModel(
+ name='Product',
+ fields=[
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('code', models.CharField(default=servo.lib.shorturl.from_time, max_length=32, unique=True, verbose_name='Code')),
+ ('subst_code', models.CharField(default='', editable=False, max_length=32, verbose_name='Substituted (new) code of this part')),
+ ('title', models.CharField(default='New Product', max_length=255, verbose_name='Title')),
+ ('description', models.TextField(blank=True, default='', verbose_name='Description')),
+ ('pct_vat', models.DecimalField(decimal_places=2, default=servo.models.product.default_vat, max_digits=4, verbose_name='VAT %')),
+ ('fixed_price', models.BooleanField(default=False, help_text="Don't update price when recalculating prices or importing parts")),
+ ('price_purchase_exchange', models.DecimalField(decimal_places=2, default=0, max_digits=8, verbose_name='Purchase price')),
+ ('pct_margin_exchange', models.DecimalField(decimal_places=2, default=servo.models.product.get_margin, max_digits=4, verbose_name='Margin %')),
+ ('price_notax_exchange', models.DecimalField(decimal_places=2, default=0, help_text='Purchase price + margin %', max_digits=8, verbose_name='Net price')),
+ ('price_sales_exchange', models.DecimalField(decimal_places=2, default=0, help_text='Purchase price + margin % + shipping + VAT %', max_digits=8, verbose_name='Sales price')),
+ ('price_purchase_stock', models.DecimalField(decimal_places=2, default=0, max_digits=8, verbose_name='Purchase price')),
+ ('pct_margin_stock', models.DecimalField(decimal_places=2, default=servo.models.product.get_margin, max_digits=4, verbose_name='Margin %')),
+ ('price_notax_stock', models.DecimalField(decimal_places=2, default=0, help_text='Purchase price + margin %', max_digits=8, verbose_name='Net price')),
+ ('price_sales_stock', models.DecimalField(decimal_places=2, default=0, help_text='Purchase price + margin % + shipping + VAT %', max_digits=8, verbose_name='Sales price')),
+ ('is_serialized', models.BooleanField(default=False, help_text='Product has a serial number', verbose_name='Is serialized')),
+ ('warranty_period', models.PositiveIntegerField(default=0, verbose_name='Warranty (months)')),
+ ('shelf', models.CharField(blank=True, default='', max_length=8, verbose_name='Shelf code')),
+ ('brand', models.CharField(blank=True, default='', max_length=32, verbose_name='Brand')),
+ ('photo', models.ImageField(blank=True, null=True, upload_to='products', verbose_name='Photo')),
+ ('shipping', models.FloatField(default=0, verbose_name='Shipping')),
+ ('component_code', models.CharField(blank=True, choices=[('0', 'General'), ('1', 'Visual'), ('2', 'Displays'), ('3', 'Mass Storage'), ('4', 'Input Devices'), ('5', 'Boards'), ('6', 'Power'), ('7', 'Printer'), ('8', 'Multi-function Device'), ('9', 'Communication Devices'), ('A', 'Share'), ('B', 'iPhone'), ('E', 'iPod'), ('F', 'iPad'), ('G', 'Beats Products'), ('W', 'Apple Watch')], default='', max_length=1, verbose_name='Component group')),
+ ('labour_tier', models.CharField(blank=True, default='', max_length=15)),
+ ('part_type', models.CharField(choices=[('ADJUSTMENT', 'Adjustment'), ('MODULE', 'Module'), ('REPLACEMENT', 'Replacement'), ('SERVICE', 'Service'), ('SERVICE CONTRACT', 'Service Contract'), ('OTHER', 'Other')], default='OTHER', max_length=18, verbose_name='Part type')),
+ ('eee_code', models.CharField(blank=True, default='', max_length=256, verbose_name='EEE code')),
+ ('total_amount', models.IntegerField(default=0, editable=False)),
+ ],
+ options={
+ 'ordering': ('-id',),
+ 'permissions': (('change_amount', 'Can change product amount'),),
+ },
+ ),
+ migrations.CreateModel(
+ name='Property',
+ fields=[
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('title', models.CharField(default='New Field', max_length=255, verbose_name='title')),
+ ('type', models.CharField(choices=[('customer', 'Customer'), ('order', 'Order'), ('product', 'Product')], default=('customer', 'Customer'), max_length=32, verbose_name='type')),
+ ('format', models.CharField(blank=True, default='', max_length=32, verbose_name='format')),
+ ('value', models.TextField(blank=True, default='', verbose_name='value')),
+ ],
+ options={
+ 'verbose_name': 'Field',
+ 'verbose_name_plural': 'Fields',
+ 'ordering': ['title'],
+ },
+ ),
+ migrations.CreateModel(
+ name='PurchaseOrder',
+ fields=[
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('reference', models.CharField(blank=True, default='', max_length=32, verbose_name='Reference')),
+ ('confirmation', models.CharField(blank=True, default='', max_length=32, verbose_name='Confirmation')),
+ ('created_at', models.DateTimeField(auto_now_add=True)),
+ ('submitted_at', models.DateTimeField(editable=False, null=True)),
+ ('supplier', models.CharField(blank=True, max_length=32, verbose_name='Supplier')),
+ ('carrier', models.CharField(blank=True, max_length=32, verbose_name='Carrier')),
+ ('tracking_id', models.CharField(blank=True, max_length=128, verbose_name='Tracking ID')),
+ ('days_delivered', models.IntegerField(blank=True, default=1, verbose_name='Delivery Time')),
+ ('has_arrived', models.BooleanField(default=False)),
+ ('total', models.FloatField(editable=False, null=True)),
+ ('invoice_id', models.CharField(default='', editable=False, max_length=10)),
+ ('invoice', models.FileField(editable=False, help_text="Apple's sales invoice for this PO", null=True, upload_to='gsx_invoices')),
+ ('created_by', models.ForeignKey(editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL)),
+ ('location', models.ForeignKey(editable=False, help_text='The location from which this PO was created', null=True, on_delete=django.db.models.deletion.SET_NULL, to='servo.location')),
+ ('sales_order', models.ForeignKey(editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, to='servo.order')),
+ ],
+ options={
+ 'ordering': ('-id',),
+ },
+ ),
+ migrations.CreateModel(
+ name='Queue',
+ fields=[
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('title', models.CharField(default='New Queue', max_length=255, unique=True, verbose_name='Title')),
+ ('keywords', models.TextField(blank=True, default='', help_text='Orders with devices matching these keywords will be automatically assigned to this queue')),
+ ('description', models.TextField(blank=True, verbose_name='description')),
+ ('priority', models.IntegerField(choices=[(2, 'High'), (1, 'Normal'), (0, 'Low')], default=1, verbose_name='priority')),
+ ('gsx_soldto', models.CharField(blank=True, default='', help_text='GSX queries of an order in this queue will be made using this Sold-To', max_length=10, verbose_name='Sold-To')),
+ ('order_template', models.FileField(blank=True, help_text='HTML template for Service Order/Work Confirmation', null=True, upload_to='templates', verbose_name='order template')),
+ ('quote_template', models.FileField(blank=True, help_text='HTML template for cost estimate', null=True, upload_to='templates', verbose_name='quote template')),
+ ('receipt_template', models.FileField(blank=True, help_text='HTML template for Sales Order Receipt', null=True, upload_to='templates', verbose_name='receipt template')),
+ ('dispatch_template', models.FileField(blank=True, help_text='HTML template for dispatched order', null=True, upload_to='templates', verbose_name='dispatch template')),
+ ('locations', models.ManyToManyField(help_text='Pick the locations you want this queue to appear in.', to='servo.Location', verbose_name='locations')),
+ ],
+ options={
+ 'verbose_name': 'Queue',
+ 'verbose_name_plural': 'Queues',
+ 'ordering': ['title'],
+ },
+ ),
+ migrations.CreateModel(
+ name='QueueStatus',
+ fields=[
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('limit_green', models.IntegerField(default=1, verbose_name='Green limit')),
+ ('limit_yellow', models.IntegerField(default=15, verbose_name='Yellow limit')),
+ ('limit_factor', models.IntegerField(choices=[(60, 'Minutes'), (3600, 'Hours'), (86400, 'Days'), (604800, 'Weeks'), (2419200, 'Months')], default=60, verbose_name='Time unit')),
+ ('idx', models.IntegerField(default=1, verbose_name='Ordering')),
+ ('queue', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='servo.queue')),
+ ],
+ options={
+ 'ordering': ('idx',),
+ },
+ ),
+ migrations.CreateModel(
+ name='Repair',
+ fields=[
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('created_at', models.DateTimeField(auto_now_add=True)),
+ ('tech_id', models.CharField(blank=True, default='', max_length=15, verbose_name='Technician')),
+ ('unit_received_at', models.DateTimeField(default=django.utils.timezone.now, verbose_name='Unit Received')),
+ ('submitted_at', models.DateTimeField(editable=False, null=True)),
+ ('completed_at', models.DateTimeField(editable=False, null=True)),
+ ('request_review', models.BooleanField(default=False, help_text='Repair should be reviewed by Apple before confirmation')),
+ ('confirmation', models.CharField(default='', editable=False, max_length=15)),
+ ('reference', models.CharField(blank=True, default='', max_length=16, verbose_name='Reference')),
+ ('symptom', models.TextField()),
+ ('diagnosis', models.TextField()),
+ ('notes', models.TextField(blank=True, default='', help_text='Notes are mandatory when requesting review.', validators=[django.core.validators.MaxLengthValidator(800)])),
+ ('status', models.CharField(default='', editable=False, max_length=128)),
+ ('status_code', models.CharField(choices=[('AWTP', 'Awaiting Parts'), ('AWTR', 'Parts Allocated'), ('BEGR', 'In Repair'), ('RFPU', 'Ready for Pickup')], default='', editable=False, max_length=4)),
+ ('attachment', models.FileField(blank=True, help_text='Choose files to be sent with the repair creation request', null=True, upload_to='repairs')),
+ ('repair_number', models.CharField(default='', editable=False, max_length=12)),
+ ('mark_complete', models.BooleanField(blank=True, default=False, help_text='Requires replacement serial number', verbose_name='mark complete')),
+ ('replacement_sn', models.CharField(blank=True, default='', help_text='Serial Number of replacement part', max_length=18, verbose_name='New serial number')),
+ ('repair_type', models.CharField(choices=[('CA', 'Carry-In/Non-Replinished'), ('NE', 'Return Before Replace'), ('NT', 'No Trouble Found'), ('ON', 'Onsite (Indirect/Direct)'), ('RR', 'Repair Or Replace/Whole Unit Mail-In'), ('WH', 'Mail-In')], default='CA', editable=False, max_length=2)),
+ ('component_data', models.TextField(default='', editable=False)),
+ ('consumer_law', models.BooleanField(default=None, help_text='Repair is eligible for consumer law coverage', null=True)),
+ ('acplus', models.BooleanField(default=None, help_text='Repair is covered by AppleCare+', null=True, verbose_name='AppleCare+')),
+ ('symptom_code', models.CharField(default='', max_length=7)),
+ ('issue_code', models.CharField(default='', max_length=7)),
+ ('completed_by', models.ForeignKey(editable=False, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='completed_repairs', to=settings.AUTH_USER_MODEL)),
+ ('created_by', models.ForeignKey(editable=False, on_delete=django.db.models.deletion.PROTECT, related_name='created_repairs', to=settings.AUTH_USER_MODEL)),
+ ('device', models.ForeignKey(editable=False, on_delete=django.db.models.deletion.PROTECT, to='servo.device')),
+ ('gsx_account', models.ForeignKey(editable=False, on_delete=django.db.models.deletion.PROTECT, to='servo.gsxaccount')),
+ ('order', models.ForeignKey(editable=False, on_delete=django.db.models.deletion.PROTECT, to='servo.order')),
+ ],
+ options={
+ 'get_latest_by': 'created_at',
+ },
+ ),
+ migrations.CreateModel(
+ name='Rule',
+ fields=[
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('description', models.CharField(default='New Rule', max_length=128)),
+ ('match', models.CharField(choices=[('ANY', 'Any'), ('ALL', 'All')], default='ANY', max_length=3)),
+ ],
+ options={
+ 'abstract': False,
+ },
+ ),
+ migrations.CreateModel(
+ name='Search',
+ fields=[
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('query', models.TextField()),
+ ('model', models.CharField(max_length=32)),
+ ('title', models.CharField(max_length=128)),
+ ('shared', models.BooleanField(default=True)),
+ ],
+ ),
+ migrations.CreateModel(
+ name='ServiceOrderItem',
+ fields=[
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('code', models.CharField(blank=True, default='', max_length=128)),
+ ('title', models.CharField(max_length=128, verbose_name='title')),
+ ('description', models.TextField(blank=True, default='', verbose_name='description')),
+ ('created_at', models.DateTimeField(auto_now_add=True)),
+ ('amount', models.IntegerField(default=1, verbose_name='amount')),
+ ('sn', models.CharField(blank=True, default='', max_length=32, verbose_name='KGB Serial Number')),
+ ('dispatched', models.BooleanField(default=False, verbose_name='dispatched')),
+ ('should_report', models.BooleanField(default=True, verbose_name='report')),
+ ('price', models.DecimalField(decimal_places=2, max_digits=8, verbose_name='sales price')),
+ ('replaced_at', models.DateTimeField(null=True)),
+ ('kbb_sn', models.CharField(blank=True, default='', max_length=32, verbose_name='KBB Serial Number')),
+ ('imei', models.CharField(blank=True, default='', max_length=35, verbose_name='IMEI')),
+ ('price_category', models.CharField(choices=[('warranty', 'Warranty'), ('exchange', 'Exchange Price'), ('stock', 'Stock Price')], default=('warranty', 'Warranty'), max_length=32, verbose_name='Price category')),
+ ('comptia_code', models.CharField(blank=True, default='', max_length=4, verbose_name='Symptom code')),
+ ('comptia_modifier', models.CharField(blank=True, default='', max_length=1, verbose_name='Symptom modifier')),
+ ('created_by', models.ForeignKey(editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL)),
+ ('order', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='servo.order')),
+ ('product', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='servo.product')),
+ ('replaced_by', models.ForeignKey(editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='replaced_parts', to=settings.AUTH_USER_MODEL)),
+ ],
+ options={
+ 'ordering': ('id',),
+ 'get_latest_by': 'id',
+ },
+ ),
+ migrations.CreateModel(
+ name='ShippingMethod',
+ fields=[
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('title', models.CharField(default='New Shipping Method', max_length=128)),
+ ('description', models.TextField(blank=True, default='')),
+ ('notify_email', models.EmailField(blank=True, max_length=254, null=True)),
+ ],
+ ),
+ migrations.CreateModel(
+ name='Template',
+ fields=[
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('title', models.CharField(default='New Template', max_length=128, unique=True, verbose_name='Title')),
+ ('content', models.TextField(verbose_name='Content')),
+ ],
+ options={
+ 'verbose_name': 'Template',
+ 'verbose_name_plural': 'Templates',
+ 'ordering': ['title'],
+ },
+ ),
+ migrations.CreateModel(
+ name='UserGroup',
+ fields=[
+ ('group_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='auth.group')),
+ ],
+ bases=('auth.group',),
+ managers=[
+ ('objects', django.contrib.auth.models.GroupManager()),
+ ],
+ ),
+ migrations.CreateModel(
+ name='TaggedItem',
+ fields=[
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('ref', models.CharField(max_length=32)),
+ ('ref_id', models.IntegerField()),
+ ('tag', models.CharField(max_length=128)),
+ ('slug', models.SlugField()),
+ ('color', models.CharField(default='', max_length=8)),
+ ],
+ options={
+ 'unique_together': {('ref', 'ref_id', 'tag')},
+ },
+ ),
+ migrations.CreateModel(
+ name='Tag',
+ fields=[
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('title', models.CharField(default='New Tag', max_length=255, unique=True, verbose_name='name')),
+ ('type', models.CharField(choices=[('device', 'Device'), ('order', 'Order'), ('note', 'Note'), ('other', 'Other')], max_length=32, verbose_name='type')),
+ ('times_used', models.IntegerField(default=0, editable=False)),
+ ('color', models.CharField(blank=True, choices=[('default', 'Default'), ('success', 'Green'), ('warning', 'Orange'), ('important', 'Red'), ('info', 'Blue')], default='default', max_length=16, null=True)),
+ ('lft', models.PositiveIntegerField(editable=False)),
+ ('rght', models.PositiveIntegerField(editable=False)),
+ ('tree_id', models.PositiveIntegerField(db_index=True, editable=False)),
+ ('level', models.PositiveIntegerField(editable=False)),
+ ('parent', mptt.fields.TreeForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='children', to='servo.tag')),
+ ],
+ options={
+ 'verbose_name': 'Tag',
+ 'verbose_name_plural': 'Tags',
+ },
+ ),
+ migrations.CreateModel(
+ name='Status',
+ fields=[
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('title', models.CharField(default='New Status', max_length=255, verbose_name='name')),
+ ('description', models.TextField(blank=True, null=True, verbose_name='description')),
+ ('limit_green', models.IntegerField(default=1, verbose_name='green limit')),
+ ('limit_yellow', models.IntegerField(default=15, verbose_name='yellow limit')),
+ ('limit_factor', models.IntegerField(choices=[(60, 'Minutes'), (3600, 'Hours'), (86400, 'Days'), (604800, 'Weeks'), (2419200, 'Months')], default=(60, 'Minutes'), verbose_name='time unit')),
+ ('queue', models.ManyToManyField(editable=False, through='servo.QueueStatus', to='servo.Queue')),
+ ],
+ options={
+ 'verbose_name': 'Status',
+ 'verbose_name_plural': 'Statuses',
+ 'ordering': ('title',),
+ },
+ ),
+ migrations.CreateModel(
+ name='Shipment',
+ fields=[
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('ship_to', models.CharField(default='', editable=False, max_length=10)),
+ ('return_id', models.CharField(editable=False, help_text='The return ID returned by GSX', max_length=10, null=True, unique=True)),
+ ('tracking_id', models.CharField(blank=True, default='', help_text="Carrier's tracking ID", max_length=30, verbose_name='Tracking ID')),
+ ('tracking_url', models.URLField(editable=False, help_text='The tracking URL returned by GSX', null=True)),
+ ('packing_list', models.FileField(editable=False, help_text='The PDF returned by GSX', null=True, upload_to='returns')),
+ ('carrier', models.CharField(blank=True, choices=[('XAER', 'Aero 2000'), ('XAIRBEC', 'Airborne'), ('XAIRB', 'Airborne'), ('XARM', 'Aramex'), ('XOZP', 'Australia Post'), ('XBAX', 'BAX GLOBAL PTE LTD'), ('XCPW', 'CPW Internal'), ('XCL', 'Citylink'), ('XDHL', 'DHL'), ('XDHLC', 'DHL'), ('XDZNA', 'Danzas-AEI'), ('XEAS', 'EAS'), ('XEGL', 'Eagle ASIA PACIFIC HOLDINGS'), ('XEXXN', 'Exel'), ('XFEDE', 'FedEx'), ('XFDE', 'FedEx Air'), ('XGLS', 'GLS-General Logistics Systems'), ('XHNF', 'H and Friends'), ('XNGLN', 'Nightline'), ('XPL', 'Parceline'), ('XPRLA', 'Purolator'), ('SDS', 'SDS An Post'), ('XSNO', 'Seino Transportation Co. Ltd.'), ('XSTE', 'Star Track Express'), ('XTNT', 'TNT'), ('XUPSN', 'UPS'), ('XUTI', 'UTi (Japan) K.K.'), ('XYMT', 'YAMATO')], default='', max_length=18, verbose_name='Carrier')),
+ ('created_at', models.DateTimeField(auto_now=True)),
+ ('dispatched_at', models.DateTimeField(editable=False, null=True)),
+ ('width', models.PositiveIntegerField(blank=True, null=True, verbose_name='width')),
+ ('height', models.PositiveIntegerField(blank=True, null=True, verbose_name='height')),
+ ('length', models.PositiveIntegerField(blank=True, null=True, verbose_name='length')),
+ ('weight', models.PositiveIntegerField(blank=True, null=True, verbose_name='weight')),
+ ('created_by', models.ForeignKey(editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='created_shipments', to=settings.AUTH_USER_MODEL)),
+ ('dispatched_by', models.ForeignKey(editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='dispatched_shipments', to=settings.AUTH_USER_MODEL)),
+ ('location', models.ForeignKey(editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, to='servo.location')),
+ ],
+ options={
+ 'ordering': ('-dispatched_at',),
+ 'get_latest_by': 'id',
+ },
+ ),
+ migrations.CreateModel(
+ name='ServicePart',
+ fields=[
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('comptia_code', models.CharField(editable=False, max_length=4, verbose_name='Symptom Code')),
+ ('comptia_modifier', models.CharField(editable=False, max_length=1, verbose_name='Symptom Modifier')),
+ ('line_number', models.SmallIntegerField(editable=False, null=True)),
+ ('registered_for_return', models.BooleanField(default=False)),
+ ('returned_at', models.DateTimeField(editable=False, null=True)),
+ ('ship_to', models.CharField(editable=False, max_length=18)),
+ ('part_title', models.CharField(max_length=128)),
+ ('part_number', models.CharField(max_length=18)),
+ ('service_order', models.CharField(max_length=10)),
+ ('return_order', models.CharField(default='', max_length=10)),
+ ('return_status', models.CharField(default='', editable=False, max_length=128)),
+ ('return_code', models.CharField(default='', editable=False, max_length=4)),
+ ('order_status', models.CharField(default='', editable=False, max_length=128)),
+ ('order_status_code', models.CharField(default='', editable=False, max_length=4)),
+ ('coverage_description', models.CharField(default='', editable=False, max_length=128)),
+ ('box_number', models.PositiveIntegerField(null=True)),
+ ('return_label', models.FileField(editable=False, null=True, upload_to='return_labels')),
+ ('carrier_url', models.CharField(default='', editable=False, max_length=255)),
+ ('order_item', models.ForeignKey(editable=False, on_delete=django.db.models.deletion.CASCADE, to='servo.serviceorderitem')),
+ ('purchase_order', models.ForeignKey(editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, to='servo.purchaseorder')),
+ ('repair', models.ForeignKey(editable=False, on_delete=django.db.models.deletion.CASCADE, to='servo.repair')),
+ ('shipment', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='servo.shipment')),
+ ],
+ options={
+ 'ordering': ('order_item',),
+ 'get_latest_by': 'id',
+ 'unique_together': {('id', 'shipment')},
+ },
+ ),
+ migrations.AddField(
+ model_name='repair',
+ name='parts',
+ field=models.ManyToManyField(through='servo.ServicePart', to='servo.ServiceOrderItem'),
+ ),
+ migrations.AddField(
+ model_name='queuestatus',
+ name='status',
+ field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='servo.status'),
+ ),
+ migrations.AddField(
+ model_name='queue',
+ name='status_assigned',
+ field=models.ForeignKey(blank=True, help_text='Order has ben assigned to a user', null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='servo.queuestatus', verbose_name='Order Assigned'),
+ ),
+ migrations.AddField(
+ model_name='queue',
+ name='status_closed',
+ field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='servo.queuestatus', verbose_name='Order Closed'),
+ ),
+ migrations.AddField(
+ model_name='queue',
+ name='status_created',
+ field=models.ForeignKey(blank=True, help_text='Order has ben placed to a queue', null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='servo.queuestatus', verbose_name='Order Created'),
+ ),
+ migrations.AddField(
+ model_name='queue',
+ name='status_dispatched',
+ field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='servo.queuestatus', verbose_name='Order Dispatched'),
+ ),
+ migrations.AddField(
+ model_name='queue',
+ name='status_products_ordered',
+ field=models.ForeignKey(blank=True, help_text='Purchase Order for this Service Order has been submitted', null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='servo.queuestatus', verbose_name='Products Ordered'),
+ ),
+ migrations.AddField(
+ model_name='queue',
+ name='status_products_received',
+ field=models.ForeignKey(blank=True, help_text='Products have been received', null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='servo.queuestatus', verbose_name='Products Received'),
+ ),
+ migrations.AddField(
+ model_name='queue',
+ name='status_repair_completed',
+ field=models.ForeignKey(blank=True, help_text='GSX repair completed', null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='servo.queuestatus', verbose_name='Repair Completed'),
+ ),
+ migrations.CreateModel(
+ name='PurchaseOrderItem',
+ fields=[
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('code', models.CharField(blank=True, default='', max_length=128)),
+ ('title', models.CharField(max_length=128, verbose_name='title')),
+ ('description', models.TextField(blank=True, default='', verbose_name='description')),
+ ('created_at', models.DateTimeField(auto_now_add=True)),
+ ('amount', models.IntegerField(default=1, verbose_name='amount')),
+ ('sn', models.CharField(blank=True, default='', max_length=32, verbose_name='KGB Serial Number')),
+ ('price', models.DecimalField(decimal_places=2, help_text='Purchase price without taxes', max_digits=8, verbose_name='Purchase Price')),
+ ('sales_order_ref', models.CharField(default='', editable=False, max_length=8)),
+ ('purchase_order_ref', models.CharField(default='', editable=False, max_length=32)),
+ ('user_fullname', models.CharField(default='', editable=False, max_length=256)),
+ ('reference', models.CharField(blank=True, default='', max_length=128)),
+ ('ordered_at', models.DateTimeField(editable=False, null=True)),
+ ('expected_ship_date', models.DateField(editable=False, null=True)),
+ ('received_at', models.DateTimeField(blank=True, editable=False, null=True, verbose_name='arrived')),
+ ('created_by', models.ForeignKey(editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL)),
+ ('order_item', models.ForeignKey(editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, to='servo.serviceorderitem')),
+ ('product', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='servo.product')),
+ ('purchase_order', models.ForeignKey(editable=False, on_delete=django.db.models.deletion.CASCADE, to='servo.purchaseorder', verbose_name='Purchase Order')),
+ ('received_by', models.ForeignKey(editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL)),
+ ('sales_order', models.ForeignKey(editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, to='servo.order')),
+ ],
+ options={
+ 'ordering': ('id',),
+ 'get_latest_by': 'id',
+ },
+ ),
+ migrations.CreateModel(
+ name='ProductCategory',
+ fields=[
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('title', models.CharField(default='New Category', max_length=255, unique=True)),
+ ('slug', models.SlugField(editable=False, null=True)),
+ ('lft', models.PositiveIntegerField(editable=False)),
+ ('rght', models.PositiveIntegerField(editable=False)),
+ ('tree_id', models.PositiveIntegerField(db_index=True, editable=False)),
+ ('level', models.PositiveIntegerField(editable=False)),
+ ('parent', mptt.fields.TreeForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='children', to='servo.productcategory')),
+ ],
+ options={
+ 'ordering': ('-title',),
+ 'get_latest_by': 'id',
+ },
+ ),
+ migrations.AddField(
+ model_name='product',
+ name='categories',
+ field=models.ManyToManyField(blank=True, to='servo.ProductCategory', verbose_name='Categories'),
+ ),
+ migrations.AddField(
+ model_name='product',
+ name='device_models',
+ field=models.ManyToManyField(blank=True, to='servo.DeviceGroup', verbose_name='Device models'),
+ ),
+ migrations.CreateModel(
+ name='Payment',
+ fields=[
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('method', models.IntegerField(choices=[(0, 'No Charge'), (1, 'Cash'), (2, 'Invoice'), (3, 'Credit Card'), (4, 'Mail payment'), (5, 'Online payment')], default=0, verbose_name='Payment Method')),
+ ('created_at', models.DateTimeField(auto_now_add=True)),
+ ('amount', models.DecimalField(decimal_places=2, max_digits=8)),
+ ('created_by', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL)),
+ ('invoice', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='servo.invoice')),
+ ],
+ ),
+ migrations.CreateModel(
+ name='OrderStatus',
+ fields=[
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('started_at', models.DateTimeField(auto_now_add=True)),
+ ('finished_at', models.DateTimeField(null=True)),
+ ('green_limit', models.DateTimeField(null=True)),
+ ('yellow_limit', models.DateTimeField(null=True)),
+ ('badge', models.CharField(choices=[('undefined', 'undefined'), ('success', 'success'), ('warning', 'warning'), ('danger', 'danger')], default='undefined', max_length=16)),
+ ('duration', models.IntegerField(default=0)),
+ ('finished_by', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='+', to=settings.AUTH_USER_MODEL)),
+ ('order', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='servo.order')),
+ ('started_by', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='+', to=settings.AUTH_USER_MODEL)),
+ ('status', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='servo.status')),
+ ],
+ options={
+ 'ordering': ('-started_at',),
+ 'get_latest_by': 'started_at',
+ },
+ ),
+ migrations.CreateModel(
+ name='OrderDevice',
+ fields=[
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('should_report', models.BooleanField(default=True)),
+ ('repeat_service', models.BooleanField(default=False)),
+ ('repair_strategies', django.contrib.postgres.fields.ArrayField(base_field=models.CharField(max_length=100), help_text='Available repair strategies from GSX', null=True, size=None)),
+ ('device', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='servo.device')),
+ ('order', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='servo.order')),
+ ],
+ options={
+ 'unique_together': {('order', 'device')},
+ },
+ ),
+ migrations.AddField(
+ model_name='order',
+ name='devices',
+ field=models.ManyToManyField(through='servo.OrderDevice', to='servo.Device'),
+ ),
+ migrations.AddField(
+ model_name='order',
+ name='followed_by',
+ field=models.ManyToManyField(related_name='followed_orders', to=settings.AUTH_USER_MODEL),
+ ),
+ migrations.AddField(
+ model_name='order',
+ name='location',
+ field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='servo.location'),
+ ),
+ migrations.AddField(
+ model_name='order',
+ name='queue',
+ field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='servo.queue', verbose_name='queue'),
+ ),
+ migrations.AddField(
+ model_name='order',
+ name='started_by',
+ field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='started_orders', to=settings.AUTH_USER_MODEL),
+ ),
+ migrations.AddField(
+ model_name='order',
+ name='status',
+ field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='servo.queuestatus', verbose_name='status'),
+ ),
+ migrations.AddField(
+ model_name='order',
+ name='statuses',
+ field=models.ManyToManyField(related_name='orders', through='servo.OrderStatus', to='servo.Status'),
+ ),
+ migrations.AddField(
+ model_name='order',
+ name='tags',
+ field=models.ManyToManyField(to='servo.Tag', verbose_name='tags'),
+ ),
+ migrations.AddField(
+ model_name='order',
+ name='user',
+ field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL),
+ ),
+ migrations.CreateModel(
+ name='Note',
+ fields=[
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('subject', models.CharField(blank=True, default=servo.defaults.subject, max_length=255, verbose_name='Subject')),
+ ('body', models.TextField(verbose_name='Message')),
+ ('code', models.CharField(default=servo.lib.shorturl.from_time, editable=False, max_length=9, unique=True)),
+ ('sender', models.CharField(default='', max_length=255, verbose_name='From')),
+ ('recipient', models.CharField(blank=True, default='', max_length=255, verbose_name='To')),
+ ('created_at', models.DateTimeField(auto_now_add=True)),
+ ('sent_at', models.DateTimeField(editable=False, null=True)),
+ ('is_reported', models.BooleanField(default=False, help_text='Show this note on the confirmation printout', verbose_name='Report')),
+ ('is_read', models.BooleanField(default=True, editable=False, verbose_name='Read')),
+ ('is_flagged', models.BooleanField(default=False, editable=False, verbose_name='Flagged')),
+ ('type', models.IntegerField(blank=True, choices=[(0, 'Note'), (1, 'Problem'), (2, 'Escalation')], default=0, verbose_name='Type')),
+ ('lft', models.PositiveIntegerField(editable=False)),
+ ('rght', models.PositiveIntegerField(editable=False)),
+ ('tree_id', models.PositiveIntegerField(db_index=True, editable=False)),
+ ('level', models.PositiveIntegerField(editable=False)),
+ ('created_by', models.ForeignKey(editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL)),
+ ('customer', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='servo.customer')),
+ ('escalation', servo.models.note.UnsavedForeignKey(editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, to='servo.escalation')),
+ ('labels', models.ManyToManyField(blank=True, limit_choices_to={'type': 'note'}, to='servo.Tag')),
+ ('order', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='servo.order')),
+ ('parent', mptt.fields.TreeForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='replies', to='servo.note')),
+ ],
+ options={
+ 'get_latest_by': 'created_at',
+ },
+ ),
+ migrations.CreateModel(
+ name='InvoiceItem',
+ fields=[
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('code', models.CharField(blank=True, default='', max_length=128)),
+ ('title', models.CharField(max_length=128, verbose_name='title')),
+ ('description', models.TextField(blank=True, default='', verbose_name='description')),
+ ('created_at', models.DateTimeField(auto_now_add=True)),
+ ('amount', models.IntegerField(default=1, verbose_name='amount')),
+ ('sn', models.CharField(blank=True, default='', max_length=32, verbose_name='KGB Serial Number')),
+ ('price', models.DecimalField(decimal_places=2, max_digits=8, verbose_name='Sales Price')),
+ ('created_by', models.ForeignKey(editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL)),
+ ('invoice', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='servo.invoice')),
+ ('product', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='servo.product')),
+ ],
+ ),
+ migrations.AddField(
+ model_name='invoice',
+ name='location',
+ field=models.ForeignKey(blank=True, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, to='servo.location'),
+ ),
+ migrations.AddField(
+ model_name='invoice',
+ name='order',
+ field=models.ForeignKey(editable=False, on_delete=django.db.models.deletion.PROTECT, to='servo.order'),
+ ),
+ migrations.CreateModel(
+ name='FlaggedItem',
+ fields=[
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('ref', models.CharField(max_length=32)),
+ ('ref_id', models.IntegerField()),
+ ('flagged_by', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL)),
+ ],
+ ),
+ migrations.CreateModel(
+ name='Event',
+ fields=[
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('ref', models.CharField(max_length=32)),
+ ('ref_id', models.IntegerField()),
+ ('description', models.CharField(max_length=255)),
+ ('triggered_at', models.DateTimeField(auto_now_add=True)),
+ ('handled_at', models.DateTimeField(null=True)),
+ ('action', models.CharField(max_length=32)),
+ ('priority', models.SmallIntegerField(default=1)),
+ ('notify_users', models.ManyToManyField(related_name='notifications', to=settings.AUTH_USER_MODEL)),
+ ('triggered_by', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL)),
+ ],
+ options={
+ 'ordering': ('priority', '-id'),
+ },
+ ),
+ migrations.AddField(
+ model_name='escalation',
+ name='gsx_account',
+ field=models.ForeignKey(default=servo.defaults.gsx_account, null=True, on_delete=django.db.models.deletion.SET_NULL, to='servo.gsxaccount', verbose_name='GSX Account'),
+ ),
+ migrations.AddField(
+ model_name='device',
+ name='products',
+ field=models.ManyToManyField(editable=False, help_text='Products that are compatible with this device instance', to='servo.Product'),
+ ),
+ migrations.AddField(
+ model_name='customer',
+ name='devices',
+ field=models.ManyToManyField(blank=True, editable=False, to='servo.Device', verbose_name='devices'),
+ ),
+ migrations.AddField(
+ model_name='customer',
+ name='groups',
+ field=models.ManyToManyField(blank=True, to='servo.CustomerGroup', verbose_name='Groups'),
+ ),
+ migrations.AddField(
+ model_name='customer',
+ name='parent',
+ field=mptt.fields.TreeForeignKey(blank=True, limit_choices_to={'is_company': True}, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='contacts', to='servo.customer', verbose_name='company'),
+ ),
+ migrations.AddField(
+ model_name='customer',
+ name='tags',
+ field=models.ManyToManyField(blank=True, limit_choices_to={'type': 'customer'}, to='servo.Tag', verbose_name='tags'),
+ ),
+ migrations.CreateModel(
+ name='Condition',
+ fields=[
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('key', models.CharField(choices=[('QUEUE', 'Queue'), ('STATUS', 'Status'), ('DEVICE', 'Device name'), ('CUSTOMER_NAME', 'Customer name')], max_length=16)),
+ ('operator', models.CharField(choices=[('^%s$', 'Equals'), ('%s', 'Contains'), ('%d < %d', 'Less than'), ('%d > %d', 'Greater than')], default='^%s$', max_length=8)),
+ ('value', models.TextField(default='')),
+ ('rule', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='servo.rule')),
+ ],
+ options={
+ 'abstract': False,
+ },
+ ),
+ migrations.CreateModel(
+ name='ChecklistItemValue',
+ fields=[
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('checked_at', models.DateTimeField(auto_now_add=True)),
+ ('checked_by', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
+ ('item', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='servo.checklistitem')),
+ ('order', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='servo.order')),
+ ],
+ ),
+ migrations.AddField(
+ model_name='checklist',
+ name='queues',
+ field=models.ManyToManyField(blank=True, to='servo.Queue', verbose_name='queue'),
+ ),
+ migrations.CreateModel(
+ name='Article',
+ fields=[
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('gsx_id', models.CharField(default='', editable=False, max_length=20)),
+ ('date_created', models.DateField(editable=False)),
+ ('date_published', models.DateField(null=True)),
+ ('title', models.TextField(default='New Article')),
+ ('summary', models.TextField(default='')),
+ ('content', models.TextField(default='')),
+ ('priority', models.CharField(choices=[('HIGH', 'High'), ('MEDIUM', 'Medium'), ('LOW', 'Low')], default='HIGH', max_length=128)),
+ ('url', models.URLField(default='')),
+ ('product_model', django.contrib.postgres.fields.ArrayField(base_field=models.CharField(max_length=128), editable=False, null=True, size=None)),
+ ('read_by', django.contrib.postgres.fields.ArrayField(base_field=models.IntegerField(), default=list, size=None)),
+ ('flagged_by', django.contrib.postgres.fields.ArrayField(base_field=models.IntegerField(), default=list, size=None)),
+ ('created_by', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL)),
+ ],
+ ),
+ migrations.CreateModel(
+ name='Action',
+ fields=[
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('key', models.CharField(choices=[('SEND_SMS', 'Send SMS'), ('SEND_EMAIL', 'Send email'), ('ADD_TAG', 'Add Tag'), ('SET_PRIO', 'Set Priority'), ('SET_QUEUE', 'Set Queue'), ('SET_USER', 'Assign to')], default='SEND_EMAIL', max_length=32)),
+ ('value', models.TextField(default='')),
+ ('rule', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='servo.rule')),
+ ],
+ options={
+ 'abstract': False,
+ },
+ ),
+ migrations.CreateModel(
+ name='Accessory',
+ fields=[
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('name', models.TextField()),
+ ('qty', models.IntegerField(default=1)),
+ ('device', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='servo.device')),
+ ('order', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='servo.order')),
+ ],
+ ),
+ migrations.AddField(
+ model_name='user',
+ name='customer',
+ field=mptt.fields.TreeForeignKey(blank=True, limit_choices_to={'is_company': True}, null=True, on_delete=django.db.models.deletion.SET_NULL, to='servo.customer'),
+ ),
+ migrations.AddField(
+ model_name='user',
+ name='groups',
+ field=models.ManyToManyField(blank=True, help_text='The groups this user belongs to. A user will get all permissions granted to each of their groups.', related_name='user_set', related_query_name='user', to='auth.Group', verbose_name='groups'),
+ ),
+ migrations.AddField(
+ model_name='user',
+ name='location',
+ field=models.ForeignKey(help_text='Orders you create will be registered to this location.', null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='servo.location', verbose_name='Current Location'),
+ ),
+ migrations.AddField(
+ model_name='user',
+ name='locations',
+ field=models.ManyToManyField(blank=True, to='servo.Location'),
+ ),
+ migrations.AddField(
+ model_name='user',
+ name='queues',
+ field=models.ManyToManyField(blank=True, to='servo.Queue', verbose_name='queues'),
+ ),
+ migrations.AddField(
+ model_name='user',
+ name='user_permissions',
+ field=models.ManyToManyField(blank=True, help_text='Specific permissions for this user.', related_name='user_set', related_query_name='user', to='auth.Permission', verbose_name='user permissions'),
+ ),
+ migrations.AlterUniqueTogether(
+ name='queuestatus',
+ unique_together={('queue', 'status')},
+ ),
+ migrations.CreateModel(
+ name='Message',
+ fields=[
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('code', models.CharField(default=servo.defaults.uid, max_length=36, unique=True)),
+ ('sender', models.CharField(max_length=128)),
+ ('recipient', models.CharField(max_length=128)),
+ ('body', models.TextField()),
+ ('sent_at', models.DateTimeField(null=True)),
+ ('received_at', models.DateTimeField(null=True)),
+ ('status', models.CharField(choices=[('SENT', 'SENT'), ('DELIVERED', 'DELIVERED'), ('RECEIVED', 'RECEIVED'), ('FAILED', 'FAILED')], max_length=16)),
+ ('method', models.CharField(choices=[('EMAIL', 'EMAIL'), ('SMS', 'SMS'), ('GSX', 'GSX')], default='EMAIL', max_length=16)),
+ ('error', models.TextField()),
+ ('created_by', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL)),
+ ('note', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='servo.note')),
+ ],
+ options={
+ 'unique_together': {('note', 'recipient')},
+ },
+ ),
+ migrations.CreateModel(
+ name='Inventory',
+ fields=[
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('amount_minimum', models.PositiveIntegerField(default=0, verbose_name='Minimum amount')),
+ ('amount_reserved', models.PositiveIntegerField(default=0, verbose_name='Reserved amount')),
+ ('amount_stocked', models.IntegerField(default=0, verbose_name='Stocked amount')),
+ ('amount_ordered', models.PositiveIntegerField(default=0, verbose_name='Ordered amount')),
+ ('location', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='servo.location')),
+ ('product', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='servo.product')),
+ ],
+ options={
+ 'unique_together': {('product', 'location')},
+ },
+ ),
+ migrations.CreateModel(
+ name='ContactInfo',
+ fields=[
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('key', models.CharField(max_length=255)),
+ ('value', models.CharField(max_length=255)),
+ ('customer', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='servo.customer')),
+ ],
+ options={
+ 'unique_together': {('customer', 'key')},
+ },
+ ),
+ ]