From 26167c923448fae157f5134350e771928ad09b0b Mon Sep 17 00:00:00 2001 From: Max Nanis Date: Thu, 10 Sep 2026 11:17:07 -0700 Subject: basic tests should be working. Jenkins p1 --- carer/app/__init__.py | 0 carer/app/manage.py | 9 ++ carer/app/settings.py | 24 ++++ carer/apps.py | 9 ++ carer/carer/__init__.py | 0 carer/carer/mtwerk/__init__.py | 0 carer/carer/mtwerk/migrations/0001_initial.py | 157 -------------------------- carer/carer/mtwerk/migrations/__init__.py | 0 carer/carer/mtwerk/models.py | 130 --------------------- carer/carer/settings/base.py | 18 --- carer/carer/settings/unittest.py | 30 ----- carer/manage.py | 22 ---- carer/mtwerk/__init__.py | 0 carer/mtwerk/migrations/0001_initial.py | 157 ++++++++++++++++++++++++++ carer/mtwerk/migrations/__init__.py | 0 carer/mtwerk/models.py | 130 +++++++++++++++++++++ 16 files changed, 329 insertions(+), 357 deletions(-) create mode 100644 carer/app/__init__.py create mode 100644 carer/app/manage.py create mode 100644 carer/app/settings.py create mode 100644 carer/apps.py delete mode 100644 carer/carer/__init__.py delete mode 100644 carer/carer/mtwerk/__init__.py delete mode 100644 carer/carer/mtwerk/migrations/0001_initial.py delete mode 100644 carer/carer/mtwerk/migrations/__init__.py delete mode 100644 carer/carer/mtwerk/models.py delete mode 100644 carer/carer/settings/base.py delete mode 100644 carer/carer/settings/unittest.py delete mode 100644 carer/manage.py create mode 100644 carer/mtwerk/__init__.py create mode 100644 carer/mtwerk/migrations/0001_initial.py create mode 100644 carer/mtwerk/migrations/__init__.py create mode 100644 carer/mtwerk/models.py (limited to 'carer') diff --git a/carer/app/__init__.py b/carer/app/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/carer/app/manage.py b/carer/app/manage.py new file mode 100644 index 0000000..9ae482e --- /dev/null +++ b/carer/app/manage.py @@ -0,0 +1,9 @@ +#!/usr/bin/env python +import os +import sys + +if __name__ == "__main__": + os.environ.setdefault("DJANGO_SETTINGS_MODULE", "carer.app.settings") + from django.core.management import execute_from_command_line + + execute_from_command_line(sys.argv) diff --git a/carer/app/settings.py b/carer/app/settings.py new file mode 100644 index 0000000..55dd93b --- /dev/null +++ b/carer/app/settings.py @@ -0,0 +1,24 @@ +import os + +INSTALLED_APPS = [ + "django.contrib.postgres", + "django.contrib.contenttypes", + "carer.mtwerk", +] + +DATABASES = { + "default": { + "ENGINE": "django.db.backends.postgresql", + "NAME": os.environ.get("DB_NAME", "thl-test"), + "USER": os.environ.get("DB_USER", "postgres"), + "PASSWORD": os.environ.get("DB_PASSWORD", "password"), + "HOST": os.environ.get("DB_HOST", "127.0.0.1"), + "PORT": "5432", + } +} +DEFAULT_AUTO_FIELD = "django.db.models.BigAutoField" +LANGUAGE_CODE = "en-us" +TIME_ZONE = "UTC" +USE_I18N = True +USE_L10N = True +USE_TZ = True diff --git a/carer/apps.py b/carer/apps.py new file mode 100644 index 0000000..c96687b --- /dev/null +++ b/carer/apps.py @@ -0,0 +1,9 @@ +from django.apps import AppConfig + + +class MTwerkSchemaConfig(AppConfig): + name = "carer.mtwerk" + label = "mtwerk" + + def ready(self): + from .mtwerk import models # pycharm: keep diff --git a/carer/carer/__init__.py b/carer/carer/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/carer/carer/mtwerk/__init__.py b/carer/carer/mtwerk/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/carer/carer/mtwerk/migrations/0001_initial.py b/carer/carer/mtwerk/migrations/0001_initial.py deleted file mode 100644 index d5c856a..0000000 --- a/carer/carer/mtwerk/migrations/0001_initial.py +++ /dev/null @@ -1,157 +0,0 @@ -# Generated by Django 5.2.7 on 2025-10-28 22:06 - -import django.db.models.deletion -from django.db import migrations, models - - -class Migration(migrations.Migration): - - initial = True - - dependencies = [ - ] - - operations = [ - migrations.CreateModel( - name='Hit', - fields=[ - ('id', models.BigAutoField(primary_key=True, serialize=False)), - ('amt_hit_id', models.CharField(max_length=30, unique=True)), - ('amt_group_id', models.CharField(max_length=30)), - ('status', models.SmallIntegerField()), - ('review_status', models.SmallIntegerField()), - ('creation_time', models.DateTimeField()), - ('expiration', models.DateTimeField()), - ('created_at', models.DateTimeField(auto_now_add=True)), - ('modified_at', models.DateTimeField(auto_now=True)), - ('max_assignments', models.IntegerField(default=1)), - ('assignment_pending_count', models.IntegerField(default=0)), - ('assignment_available_count', models.IntegerField(default=0)), - ('assignment_completed_count', models.IntegerField(default=0)), - ], - options={ - 'db_table': 'mtwerk_hit', - }, - ), - migrations.CreateModel( - name='Assignment', - fields=[ - ('id', models.BigAutoField(primary_key=True, serialize=False)), - ('amt_assignment_id', models.CharField(max_length=30, unique=True)), - ('amt_worker_id', models.CharField(max_length=30)), - ('status', models.SmallIntegerField()), - ('auto_approval_time', models.DateTimeField(null=True)), - ('accept_time', models.DateTimeField(null=True)), - ('submit_time', models.DateTimeField(null=True)), - ('approval_time', models.DateTimeField(null=True)), - ('rejection_time', models.DateTimeField(null=True)), - ('requester_feedback', models.CharField(max_length=1024, null=True)), - ('created_at', models.DateTimeField(auto_now_add=True)), - ('modified_at', models.DateTimeField(auto_now=True)), - ('tsid', models.UUIDField(null=True)), - ('hit', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='mtwerk.hit')), - ], - options={ - 'db_table': 'mtwerk_assignment', - }, - ), - migrations.CreateModel( - name='HitType', - fields=[ - ('id', models.AutoField(primary_key=True, serialize=False)), - ('amt_hit_type_id', models.CharField(max_length=30, unique=True)), - ('title', models.CharField(max_length=200)), - ('description', models.CharField(max_length=2000)), - ('reward', models.DecimalField(decimal_places=2, max_digits=8)), - ('assignment_duration', models.PositiveIntegerField()), - ('auto_approval_delay', models.PositiveIntegerField()), - ('keywords', models.CharField(max_length=256)), - ('min_active', models.IntegerField(default=0)), - ], - options={ - 'db_table': 'mtwerk_hittype', - 'indexes': [models.Index(fields=['amt_hit_type_id'], name='mtwerk_hitt_amt_hit_05dd10_idx'), models.Index(fields=['min_active'], name='mtwerk_hitt_min_act_e18222_idx')], - }, - ), - migrations.AddField( - model_name='hit', - name='hit_type', - field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='mtwerk.hittype'), - ), - migrations.CreateModel( - name='Question', - fields=[ - ('id', models.AutoField(primary_key=True, serialize=False)), - ('url', models.URLField()), - ('height', models.IntegerField(default=1200)), - ], - options={ - 'db_table': 'mtwerk_question', - 'unique_together': {('url', 'height')}, - }, - ), - migrations.AddField( - model_name='hit', - name='question', - field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='mtwerk.question'), - ), - migrations.CreateModel( - name='Bonus', - fields=[ - ('id', models.BigAutoField(primary_key=True, serialize=False)), - ('payout_event_id', models.UUIDField(unique=True)), - ('amt_worker_id', models.CharField(max_length=30, null=True)), - ('amount', models.DecimalField(decimal_places=2, max_digits=10)), - ('grant_time', models.DateTimeField()), - ('reason', models.CharField(max_length=1024)), - ('assignment', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='mtwerk.assignment')), - ], - options={ - 'indexes': [models.Index(fields=['amt_worker_id'], name='mtwerk_bonu_amt_wor_77d514_idx'), models.Index(fields=['grant_time'], name='mtwerk_bonu_grant_t_d43c6c_idx')], - }, - ), - migrations.AddIndex( - model_name='assignment', - index=models.Index(fields=['amt_worker_id'], name='mtwerk_assi_amt_wor_7dbe42_idx'), - ), - migrations.AddIndex( - model_name='assignment', - index=models.Index(fields=['status'], name='mtwerk_assi_status_4e01de_idx'), - ), - migrations.AddIndex( - model_name='assignment', - index=models.Index(fields=['submit_time'], name='mtwerk_assi_submit__429d3e_idx'), - ), - migrations.AddIndex( - model_name='assignment', - index=models.Index(fields=['created_at'], name='mtwerk_assi_created_9292fa_idx'), - ), - migrations.AddIndex( - model_name='assignment', - index=models.Index(fields=['modified_at'], name='mtwerk_assi_modifie_44f1d0_idx'), - ), - migrations.AddIndex( - model_name='assignment', - index=models.Index(fields=['tsid'], name='mtwerk_assi_tsid_bd796d_idx'), - ), - migrations.AddIndex( - model_name='hit', - index=models.Index(fields=['status'], name='mtwerk_hit_status_ae726f_idx'), - ), - migrations.AddIndex( - model_name='hit', - index=models.Index(fields=['review_status'], name='mtwerk_hit_review__a9f420_idx'), - ), - migrations.AddIndex( - model_name='hit', - index=models.Index(fields=['creation_time'], name='mtwerk_hit_creatio_48e0fd_idx'), - ), - migrations.AddIndex( - model_name='hit', - index=models.Index(fields=['created_at'], name='mtwerk_hit_created_f1614b_idx'), - ), - migrations.AddIndex( - model_name='hit', - index=models.Index(fields=['modified_at'], name='mtwerk_hit_modifie_45c2ed_idx'), - ), - ] diff --git a/carer/carer/mtwerk/migrations/__init__.py b/carer/carer/mtwerk/migrations/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/carer/carer/mtwerk/models.py b/carer/carer/mtwerk/models.py deleted file mode 100644 index 5cb026d..0000000 --- a/carer/carer/mtwerk/models.py +++ /dev/null @@ -1,130 +0,0 @@ -from django.db import models - - -class Question(models.Model): - """The iFrame location and details for a HIT""" - - id = models.AutoField(primary_key=True) - - url = models.URLField(max_length=200) - height = models.IntegerField(default=1200) - - class Meta: - db_table = "mtwerk_question" - unique_together = ["url", "height"] - - -class HitType(models.Model): - id = models.AutoField(primary_key=True) - amt_hit_type_id = models.CharField(max_length=30, unique=True) - - title = models.CharField(max_length=200) - description = models.CharField(max_length=2000) - reward = models.DecimalField(decimal_places=2, max_digits=8) - assignment_duration = models.PositiveIntegerField() - auto_approval_delay = models.PositiveIntegerField() - keywords = models.CharField(max_length=256) - - # If set, don't let the active HIT count drop below this amount - min_active = models.IntegerField(null=False, default=0) - - class Meta: - db_table = "mtwerk_hittype" - indexes = [ - models.Index(fields=["amt_hit_type_id"]), - models.Index(fields=["min_active"]), - ] - - -class Hit(models.Model): - id = models.BigAutoField(primary_key=True) - amt_hit_id = models.CharField(max_length=30, unique=True) - - hit_type = models.ForeignKey(HitType, on_delete=models.PROTECT) - - amt_group_id = models.CharField(max_length=30) - - status = models.SmallIntegerField(null=False) - review_status = models.SmallIntegerField(null=False) - creation_time = models.DateTimeField(null=False) - expiration = models.DateTimeField(null=False) - - question = models.ForeignKey(Question, on_delete=models.PROTECT) - created_at = models.DateTimeField(null=False, auto_now_add=True) - modified_at = models.DateTimeField(null=False, auto_now=True) - - max_assignments = models.IntegerField(null=False, default=1) - assignment_pending_count = models.IntegerField(null=False, default=0) - assignment_available_count = models.IntegerField(null=False, default=0) - assignment_completed_count = models.IntegerField(null=False, default=0) - - class Meta: - db_table = "mtwerk_hit" - indexes = [ - models.Index(fields=["status"]), - models.Index(fields=["review_status"]), - models.Index(fields=["creation_time"]), - models.Index(fields=["created_at"]), - models.Index(fields=["modified_at"]), - ] - - -class Assignment(models.Model): - id = models.BigAutoField(primary_key=True) - amt_assignment_id = models.CharField(max_length=30, unique=True) - - amt_worker_id = models.CharField(max_length=30, null=False) - - hit = models.ForeignKey(Hit, on_delete=models.PROTECT) - - status = models.SmallIntegerField(null=False) - - auto_approval_time = models.DateTimeField(null=True) - accept_time = models.DateTimeField(null=True) - submit_time = models.DateTimeField(null=True) - approval_time = models.DateTimeField(null=True) - rejection_time = models.DateTimeField(null=True) - - # Don't need this - # answer = models.CharField - - requester_feedback = models.CharField(null=True, max_length=1024) - - # Internal tracking - created_at = models.DateTimeField(null=False, auto_now_add=True) - modified_at = models.DateTimeField(null=False, auto_now=True) - tsid = models.UUIDField(null=True) - - class Meta: - db_table = "mtwerk_assignment" - indexes = [ - models.Index(fields=["amt_worker_id"]), - models.Index(fields=["status"]), - models.Index(fields=["submit_time"]), - models.Index(fields=["created_at"]), - models.Index(fields=["modified_at"]), - models.Index(fields=["tsid"]), - ] - - -class Bonus(models.Model): - """Issued bonuses to workers for supplemental payments""" - - id = models.BigAutoField(primary_key=True) - payout_event_id = models.UUIDField(null=False, unique=True) - - amt_worker_id = models.CharField(max_length=30, null=True) - - # Not unique=True because maybe multiple Bonuses will be associated - # with a single Assignment - assignment = models.ForeignKey(Assignment, null=False, on_delete=models.PROTECT) - - amount = models.DecimalField(max_digits=10, decimal_places=2) - grant_time = models.DateTimeField(null=False) - reason = models.CharField(max_length=1024) - - class Meta: - indexes = [ - models.Index(fields=["amt_worker_id"]), - models.Index(fields=["grant_time"]), - ] diff --git a/carer/carer/settings/base.py b/carer/carer/settings/base.py deleted file mode 100644 index c83e0fe..0000000 --- a/carer/carer/settings/base.py +++ /dev/null @@ -1,18 +0,0 @@ -from pathlib import Path -import os - -# Build paths inside the project like this: BASE_DIR / 'subdir'. -BASE_DIR = Path(__file__).resolve().parent.parent - -SECRET_KEY = os.environ.get("CARER_SECRET_KEY") - -INSTALLED_APPS = [ - "carer.mtwerk", -] - -LANGUAGE_CODE = "en-us" -TIME_ZONE = "UTC" -USE_I18N = True -USE_TZ = True - -DEFAULT_AUTO_FIELD = "django.db.models.BigAutoField" diff --git a/carer/carer/settings/unittest.py b/carer/carer/settings/unittest.py deleted file mode 100644 index a147794..0000000 --- a/carer/carer/settings/unittest.py +++ /dev/null @@ -1,30 +0,0 @@ -import os - -# noinspection PyUnresolvedReferences -from .base import * - -DEBUG = True -ALLOWED_HOSTS = ["*"] - -DEFAULT_HTTP_PROTOCOL = "https" -CSRF_COOKIE_HTTPONLY = True # Get from page, never cookie - -DB_NAME = os.environ.get("DB_NAME") -DB_USER = os.environ.get("DB_USER") -DB_PASSWORD = os.environ.get("DB_PASSWORD") -DB_POSTGRESQL_HOST = os.environ.get("DB_POSTGRESQL_HOST") - -DATABASES = dict( - default={ - "ENGINE": "django.db.backends.postgresql", - "NAME": DB_NAME, - "USER": DB_USER, - "PASSWORD": DB_PASSWORD, - "HOST": DB_POSTGRESQL_HOST, - "PORT": "5432", - "ENCODING": "utf8mb4", - "COLLATION": "utf8mb4_unicode_520_ci", - } -) - -print(f"Using test database: {DB_NAME} on {DATABASES['default']['HOST']}") diff --git a/carer/manage.py b/carer/manage.py deleted file mode 100644 index 091b39b..0000000 --- a/carer/manage.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python -"""Django's command-line utility for administrative tasks.""" -import os -import sys - - -def main(): - """Run administrative tasks.""" - os.environ.setdefault("DJANGO_SETTINGS_MODULE", "carer.settings") - try: - from django.core.management import execute_from_command_line - except ImportError as exc: - raise ImportError( - "Couldn't import Django. Are you sure it's installed and " - "available on your PYTHONPATH environment variable? Did you " - "forget to activate a virtual environment?" - ) from exc - execute_from_command_line(sys.argv) - - -if __name__ == "__main__": - main() diff --git a/carer/mtwerk/__init__.py b/carer/mtwerk/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/carer/mtwerk/migrations/0001_initial.py b/carer/mtwerk/migrations/0001_initial.py new file mode 100644 index 0000000..d5c856a --- /dev/null +++ b/carer/mtwerk/migrations/0001_initial.py @@ -0,0 +1,157 @@ +# Generated by Django 5.2.7 on 2025-10-28 22:06 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='Hit', + fields=[ + ('id', models.BigAutoField(primary_key=True, serialize=False)), + ('amt_hit_id', models.CharField(max_length=30, unique=True)), + ('amt_group_id', models.CharField(max_length=30)), + ('status', models.SmallIntegerField()), + ('review_status', models.SmallIntegerField()), + ('creation_time', models.DateTimeField()), + ('expiration', models.DateTimeField()), + ('created_at', models.DateTimeField(auto_now_add=True)), + ('modified_at', models.DateTimeField(auto_now=True)), + ('max_assignments', models.IntegerField(default=1)), + ('assignment_pending_count', models.IntegerField(default=0)), + ('assignment_available_count', models.IntegerField(default=0)), + ('assignment_completed_count', models.IntegerField(default=0)), + ], + options={ + 'db_table': 'mtwerk_hit', + }, + ), + migrations.CreateModel( + name='Assignment', + fields=[ + ('id', models.BigAutoField(primary_key=True, serialize=False)), + ('amt_assignment_id', models.CharField(max_length=30, unique=True)), + ('amt_worker_id', models.CharField(max_length=30)), + ('status', models.SmallIntegerField()), + ('auto_approval_time', models.DateTimeField(null=True)), + ('accept_time', models.DateTimeField(null=True)), + ('submit_time', models.DateTimeField(null=True)), + ('approval_time', models.DateTimeField(null=True)), + ('rejection_time', models.DateTimeField(null=True)), + ('requester_feedback', models.CharField(max_length=1024, null=True)), + ('created_at', models.DateTimeField(auto_now_add=True)), + ('modified_at', models.DateTimeField(auto_now=True)), + ('tsid', models.UUIDField(null=True)), + ('hit', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='mtwerk.hit')), + ], + options={ + 'db_table': 'mtwerk_assignment', + }, + ), + migrations.CreateModel( + name='HitType', + fields=[ + ('id', models.AutoField(primary_key=True, serialize=False)), + ('amt_hit_type_id', models.CharField(max_length=30, unique=True)), + ('title', models.CharField(max_length=200)), + ('description', models.CharField(max_length=2000)), + ('reward', models.DecimalField(decimal_places=2, max_digits=8)), + ('assignment_duration', models.PositiveIntegerField()), + ('auto_approval_delay', models.PositiveIntegerField()), + ('keywords', models.CharField(max_length=256)), + ('min_active', models.IntegerField(default=0)), + ], + options={ + 'db_table': 'mtwerk_hittype', + 'indexes': [models.Index(fields=['amt_hit_type_id'], name='mtwerk_hitt_amt_hit_05dd10_idx'), models.Index(fields=['min_active'], name='mtwerk_hitt_min_act_e18222_idx')], + }, + ), + migrations.AddField( + model_name='hit', + name='hit_type', + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='mtwerk.hittype'), + ), + migrations.CreateModel( + name='Question', + fields=[ + ('id', models.AutoField(primary_key=True, serialize=False)), + ('url', models.URLField()), + ('height', models.IntegerField(default=1200)), + ], + options={ + 'db_table': 'mtwerk_question', + 'unique_together': {('url', 'height')}, + }, + ), + migrations.AddField( + model_name='hit', + name='question', + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='mtwerk.question'), + ), + migrations.CreateModel( + name='Bonus', + fields=[ + ('id', models.BigAutoField(primary_key=True, serialize=False)), + ('payout_event_id', models.UUIDField(unique=True)), + ('amt_worker_id', models.CharField(max_length=30, null=True)), + ('amount', models.DecimalField(decimal_places=2, max_digits=10)), + ('grant_time', models.DateTimeField()), + ('reason', models.CharField(max_length=1024)), + ('assignment', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='mtwerk.assignment')), + ], + options={ + 'indexes': [models.Index(fields=['amt_worker_id'], name='mtwerk_bonu_amt_wor_77d514_idx'), models.Index(fields=['grant_time'], name='mtwerk_bonu_grant_t_d43c6c_idx')], + }, + ), + migrations.AddIndex( + model_name='assignment', + index=models.Index(fields=['amt_worker_id'], name='mtwerk_assi_amt_wor_7dbe42_idx'), + ), + migrations.AddIndex( + model_name='assignment', + index=models.Index(fields=['status'], name='mtwerk_assi_status_4e01de_idx'), + ), + migrations.AddIndex( + model_name='assignment', + index=models.Index(fields=['submit_time'], name='mtwerk_assi_submit__429d3e_idx'), + ), + migrations.AddIndex( + model_name='assignment', + index=models.Index(fields=['created_at'], name='mtwerk_assi_created_9292fa_idx'), + ), + migrations.AddIndex( + model_name='assignment', + index=models.Index(fields=['modified_at'], name='mtwerk_assi_modifie_44f1d0_idx'), + ), + migrations.AddIndex( + model_name='assignment', + index=models.Index(fields=['tsid'], name='mtwerk_assi_tsid_bd796d_idx'), + ), + migrations.AddIndex( + model_name='hit', + index=models.Index(fields=['status'], name='mtwerk_hit_status_ae726f_idx'), + ), + migrations.AddIndex( + model_name='hit', + index=models.Index(fields=['review_status'], name='mtwerk_hit_review__a9f420_idx'), + ), + migrations.AddIndex( + model_name='hit', + index=models.Index(fields=['creation_time'], name='mtwerk_hit_creatio_48e0fd_idx'), + ), + migrations.AddIndex( + model_name='hit', + index=models.Index(fields=['created_at'], name='mtwerk_hit_created_f1614b_idx'), + ), + migrations.AddIndex( + model_name='hit', + index=models.Index(fields=['modified_at'], name='mtwerk_hit_modifie_45c2ed_idx'), + ), + ] diff --git a/carer/mtwerk/migrations/__init__.py b/carer/mtwerk/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/carer/mtwerk/models.py b/carer/mtwerk/models.py new file mode 100644 index 0000000..5cb026d --- /dev/null +++ b/carer/mtwerk/models.py @@ -0,0 +1,130 @@ +from django.db import models + + +class Question(models.Model): + """The iFrame location and details for a HIT""" + + id = models.AutoField(primary_key=True) + + url = models.URLField(max_length=200) + height = models.IntegerField(default=1200) + + class Meta: + db_table = "mtwerk_question" + unique_together = ["url", "height"] + + +class HitType(models.Model): + id = models.AutoField(primary_key=True) + amt_hit_type_id = models.CharField(max_length=30, unique=True) + + title = models.CharField(max_length=200) + description = models.CharField(max_length=2000) + reward = models.DecimalField(decimal_places=2, max_digits=8) + assignment_duration = models.PositiveIntegerField() + auto_approval_delay = models.PositiveIntegerField() + keywords = models.CharField(max_length=256) + + # If set, don't let the active HIT count drop below this amount + min_active = models.IntegerField(null=False, default=0) + + class Meta: + db_table = "mtwerk_hittype" + indexes = [ + models.Index(fields=["amt_hit_type_id"]), + models.Index(fields=["min_active"]), + ] + + +class Hit(models.Model): + id = models.BigAutoField(primary_key=True) + amt_hit_id = models.CharField(max_length=30, unique=True) + + hit_type = models.ForeignKey(HitType, on_delete=models.PROTECT) + + amt_group_id = models.CharField(max_length=30) + + status = models.SmallIntegerField(null=False) + review_status = models.SmallIntegerField(null=False) + creation_time = models.DateTimeField(null=False) + expiration = models.DateTimeField(null=False) + + question = models.ForeignKey(Question, on_delete=models.PROTECT) + created_at = models.DateTimeField(null=False, auto_now_add=True) + modified_at = models.DateTimeField(null=False, auto_now=True) + + max_assignments = models.IntegerField(null=False, default=1) + assignment_pending_count = models.IntegerField(null=False, default=0) + assignment_available_count = models.IntegerField(null=False, default=0) + assignment_completed_count = models.IntegerField(null=False, default=0) + + class Meta: + db_table = "mtwerk_hit" + indexes = [ + models.Index(fields=["status"]), + models.Index(fields=["review_status"]), + models.Index(fields=["creation_time"]), + models.Index(fields=["created_at"]), + models.Index(fields=["modified_at"]), + ] + + +class Assignment(models.Model): + id = models.BigAutoField(primary_key=True) + amt_assignment_id = models.CharField(max_length=30, unique=True) + + amt_worker_id = models.CharField(max_length=30, null=False) + + hit = models.ForeignKey(Hit, on_delete=models.PROTECT) + + status = models.SmallIntegerField(null=False) + + auto_approval_time = models.DateTimeField(null=True) + accept_time = models.DateTimeField(null=True) + submit_time = models.DateTimeField(null=True) + approval_time = models.DateTimeField(null=True) + rejection_time = models.DateTimeField(null=True) + + # Don't need this + # answer = models.CharField + + requester_feedback = models.CharField(null=True, max_length=1024) + + # Internal tracking + created_at = models.DateTimeField(null=False, auto_now_add=True) + modified_at = models.DateTimeField(null=False, auto_now=True) + tsid = models.UUIDField(null=True) + + class Meta: + db_table = "mtwerk_assignment" + indexes = [ + models.Index(fields=["amt_worker_id"]), + models.Index(fields=["status"]), + models.Index(fields=["submit_time"]), + models.Index(fields=["created_at"]), + models.Index(fields=["modified_at"]), + models.Index(fields=["tsid"]), + ] + + +class Bonus(models.Model): + """Issued bonuses to workers for supplemental payments""" + + id = models.BigAutoField(primary_key=True) + payout_event_id = models.UUIDField(null=False, unique=True) + + amt_worker_id = models.CharField(max_length=30, null=True) + + # Not unique=True because maybe multiple Bonuses will be associated + # with a single Assignment + assignment = models.ForeignKey(Assignment, null=False, on_delete=models.PROTECT) + + amount = models.DecimalField(max_digits=10, decimal_places=2) + grant_time = models.DateTimeField(null=False) + reason = models.CharField(max_length=1024) + + class Meta: + indexes = [ + models.Index(fields=["amt_worker_id"]), + models.Index(fields=["grant_time"]), + ] -- cgit v1.2.3