From 13107bf0d48d500449b2c684ea251255a40adbce Mon Sep 17 00:00:00 2001 From: roseva1 Date: Mon, 13 Nov 2023 15:00:56 -0500 Subject: [PATCH 1/8] batch bookmark model added --- turkle/models.py | 6 +++++ turkle/templates/turkle/base.html | 5 +++- turkle/templates/turkle/index.html | 40 +++++++++++++++++++++++++++ turkle/views.py | 43 +++++++++++++++++++++++++++--- 4 files changed, 90 insertions(+), 4 deletions(-) diff --git a/turkle/models.py b/turkle/models.py index abed6d47..acd1396a 100644 --- a/turkle/models.py +++ b/turkle/models.py @@ -939,3 +939,9 @@ def completed_assignments(self): def most_recent(self): return self.last_finished_time most_recent.admin_order_field = 'last_finished_time' + + +class Bookmark(models.Model): + user = models.ForeignKey(User, on_delete=models.CASCADE) + batch = models.ForeignKey(Batch, on_delete=models.CASCADE) + bookmarked = models.BooleanField(default=False) diff --git a/turkle/templates/turkle/base.html b/turkle/templates/turkle/base.html index 25e0067c..c43b6029 100644 --- a/turkle/templates/turkle/base.html +++ b/turkle/templates/turkle/base.html @@ -62,5 +62,8 @@ {% block footer %} {% endblock %} + + {% block script %} + {% endblock %} - + \ No newline at end of file diff --git a/turkle/templates/turkle/index.html b/turkle/templates/turkle/index.html index 06dd2a44..699f0b95 100644 --- a/turkle/templates/turkle/index.html +++ b/turkle/templates/turkle/index.html @@ -39,6 +39,7 @@ Project Batch Batch Published + Batch Bookmarked Tasks Available @@ -48,6 +49,9 @@ {{ batch_row.project_name }} {{ batch_row.batch_name }} {{ batch_row.batch_published }} + + + {{ batch_row.assignments_available }} @@ -74,3 +78,39 @@

{% endblock %} + +{% block script %} + + +{% endblock %} \ No newline at end of file diff --git a/turkle/views.py b/turkle/views.py index 4545524f..47d45fe2 100644 --- a/turkle/views.py +++ b/turkle/views.py @@ -5,7 +5,7 @@ import urllib from django.conf import settings -from django.contrib import messages +from django.contrib import messages, auth from django.contrib.auth import get_user_model from django.core.exceptions import ObjectDoesNotExist from django.db import connection, transaction @@ -17,7 +17,7 @@ from django.utils.dateparse import parse_date from django.utils.datastructures import MultiValueDictKeyError -from .models import Task, TaskAssignment, Batch, Project +from .models import Task, TaskAssignment, Batch, Project, Bookmark User = get_user_model() @@ -41,6 +41,12 @@ def wrapper(request, *args, **kwargs): return wrapper +def get_user(request): + if not hasattr(request, '_cached_user'): + request._cached_user = auth.get_user(request) + return request._cached_user + + def index(request): """ Security behavior: @@ -63,21 +69,52 @@ def index(request): available_task_counts = Batch.available_task_counts_for(batch_query, request.user) + if request.POST: + def process_bookmark(query_dict): + """Create or update bookmark status for a batch & user + """ + batch_name = query_dict.get('rowId') + bookmark_status = query_dict.get('bookmarked') == 'true' + batch = Batch.objects.get(name=batch_name) + bookmark, created = Bookmark.objects.get_or_create( + user=get_user(request), + batch=batch, + defaults={'bookmarked': bookmark_status} + ) + if not created: + bookmark.bookmarked = bookmark_status + bookmark.save() + + if request.POST: + print(request.POST) + if 'bookmarking' in request.POST.get('action'): + process_bookmark(request.POST) + batch_rows = [] for batch in batch_query.values('created_at', 'id', 'name', 'project__name'): - total_tasks_available = available_task_counts[batch['id']] + def get_bookmark_status(batch): + """Access batch bookmark status for a user + """ + bookmark = Bookmark.objects.filter( + user=get_user(request), + batch__name=batch['name'] + ).values_list('bookmarked', flat=True).first() + return 'checked' if bookmark else '' + total_tasks_available = available_task_counts[batch['id']] if total_tasks_available > 0: batch_rows.append({ 'project_name': batch['project__name'], 'batch_name': batch['name'], 'batch_published': batch['created_at'], 'assignments_available': total_tasks_available, + 'selected': get_bookmark_status(batch), 'preview_next_task_url': reverse('preview_next_task', kwargs={'batch_id': batch['id']}), 'accept_next_task_url': reverse('accept_next_task', kwargs={'batch_id': batch['id']}) }) + return render(request, 'turkle/index.html', { 'abandoned_assignments': abandoned_assignments, 'batch_rows': batch_rows From 87ad55150f615dd10c63f88bab51f0f44199d26c Mon Sep 17 00:00:00 2001 From: roseva1 Date: Tue, 14 Nov 2023 08:42:30 -0500 Subject: [PATCH 2/8] migration file --- turkle/migrations/0014_bookmark.py | 44 ++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 turkle/migrations/0014_bookmark.py diff --git a/turkle/migrations/0014_bookmark.py b/turkle/migrations/0014_bookmark.py new file mode 100644 index 00000000..18e373f7 --- /dev/null +++ b/turkle/migrations/0014_bookmark.py @@ -0,0 +1,44 @@ +# Generated by Django 4.2.6 on 2023-11-14 13:41 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ("turkle", "0013_activeproject_activeuser"), + ] + + operations = [ + migrations.CreateModel( + name="Bookmark", + fields=[ + ( + "id", + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("bookmarked", models.BooleanField(default=False)), + ( + "batch", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, to="turkle.batch" + ), + ), + ( + "user", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + to=settings.AUTH_USER_MODEL, + ), + ), + ], + ), + ] From 38e6d8c82c8db48502015f157f39eb55b83dbbe3 Mon Sep 17 00:00:00 2001 From: roseva1 Date: Tue, 14 Nov 2023 08:48:37 -0500 Subject: [PATCH 3/8] catch case of anonymous user --- turkle/views.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/turkle/views.py b/turkle/views.py index 47d45fe2..0cb5df5d 100644 --- a/turkle/views.py +++ b/turkle/views.py @@ -86,7 +86,6 @@ def process_bookmark(query_dict): bookmark.save() if request.POST: - print(request.POST) if 'bookmarking' in request.POST.get('action'): process_bookmark(request.POST) @@ -101,6 +100,7 @@ def get_bookmark_status(batch): ).values_list('bookmarked', flat=True).first() return 'checked' if bookmark else '' + bookmark_status = get_bookmark_status(batch) if request.user.is_authenticated else '' total_tasks_available = available_task_counts[batch['id']] if total_tasks_available > 0: batch_rows.append({ @@ -108,7 +108,7 @@ def get_bookmark_status(batch): 'batch_name': batch['name'], 'batch_published': batch['created_at'], 'assignments_available': total_tasks_available, - 'selected': get_bookmark_status(batch), + 'selected': bookmark_status, 'preview_next_task_url': reverse('preview_next_task', kwargs={'batch_id': batch['id']}), 'accept_next_task_url': reverse('accept_next_task', From fc17dd62c93e62b21ad557f3852dfd06190189c9 Mon Sep 17 00:00:00 2001 From: roseva1 Date: Thu, 29 Feb 2024 11:18:08 -0500 Subject: [PATCH 4/8] inclusion of abandoned and bookmark tables --- turkle/migrations/0014_bookmark.py | 2 +- turkle/static/turkle/css/turkle.css | 27 +++ turkle/templates/turkle/base.html | 6 +- turkle/templates/turkle/index.html | 319 ++++++++++++++++++++-------- turkle/views.py | 2 +- 5 files changed, 263 insertions(+), 93 deletions(-) diff --git a/turkle/migrations/0014_bookmark.py b/turkle/migrations/0014_bookmark.py index 18e373f7..a10c66a4 100644 --- a/turkle/migrations/0014_bookmark.py +++ b/turkle/migrations/0014_bookmark.py @@ -1,4 +1,4 @@ -# Generated by Django 4.2.6 on 2023-11-14 13:41 +# Generated by Django 4.2.6 on 2024-02-08 15:16 from django.conf import settings from django.db import migrations, models diff --git a/turkle/static/turkle/css/turkle.css b/turkle/static/turkle/css/turkle.css index e85366f4..37a53a87 100644 --- a/turkle/static/turkle/css/turkle.css +++ b/turkle/static/turkle/css/turkle.css @@ -62,3 +62,30 @@ div.task-preview { background: #fff; opacity: 0.8; } +.table-alert{ + margin-bottom: 0; + height: 100%; +} +.column-div { + float: left; + width: 50%; + border-radius: 5px; + padding: 5pt; + position: relative; + overflow: hidden; + height: 100%; +} + +.table-header, .table-body { + width: 100%; + table-layout: fixed; + border-collapse: collapse; +} +.table-body-container { + height: 12vh; + overflow-y: auto; +} +.column-div th, td { + text-align: left; + padding: 8px; +} diff --git a/turkle/templates/turkle/base.html b/turkle/templates/turkle/base.html index c43b6029..11f33de1 100644 --- a/turkle/templates/turkle/base.html +++ b/turkle/templates/turkle/base.html @@ -8,9 +8,11 @@ {% load turkle_tags %}{% for tag in turkle_meta_tags %}{{ tag|meta_tag }}{% endfor %} - - + + + + {% block head %} {% endblock %} diff --git a/turkle/templates/turkle/index.html b/turkle/templates/turkle/index.html index 699f0b95..30ac5f09 100644 --- a/turkle/templates/turkle/index.html +++ b/turkle/templates/turkle/index.html @@ -2,115 +2,256 @@ {% load static %} {% block body %} +{% if batch_rows %} + +
+