diff options
Diffstat (limited to 'carer')
| -rw-r--r-- | carer/README.md | 20 | ||||
| -rw-r--r-- | carer/__init__.py | 0 | ||||
| -rw-r--r-- | carer/carer/__init__.py | 0 | ||||
| -rw-r--r-- | carer/carer/mtwerk/__init__.py | 0 | ||||
| -rw-r--r-- | carer/carer/mtwerk/migrations/0001_initial.py | 157 | ||||
| -rw-r--r-- | carer/carer/mtwerk/migrations/__init__.py | 0 | ||||
| -rw-r--r-- | carer/carer/mtwerk/models.py | 130 | ||||
| -rw-r--r-- | carer/manage.py | 22 | ||||
| -rw-r--r-- | carer/requirements.txt | 4 |
9 files changed, 333 insertions, 0 deletions
diff --git a/carer/README.md b/carer/README.md new file mode 100644 index 0000000..e5f9123 --- /dev/null +++ b/carer/README.md @@ -0,0 +1,20 @@ +# amt-jb + +This refers to the Django carer that handles DB models + +## Environment + +- amt-jb-carer: (amt-jb-carer-venv) Python 3.13.7 + + +```shell + +python3.13 -m venv /root/amt-jb-carer-venv +source /root/amt-jb-carer-venv/bin/activate +pip install -U pip setuptools wheel +cd ~/amt-jb/carer/ +pip install -r requirements.txt + +python3 manage.py makemigrations mtwerk --settings=carer.settings.production +python3 manage.py migrate mtwerk --settings=carer.settings.production +```
\ No newline at end of file diff --git a/carer/__init__.py b/carer/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/carer/__init__.py diff --git a/carer/carer/__init__.py b/carer/carer/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/carer/carer/__init__.py diff --git a/carer/carer/mtwerk/__init__.py b/carer/carer/mtwerk/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/carer/carer/mtwerk/__init__.py diff --git a/carer/carer/mtwerk/migrations/0001_initial.py b/carer/carer/mtwerk/migrations/0001_initial.py new file mode 100644 index 0000000..d5c856a --- /dev/null +++ b/carer/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/carer/mtwerk/migrations/__init__.py b/carer/carer/mtwerk/migrations/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/carer/carer/mtwerk/migrations/__init__.py diff --git a/carer/carer/mtwerk/models.py b/carer/carer/mtwerk/models.py new file mode 100644 index 0000000..5cb026d --- /dev/null +++ b/carer/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"]), + ] diff --git a/carer/manage.py b/carer/manage.py new file mode 100644 index 0000000..091b39b --- /dev/null +++ b/carer/manage.py @@ -0,0 +1,22 @@ +#!/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/requirements.txt b/carer/requirements.txt new file mode 100644 index 0000000..f4f866e --- /dev/null +++ b/carer/requirements.txt @@ -0,0 +1,4 @@ +asgiref==3.10.0 +Django==5.2.7 +psycopg==3.2.10 +sqlparse==0.5.3 |
