From 695153bf0bf32eb51cea1a853e97e089a8c12e58 Mon Sep 17 00:00:00 2001 From: Jennifer Kuenning <72825410+jkueloc@users.noreply.github.com> Date: Mon, 12 Aug 2024 07:19:22 -0400 Subject: [PATCH 01/28] revert bad merge to release (#2484) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Install non-English languages with tesseract (#2421) * Removed inadvertent addition of review_count to user admin (#2474) * Fixed misspelling (#2476) * Revert "Merge branch 'main' into release" This reverts commit 0d1b6f047bfa539f9c174a7c61d8527ca7df1910, reversing changes made to 2ad61b57b61a0c3c552e62d5758c25f76531cf07. This merge to release was a mistake and needs to be reverted. --------- Co-authored-by: Josh Stegmaier <104993387+joshuastegmaier@users.noreply.github.com> --- .eslintrc.yaml | 1 - concordia/admin/__init__.py | 44 +- concordia/admin/filters.py | 21 +- concordia/admin/forms.py | 18 +- concordia/documents.py | 3 - ...tions_userprofile_review_count_and_more.py | 43 - .../0098_userprofile_create_and_population.py | 40 - concordia/models.py | 154 +- concordia/signals/handlers.py | 8 +- concordia/static/js/src/asset-reservation.js | 16 +- concordia/static/js/src/banner.js | 18 - concordia/static/js/src/contribute.js | 23 - concordia/static/js/src/guide.js | 86 -- concordia/static/js/src/ocr.js | 7 - concordia/static/js/src/quick-tips.js | 38 - concordia/static/js/src/viewer-split.js | 146 -- concordia/static/js/src/viewer.js | 200 --- concordia/tasks.py | 12 +- .../admin/concordia/item/change_form.html | 15 + .../admin/concordia/topic/change_form.html | 19 + .../templates/emails/unusual_activity.txt | 2 +- .../transcriptions/asset_detail.html | 1239 ++++++++++++++++- .../asset_reservation_failure_modal.html | 19 - .../asset_detail/captcha_modal.html | 38 - .../transcriptions/asset_detail/editor.html | 118 -- .../language_selection_modal.html | 33 - .../asset_detail/navigation.html | 49 - .../asset_detail/ocr_help_modal.html | 27 - .../asset_detail/ocr_transcription_modal.html | 24 - .../asset_detail/quick_tips_modal.html | 42 - .../asset_detail/review_accepted_modal.html | 35 - .../successful_submission_modal.html | 35 - .../transcriptions/asset_detail/tags.html | 47 - .../transcriptions/asset_detail/viewer.html | 121 -- .../asset_detail/viewer_filters.html | 125 -- .../transcriptions/topic_detail.html | 4 +- concordia/tests/test_admin.py | 6 +- concordia/tests/test_models.py | 142 +- concordia/tests/test_views.py | 9 +- exporter/tabular_export/admin.py | 22 +- 40 files changed, 1377 insertions(+), 1672 deletions(-) delete mode 100644 concordia/migrations/0097_alter_sitereport_options_userprofile_review_count_and_more.py delete mode 100644 concordia/migrations/0098_userprofile_create_and_population.py delete mode 100644 concordia/static/js/src/banner.js delete mode 100644 concordia/static/js/src/guide.js delete mode 100644 concordia/static/js/src/ocr.js delete mode 100644 concordia/static/js/src/quick-tips.js delete mode 100644 concordia/static/js/src/viewer-split.js delete mode 100644 concordia/static/js/src/viewer.js create mode 100644 concordia/templates/admin/concordia/topic/change_form.html delete mode 100644 concordia/templates/transcriptions/asset_detail/asset_reservation_failure_modal.html delete mode 100644 concordia/templates/transcriptions/asset_detail/captcha_modal.html delete mode 100644 concordia/templates/transcriptions/asset_detail/editor.html delete mode 100644 concordia/templates/transcriptions/asset_detail/language_selection_modal.html delete mode 100644 concordia/templates/transcriptions/asset_detail/navigation.html delete mode 100644 concordia/templates/transcriptions/asset_detail/ocr_help_modal.html delete mode 100644 concordia/templates/transcriptions/asset_detail/ocr_transcription_modal.html delete mode 100644 concordia/templates/transcriptions/asset_detail/quick_tips_modal.html delete mode 100644 concordia/templates/transcriptions/asset_detail/review_accepted_modal.html delete mode 100644 concordia/templates/transcriptions/asset_detail/successful_submission_modal.html delete mode 100644 concordia/templates/transcriptions/asset_detail/tags.html delete mode 100644 concordia/templates/transcriptions/asset_detail/viewer.html delete mode 100644 concordia/templates/transcriptions/asset_detail/viewer_filters.html diff --git a/.eslintrc.yaml b/.eslintrc.yaml index 56959c746..989beb8c0 100644 --- a/.eslintrc.yaml +++ b/.eslintrc.yaml @@ -15,7 +15,6 @@ rules: 'unicorn/prefer-query-selector': off # See https://github.com/sindresorhus/eslint-plugin-unicorn/issues/276 'unicorn/prefer-node-append': off 'unicorn/prefer-ternary': off - 'unicorn/no-lonely-if': off env: browser: true es2024: true diff --git a/concordia/admin/__init__.py b/concordia/admin/__init__.py index 46a8081e9..0462e8891 100644 --- a/concordia/admin/__init__.py +++ b/concordia/admin/__init__.py @@ -9,6 +9,7 @@ from django.contrib.auth.admin import UserAdmin from django.contrib.auth.decorators import permission_required from django.contrib.auth.models import User +from django.db.models import Count from django.http import HttpResponseRedirect from django.shortcuts import get_object_or_404, render from django.template.defaultfilters import truncatechars @@ -79,7 +80,6 @@ SubmittedFilter, TagCampaignListFilter, TagCampaignStatusListFilter, - TopicListFilter, TranscriptionCampaignListFilter, TranscriptionCampaignStatusListFilter, TranscriptionProjectListFilter, @@ -93,9 +93,8 @@ CampaignAdminForm, CardAdminForm, GuideAdminForm, - ItemAdminForm, ProjectAdminForm, - TopicAdminForm, + SanitizedDescriptionAdminForm, ) logger = logging.getLogger(__name__) @@ -108,22 +107,16 @@ class ConcordiaUserAdmin(UserAdmin): "is_staff", "date_joined", "transcription_count", - "review_count", ) def get_queryset(self, request): - qs = super().get_queryset(request).select_related("profile") + qs = super().get_queryset(request) + qs = qs.annotate(Count("transcription")) return qs - @admin.display( - description="Transcription Count", ordering="profile__transcribe_count" - ) + @admin.display(ordering="transcription__count") def transcription_count(self, obj): - return obj.profile.transcribe_count - - @admin.display(description="Review Count", ordering="profile__review_count") - def review_count(self, obj): - return obj.profile.review_count + return obj.transcription__count EXPORT_FIELDS = ( "username", @@ -135,31 +128,17 @@ def review_count(self, obj): "is_superuser", "date_joined", "last_login", - "profile__transcribe_count", - "profile__review_count", + "transcription__count", ) - EXTRA_VERBOSE_NAMES = { - "profile__transcribe_count": "transcription count", - "profile__review_count": "review count", - } - def export_users_as_csv(self, request, queryset): return export_to_csv_action( - self, - request, - queryset, - field_names=self.EXPORT_FIELDS, - extra_verbose_names=self.EXTRA_VERBOSE_NAMES, + self, request, queryset, field_names=self.EXPORT_FIELDS ) def export_users_as_excel(self, request, queryset): return export_to_excel_action( - self, - request, - queryset, - field_names=self.EXPORT_FIELDS, - extra_verbose_names=self.EXTRA_VERBOSE_NAMES, + self, request, queryset, field_names=self.EXPORT_FIELDS ) actions = (anonymize_action, export_users_as_csv, export_users_as_excel) @@ -379,8 +358,8 @@ class ResourceAdmin(admin.ModelAdmin, CustomListDisplayFieldsMixin): list_filter = ( "resource_type", ResourceCampaignStatusListFilter, - TopicListFilter, ResourceCampaignListFilter, + "title", ) def formfield_for_foreignkey(self, db_field, request, **kwargs): @@ -417,7 +396,7 @@ def get_fields(self, request, obj=None): @admin.register(Topic) class TopicAdmin(admin.ModelAdmin): - form = TopicAdminForm + form = SanitizedDescriptionAdminForm list_display = ( "id", @@ -544,7 +523,6 @@ def item_import_view(self, request, object_id): @admin.register(Item) class ItemAdmin(admin.ModelAdmin): - form = ItemAdminForm list_display = ("title", "item_id", "campaign_title", "project", "published") list_display_links = ("title", "item_id") search_fields = [ diff --git a/concordia/admin/filters.py b/concordia/admin/filters.py index 4148a0d5b..236c31337 100644 --- a/concordia/admin/filters.py +++ b/concordia/admin/filters.py @@ -1,7 +1,7 @@ from django.contrib import admin from django.utils.translation import gettext_lazy as _ -from ..models import Campaign, Project, Topic +from ..models import Campaign, Project class NullableTimestampFilter(admin.SimpleListFilter): @@ -92,25 +92,6 @@ def queryset(self, request, queryset): return queryset -class TopicListFilter(admin.SimpleListFilter): - """ - Base class for admin topic filters - """ - - title = "Topic" - template = "admin/long_name_filter.html" - parameter_name = "topic__id__exact" - - def lookups(self, request, model_admin): - queryset = Topic.objects.all() - return queryset.values_list("id", "title").order_by("title") - - def queryset(self, request, queryset): - if self.value(): - return queryset.filter(**{self.parameter_name: self.value()}) - return queryset - - class ProjectCampaignListFilter(CampaignListFilter): parameter_name = "campaign__id__exact" status_filter_parameter = "campaign__status" diff --git a/concordia/admin/forms.py b/concordia/admin/forms.py index 49df703b5..ff3011a36 100644 --- a/concordia/admin/forms.py +++ b/concordia/admin/forms.py @@ -3,7 +3,7 @@ from django.core.cache import caches from tinymce.widgets import TinyMCE -from ..models import Campaign, Card, Guide, Item, Project, Topic +from ..models import Campaign, Card, Guide, Project FRAGMENT_ALLOWED_TAGS = { "a", @@ -90,15 +90,6 @@ def clean_short_description(self): ) -class TopicAdminForm(SanitizedDescriptionAdminForm): - class Meta(SanitizedDescriptionAdminForm.Meta): - model = Topic - widgets = { - "description": TinyMCE(), - "short_description": TinyMCE(), - } - - class CampaignAdminForm(SanitizedDescriptionAdminForm): class Meta(SanitizedDescriptionAdminForm.Meta): model = Campaign @@ -117,13 +108,6 @@ class Meta(SanitizedDescriptionAdminForm.Meta): } -class ItemAdminForm(forms.ModelForm): - class Meta: - model = Item - widgets = {"description": TinyMCE()} - fields = "__all__" - - class CardAdminForm(forms.ModelForm): class Meta: model = Card diff --git a/concordia/documents.py b/concordia/documents.py index 1060e3a6e..1a0620914 100644 --- a/concordia/documents.py +++ b/concordia/documents.py @@ -41,7 +41,6 @@ class Django: fields = [ "created_on", - "report_name", "assets_total", "assets_published", "assets_not_started", @@ -55,14 +54,12 @@ class Django: "projects_unpublished", "anonymous_transcriptions", "transcriptions_saved", - "daily_review_actions", "distinct_tags", "tag_uses", "campaigns_published", "campaigns_unpublished", "users_registered", "users_activated", - "registered_contributors", "daily_active_users", ] diff --git a/concordia/migrations/0097_alter_sitereport_options_userprofile_review_count_and_more.py b/concordia/migrations/0097_alter_sitereport_options_userprofile_review_count_and_more.py deleted file mode 100644 index 73264a261..000000000 --- a/concordia/migrations/0097_alter_sitereport_options_userprofile_review_count_and_more.py +++ /dev/null @@ -1,43 +0,0 @@ -# Generated by Django 4.2.13 on 2024-07-29 17:30 - -import django.db.models.deletion -from django.conf import settings -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ("concordia", "0096_transcription_source"), - ] - - operations = [ - migrations.AlterModelOptions( - name="sitereport", - options={"get_latest_by": "created_on", "ordering": ("-created_on",)}, - ), - migrations.AddField( - model_name="userprofile", - name="review_count", - field=models.IntegerField( - default=0, verbose_name="transcription review count" - ), - ), - migrations.AddField( - model_name="userprofile", - name="transcribe_count", - field=models.IntegerField( - default=0, verbose_name="transcription save/submit count" - ), - ), - migrations.AlterField( - model_name="userprofile", - name="user", - field=models.OneToOneField( - on_delete=django.db.models.deletion.CASCADE, - related_name="profile", - to=settings.AUTH_USER_MODEL, - ), - ), - ] diff --git a/concordia/migrations/0098_userprofile_create_and_population.py b/concordia/migrations/0098_userprofile_create_and_population.py deleted file mode 100644 index 36efd5bc7..000000000 --- a/concordia/migrations/0098_userprofile_create_and_population.py +++ /dev/null @@ -1,40 +0,0 @@ -# Generated by Django 4.2.13 on 2024-07-29 17:40 - -from django.conf import settings -from django.db import migrations - - -def create_and_populate_profiles(apps, schema_editor): - User = apps.get_model("auth", "User") - UserProfile = apps.get_model("concordia", "UserProfile") - db_alias = schema_editor.connection.alias - for user in User.objects.using(db_alias).all().iterator(chunk_size=10000): - profile, created = UserProfile.objects.using(db_alias).get_or_create(user=user) - for activity in user.userprofileactivity_set.all(): - profile.transcribe_count += activity.transcribe_count - profile.review_count += activity.review_count - profile.save() - - -def revert_create_and_populate_profiles(apps, schema_editor): - # We can't actually revert the data to the state it was before, - # and there's no actual need to, but we need this function to be - # able to reverse this migration - pass - - -class Migration(migrations.Migration): - - dependencies = [ - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ( - "concordia", - "0097_alter_sitereport_options_userprofile_review_count_and_more", - ), - ] - - operations = [ - migrations.RunPython( - create_and_populate_profiles, revert_create_and_populate_profiles - ), - ] diff --git a/concordia/models.py b/concordia/models.py index e9c8b7939..495082209 100644 --- a/concordia/models.py +++ b/concordia/models.py @@ -11,7 +11,7 @@ from django.core.cache import cache from django.core.exceptions import ValidationError from django.core.validators import RegexValidator -from django.db import models +from django.db import connection, models from django.db.models import Count, ExpressionWrapper, F, JSONField, Q from django.db.models.functions import Round from django.db.models.signals import post_save @@ -27,10 +27,8 @@ User._meta.get_field("email").__dict__["_unique"] = True -ONE_MINUTE = datetime.timedelta(minutes=1) ONE_DAY = datetime.timedelta(days=1) ONE_DAY_AGO = timezone.now() - ONE_DAY -THRESHOLD = 3 def resource_file_upload_path(instance, filename): @@ -74,53 +72,9 @@ def get_email_reconfirmation_key(self): def validate_reconfirmation_email(self, email): return email == self.get_email_for_reconfirmation() - def review_incidents(self, recent_accepts, recent_rejects, threshold=THRESHOLD): - accepts = recent_accepts.filter(reviewed_by=self).values_list( - "accepted", flat=True - ) - rejects = recent_rejects.filter(reviewed_by=self).values_list( - "rejected", flat=True - ) - timestamps = list(accepts) + list(rejects) - timestamps.sort() - incidents = 0 - for i in range(len(timestamps)): - count = 1 - for j in range(i + 1, len(timestamps)): - if (timestamps[j] - timestamps[i]).seconds <= 60: - count += 1 - if count == threshold: - incidents += 1 - break - else: - break - return incidents - - def transcribe_incidents(self, transcriptions, threshold=THRESHOLD): - recent_transcriptions = transcriptions.filter(user=self).order_by("submitted") - timestamps = recent_transcriptions.values_list("submitted", flat=True) - incidents = 0 - for i in range(len(timestamps)): - count = 1 - for j in range(i + 1, len(timestamps)): - if (timestamps[j] - timestamps[i]).seconds <= 60: - count += 1 - if count == threshold: - incidents += 1 - break - else: - break - return incidents - class UserProfile(MetricsModelMixin("userprofile"), models.Model): - user = models.OneToOneField(User, on_delete=models.CASCADE, related_name="profile") - transcribe_count = models.IntegerField( - default=0, verbose_name="transcription save/submit count" - ) - review_count = models.IntegerField( - default=0, verbose_name="transcription review count" - ) + user = models.ForeignKey(User, on_delete=models.CASCADE) class OverlayPosition(object): @@ -838,49 +792,63 @@ def recent_review_actions(self, days=1): START = timezone.now() - datetime.timedelta(days=days) return self.review_actions(START) - def review_incidents(self): - user_incident_count = [] - recent_accepts = self.filter( - accepted__gte=ONE_DAY_AGO, - reviewed_by__is_superuser=False, - reviewed_by__is_staff=False, - ) - recent_rejects = self.filter( - rejected__gte=ONE_DAY_AGO, - reviewed_by__is_superuser=False, - reviewed_by__is_staff=False, - ) - recent_actions = recent_accepts.union(recent_rejects) - user_ids = set( - recent_actions.order_by("reviewed_by").values_list("reviewed_by", flat=True) - ) - - for user_id in user_ids: - user = ConcordiaUser.objects.get(id=user_id) - incident_count = user.review_incidents(recent_accepts, recent_rejects) - if incident_count > 0: - user_incident_count.append((user.id, user.username, incident_count)) - - return user_incident_count - - def transcribe_incidents(self): - user_incident_count = [] - transcriptions = self.get_queryset().filter( - submitted__gte=ONE_DAY_AGO, user__is_superuser=False, user__is_staff=False - ) - user_ids = ( - transcriptions.order_by("user") - .distinct("user") - .values_list("user", flat=True) - ) - - for user_id in user_ids: - user = ConcordiaUser.objects.get(id=user_id) - incident_count = user.transcribe_incidents(transcriptions) - if incident_count > 0: - user_incident_count.append((user.id, user.username, incident_count)) - - return user_incident_count + def reviewing_too_quickly(self, start=ONE_DAY_AGO): + with connection.cursor() as cursor: + cursor.execute( + f"""SELECT u.id, u.username, COUNT(*) + FROM concordia_transcription t1 + JOIN concordia_transcription t2 + ON t1.id < t2.id + JOIN concordia_transcription t3 + ON t2.id < t3.id + AND t1.reviewed_by_id = t2.reviewed_by_id + AND t2.reviewed_by_id = t3.reviewed_by_id + AND t1.accepted >= '{start}' + AND t2.accepted >= '{start}' + AND t3.accepted >= '{start}' + AND ABS( + EXTRACT(EPOCH FROM (t1.updated_on - t2.updated_on)) + ) < 60 + AND ABS( + EXTRACT(EPOCH FROM (t1.updated_on - t3.updated_on)) + ) < 60 + AND ABS(EXTRACT( + EPOCH FROM (t2.updated_on - t3.updated_on)) + ) < 60 + JOIN auth_user u on t1.reviewed_by_id = u.id + WHERE u.is_superuser = FALSE and u.is_staff = False + GROUP BY u.id, u.username""" # nosec B608 + ) + return cursor.fetchall() + + def transcribing_too_quickly(self, start=ONE_DAY_AGO): + with connection.cursor() as cursor: + cursor.execute( + f"""SELECT u.id, u.username, COUNT(*) + FROM concordia_transcription t1 + JOIN concordia_transcription t2 + ON t1.id < t2.id + JOIN concordia_transcription t3 + ON t2.id < t3.id + AND t1.user_id = t2.user_id + AND t2.user_id = t3.user_id + AND t1.submitted >= '{start}' + AND t2.submitted >= '{start}' + AND t3.submitted >= '{start}' + AND ABS( + EXTRACT(EPOCH FROM (t1.created_on - t2.created_on)) + ) < 60 + AND ABS( + EXTRACT(EPOCH FROM (t1.created_on - t3.created_on)) + ) < 60 + AND ABS( + EXTRACT(EPOCH FROM (t2.created_on - t3.created_on)) + ) < 60 + JOIN auth_user u on t1.user_id = u.id + WHERE u.is_superuser = FALSE and u.is_staff = False + GROUP BY u.id, u.username""" # nosec B608 + ) + return cursor.fetchall() class Transcription(MetricsModelMixin("transcription"), models.Model): @@ -994,13 +962,10 @@ def on_transcription_save(sender, instance, **kwargs): user=user, campaign=instance.asset.item.project.campaign, ) - profile, created = UserProfile.objects.get_or_create(user=user) if created: setattr(user_profile_activity, attr_name, 1) - setattr(profile, attr_name, 1) else: setattr(user_profile_activity, attr_name, F(attr_name) + 1) - setattr(profile, attr_name, F(attr_name) + 1) q = Q(transcription__user=user) | Q(transcription__reviewed_by=user) user_profile_activity.asset_count = ( Asset.objects.filter(q) @@ -1009,7 +974,6 @@ def on_transcription_save(sender, instance, **kwargs): .count() ) user_profile_activity.save() - profile.save() post_save.connect(on_transcription_save, sender=Transcription) diff --git a/concordia/signals/handlers.py b/concordia/signals/handlers.py index 72f12620b..47451cfae 100644 --- a/concordia/signals/handlers.py +++ b/concordia/signals/handlers.py @@ -14,7 +14,7 @@ from django_registration.signals import user_activated, user_registered from flags.state import flag_enabled -from ..models import Asset, Transcription, TranscriptionStatus, UserProfile +from ..models import Asset, Transcription, TranscriptionStatus from ..tasks import calculate_difficulty_values from .signals import reservation_obtained, reservation_released @@ -191,9 +191,3 @@ def send_asset_reservation_message( @receiver(post_delete, sender=Asset) def remove_file_from_s3(sender, instance, using, **kwargs): instance.storage_image.delete(save=False) - - -@receiver(post_save, sender=settings.AUTH_USER_MODEL) -def create_user_profile(sender, instance, *args, **kwargs): - if not hasattr(instance, "profile"): - UserProfile.objects.create(user=instance) diff --git a/concordia/static/js/src/asset-reservation.js b/concordia/static/js/src/asset-reservation.js index 9e2299b59..bb1ef4cfe 100644 --- a/concordia/static/js/src/asset-reservation.js +++ b/concordia/static/js/src/asset-reservation.js @@ -1,7 +1,5 @@ /* global jQuery displayMessage displayHtmlMessage buildErrorMessage Sentry */ -/* exported attemptToReserveAsset reserveAssetForEditing */ - -const assetData = document.currentScript.dataset; +/* exported attemptToReserveAsset */ function attemptToReserveAsset(reservationURL, findANewPageURL, actionType) { var $transcriptionEditor = jQuery('#transcription-editor'); @@ -97,15 +95,3 @@ function attemptToReserveAsset(reservationURL, findANewPageURL, actionType) { } }); } - -function reserveAssetForEditing() { - if (assetData.reserveAssetUrl) { - attemptToReserveAsset(assetData.reserveAssetUrl, '', 'transcribe'); - } -} - -jQuery(function () { - if (assetData.reserveForEditing) { - reserveAssetForEditing(); - } -}); diff --git a/concordia/static/js/src/banner.js b/concordia/static/js/src/banner.js deleted file mode 100644 index a46e3ea2a..000000000 --- a/concordia/static/js/src/banner.js +++ /dev/null @@ -1,18 +0,0 @@ -/* global $ */ - -if (typeof Storage !== 'undefined') { - if (!(window.screen.width < 1024 || window.screen.height < 768)) { - for (var key in localStorage) { - if (key.startsWith('banner-')) { - if ($('#' + key).hasClass('alert')) { - $('#' + key).attr('hidden', true); - } - } - } - } -} - -$('#no-interface-banner').click(function (event) { - localStorage.setItem(event.target.parentElement.id, true); - $('#' + event.target.parentElement.id).attr('hidden', true); -}); diff --git a/concordia/static/js/src/contribute.js b/concordia/static/js/src/contribute.js index f477ef02e..30f9c8942 100644 --- a/concordia/static/js/src/contribute.js +++ b/concordia/static/js/src/contribute.js @@ -766,27 +766,4 @@ function setupPage() { } } -let transcriptionForm = document.getElementById('transcription-editor'); -let ocrForm = document.getElementById('ocr-transcription-form'); - -let formChanged = false; -transcriptionForm.addEventListener('change', function () { - formChanged = true; -}); -transcriptionForm.addEventListener('submit', function () { - formChanged = false; -}); -if (ocrForm) { - ocrForm.addEventListener('submit', function () { - formChanged = false; - }); -} -window.addEventListener('beforeunload', function (event) { - if (formChanged) { - // Some browsers ignore this value and always display a built-in message instead - return (event.returnValue = - "The transcription you've started has not been saved."); - } -}); - setupPage(); diff --git a/concordia/static/js/src/guide.js b/concordia/static/js/src/guide.js deleted file mode 100644 index 2bfe28570..000000000 --- a/concordia/static/js/src/guide.js +++ /dev/null @@ -1,86 +0,0 @@ -/* global $ trackUIInteraction */ -/* exported openOffcanvas closeOffcanvas showPane hidePane */ - -function openOffcanvas() { - var guide = document.getElementById('guide-sidebar'); - guide.classList.remove('offscreen'); - guide.style.borderWidth = '0 0 thick thick'; - guide.style.borderStyle = 'solid'; - guide.style.borderColor = '#0076ad'; - document.getElementById('open-guide').style.display = 'none'; - document.addEventListener('keydown', function (event) { - if (event.key == 'Escape') { - closeOffcanvas(); - } - }); -} - -function closeOffcanvas() { - var guide = document.getElementById('guide-sidebar'); - guide.classList.add('offscreen'); - - guide.style.border = 'none'; - document.getElementById('open-guide').style.display = 'block'; -} - -function showPane(elementId) { - document.getElementById(elementId).classList.add('show', 'active'); - document.getElementById('guide-nav').classList.remove('show', 'active'); -} - -function hidePane(elementId) { - document.getElementById(elementId).classList.remove('show', 'active'); - document.getElementById('guide-nav').classList.add('show', 'active'); -} - -function trackHowToInteraction(element, label) { - trackUIInteraction(element, 'How To Guide', 'click', label); -} - -$('#open-guide').on('click', function () { - trackHowToInteraction($(this), 'Open'); -}); -$('#close-guide').on('click', function () { - trackHowToInteraction($(this), 'Close'); -}); -$('#previous-guide').on('click', function () { - trackHowToInteraction($(this), 'Back'); -}); -$('#next-guide').on('click', function () { - trackHowToInteraction($(this), 'Next'); -}); -$('#guide-bars').on('click', function () { - trackHowToInteraction($(this), 'Hamburger Menu'); -}); -$('#guide-sidebar .nav-link').on('click', function () { - let label = $(this).text().trim(); - trackHowToInteraction($(this), label); -}); - -$('#guide-carousel') - .carousel({ - interval: false, - wrap: false, - }) - .on('slide.bs.carousel', function (event) { - if (event.to == 0) { - $('#guide-bars').addClass('d-none'); - } else { - $('#guide-bars').removeClass('d-none'); - } - }); - -$('#previous-card').hide(); - -$('#card-carousel').on('slid.bs.carousel', function () { - if ($('#card-carousel .carousel-item:first').hasClass('active')) { - $('#previous-card').hide(); - $('#next-card').show(); - } else if ($('#card-carousel .carousel-item:last').hasClass('active')) { - $('#previous-card').show(); - $('#next-card').hide(); - } else { - $('#previous-card').show(); - $('#next-card').show(); - } -}); diff --git a/concordia/static/js/src/ocr.js b/concordia/static/js/src/ocr.js deleted file mode 100644 index 8c5cf0d07..000000000 --- a/concordia/static/js/src/ocr.js +++ /dev/null @@ -1,7 +0,0 @@ -/* global $ */ -/* exported selectLanguage */ - -function selectLanguage() { - $('#ocr-transcription-modal').modal('hide'); - $('#language-selection-modal').modal('show'); -} diff --git a/concordia/static/js/src/quick-tips.js b/concordia/static/js/src/quick-tips.js deleted file mode 100644 index 139eb3acf..000000000 --- a/concordia/static/js/src/quick-tips.js +++ /dev/null @@ -1,38 +0,0 @@ -/* global $ trackUIInteraction setTutorialHeight */ - -function trackQuickTipsInteraction(element, label) { - trackUIInteraction(element, 'Quick Tips', 'click', label); -} - -var mainContentHeight = $('#contribute-main-content').height(); -if (mainContentHeight < 710) { - $('.sidebar').height(mainContentHeight - 130); -} - -$('#tutorial-popup').on('shown.bs.modal', function () { - setTutorialHeight(); -}); - -$('#quick-tips').on('click', function () { - trackQuickTipsInteraction($(this), 'Open'); -}); -$('#previous-card').on('click', function () { - trackQuickTipsInteraction($(this), 'Back'); -}); -$('#next-card').on('click', function () { - trackQuickTipsInteraction($(this), 'Next'); -}); -$('.carousel-indicators li').on('click', function () { - let index = [...this.parentElement.children].indexOf(this); - trackQuickTipsInteraction($(this), `Carousel ${index}`); -}); -$('#tutorial-popup').on('hidden.bs.modal', function () { - // We're tracking whenever the popup closes, so we don't separately track the close button being clicked - trackUIInteraction($(this), 'Quick Tips', 'click', 'Close'); -}); -$('#tutorial-popup').on('shown-on-load', function () { - // We set a timeout to make sure the analytics code is loaded before trying to track - setTimeout(function () { - trackUIInteraction($(this), 'Quick Tips', 'load', 'Open'); - }, 1000); -}); diff --git a/concordia/static/js/src/viewer-split.js b/concordia/static/js/src/viewer-split.js deleted file mode 100644 index 2769b7b49..000000000 --- a/concordia/static/js/src/viewer-split.js +++ /dev/null @@ -1,146 +0,0 @@ -/* global Split seadragonViewer */ - -let pageSplit; -let contributeContainer = document.getElementById('contribute-container'); -let ocrSection = document.getElementById('ocr-section'); -let editorColumn = document.getElementById('editor-column'); -let viewerColumn = document.getElementById('viewer-column'); -let layoutColumns = ['#viewer-column', '#editor-column']; -let verticalKey = 'transcription-split-sizes-vertical'; -let horizontalKey = 'transcription-split-sizes-horizontal'; - -let sizesVertical = localStorage.getItem(verticalKey); - -if (sizesVertical) { - sizesVertical = JSON.parse(sizesVertical); -} else { - sizesVertical = [50, 50]; -} - -let sizesHorizontal = localStorage.getItem(horizontalKey); - -if (sizesHorizontal) { - sizesHorizontal = JSON.parse(sizesHorizontal); -} else { - sizesHorizontal = [50, 50]; -} - -let splitDirection = localStorage.getItem('transcription-split-direction'); - -if (splitDirection) { - splitDirection = JSON.parse(splitDirection); -} else { - splitDirection = 'h'; -} - -function saveSizes(sizes) { - let sizeKey; - if (splitDirection == 'h') { - sizeKey = horizontalKey; - sizesHorizontal = sizes; - } else { - sizeKey = verticalKey; - sizesVertical = sizes; - } - localStorage.setItem(sizeKey, JSON.stringify(sizes)); -} - -function saveDirection(direction) { - localStorage.setItem( - 'transcription-split-direction', - JSON.stringify(direction), - ); -} - -function verticalSplit() { - splitDirection = 'v'; - saveDirection(splitDirection); - contributeContainer.classList.remove('flex-row'); - contributeContainer.classList.add('flex-column'); - viewerColumn.classList.remove('h-100'); - if (ocrSection != undefined) { - editorColumn.prepend(ocrSection); - } - - return Split(layoutColumns, { - sizes: sizesVertical, - minSize: 100, - gutterSize: 8, - direction: 'vertical', - elementStyle: function (dimension, size, gutterSize) { - return { - 'flex-basis': 'calc(' + size + '% - ' + gutterSize + 'px)', - }; - }, - gutterStyle: function (dimension, gutterSize) { - return { - 'flex-basis': gutterSize + 'px', - }; - }, - onDragEnd: saveSizes, - }); -} -function horizontalSplit() { - splitDirection = 'h'; - saveDirection(splitDirection); - contributeContainer.classList.remove('flex-column'); - contributeContainer.classList.add('flex-row'); - viewerColumn.classList.add('h-100'); - if (ocrSection != undefined) { - viewerColumn.append(ocrSection); - } - return Split(layoutColumns, { - sizes: sizesHorizontal, - minSize: 100, - gutterSize: 8, - elementStyle: function (dimension, size, gutterSize) { - return { - 'flex-basis': 'calc(' + size + '% - ' + gutterSize + 'px)', - }; - }, - gutterStyle: function (dimension, gutterSize) { - return { - 'flex-basis': gutterSize + 'px', - }; - }, - onDragEnd: saveSizes, - }); -} - -document - .getElementById('viewer-layout-horizontal') - .addEventListener('click', function () { - if (splitDirection != 'h') { - if (pageSplit != undefined) { - pageSplit.destroy(); - } - pageSplit = horizontalSplit(); - setTimeout(function () { - // Some quirk in the viewer makes this - // sometimes not work depending on - // the rotation, unless it's delayed. - // Less than 10ms didn't reliable work. - seadragonViewer.viewport.zoomTo(1); - }, 10); - } - }); - -document - .getElementById('viewer-layout-vertical') - .addEventListener('click', function () { - if (splitDirection != 'v') { - if (pageSplit != undefined) { - pageSplit.destroy(); - } - pageSplit = verticalSplit(); - setTimeout(function () { - seadragonViewer.viewport.zoomTo(1); - }, 10); - } - }); - -if (splitDirection == 'v') { - pageSplit = verticalSplit(); -} else { - pageSplit = horizontalSplit(); -} diff --git a/concordia/static/js/src/viewer.js b/concordia/static/js/src/viewer.js deleted file mode 100644 index 9ad073409..000000000 --- a/concordia/static/js/src/viewer.js +++ /dev/null @@ -1,200 +0,0 @@ -/* global OpenSeadragon screenfull debounce */ -/* exported seadragonView stepUp stepDown resetImageFilterForms */ - -const viewerData = document.currentScript.dataset; - -var seadragonViewer = OpenSeadragon({ - id: 'asset-image', - prefixUrl: viewerData.prefixUrl, - tileSources: { - type: 'image', - url: viewerData.tileSourceUrl, - }, - gestureSettingsTouch: { - pinchRotate: true, - }, - showNavigator: true, - showRotationControl: true, - showFlipControl: true, - toolbar: 'viewer-controls', - zoomInButton: 'viewer-zoom-in', - zoomOutButton: 'viewer-zoom-out', - homeButton: 'viewer-home', - rotateLeftButton: 'viewer-rotate-left', - rotateRightButton: 'viewer-rotate-right', - flipButton: 'viewer-flip', - crossOriginPolicy: 'Anonymous', -}); - -// We need to define our own fullscreen function rather than using OpenSeadragon's -// because the built-in fullscreen function overwrites the DOM with the viewer, -// breaking our extra controls, such as the image filters. -if (screenfull.isEnabled) { - let fullscreenButton = document.querySelector('#viewer-fullscreen'); - fullscreenButton.addEventListener('click', function (event) { - event.preventDefault(); - let targetElement = document.querySelector( - fullscreenButton.dataset.target, - ); - if (screenfull.isFullscreen) { - screenfull.exit(); - } else { - screenfull.request(targetElement); - } - }); -} - -// The buttons configured as controls for the viewer don't properly get focus -// when clicked. This mostly isn't a problem, but causes odd-looking behavior -// when one of the extra buttons in the control bar is clicked (and therefore -// focused) first--clicking the control button leaves the focus on the extra -// button. -// TODO: Attempting to add focus to the clicked button here doesn't consistently -// work for unknown reasons, so it just removes focus from the extra buttons -// for now -let viewerControlButtons = document.querySelectorAll('.viewer-control-button'); -for (const node of viewerControlButtons) { - node.addEventListener('click', function () { - let focusedButton = document.querySelector( - '.extra-control-button:focus', - ); - if (focusedButton) { - focusedButton.blur(); - } - }); -} - -/* - * Image filter handling - */ - -let availableFilters = [ - { - formId: 'gamma-form', - inputId: 'gamma', - getFilter: function () { - let value = document.getElementById(this.inputId).value; - if ( - !Number.isNaN(value) && - value != 1 && - value >= 0 && - value <= 5 - ) { - return OpenSeadragon.Filters.GAMMA(value); - } - }, - }, - { - formId: 'invert-form', - inputId: 'invert', - getFilter: function () { - let value = document.getElementById(this.inputId).checked; - if (value) { - return OpenSeadragon.Filters.INVERT(); - } - }, - }, - { - formId: 'threshold-form', - inputId: 'threshold', - getFilter: function () { - let value = document.getElementById(this.inputId).value; - if (!Number.isNaN(value) && value > 0 && value <= 255) { - return OpenSeadragon.Filters.THRESHOLDING(value); - } - }, - }, -]; - -function updateFilters() { - let filters = []; - for (const filterData of availableFilters) { - let filter = filterData.getFilter(); - if (filter) { - filters.push(filter); - } - } - - seadragonViewer.setFilterOptions({ - filters: { - processors: filters, - }, - }); -} - -for (const filterData of availableFilters) { - let form = document.getElementById(filterData.formId); - if (form) { - form.addEventListener('change', updateFilters); - form.addEventListener('reset', function () { - // We use setTimeout to push the updateFilters - // call to the next event cycle in order to - // call it after the form is reset, instead - // of before, which is when this listener - // triggers - setTimeout(updateFilters); - }); - } - - let input = document.getElementById(filterData.inputId); - if (input) { - // We use debounce here so that updateFilters is only called once, - // after the user stops typing or scrolling with their mousewheel - input.addEventListener( - 'keyup', - debounce(() => updateFilters()), - ); - input.addEventListener( - 'wheel', - debounce(() => updateFilters()), - ); - } -} - -/* - * Image filter form handling - */ -function stepUp(id) { - let input = document.getElementById(id); - input.stepUp(); - input.dispatchEvent(new Event('input', {bubbles: true})); - input.dispatchEvent(new Event('change', {bubbles: true})); - return false; -} - -function stepDown(id) { - let input = document.getElementById(id); - input.stepDown(); - input.dispatchEvent(new Event('input', {bubbles: true})); - input.dispatchEvent(new Event('change', {bubbles: true})); - return false; -} - -function resetImageFilterForms() { - for (const filterData of availableFilters) { - let form = document.getElementById(filterData.formId); - form.reset(); - } -} - -let gammaNumber = document.getElementById('gamma'); -let gammaRange = document.getElementById('gamma-range'); - -gammaNumber.addEventListener('input', function () { - gammaRange.value = gammaNumber.value; -}); - -gammaRange.addEventListener('input', function () { - gammaNumber.value = gammaRange.value; -}); - -let thresholdNumber = document.getElementById('threshold'); -let thresholdRange = document.getElementById('threshold-range'); - -thresholdNumber.addEventListener('input', function () { - thresholdRange.value = thresholdNumber.value; -}); - -thresholdRange.addEventListener('input', function () { - thresholdNumber.value = thresholdRange.value; -}); diff --git a/concordia/tasks.py b/concordia/tasks.py index 8445b0670..bb3054dad 100644 --- a/concordia/tasks.py +++ b/concordia/tasks.py @@ -1043,6 +1043,14 @@ def fix_storage_images(campaign_slug=None, asset_start_id=None): logger.debug("%s / %s (%s%%)", count, full_count, str(count / full_count * 100)) +def transcribing_too_quickly(): + return Transcription.objects.transcribing_too_quickly() + + +def reviewing_too_quickly(): + return Transcription.objects.reviewing_too_quickly() + + @celery_app.task(ignore_result=True) def clear_sessions(): # This clears expired Django sessions in the database @@ -1059,8 +1067,8 @@ def unusual_activity(): "title": "Unusual User Activity Report for " + timezone.now().strftime("%b %d %Y, %I:%M %p"), "domain": "https://" + site.domain, - "transcriptions": Transcription.objects.transcribe_incidents(), - "reviews": Transcription.objects.review_incidents(), + "transcriptions": transcribing_too_quickly(), + "reviews": reviewing_too_quickly(), } text_body_template = loader.get_template("emails/unusual_activity.txt") diff --git a/concordia/templates/admin/concordia/item/change_form.html b/concordia/templates/admin/concordia/item/change_form.html index 835d87b2e..4e0dc3352 100644 --- a/concordia/templates/admin/concordia/item/change_form.html +++ b/concordia/templates/admin/concordia/item/change_form.html @@ -29,3 +29,18 @@ {% endif %} {{ block.super }} {% endblock %} + +{% block extrahead %} + {{ block.super }} + + {% include 'fragments/codemirror.html' %} +{% endblock extrahead %} + + +{% block content %} + {{ block.super }} + + +{% endblock content %} diff --git a/concordia/templates/admin/concordia/topic/change_form.html b/concordia/templates/admin/concordia/topic/change_form.html new file mode 100644 index 000000000..e461b658c --- /dev/null +++ b/concordia/templates/admin/concordia/topic/change_form.html @@ -0,0 +1,19 @@ +{% extends "admin/change_form.html" %} + +{% load i18n admin_urls static %} + +{% block extrahead %} + {{ block.super }} + + {% include 'fragments/codemirror.html' %} +{% endblock extrahead %} + + +{% block content %} + {{ block.super }} + + +{% endblock content %} diff --git a/concordia/templates/emails/unusual_activity.txt b/concordia/templates/emails/unusual_activity.txt index daba6e152..eb2bf8549 100644 --- a/concordia/templates/emails/unusual_activity.txt +++ b/concordia/templates/emails/unusual_activity.txt @@ -6,7 +6,7 @@ Incidents of two or more transcriptions submitted within a single minute: No transcriptions fell within the window. {% endfor %} Incidents of two or more transcriptions reviewed within a single minute: -{% for row in reviews %} +{% for row in reviews_by %} {{ row.1 }} | {{ row.2 }} {% empty %} No reviews fell within the window. diff --git a/concordia/templates/transcriptions/asset_detail.html b/concordia/templates/transcriptions/asset_detail.html index f67474313..5ed967fbf 100644 --- a/concordia/templates/transcriptions/asset_detail.html +++ b/concordia/templates/transcriptions/asset_detail.html @@ -18,25 +18,6 @@ - - - - - - - - - - - {% endblock head_content %} {% block breadcrumbs %} @@ -54,13 +35,330 @@
- {% include "transcriptions/asset_detail/viewer.html" %} - {% include "transcriptions/asset_detail/ocr_help_modal.html" %} - {% include "transcriptions/asset_detail/viewer_filters.html" %} +
+
+
+ + +
+ +
+ +
+ +
+ + +
+ +
+ + +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+
+
+ + +
+
+ +
+ +
+
+
+
+
+
+ + +
+
+
+ +
+
+ +
+
+
+ + + +
+
+
+
+ +
+ + +
+ +
+
+
+
+
+
+ + +
+
+
+ +
+
+ +
+
+
+ + + +
+
+
+
{% if not disable_ocr %}
- {% include "transcriptions/asset_detail/editor.html" %} - {% include "transcriptions/asset_detail/tags.html" %} +
+
+

+ + Needs review +

+

+ + Completed +

+

+ + Not started +

+

+ + In progress +

+ +
+ +
+ {% csrf_token %} + + +
+ +

+ Registered Contributors: {{ registered_contributors }} +

+ + Transcribe this page. + + + Someone started this transcription. Can you finish it? + + + Check this transcription thoroughly. Accept if correct! + + + This transcription is finished! You can read and add tags. + +
+ +
+ + {% spaceless %} +
+ +
+
+ + {% if guides %} + + {% include "fragments/_how-to-guide.html" %} + {% endif %} +
+ + + +
+ {% if transcription_status == 'not_started' or transcription_status == 'in_progress' %} +
+ + + + + + +
+ + + + + + + {% elif transcription_status == 'submitted' %} + {% if not user.is_authenticated %} +

+ Register + or + login + to help review +

+ {% else %} + + {% if transcription.user.pk == user.pk %} +

You submitted this transcription. You can re-open it for editing if you wish to make changes before another volunteer reviews it.

+ {% else %} + + {% endif %} + {% endif %} + {% endif %} +
+ {% endspaceless %} +
+ +
+
+

+
+ {% csrf_token %} +
+ {% if user.is_authenticated %} +
+
+ +
+ +
+
+ Tags must be between 1-50 characters and may contain only letters, numbers, dashes, underscores, apostrophes, and spaces +
+
+
+ {% else %} +

+ Want to tag this page? + + Register + or + login + to add tags. +

+ {% endif %} +
+ +
    + {% for tag in tags %} +
  • + + +
  • + {% endfor %} +
+
+
@@ -97,26 +559,739 @@
{% if cards %} - {% include "transcriptions/asset_detail/quick_tips_modal.html" %} + {% endif %} {% endblock main_content %} + +{% block body_scripts %} + + + + + + + + + + + + + + + + + + + +{% endblock body_scripts %} diff --git a/concordia/templates/transcriptions/asset_detail/asset_reservation_failure_modal.html b/concordia/templates/transcriptions/asset_detail/asset_reservation_failure_modal.html deleted file mode 100644 index a84b36411..000000000 --- a/concordia/templates/transcriptions/asset_detail/asset_reservation_failure_modal.html +++ /dev/null @@ -1,19 +0,0 @@ - diff --git a/concordia/templates/transcriptions/asset_detail/captcha_modal.html b/concordia/templates/transcriptions/asset_detail/captcha_modal.html deleted file mode 100644 index 2ca5c457d..000000000 --- a/concordia/templates/transcriptions/asset_detail/captcha_modal.html +++ /dev/null @@ -1,38 +0,0 @@ - diff --git a/concordia/templates/transcriptions/asset_detail/editor.html b/concordia/templates/transcriptions/asset_detail/editor.html deleted file mode 100644 index 92a09da5e..000000000 --- a/concordia/templates/transcriptions/asset_detail/editor.html +++ /dev/null @@ -1,118 +0,0 @@ -
-
-

- - Needs review -

-

- - Completed -

-

- - Not started -

-

- - In progress -

- -
- -
- {% csrf_token %} - - -
- -

- Registered Contributors: {{ registered_contributors }} -

- - Transcribe this page. - - - Someone started this transcription. Can you finish it? - - - Check this transcription thoroughly. Accept if correct! - - - This transcription is finished! You can read and add tags. - -
- -
- - {% spaceless %} -
- -
-
- - {% if guides %} - - {% include "fragments/_how-to-guide.html" %} - {% endif %} -
- - - -
- {% if transcription_status == 'not_started' or transcription_status == 'in_progress' %} -
- - - - - - -
- - - - - - - {% elif transcription_status == 'submitted' %} - {% if not user.is_authenticated %} -

- Register - or - login - to help review -

- {% else %} - - {% if transcription.user.pk == user.pk %} -

You submitted this transcription. You can re-open it for editing if you wish to make changes before another volunteer reviews it.

- {% else %} - - {% endif %} - {% endif %} - {% endif %} -
- {% endspaceless %} -
-
diff --git a/concordia/templates/transcriptions/asset_detail/language_selection_modal.html b/concordia/templates/transcriptions/asset_detail/language_selection_modal.html deleted file mode 100644 index 63ba19e31..000000000 --- a/concordia/templates/transcriptions/asset_detail/language_selection_modal.html +++ /dev/null @@ -1,33 +0,0 @@ - diff --git a/concordia/templates/transcriptions/asset_detail/navigation.html b/concordia/templates/transcriptions/asset_detail/navigation.html deleted file mode 100644 index 6f9c2259c..000000000 --- a/concordia/templates/transcriptions/asset_detail/navigation.html +++ /dev/null @@ -1,49 +0,0 @@ - diff --git a/concordia/templates/transcriptions/asset_detail/ocr_help_modal.html b/concordia/templates/transcriptions/asset_detail/ocr_help_modal.html deleted file mode 100644 index b491590cf..000000000 --- a/concordia/templates/transcriptions/asset_detail/ocr_help_modal.html +++ /dev/null @@ -1,27 +0,0 @@ - diff --git a/concordia/templates/transcriptions/asset_detail/ocr_transcription_modal.html b/concordia/templates/transcriptions/asset_detail/ocr_transcription_modal.html deleted file mode 100644 index 39ef4601b..000000000 --- a/concordia/templates/transcriptions/asset_detail/ocr_transcription_modal.html +++ /dev/null @@ -1,24 +0,0 @@ - diff --git a/concordia/templates/transcriptions/asset_detail/quick_tips_modal.html b/concordia/templates/transcriptions/asset_detail/quick_tips_modal.html deleted file mode 100644 index 9d6337a28..000000000 --- a/concordia/templates/transcriptions/asset_detail/quick_tips_modal.html +++ /dev/null @@ -1,42 +0,0 @@ - diff --git a/concordia/templates/transcriptions/asset_detail/review_accepted_modal.html b/concordia/templates/transcriptions/asset_detail/review_accepted_modal.html deleted file mode 100644 index 5bb447160..000000000 --- a/concordia/templates/transcriptions/asset_detail/review_accepted_modal.html +++ /dev/null @@ -1,35 +0,0 @@ - diff --git a/concordia/templates/transcriptions/asset_detail/successful_submission_modal.html b/concordia/templates/transcriptions/asset_detail/successful_submission_modal.html deleted file mode 100644 index 45cdb964a..000000000 --- a/concordia/templates/transcriptions/asset_detail/successful_submission_modal.html +++ /dev/null @@ -1,35 +0,0 @@ - diff --git a/concordia/templates/transcriptions/asset_detail/tags.html b/concordia/templates/transcriptions/asset_detail/tags.html deleted file mode 100644 index 0df583244..000000000 --- a/concordia/templates/transcriptions/asset_detail/tags.html +++ /dev/null @@ -1,47 +0,0 @@ -
-

-
- {% csrf_token %} -
- {% if user.is_authenticated %} -
-
- -
- -
-
- Tags must be between 1-50 characters and may contain only letters, numbers, dashes, underscores, apostrophes, and spaces -
-
-
- {% else %} -

- Want to tag this page? - - Register - or - login - to add tags. -

- {% endif %} -
- - -
-
diff --git a/concordia/templates/transcriptions/asset_detail/viewer.html b/concordia/templates/transcriptions/asset_detail/viewer.html deleted file mode 100644 index edd395d35..000000000 --- a/concordia/templates/transcriptions/asset_detail/viewer.html +++ /dev/null @@ -1,121 +0,0 @@ -
-
-
- - -
- -
- -
- -
- - -
- -
- - -
- -
- -
- -
- -
- -
- -
- -
- -
-
-
- - diff --git a/concordia/templates/transcriptions/asset_detail/viewer_filters.html b/concordia/templates/transcriptions/asset_detail/viewer_filters.html deleted file mode 100644 index 3170aae21..000000000 --- a/concordia/templates/transcriptions/asset_detail/viewer_filters.html +++ /dev/null @@ -1,125 +0,0 @@ -
-
- -
- -
-
-
-
-
-
- - -
-
-
- -
-
- -
-
-
- - - -
-
-
-
- -
- - -
- -
-
-
-
-
-
- - -
-
-
- -
-
- -
-
-
- - - -
-
-
-
diff --git a/concordia/templates/transcriptions/topic_detail.html b/concordia/templates/transcriptions/topic_detail.html index 6f159a8c3..cd230eb5e 100644 --- a/concordia/templates/transcriptions/topic_detail.html +++ b/concordia/templates/transcriptions/topic_detail.html @@ -14,12 +14,12 @@ {% block breadcrumbs %} - + {% endblock breadcrumbs %} {% block main_content %}
-
+

{{ topic.title }}

{{ topic.description|safe }}
diff --git a/concordia/tests/test_admin.py b/concordia/tests/test_admin.py index 8fe3f680f..b524503ad 100644 --- a/concordia/tests/test_admin.py +++ b/concordia/tests/test_admin.py @@ -79,9 +79,9 @@ def test_csv_export(self): self.assertEqual(len(content), 4) # Includes empty line at the end of the file test_data = [ b"username,email address,first name,last name,active,staff status," - + b"superuser status,last login,transcription count,review count", - b"testsuperuser,testsuperuser@example.com,,,True,True,True,,0,0", - b"testuser,testuser@example.com,,,True,False,False,,0,0", + + b"superuser status,last login,transcription__count", + b"testsuperuser,testsuperuser@example.com,,,True,True,True,,0", + b"testuser,testuser@example.com,,,True,False,False,,0", b"", ] self.assertEqual(content, test_data) diff --git a/concordia/tests/test_models.py b/concordia/tests/test_models.py index bee7580fa..bfc4dec81 100644 --- a/concordia/tests/test_models.py +++ b/concordia/tests/test_models.py @@ -114,110 +114,6 @@ def test_review_actions(self): end = timezone.now() - timedelta(days=1) self.assertEqual(Transcription.objects.review_actions(start, end).count(), 1) - def test_review_incidents(self): - self.transcription1.accepted = timezone.now() - self.transcription1.reviewed_by = self.create_user(username="tester2") - self.transcription1.save() - self.transcription2.accepted = self.transcription1.accepted + timedelta( - seconds=29 - ) - self.transcription2.reviewed_by = self.transcription1.reviewed_by - self.transcription2.save() - users = Transcription.objects.review_incidents() - self.assertNotIn(self.transcription1.user.id, users) - - transcription3 = create_transcription( - asset=self.transcription1.asset, - user=self.transcription1.user, - reviewed_by=self.transcription1.reviewed_by, - accepted=self.transcription1.accepted + timedelta(seconds=58), - ) - transcription4 = create_transcription( - asset=self.transcription1.asset, - user=self.transcription1.user, - reviewed_by=self.transcription1.reviewed_by, - accepted=transcription3.accepted + timedelta(minutes=1, seconds=1), - ) - users = Transcription.objects.review_incidents() - self.assertEqual(len(users), 1) - self.assertEqual( - users[0], - ( - self.transcription1.reviewed_by.id, - self.transcription1.reviewed_by.username, - 1, - ), - ) - - create_transcription( - asset=self.transcription1.asset, - user=self.transcription1.user, - reviewed_by=self.transcription1.reviewed_by, - accepted=transcription4.accepted + timedelta(seconds=29), - ) - create_transcription( - asset=self.transcription1.asset, - user=self.transcription1.user, - reviewed_by=self.transcription1.reviewed_by, - accepted=transcription4.accepted + timedelta(seconds=58), - ) - users = Transcription.objects.review_incidents() - self.assertEqual(len(users), 1) - self.assertEqual( - users[0], - ( - self.transcription1.reviewed_by.id, - self.transcription1.reviewed_by.username, - 2, - ), - ) - - def test_transcribe_incidents(self): - self.transcription1.submitted = timezone.now() - self.transcription1.save() - self.transcription2.submitted = self.transcription1.submitted + timedelta( - seconds=29 - ) - self.transcription2.user = self.transcription1.user - self.transcription2.save() - users = Transcription.objects.transcribe_incidents() - self.assertEqual(len(users), 0) - self.assertNotIn(self.transcription1.user.id, users) - - transcription3 = create_transcription( - asset=self.transcription1.asset, - user=self.transcription1.user, - submitted=self.transcription1.submitted + timedelta(seconds=58), - ) - transcription4 = create_transcription( - asset=self.transcription1.asset, - user=self.transcription1.user, - submitted=transcription3.submitted + timedelta(minutes=1, seconds=1), - ) - create_transcription( - asset=self.transcription1.asset, - user=self.transcription1.user, - submitted=transcription4.submitted + timedelta(seconds=59), - ) - users = Transcription.objects.transcribe_incidents() - self.assertEqual(len(users), 1) - self.assertEqual( - users[0], - (self.transcription1.user.id, self.transcription1.user.username, 1), - ) - - create_transcription( - asset=self.transcription1.asset, - user=self.transcription1.user, - submitted=self.transcription1.submitted + timedelta(minutes=1, seconds=59), - ) - users = Transcription.objects.transcribe_incidents() - self.assertEqual(len(users), 1) - self.assertEqual( - users[0], - (self.transcription1.user.id, self.transcription1.user.username, 2), - ) - class TranscriptionTestCase(CreateTestUsers, TestCase): def setUp(self): @@ -280,6 +176,44 @@ def test_status(self): TranscriptionStatus.CHOICE_MAP[TranscriptionStatus.COMPLETED], ) + def test_reviewing_too_quickly(self): + self.transcription1.accepted = timezone.now() + self.transcription1.reviewed_by = self.create_user(username="tester2") + self.transcription1.save() + self.transcription2.accepted = self.transcription1.accepted + self.transcription2.reviewed_by = self.transcription1.reviewed_by + self.transcription2.save() + transcriptions = Transcription.objects.reviewing_too_quickly() + self.assertEqual(len(transcriptions), 0) + + transcription3 = create_transcription( + asset=self.transcription1.asset, + user=self.transcription1.user, + reviewed_by=self.transcription1.reviewed_by, + accepted=self.transcription1.accepted, + ) + transcriptions = Transcription.objects.reviewing_too_quickly() + self.assertEqual(len(transcriptions), 1) + self.assertEqual(transcriptions[0][0], transcription3.reviewed_by.id) + + def test_transcribing_too_quickly(self): + self.transcription1.submitted = timezone.now() + self.transcription1.save() + self.transcription2.submitted = self.transcription1.submitted + self.transcription2.user = self.transcription1.user + self.transcription2.save() + transcriptions = Transcription.objects.transcribing_too_quickly() + self.assertEqual(len(transcriptions), 0) + + transcription3 = create_transcription( + asset=self.transcription1.asset, + user=self.transcription1.user, + submitted=self.transcription1.submitted, + ) + transcriptions = Transcription.objects.transcribing_too_quickly() + self.assertEqual(len(transcriptions), 1) + self.assertEqual(transcriptions[0][0], transcription3.user.id) + class AssetTranscriptionReservationTest(CreateTestUsers, TestCase): def setUp(self): diff --git a/concordia/tests/test_views.py b/concordia/tests/test_views.py index ea912bef1..23e4fd2da 100644 --- a/concordia/tests/test_views.py +++ b/concordia/tests/test_views.py @@ -577,8 +577,8 @@ def test_asset_reservation_competition(self): # to edit it after logging in # 4 queries = - # 1 expiry + 1 acquire + 2 get user ID + 2 get user profile from request - with self.assertNumQueries(6): + # 1 expiry + 1 acquire + 2 get user ID from request + with self.assertNumQueries(4): resp = self.client.post(reverse("reserve-asset", args=(asset.pk,))) self.assertEqual(200, resp.status_code) self.assertEqual(1, AssetTranscriptionReservation.objects.count()) @@ -682,9 +682,8 @@ def test_asset_reservation_tombstone(self): self.client.logout() - # 1 reservation check + 1 acquire + 2 get user ID - # + 2 get user profile from request - expected_queries = 6 + # 1 reservation check + 1 acquire + 2 get user ID from request + expected_queries = 4 if settings.SESSION_ENGINE.endswith("db"): # + 1 session check expected_queries += 1 diff --git a/exporter/tabular_export/admin.py b/exporter/tabular_export/admin.py index 9892b43f0..5c368a889 100644 --- a/exporter/tabular_export/admin.py +++ b/exporter/tabular_export/admin.py @@ -49,17 +49,10 @@ def inner(modeladmin, request, queryset, filename=None, *args, **kwargs): @ensure_filename("xlsx") def export_to_excel_action( - modeladmin, - request, - queryset, - filename=None, - field_names=None, - extra_verbose_names=None, + modeladmin, request, queryset, filename=None, field_names=None ): """Django admin action which exports selected records as an Excel XLSX download""" - headers, rows = flatten_queryset( - queryset, field_names=field_names, extra_verbose_names=extra_verbose_names - ) + headers, rows = flatten_queryset(queryset, field_names=field_names) return export_to_excel_response(filename, headers, rows) @@ -68,17 +61,10 @@ def export_to_excel_action( @ensure_filename("csv") def export_to_csv_action( - modeladmin, - request, - queryset, - filename=None, - field_names=None, - extra_verbose_names=None, + modeladmin, request, queryset, filename=None, field_names=None ): """Django admin action which exports the selected records as a CSV download""" - headers, rows = flatten_queryset( - queryset, field_names=field_names, extra_verbose_names=extra_verbose_names - ) + headers, rows = flatten_queryset(queryset, field_names=field_names) return export_to_csv_response(filename, headers, rows) From 67a00c7670c11c750e6b9b112c22ff8e06711edc Mon Sep 17 00:00:00 2001 From: Jennifer Kuenning <72825410+jkueloc@users.noreply.github.com> Date: Mon, 12 Aug 2024 07:34:30 -0400 Subject: [PATCH 02/28] Revert "revert bad merge to release (#2484)" (#2485) This reverts commit 695153bf0bf32eb51cea1a853e97e089a8c12e58. --- .eslintrc.yaml | 1 + concordia/admin/__init__.py | 44 +- concordia/admin/filters.py | 21 +- concordia/admin/forms.py | 18 +- concordia/documents.py | 3 + ...tions_userprofile_review_count_and_more.py | 43 + .../0098_userprofile_create_and_population.py | 40 + concordia/models.py | 154 +- concordia/signals/handlers.py | 8 +- concordia/static/js/src/asset-reservation.js | 16 +- concordia/static/js/src/banner.js | 18 + concordia/static/js/src/contribute.js | 23 + concordia/static/js/src/guide.js | 86 ++ concordia/static/js/src/ocr.js | 7 + concordia/static/js/src/quick-tips.js | 38 + concordia/static/js/src/viewer-split.js | 146 ++ concordia/static/js/src/viewer.js | 200 +++ concordia/tasks.py | 12 +- .../admin/concordia/item/change_form.html | 15 - .../admin/concordia/topic/change_form.html | 19 - .../templates/emails/unusual_activity.txt | 2 +- .../transcriptions/asset_detail.html | 1239 +---------------- .../asset_reservation_failure_modal.html | 19 + .../asset_detail/captcha_modal.html | 38 + .../transcriptions/asset_detail/editor.html | 118 ++ .../language_selection_modal.html | 33 + .../asset_detail/navigation.html | 49 + .../asset_detail/ocr_help_modal.html | 27 + .../asset_detail/ocr_transcription_modal.html | 24 + .../asset_detail/quick_tips_modal.html | 42 + .../asset_detail/review_accepted_modal.html | 35 + .../successful_submission_modal.html | 35 + .../transcriptions/asset_detail/tags.html | 47 + .../transcriptions/asset_detail/viewer.html | 121 ++ .../asset_detail/viewer_filters.html | 125 ++ .../transcriptions/topic_detail.html | 4 +- concordia/tests/test_admin.py | 6 +- concordia/tests/test_models.py | 142 +- concordia/tests/test_views.py | 9 +- exporter/tabular_export/admin.py | 22 +- 40 files changed, 1672 insertions(+), 1377 deletions(-) create mode 100644 concordia/migrations/0097_alter_sitereport_options_userprofile_review_count_and_more.py create mode 100644 concordia/migrations/0098_userprofile_create_and_population.py create mode 100644 concordia/static/js/src/banner.js create mode 100644 concordia/static/js/src/guide.js create mode 100644 concordia/static/js/src/ocr.js create mode 100644 concordia/static/js/src/quick-tips.js create mode 100644 concordia/static/js/src/viewer-split.js create mode 100644 concordia/static/js/src/viewer.js delete mode 100644 concordia/templates/admin/concordia/topic/change_form.html create mode 100644 concordia/templates/transcriptions/asset_detail/asset_reservation_failure_modal.html create mode 100644 concordia/templates/transcriptions/asset_detail/captcha_modal.html create mode 100644 concordia/templates/transcriptions/asset_detail/editor.html create mode 100644 concordia/templates/transcriptions/asset_detail/language_selection_modal.html create mode 100644 concordia/templates/transcriptions/asset_detail/navigation.html create mode 100644 concordia/templates/transcriptions/asset_detail/ocr_help_modal.html create mode 100644 concordia/templates/transcriptions/asset_detail/ocr_transcription_modal.html create mode 100644 concordia/templates/transcriptions/asset_detail/quick_tips_modal.html create mode 100644 concordia/templates/transcriptions/asset_detail/review_accepted_modal.html create mode 100644 concordia/templates/transcriptions/asset_detail/successful_submission_modal.html create mode 100644 concordia/templates/transcriptions/asset_detail/tags.html create mode 100644 concordia/templates/transcriptions/asset_detail/viewer.html create mode 100644 concordia/templates/transcriptions/asset_detail/viewer_filters.html diff --git a/.eslintrc.yaml b/.eslintrc.yaml index 989beb8c0..56959c746 100644 --- a/.eslintrc.yaml +++ b/.eslintrc.yaml @@ -15,6 +15,7 @@ rules: 'unicorn/prefer-query-selector': off # See https://github.com/sindresorhus/eslint-plugin-unicorn/issues/276 'unicorn/prefer-node-append': off 'unicorn/prefer-ternary': off + 'unicorn/no-lonely-if': off env: browser: true es2024: true diff --git a/concordia/admin/__init__.py b/concordia/admin/__init__.py index 0462e8891..46a8081e9 100644 --- a/concordia/admin/__init__.py +++ b/concordia/admin/__init__.py @@ -9,7 +9,6 @@ from django.contrib.auth.admin import UserAdmin from django.contrib.auth.decorators import permission_required from django.contrib.auth.models import User -from django.db.models import Count from django.http import HttpResponseRedirect from django.shortcuts import get_object_or_404, render from django.template.defaultfilters import truncatechars @@ -80,6 +79,7 @@ SubmittedFilter, TagCampaignListFilter, TagCampaignStatusListFilter, + TopicListFilter, TranscriptionCampaignListFilter, TranscriptionCampaignStatusListFilter, TranscriptionProjectListFilter, @@ -93,8 +93,9 @@ CampaignAdminForm, CardAdminForm, GuideAdminForm, + ItemAdminForm, ProjectAdminForm, - SanitizedDescriptionAdminForm, + TopicAdminForm, ) logger = logging.getLogger(__name__) @@ -107,16 +108,22 @@ class ConcordiaUserAdmin(UserAdmin): "is_staff", "date_joined", "transcription_count", + "review_count", ) def get_queryset(self, request): - qs = super().get_queryset(request) - qs = qs.annotate(Count("transcription")) + qs = super().get_queryset(request).select_related("profile") return qs - @admin.display(ordering="transcription__count") + @admin.display( + description="Transcription Count", ordering="profile__transcribe_count" + ) def transcription_count(self, obj): - return obj.transcription__count + return obj.profile.transcribe_count + + @admin.display(description="Review Count", ordering="profile__review_count") + def review_count(self, obj): + return obj.profile.review_count EXPORT_FIELDS = ( "username", @@ -128,17 +135,31 @@ def transcription_count(self, obj): "is_superuser", "date_joined", "last_login", - "transcription__count", + "profile__transcribe_count", + "profile__review_count", ) + EXTRA_VERBOSE_NAMES = { + "profile__transcribe_count": "transcription count", + "profile__review_count": "review count", + } + def export_users_as_csv(self, request, queryset): return export_to_csv_action( - self, request, queryset, field_names=self.EXPORT_FIELDS + self, + request, + queryset, + field_names=self.EXPORT_FIELDS, + extra_verbose_names=self.EXTRA_VERBOSE_NAMES, ) def export_users_as_excel(self, request, queryset): return export_to_excel_action( - self, request, queryset, field_names=self.EXPORT_FIELDS + self, + request, + queryset, + field_names=self.EXPORT_FIELDS, + extra_verbose_names=self.EXTRA_VERBOSE_NAMES, ) actions = (anonymize_action, export_users_as_csv, export_users_as_excel) @@ -358,8 +379,8 @@ class ResourceAdmin(admin.ModelAdmin, CustomListDisplayFieldsMixin): list_filter = ( "resource_type", ResourceCampaignStatusListFilter, + TopicListFilter, ResourceCampaignListFilter, - "title", ) def formfield_for_foreignkey(self, db_field, request, **kwargs): @@ -396,7 +417,7 @@ def get_fields(self, request, obj=None): @admin.register(Topic) class TopicAdmin(admin.ModelAdmin): - form = SanitizedDescriptionAdminForm + form = TopicAdminForm list_display = ( "id", @@ -523,6 +544,7 @@ def item_import_view(self, request, object_id): @admin.register(Item) class ItemAdmin(admin.ModelAdmin): + form = ItemAdminForm list_display = ("title", "item_id", "campaign_title", "project", "published") list_display_links = ("title", "item_id") search_fields = [ diff --git a/concordia/admin/filters.py b/concordia/admin/filters.py index 236c31337..4148a0d5b 100644 --- a/concordia/admin/filters.py +++ b/concordia/admin/filters.py @@ -1,7 +1,7 @@ from django.contrib import admin from django.utils.translation import gettext_lazy as _ -from ..models import Campaign, Project +from ..models import Campaign, Project, Topic class NullableTimestampFilter(admin.SimpleListFilter): @@ -92,6 +92,25 @@ def queryset(self, request, queryset): return queryset +class TopicListFilter(admin.SimpleListFilter): + """ + Base class for admin topic filters + """ + + title = "Topic" + template = "admin/long_name_filter.html" + parameter_name = "topic__id__exact" + + def lookups(self, request, model_admin): + queryset = Topic.objects.all() + return queryset.values_list("id", "title").order_by("title") + + def queryset(self, request, queryset): + if self.value(): + return queryset.filter(**{self.parameter_name: self.value()}) + return queryset + + class ProjectCampaignListFilter(CampaignListFilter): parameter_name = "campaign__id__exact" status_filter_parameter = "campaign__status" diff --git a/concordia/admin/forms.py b/concordia/admin/forms.py index ff3011a36..49df703b5 100644 --- a/concordia/admin/forms.py +++ b/concordia/admin/forms.py @@ -3,7 +3,7 @@ from django.core.cache import caches from tinymce.widgets import TinyMCE -from ..models import Campaign, Card, Guide, Project +from ..models import Campaign, Card, Guide, Item, Project, Topic FRAGMENT_ALLOWED_TAGS = { "a", @@ -90,6 +90,15 @@ def clean_short_description(self): ) +class TopicAdminForm(SanitizedDescriptionAdminForm): + class Meta(SanitizedDescriptionAdminForm.Meta): + model = Topic + widgets = { + "description": TinyMCE(), + "short_description": TinyMCE(), + } + + class CampaignAdminForm(SanitizedDescriptionAdminForm): class Meta(SanitizedDescriptionAdminForm.Meta): model = Campaign @@ -108,6 +117,13 @@ class Meta(SanitizedDescriptionAdminForm.Meta): } +class ItemAdminForm(forms.ModelForm): + class Meta: + model = Item + widgets = {"description": TinyMCE()} + fields = "__all__" + + class CardAdminForm(forms.ModelForm): class Meta: model = Card diff --git a/concordia/documents.py b/concordia/documents.py index 1a0620914..1060e3a6e 100644 --- a/concordia/documents.py +++ b/concordia/documents.py @@ -41,6 +41,7 @@ class Django: fields = [ "created_on", + "report_name", "assets_total", "assets_published", "assets_not_started", @@ -54,12 +55,14 @@ class Django: "projects_unpublished", "anonymous_transcriptions", "transcriptions_saved", + "daily_review_actions", "distinct_tags", "tag_uses", "campaigns_published", "campaigns_unpublished", "users_registered", "users_activated", + "registered_contributors", "daily_active_users", ] diff --git a/concordia/migrations/0097_alter_sitereport_options_userprofile_review_count_and_more.py b/concordia/migrations/0097_alter_sitereport_options_userprofile_review_count_and_more.py new file mode 100644 index 000000000..73264a261 --- /dev/null +++ b/concordia/migrations/0097_alter_sitereport_options_userprofile_review_count_and_more.py @@ -0,0 +1,43 @@ +# Generated by Django 4.2.13 on 2024-07-29 17:30 + +import django.db.models.deletion +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ("concordia", "0096_transcription_source"), + ] + + operations = [ + migrations.AlterModelOptions( + name="sitereport", + options={"get_latest_by": "created_on", "ordering": ("-created_on",)}, + ), + migrations.AddField( + model_name="userprofile", + name="review_count", + field=models.IntegerField( + default=0, verbose_name="transcription review count" + ), + ), + migrations.AddField( + model_name="userprofile", + name="transcribe_count", + field=models.IntegerField( + default=0, verbose_name="transcription save/submit count" + ), + ), + migrations.AlterField( + model_name="userprofile", + name="user", + field=models.OneToOneField( + on_delete=django.db.models.deletion.CASCADE, + related_name="profile", + to=settings.AUTH_USER_MODEL, + ), + ), + ] diff --git a/concordia/migrations/0098_userprofile_create_and_population.py b/concordia/migrations/0098_userprofile_create_and_population.py new file mode 100644 index 000000000..36efd5bc7 --- /dev/null +++ b/concordia/migrations/0098_userprofile_create_and_population.py @@ -0,0 +1,40 @@ +# Generated by Django 4.2.13 on 2024-07-29 17:40 + +from django.conf import settings +from django.db import migrations + + +def create_and_populate_profiles(apps, schema_editor): + User = apps.get_model("auth", "User") + UserProfile = apps.get_model("concordia", "UserProfile") + db_alias = schema_editor.connection.alias + for user in User.objects.using(db_alias).all().iterator(chunk_size=10000): + profile, created = UserProfile.objects.using(db_alias).get_or_create(user=user) + for activity in user.userprofileactivity_set.all(): + profile.transcribe_count += activity.transcribe_count + profile.review_count += activity.review_count + profile.save() + + +def revert_create_and_populate_profiles(apps, schema_editor): + # We can't actually revert the data to the state it was before, + # and there's no actual need to, but we need this function to be + # able to reverse this migration + pass + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ( + "concordia", + "0097_alter_sitereport_options_userprofile_review_count_and_more", + ), + ] + + operations = [ + migrations.RunPython( + create_and_populate_profiles, revert_create_and_populate_profiles + ), + ] diff --git a/concordia/models.py b/concordia/models.py index 495082209..e9c8b7939 100644 --- a/concordia/models.py +++ b/concordia/models.py @@ -11,7 +11,7 @@ from django.core.cache import cache from django.core.exceptions import ValidationError from django.core.validators import RegexValidator -from django.db import connection, models +from django.db import models from django.db.models import Count, ExpressionWrapper, F, JSONField, Q from django.db.models.functions import Round from django.db.models.signals import post_save @@ -27,8 +27,10 @@ User._meta.get_field("email").__dict__["_unique"] = True +ONE_MINUTE = datetime.timedelta(minutes=1) ONE_DAY = datetime.timedelta(days=1) ONE_DAY_AGO = timezone.now() - ONE_DAY +THRESHOLD = 3 def resource_file_upload_path(instance, filename): @@ -72,9 +74,53 @@ def get_email_reconfirmation_key(self): def validate_reconfirmation_email(self, email): return email == self.get_email_for_reconfirmation() + def review_incidents(self, recent_accepts, recent_rejects, threshold=THRESHOLD): + accepts = recent_accepts.filter(reviewed_by=self).values_list( + "accepted", flat=True + ) + rejects = recent_rejects.filter(reviewed_by=self).values_list( + "rejected", flat=True + ) + timestamps = list(accepts) + list(rejects) + timestamps.sort() + incidents = 0 + for i in range(len(timestamps)): + count = 1 + for j in range(i + 1, len(timestamps)): + if (timestamps[j] - timestamps[i]).seconds <= 60: + count += 1 + if count == threshold: + incidents += 1 + break + else: + break + return incidents + + def transcribe_incidents(self, transcriptions, threshold=THRESHOLD): + recent_transcriptions = transcriptions.filter(user=self).order_by("submitted") + timestamps = recent_transcriptions.values_list("submitted", flat=True) + incidents = 0 + for i in range(len(timestamps)): + count = 1 + for j in range(i + 1, len(timestamps)): + if (timestamps[j] - timestamps[i]).seconds <= 60: + count += 1 + if count == threshold: + incidents += 1 + break + else: + break + return incidents + class UserProfile(MetricsModelMixin("userprofile"), models.Model): - user = models.ForeignKey(User, on_delete=models.CASCADE) + user = models.OneToOneField(User, on_delete=models.CASCADE, related_name="profile") + transcribe_count = models.IntegerField( + default=0, verbose_name="transcription save/submit count" + ) + review_count = models.IntegerField( + default=0, verbose_name="transcription review count" + ) class OverlayPosition(object): @@ -792,63 +838,49 @@ def recent_review_actions(self, days=1): START = timezone.now() - datetime.timedelta(days=days) return self.review_actions(START) - def reviewing_too_quickly(self, start=ONE_DAY_AGO): - with connection.cursor() as cursor: - cursor.execute( - f"""SELECT u.id, u.username, COUNT(*) - FROM concordia_transcription t1 - JOIN concordia_transcription t2 - ON t1.id < t2.id - JOIN concordia_transcription t3 - ON t2.id < t3.id - AND t1.reviewed_by_id = t2.reviewed_by_id - AND t2.reviewed_by_id = t3.reviewed_by_id - AND t1.accepted >= '{start}' - AND t2.accepted >= '{start}' - AND t3.accepted >= '{start}' - AND ABS( - EXTRACT(EPOCH FROM (t1.updated_on - t2.updated_on)) - ) < 60 - AND ABS( - EXTRACT(EPOCH FROM (t1.updated_on - t3.updated_on)) - ) < 60 - AND ABS(EXTRACT( - EPOCH FROM (t2.updated_on - t3.updated_on)) - ) < 60 - JOIN auth_user u on t1.reviewed_by_id = u.id - WHERE u.is_superuser = FALSE and u.is_staff = False - GROUP BY u.id, u.username""" # nosec B608 - ) - return cursor.fetchall() - - def transcribing_too_quickly(self, start=ONE_DAY_AGO): - with connection.cursor() as cursor: - cursor.execute( - f"""SELECT u.id, u.username, COUNT(*) - FROM concordia_transcription t1 - JOIN concordia_transcription t2 - ON t1.id < t2.id - JOIN concordia_transcription t3 - ON t2.id < t3.id - AND t1.user_id = t2.user_id - AND t2.user_id = t3.user_id - AND t1.submitted >= '{start}' - AND t2.submitted >= '{start}' - AND t3.submitted >= '{start}' - AND ABS( - EXTRACT(EPOCH FROM (t1.created_on - t2.created_on)) - ) < 60 - AND ABS( - EXTRACT(EPOCH FROM (t1.created_on - t3.created_on)) - ) < 60 - AND ABS( - EXTRACT(EPOCH FROM (t2.created_on - t3.created_on)) - ) < 60 - JOIN auth_user u on t1.user_id = u.id - WHERE u.is_superuser = FALSE and u.is_staff = False - GROUP BY u.id, u.username""" # nosec B608 - ) - return cursor.fetchall() + def review_incidents(self): + user_incident_count = [] + recent_accepts = self.filter( + accepted__gte=ONE_DAY_AGO, + reviewed_by__is_superuser=False, + reviewed_by__is_staff=False, + ) + recent_rejects = self.filter( + rejected__gte=ONE_DAY_AGO, + reviewed_by__is_superuser=False, + reviewed_by__is_staff=False, + ) + recent_actions = recent_accepts.union(recent_rejects) + user_ids = set( + recent_actions.order_by("reviewed_by").values_list("reviewed_by", flat=True) + ) + + for user_id in user_ids: + user = ConcordiaUser.objects.get(id=user_id) + incident_count = user.review_incidents(recent_accepts, recent_rejects) + if incident_count > 0: + user_incident_count.append((user.id, user.username, incident_count)) + + return user_incident_count + + def transcribe_incidents(self): + user_incident_count = [] + transcriptions = self.get_queryset().filter( + submitted__gte=ONE_DAY_AGO, user__is_superuser=False, user__is_staff=False + ) + user_ids = ( + transcriptions.order_by("user") + .distinct("user") + .values_list("user", flat=True) + ) + + for user_id in user_ids: + user = ConcordiaUser.objects.get(id=user_id) + incident_count = user.transcribe_incidents(transcriptions) + if incident_count > 0: + user_incident_count.append((user.id, user.username, incident_count)) + + return user_incident_count class Transcription(MetricsModelMixin("transcription"), models.Model): @@ -962,10 +994,13 @@ def on_transcription_save(sender, instance, **kwargs): user=user, campaign=instance.asset.item.project.campaign, ) + profile, created = UserProfile.objects.get_or_create(user=user) if created: setattr(user_profile_activity, attr_name, 1) + setattr(profile, attr_name, 1) else: setattr(user_profile_activity, attr_name, F(attr_name) + 1) + setattr(profile, attr_name, F(attr_name) + 1) q = Q(transcription__user=user) | Q(transcription__reviewed_by=user) user_profile_activity.asset_count = ( Asset.objects.filter(q) @@ -974,6 +1009,7 @@ def on_transcription_save(sender, instance, **kwargs): .count() ) user_profile_activity.save() + profile.save() post_save.connect(on_transcription_save, sender=Transcription) diff --git a/concordia/signals/handlers.py b/concordia/signals/handlers.py index 47451cfae..72f12620b 100644 --- a/concordia/signals/handlers.py +++ b/concordia/signals/handlers.py @@ -14,7 +14,7 @@ from django_registration.signals import user_activated, user_registered from flags.state import flag_enabled -from ..models import Asset, Transcription, TranscriptionStatus +from ..models import Asset, Transcription, TranscriptionStatus, UserProfile from ..tasks import calculate_difficulty_values from .signals import reservation_obtained, reservation_released @@ -191,3 +191,9 @@ def send_asset_reservation_message( @receiver(post_delete, sender=Asset) def remove_file_from_s3(sender, instance, using, **kwargs): instance.storage_image.delete(save=False) + + +@receiver(post_save, sender=settings.AUTH_USER_MODEL) +def create_user_profile(sender, instance, *args, **kwargs): + if not hasattr(instance, "profile"): + UserProfile.objects.create(user=instance) diff --git a/concordia/static/js/src/asset-reservation.js b/concordia/static/js/src/asset-reservation.js index bb1ef4cfe..9e2299b59 100644 --- a/concordia/static/js/src/asset-reservation.js +++ b/concordia/static/js/src/asset-reservation.js @@ -1,5 +1,7 @@ /* global jQuery displayMessage displayHtmlMessage buildErrorMessage Sentry */ -/* exported attemptToReserveAsset */ +/* exported attemptToReserveAsset reserveAssetForEditing */ + +const assetData = document.currentScript.dataset; function attemptToReserveAsset(reservationURL, findANewPageURL, actionType) { var $transcriptionEditor = jQuery('#transcription-editor'); @@ -95,3 +97,15 @@ function attemptToReserveAsset(reservationURL, findANewPageURL, actionType) { } }); } + +function reserveAssetForEditing() { + if (assetData.reserveAssetUrl) { + attemptToReserveAsset(assetData.reserveAssetUrl, '', 'transcribe'); + } +} + +jQuery(function () { + if (assetData.reserveForEditing) { + reserveAssetForEditing(); + } +}); diff --git a/concordia/static/js/src/banner.js b/concordia/static/js/src/banner.js new file mode 100644 index 000000000..a46e3ea2a --- /dev/null +++ b/concordia/static/js/src/banner.js @@ -0,0 +1,18 @@ +/* global $ */ + +if (typeof Storage !== 'undefined') { + if (!(window.screen.width < 1024 || window.screen.height < 768)) { + for (var key in localStorage) { + if (key.startsWith('banner-')) { + if ($('#' + key).hasClass('alert')) { + $('#' + key).attr('hidden', true); + } + } + } + } +} + +$('#no-interface-banner').click(function (event) { + localStorage.setItem(event.target.parentElement.id, true); + $('#' + event.target.parentElement.id).attr('hidden', true); +}); diff --git a/concordia/static/js/src/contribute.js b/concordia/static/js/src/contribute.js index 30f9c8942..f477ef02e 100644 --- a/concordia/static/js/src/contribute.js +++ b/concordia/static/js/src/contribute.js @@ -766,4 +766,27 @@ function setupPage() { } } +let transcriptionForm = document.getElementById('transcription-editor'); +let ocrForm = document.getElementById('ocr-transcription-form'); + +let formChanged = false; +transcriptionForm.addEventListener('change', function () { + formChanged = true; +}); +transcriptionForm.addEventListener('submit', function () { + formChanged = false; +}); +if (ocrForm) { + ocrForm.addEventListener('submit', function () { + formChanged = false; + }); +} +window.addEventListener('beforeunload', function (event) { + if (formChanged) { + // Some browsers ignore this value and always display a built-in message instead + return (event.returnValue = + "The transcription you've started has not been saved."); + } +}); + setupPage(); diff --git a/concordia/static/js/src/guide.js b/concordia/static/js/src/guide.js new file mode 100644 index 000000000..2bfe28570 --- /dev/null +++ b/concordia/static/js/src/guide.js @@ -0,0 +1,86 @@ +/* global $ trackUIInteraction */ +/* exported openOffcanvas closeOffcanvas showPane hidePane */ + +function openOffcanvas() { + var guide = document.getElementById('guide-sidebar'); + guide.classList.remove('offscreen'); + guide.style.borderWidth = '0 0 thick thick'; + guide.style.borderStyle = 'solid'; + guide.style.borderColor = '#0076ad'; + document.getElementById('open-guide').style.display = 'none'; + document.addEventListener('keydown', function (event) { + if (event.key == 'Escape') { + closeOffcanvas(); + } + }); +} + +function closeOffcanvas() { + var guide = document.getElementById('guide-sidebar'); + guide.classList.add('offscreen'); + + guide.style.border = 'none'; + document.getElementById('open-guide').style.display = 'block'; +} + +function showPane(elementId) { + document.getElementById(elementId).classList.add('show', 'active'); + document.getElementById('guide-nav').classList.remove('show', 'active'); +} + +function hidePane(elementId) { + document.getElementById(elementId).classList.remove('show', 'active'); + document.getElementById('guide-nav').classList.add('show', 'active'); +} + +function trackHowToInteraction(element, label) { + trackUIInteraction(element, 'How To Guide', 'click', label); +} + +$('#open-guide').on('click', function () { + trackHowToInteraction($(this), 'Open'); +}); +$('#close-guide').on('click', function () { + trackHowToInteraction($(this), 'Close'); +}); +$('#previous-guide').on('click', function () { + trackHowToInteraction($(this), 'Back'); +}); +$('#next-guide').on('click', function () { + trackHowToInteraction($(this), 'Next'); +}); +$('#guide-bars').on('click', function () { + trackHowToInteraction($(this), 'Hamburger Menu'); +}); +$('#guide-sidebar .nav-link').on('click', function () { + let label = $(this).text().trim(); + trackHowToInteraction($(this), label); +}); + +$('#guide-carousel') + .carousel({ + interval: false, + wrap: false, + }) + .on('slide.bs.carousel', function (event) { + if (event.to == 0) { + $('#guide-bars').addClass('d-none'); + } else { + $('#guide-bars').removeClass('d-none'); + } + }); + +$('#previous-card').hide(); + +$('#card-carousel').on('slid.bs.carousel', function () { + if ($('#card-carousel .carousel-item:first').hasClass('active')) { + $('#previous-card').hide(); + $('#next-card').show(); + } else if ($('#card-carousel .carousel-item:last').hasClass('active')) { + $('#previous-card').show(); + $('#next-card').hide(); + } else { + $('#previous-card').show(); + $('#next-card').show(); + } +}); diff --git a/concordia/static/js/src/ocr.js b/concordia/static/js/src/ocr.js new file mode 100644 index 000000000..8c5cf0d07 --- /dev/null +++ b/concordia/static/js/src/ocr.js @@ -0,0 +1,7 @@ +/* global $ */ +/* exported selectLanguage */ + +function selectLanguage() { + $('#ocr-transcription-modal').modal('hide'); + $('#language-selection-modal').modal('show'); +} diff --git a/concordia/static/js/src/quick-tips.js b/concordia/static/js/src/quick-tips.js new file mode 100644 index 000000000..139eb3acf --- /dev/null +++ b/concordia/static/js/src/quick-tips.js @@ -0,0 +1,38 @@ +/* global $ trackUIInteraction setTutorialHeight */ + +function trackQuickTipsInteraction(element, label) { + trackUIInteraction(element, 'Quick Tips', 'click', label); +} + +var mainContentHeight = $('#contribute-main-content').height(); +if (mainContentHeight < 710) { + $('.sidebar').height(mainContentHeight - 130); +} + +$('#tutorial-popup').on('shown.bs.modal', function () { + setTutorialHeight(); +}); + +$('#quick-tips').on('click', function () { + trackQuickTipsInteraction($(this), 'Open'); +}); +$('#previous-card').on('click', function () { + trackQuickTipsInteraction($(this), 'Back'); +}); +$('#next-card').on('click', function () { + trackQuickTipsInteraction($(this), 'Next'); +}); +$('.carousel-indicators li').on('click', function () { + let index = [...this.parentElement.children].indexOf(this); + trackQuickTipsInteraction($(this), `Carousel ${index}`); +}); +$('#tutorial-popup').on('hidden.bs.modal', function () { + // We're tracking whenever the popup closes, so we don't separately track the close button being clicked + trackUIInteraction($(this), 'Quick Tips', 'click', 'Close'); +}); +$('#tutorial-popup').on('shown-on-load', function () { + // We set a timeout to make sure the analytics code is loaded before trying to track + setTimeout(function () { + trackUIInteraction($(this), 'Quick Tips', 'load', 'Open'); + }, 1000); +}); diff --git a/concordia/static/js/src/viewer-split.js b/concordia/static/js/src/viewer-split.js new file mode 100644 index 000000000..2769b7b49 --- /dev/null +++ b/concordia/static/js/src/viewer-split.js @@ -0,0 +1,146 @@ +/* global Split seadragonViewer */ + +let pageSplit; +let contributeContainer = document.getElementById('contribute-container'); +let ocrSection = document.getElementById('ocr-section'); +let editorColumn = document.getElementById('editor-column'); +let viewerColumn = document.getElementById('viewer-column'); +let layoutColumns = ['#viewer-column', '#editor-column']; +let verticalKey = 'transcription-split-sizes-vertical'; +let horizontalKey = 'transcription-split-sizes-horizontal'; + +let sizesVertical = localStorage.getItem(verticalKey); + +if (sizesVertical) { + sizesVertical = JSON.parse(sizesVertical); +} else { + sizesVertical = [50, 50]; +} + +let sizesHorizontal = localStorage.getItem(horizontalKey); + +if (sizesHorizontal) { + sizesHorizontal = JSON.parse(sizesHorizontal); +} else { + sizesHorizontal = [50, 50]; +} + +let splitDirection = localStorage.getItem('transcription-split-direction'); + +if (splitDirection) { + splitDirection = JSON.parse(splitDirection); +} else { + splitDirection = 'h'; +} + +function saveSizes(sizes) { + let sizeKey; + if (splitDirection == 'h') { + sizeKey = horizontalKey; + sizesHorizontal = sizes; + } else { + sizeKey = verticalKey; + sizesVertical = sizes; + } + localStorage.setItem(sizeKey, JSON.stringify(sizes)); +} + +function saveDirection(direction) { + localStorage.setItem( + 'transcription-split-direction', + JSON.stringify(direction), + ); +} + +function verticalSplit() { + splitDirection = 'v'; + saveDirection(splitDirection); + contributeContainer.classList.remove('flex-row'); + contributeContainer.classList.add('flex-column'); + viewerColumn.classList.remove('h-100'); + if (ocrSection != undefined) { + editorColumn.prepend(ocrSection); + } + + return Split(layoutColumns, { + sizes: sizesVertical, + minSize: 100, + gutterSize: 8, + direction: 'vertical', + elementStyle: function (dimension, size, gutterSize) { + return { + 'flex-basis': 'calc(' + size + '% - ' + gutterSize + 'px)', + }; + }, + gutterStyle: function (dimension, gutterSize) { + return { + 'flex-basis': gutterSize + 'px', + }; + }, + onDragEnd: saveSizes, + }); +} +function horizontalSplit() { + splitDirection = 'h'; + saveDirection(splitDirection); + contributeContainer.classList.remove('flex-column'); + contributeContainer.classList.add('flex-row'); + viewerColumn.classList.add('h-100'); + if (ocrSection != undefined) { + viewerColumn.append(ocrSection); + } + return Split(layoutColumns, { + sizes: sizesHorizontal, + minSize: 100, + gutterSize: 8, + elementStyle: function (dimension, size, gutterSize) { + return { + 'flex-basis': 'calc(' + size + '% - ' + gutterSize + 'px)', + }; + }, + gutterStyle: function (dimension, gutterSize) { + return { + 'flex-basis': gutterSize + 'px', + }; + }, + onDragEnd: saveSizes, + }); +} + +document + .getElementById('viewer-layout-horizontal') + .addEventListener('click', function () { + if (splitDirection != 'h') { + if (pageSplit != undefined) { + pageSplit.destroy(); + } + pageSplit = horizontalSplit(); + setTimeout(function () { + // Some quirk in the viewer makes this + // sometimes not work depending on + // the rotation, unless it's delayed. + // Less than 10ms didn't reliable work. + seadragonViewer.viewport.zoomTo(1); + }, 10); + } + }); + +document + .getElementById('viewer-layout-vertical') + .addEventListener('click', function () { + if (splitDirection != 'v') { + if (pageSplit != undefined) { + pageSplit.destroy(); + } + pageSplit = verticalSplit(); + setTimeout(function () { + seadragonViewer.viewport.zoomTo(1); + }, 10); + } + }); + +if (splitDirection == 'v') { + pageSplit = verticalSplit(); +} else { + pageSplit = horizontalSplit(); +} diff --git a/concordia/static/js/src/viewer.js b/concordia/static/js/src/viewer.js new file mode 100644 index 000000000..9ad073409 --- /dev/null +++ b/concordia/static/js/src/viewer.js @@ -0,0 +1,200 @@ +/* global OpenSeadragon screenfull debounce */ +/* exported seadragonView stepUp stepDown resetImageFilterForms */ + +const viewerData = document.currentScript.dataset; + +var seadragonViewer = OpenSeadragon({ + id: 'asset-image', + prefixUrl: viewerData.prefixUrl, + tileSources: { + type: 'image', + url: viewerData.tileSourceUrl, + }, + gestureSettingsTouch: { + pinchRotate: true, + }, + showNavigator: true, + showRotationControl: true, + showFlipControl: true, + toolbar: 'viewer-controls', + zoomInButton: 'viewer-zoom-in', + zoomOutButton: 'viewer-zoom-out', + homeButton: 'viewer-home', + rotateLeftButton: 'viewer-rotate-left', + rotateRightButton: 'viewer-rotate-right', + flipButton: 'viewer-flip', + crossOriginPolicy: 'Anonymous', +}); + +// We need to define our own fullscreen function rather than using OpenSeadragon's +// because the built-in fullscreen function overwrites the DOM with the viewer, +// breaking our extra controls, such as the image filters. +if (screenfull.isEnabled) { + let fullscreenButton = document.querySelector('#viewer-fullscreen'); + fullscreenButton.addEventListener('click', function (event) { + event.preventDefault(); + let targetElement = document.querySelector( + fullscreenButton.dataset.target, + ); + if (screenfull.isFullscreen) { + screenfull.exit(); + } else { + screenfull.request(targetElement); + } + }); +} + +// The buttons configured as controls for the viewer don't properly get focus +// when clicked. This mostly isn't a problem, but causes odd-looking behavior +// when one of the extra buttons in the control bar is clicked (and therefore +// focused) first--clicking the control button leaves the focus on the extra +// button. +// TODO: Attempting to add focus to the clicked button here doesn't consistently +// work for unknown reasons, so it just removes focus from the extra buttons +// for now +let viewerControlButtons = document.querySelectorAll('.viewer-control-button'); +for (const node of viewerControlButtons) { + node.addEventListener('click', function () { + let focusedButton = document.querySelector( + '.extra-control-button:focus', + ); + if (focusedButton) { + focusedButton.blur(); + } + }); +} + +/* + * Image filter handling + */ + +let availableFilters = [ + { + formId: 'gamma-form', + inputId: 'gamma', + getFilter: function () { + let value = document.getElementById(this.inputId).value; + if ( + !Number.isNaN(value) && + value != 1 && + value >= 0 && + value <= 5 + ) { + return OpenSeadragon.Filters.GAMMA(value); + } + }, + }, + { + formId: 'invert-form', + inputId: 'invert', + getFilter: function () { + let value = document.getElementById(this.inputId).checked; + if (value) { + return OpenSeadragon.Filters.INVERT(); + } + }, + }, + { + formId: 'threshold-form', + inputId: 'threshold', + getFilter: function () { + let value = document.getElementById(this.inputId).value; + if (!Number.isNaN(value) && value > 0 && value <= 255) { + return OpenSeadragon.Filters.THRESHOLDING(value); + } + }, + }, +]; + +function updateFilters() { + let filters = []; + for (const filterData of availableFilters) { + let filter = filterData.getFilter(); + if (filter) { + filters.push(filter); + } + } + + seadragonViewer.setFilterOptions({ + filters: { + processors: filters, + }, + }); +} + +for (const filterData of availableFilters) { + let form = document.getElementById(filterData.formId); + if (form) { + form.addEventListener('change', updateFilters); + form.addEventListener('reset', function () { + // We use setTimeout to push the updateFilters + // call to the next event cycle in order to + // call it after the form is reset, instead + // of before, which is when this listener + // triggers + setTimeout(updateFilters); + }); + } + + let input = document.getElementById(filterData.inputId); + if (input) { + // We use debounce here so that updateFilters is only called once, + // after the user stops typing or scrolling with their mousewheel + input.addEventListener( + 'keyup', + debounce(() => updateFilters()), + ); + input.addEventListener( + 'wheel', + debounce(() => updateFilters()), + ); + } +} + +/* + * Image filter form handling + */ +function stepUp(id) { + let input = document.getElementById(id); + input.stepUp(); + input.dispatchEvent(new Event('input', {bubbles: true})); + input.dispatchEvent(new Event('change', {bubbles: true})); + return false; +} + +function stepDown(id) { + let input = document.getElementById(id); + input.stepDown(); + input.dispatchEvent(new Event('input', {bubbles: true})); + input.dispatchEvent(new Event('change', {bubbles: true})); + return false; +} + +function resetImageFilterForms() { + for (const filterData of availableFilters) { + let form = document.getElementById(filterData.formId); + form.reset(); + } +} + +let gammaNumber = document.getElementById('gamma'); +let gammaRange = document.getElementById('gamma-range'); + +gammaNumber.addEventListener('input', function () { + gammaRange.value = gammaNumber.value; +}); + +gammaRange.addEventListener('input', function () { + gammaNumber.value = gammaRange.value; +}); + +let thresholdNumber = document.getElementById('threshold'); +let thresholdRange = document.getElementById('threshold-range'); + +thresholdNumber.addEventListener('input', function () { + thresholdRange.value = thresholdNumber.value; +}); + +thresholdRange.addEventListener('input', function () { + thresholdNumber.value = thresholdRange.value; +}); diff --git a/concordia/tasks.py b/concordia/tasks.py index bb3054dad..8445b0670 100644 --- a/concordia/tasks.py +++ b/concordia/tasks.py @@ -1043,14 +1043,6 @@ def fix_storage_images(campaign_slug=None, asset_start_id=None): logger.debug("%s / %s (%s%%)", count, full_count, str(count / full_count * 100)) -def transcribing_too_quickly(): - return Transcription.objects.transcribing_too_quickly() - - -def reviewing_too_quickly(): - return Transcription.objects.reviewing_too_quickly() - - @celery_app.task(ignore_result=True) def clear_sessions(): # This clears expired Django sessions in the database @@ -1067,8 +1059,8 @@ def unusual_activity(): "title": "Unusual User Activity Report for " + timezone.now().strftime("%b %d %Y, %I:%M %p"), "domain": "https://" + site.domain, - "transcriptions": transcribing_too_quickly(), - "reviews": reviewing_too_quickly(), + "transcriptions": Transcription.objects.transcribe_incidents(), + "reviews": Transcription.objects.review_incidents(), } text_body_template = loader.get_template("emails/unusual_activity.txt") diff --git a/concordia/templates/admin/concordia/item/change_form.html b/concordia/templates/admin/concordia/item/change_form.html index 4e0dc3352..835d87b2e 100644 --- a/concordia/templates/admin/concordia/item/change_form.html +++ b/concordia/templates/admin/concordia/item/change_form.html @@ -29,18 +29,3 @@ {% endif %} {{ block.super }} {% endblock %} - -{% block extrahead %} - {{ block.super }} - - {% include 'fragments/codemirror.html' %} -{% endblock extrahead %} - - -{% block content %} - {{ block.super }} - - -{% endblock content %} diff --git a/concordia/templates/admin/concordia/topic/change_form.html b/concordia/templates/admin/concordia/topic/change_form.html deleted file mode 100644 index e461b658c..000000000 --- a/concordia/templates/admin/concordia/topic/change_form.html +++ /dev/null @@ -1,19 +0,0 @@ -{% extends "admin/change_form.html" %} - -{% load i18n admin_urls static %} - -{% block extrahead %} - {{ block.super }} - - {% include 'fragments/codemirror.html' %} -{% endblock extrahead %} - - -{% block content %} - {{ block.super }} - - -{% endblock content %} diff --git a/concordia/templates/emails/unusual_activity.txt b/concordia/templates/emails/unusual_activity.txt index eb2bf8549..daba6e152 100644 --- a/concordia/templates/emails/unusual_activity.txt +++ b/concordia/templates/emails/unusual_activity.txt @@ -6,7 +6,7 @@ Incidents of two or more transcriptions submitted within a single minute: No transcriptions fell within the window. {% endfor %} Incidents of two or more transcriptions reviewed within a single minute: -{% for row in reviews_by %} +{% for row in reviews %} {{ row.1 }} | {{ row.2 }} {% empty %} No reviews fell within the window. diff --git a/concordia/templates/transcriptions/asset_detail.html b/concordia/templates/transcriptions/asset_detail.html index 5ed967fbf..f67474313 100644 --- a/concordia/templates/transcriptions/asset_detail.html +++ b/concordia/templates/transcriptions/asset_detail.html @@ -18,6 +18,25 @@ + + + + + + + + + + + {% endblock head_content %} {% block breadcrumbs %} @@ -35,330 +54,13 @@
-
-
-
- - -
- -
- -
- -
- - -
- -
- - -
- -
- -
- -
- -
- -
- -
- -
- -
-
-
- - -
-
- -
- -
-
-
-
-
-
- - -
-
-
- -
-
- -
-
-
- - - -
-
-
-
- -
- - -
- -
-
-
-
-
-
- - -
-
-
- -
-
- -
-
-
- - - -
-
-
-
+ {% include "transcriptions/asset_detail/viewer.html" %} + {% include "transcriptions/asset_detail/ocr_help_modal.html" %} + {% include "transcriptions/asset_detail/viewer_filters.html" %}
{% if not disable_ocr %}
@@ -559,739 +97,26 @@

{% if cards %} - + {% include "transcriptions/asset_detail/quick_tips_modal.html" %} {% endif %} {% endblock main_content %} - -{% block body_scripts %} - - - - - - - - - - - - - - - - - - - -{% endblock body_scripts %} diff --git a/concordia/templates/transcriptions/asset_detail/asset_reservation_failure_modal.html b/concordia/templates/transcriptions/asset_detail/asset_reservation_failure_modal.html new file mode 100644 index 000000000..a84b36411 --- /dev/null +++ b/concordia/templates/transcriptions/asset_detail/asset_reservation_failure_modal.html @@ -0,0 +1,19 @@ + diff --git a/concordia/templates/transcriptions/asset_detail/captcha_modal.html b/concordia/templates/transcriptions/asset_detail/captcha_modal.html new file mode 100644 index 000000000..2ca5c457d --- /dev/null +++ b/concordia/templates/transcriptions/asset_detail/captcha_modal.html @@ -0,0 +1,38 @@ + diff --git a/concordia/templates/transcriptions/asset_detail/editor.html b/concordia/templates/transcriptions/asset_detail/editor.html new file mode 100644 index 000000000..92a09da5e --- /dev/null +++ b/concordia/templates/transcriptions/asset_detail/editor.html @@ -0,0 +1,118 @@ +
+
+

+ + Needs review +

+

+ + Completed +

+

+ + Not started +

+

+ + In progress +

+ +
+ +
+ {% csrf_token %} + + +
+ +

+ Registered Contributors: {{ registered_contributors }} +

+ + Transcribe this page. + + + Someone started this transcription. Can you finish it? + + + Check this transcription thoroughly. Accept if correct! + + + This transcription is finished! You can read and add tags. + +
+ +
+ + {% spaceless %} +
+ +
+
+ + {% if guides %} + + {% include "fragments/_how-to-guide.html" %} + {% endif %} +
+ + + +
+ {% if transcription_status == 'not_started' or transcription_status == 'in_progress' %} +
+ + + + + + +
+ + + + + + + {% elif transcription_status == 'submitted' %} + {% if not user.is_authenticated %} +

+ Register + or + login + to help review +

+ {% else %} + + {% if transcription.user.pk == user.pk %} +

You submitted this transcription. You can re-open it for editing if you wish to make changes before another volunteer reviews it.

+ {% else %} + + {% endif %} + {% endif %} + {% endif %} +
+ {% endspaceless %} +
+
diff --git a/concordia/templates/transcriptions/asset_detail/language_selection_modal.html b/concordia/templates/transcriptions/asset_detail/language_selection_modal.html new file mode 100644 index 000000000..63ba19e31 --- /dev/null +++ b/concordia/templates/transcriptions/asset_detail/language_selection_modal.html @@ -0,0 +1,33 @@ + diff --git a/concordia/templates/transcriptions/asset_detail/navigation.html b/concordia/templates/transcriptions/asset_detail/navigation.html new file mode 100644 index 000000000..6f9c2259c --- /dev/null +++ b/concordia/templates/transcriptions/asset_detail/navigation.html @@ -0,0 +1,49 @@ + diff --git a/concordia/templates/transcriptions/asset_detail/ocr_help_modal.html b/concordia/templates/transcriptions/asset_detail/ocr_help_modal.html new file mode 100644 index 000000000..b491590cf --- /dev/null +++ b/concordia/templates/transcriptions/asset_detail/ocr_help_modal.html @@ -0,0 +1,27 @@ + diff --git a/concordia/templates/transcriptions/asset_detail/ocr_transcription_modal.html b/concordia/templates/transcriptions/asset_detail/ocr_transcription_modal.html new file mode 100644 index 000000000..39ef4601b --- /dev/null +++ b/concordia/templates/transcriptions/asset_detail/ocr_transcription_modal.html @@ -0,0 +1,24 @@ + diff --git a/concordia/templates/transcriptions/asset_detail/quick_tips_modal.html b/concordia/templates/transcriptions/asset_detail/quick_tips_modal.html new file mode 100644 index 000000000..9d6337a28 --- /dev/null +++ b/concordia/templates/transcriptions/asset_detail/quick_tips_modal.html @@ -0,0 +1,42 @@ + diff --git a/concordia/templates/transcriptions/asset_detail/review_accepted_modal.html b/concordia/templates/transcriptions/asset_detail/review_accepted_modal.html new file mode 100644 index 000000000..5bb447160 --- /dev/null +++ b/concordia/templates/transcriptions/asset_detail/review_accepted_modal.html @@ -0,0 +1,35 @@ + diff --git a/concordia/templates/transcriptions/asset_detail/successful_submission_modal.html b/concordia/templates/transcriptions/asset_detail/successful_submission_modal.html new file mode 100644 index 000000000..45cdb964a --- /dev/null +++ b/concordia/templates/transcriptions/asset_detail/successful_submission_modal.html @@ -0,0 +1,35 @@ + diff --git a/concordia/templates/transcriptions/asset_detail/tags.html b/concordia/templates/transcriptions/asset_detail/tags.html new file mode 100644 index 000000000..0df583244 --- /dev/null +++ b/concordia/templates/transcriptions/asset_detail/tags.html @@ -0,0 +1,47 @@ +
+

+
+ {% csrf_token %} +
+ {% if user.is_authenticated %} +
+
+ +
+ +
+
+ Tags must be between 1-50 characters and may contain only letters, numbers, dashes, underscores, apostrophes, and spaces +
+
+
+ {% else %} +

+ Want to tag this page? + + Register + or + login + to add tags. +

+ {% endif %} +
+ +
    + {% for tag in tags %} +
  • + + +
  • + {% endfor %} +
+
+
diff --git a/concordia/templates/transcriptions/asset_detail/viewer.html b/concordia/templates/transcriptions/asset_detail/viewer.html new file mode 100644 index 000000000..edd395d35 --- /dev/null +++ b/concordia/templates/transcriptions/asset_detail/viewer.html @@ -0,0 +1,121 @@ +
+
+
+ + +
+ +
+ +
+ +
+ + +
+ +
+ + +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+
+
+ + diff --git a/concordia/templates/transcriptions/asset_detail/viewer_filters.html b/concordia/templates/transcriptions/asset_detail/viewer_filters.html new file mode 100644 index 000000000..3170aae21 --- /dev/null +++ b/concordia/templates/transcriptions/asset_detail/viewer_filters.html @@ -0,0 +1,125 @@ +
+
+ +
+ +
+
+
+
+
+
+ + +
+
+
+ +
+
+ +
+
+
+ + + +
+
+
+
+ +
+ + +
+ +
+
+
+
+
+
+ + +
+
+
+ +
+
+ +
+
+
+ + + +
+
+
+
diff --git a/concordia/templates/transcriptions/topic_detail.html b/concordia/templates/transcriptions/topic_detail.html index cd230eb5e..6f159a8c3 100644 --- a/concordia/templates/transcriptions/topic_detail.html +++ b/concordia/templates/transcriptions/topic_detail.html @@ -14,12 +14,12 @@ {% block breadcrumbs %} - + {% endblock breadcrumbs %} {% block main_content %}
-
+

{{ topic.title }}

{{ topic.description|safe }}
diff --git a/concordia/tests/test_admin.py b/concordia/tests/test_admin.py index b524503ad..8fe3f680f 100644 --- a/concordia/tests/test_admin.py +++ b/concordia/tests/test_admin.py @@ -79,9 +79,9 @@ def test_csv_export(self): self.assertEqual(len(content), 4) # Includes empty line at the end of the file test_data = [ b"username,email address,first name,last name,active,staff status," - + b"superuser status,last login,transcription__count", - b"testsuperuser,testsuperuser@example.com,,,True,True,True,,0", - b"testuser,testuser@example.com,,,True,False,False,,0", + + b"superuser status,last login,transcription count,review count", + b"testsuperuser,testsuperuser@example.com,,,True,True,True,,0,0", + b"testuser,testuser@example.com,,,True,False,False,,0,0", b"", ] self.assertEqual(content, test_data) diff --git a/concordia/tests/test_models.py b/concordia/tests/test_models.py index bfc4dec81..bee7580fa 100644 --- a/concordia/tests/test_models.py +++ b/concordia/tests/test_models.py @@ -114,6 +114,110 @@ def test_review_actions(self): end = timezone.now() - timedelta(days=1) self.assertEqual(Transcription.objects.review_actions(start, end).count(), 1) + def test_review_incidents(self): + self.transcription1.accepted = timezone.now() + self.transcription1.reviewed_by = self.create_user(username="tester2") + self.transcription1.save() + self.transcription2.accepted = self.transcription1.accepted + timedelta( + seconds=29 + ) + self.transcription2.reviewed_by = self.transcription1.reviewed_by + self.transcription2.save() + users = Transcription.objects.review_incidents() + self.assertNotIn(self.transcription1.user.id, users) + + transcription3 = create_transcription( + asset=self.transcription1.asset, + user=self.transcription1.user, + reviewed_by=self.transcription1.reviewed_by, + accepted=self.transcription1.accepted + timedelta(seconds=58), + ) + transcription4 = create_transcription( + asset=self.transcription1.asset, + user=self.transcription1.user, + reviewed_by=self.transcription1.reviewed_by, + accepted=transcription3.accepted + timedelta(minutes=1, seconds=1), + ) + users = Transcription.objects.review_incidents() + self.assertEqual(len(users), 1) + self.assertEqual( + users[0], + ( + self.transcription1.reviewed_by.id, + self.transcription1.reviewed_by.username, + 1, + ), + ) + + create_transcription( + asset=self.transcription1.asset, + user=self.transcription1.user, + reviewed_by=self.transcription1.reviewed_by, + accepted=transcription4.accepted + timedelta(seconds=29), + ) + create_transcription( + asset=self.transcription1.asset, + user=self.transcription1.user, + reviewed_by=self.transcription1.reviewed_by, + accepted=transcription4.accepted + timedelta(seconds=58), + ) + users = Transcription.objects.review_incidents() + self.assertEqual(len(users), 1) + self.assertEqual( + users[0], + ( + self.transcription1.reviewed_by.id, + self.transcription1.reviewed_by.username, + 2, + ), + ) + + def test_transcribe_incidents(self): + self.transcription1.submitted = timezone.now() + self.transcription1.save() + self.transcription2.submitted = self.transcription1.submitted + timedelta( + seconds=29 + ) + self.transcription2.user = self.transcription1.user + self.transcription2.save() + users = Transcription.objects.transcribe_incidents() + self.assertEqual(len(users), 0) + self.assertNotIn(self.transcription1.user.id, users) + + transcription3 = create_transcription( + asset=self.transcription1.asset, + user=self.transcription1.user, + submitted=self.transcription1.submitted + timedelta(seconds=58), + ) + transcription4 = create_transcription( + asset=self.transcription1.asset, + user=self.transcription1.user, + submitted=transcription3.submitted + timedelta(minutes=1, seconds=1), + ) + create_transcription( + asset=self.transcription1.asset, + user=self.transcription1.user, + submitted=transcription4.submitted + timedelta(seconds=59), + ) + users = Transcription.objects.transcribe_incidents() + self.assertEqual(len(users), 1) + self.assertEqual( + users[0], + (self.transcription1.user.id, self.transcription1.user.username, 1), + ) + + create_transcription( + asset=self.transcription1.asset, + user=self.transcription1.user, + submitted=self.transcription1.submitted + timedelta(minutes=1, seconds=59), + ) + users = Transcription.objects.transcribe_incidents() + self.assertEqual(len(users), 1) + self.assertEqual( + users[0], + (self.transcription1.user.id, self.transcription1.user.username, 2), + ) + class TranscriptionTestCase(CreateTestUsers, TestCase): def setUp(self): @@ -176,44 +280,6 @@ def test_status(self): TranscriptionStatus.CHOICE_MAP[TranscriptionStatus.COMPLETED], ) - def test_reviewing_too_quickly(self): - self.transcription1.accepted = timezone.now() - self.transcription1.reviewed_by = self.create_user(username="tester2") - self.transcription1.save() - self.transcription2.accepted = self.transcription1.accepted - self.transcription2.reviewed_by = self.transcription1.reviewed_by - self.transcription2.save() - transcriptions = Transcription.objects.reviewing_too_quickly() - self.assertEqual(len(transcriptions), 0) - - transcription3 = create_transcription( - asset=self.transcription1.asset, - user=self.transcription1.user, - reviewed_by=self.transcription1.reviewed_by, - accepted=self.transcription1.accepted, - ) - transcriptions = Transcription.objects.reviewing_too_quickly() - self.assertEqual(len(transcriptions), 1) - self.assertEqual(transcriptions[0][0], transcription3.reviewed_by.id) - - def test_transcribing_too_quickly(self): - self.transcription1.submitted = timezone.now() - self.transcription1.save() - self.transcription2.submitted = self.transcription1.submitted - self.transcription2.user = self.transcription1.user - self.transcription2.save() - transcriptions = Transcription.objects.transcribing_too_quickly() - self.assertEqual(len(transcriptions), 0) - - transcription3 = create_transcription( - asset=self.transcription1.asset, - user=self.transcription1.user, - submitted=self.transcription1.submitted, - ) - transcriptions = Transcription.objects.transcribing_too_quickly() - self.assertEqual(len(transcriptions), 1) - self.assertEqual(transcriptions[0][0], transcription3.user.id) - class AssetTranscriptionReservationTest(CreateTestUsers, TestCase): def setUp(self): diff --git a/concordia/tests/test_views.py b/concordia/tests/test_views.py index 23e4fd2da..ea912bef1 100644 --- a/concordia/tests/test_views.py +++ b/concordia/tests/test_views.py @@ -577,8 +577,8 @@ def test_asset_reservation_competition(self): # to edit it after logging in # 4 queries = - # 1 expiry + 1 acquire + 2 get user ID from request - with self.assertNumQueries(4): + # 1 expiry + 1 acquire + 2 get user ID + 2 get user profile from request + with self.assertNumQueries(6): resp = self.client.post(reverse("reserve-asset", args=(asset.pk,))) self.assertEqual(200, resp.status_code) self.assertEqual(1, AssetTranscriptionReservation.objects.count()) @@ -682,8 +682,9 @@ def test_asset_reservation_tombstone(self): self.client.logout() - # 1 reservation check + 1 acquire + 2 get user ID from request - expected_queries = 4 + # 1 reservation check + 1 acquire + 2 get user ID + # + 2 get user profile from request + expected_queries = 6 if settings.SESSION_ENGINE.endswith("db"): # + 1 session check expected_queries += 1 diff --git a/exporter/tabular_export/admin.py b/exporter/tabular_export/admin.py index 5c368a889..9892b43f0 100644 --- a/exporter/tabular_export/admin.py +++ b/exporter/tabular_export/admin.py @@ -49,10 +49,17 @@ def inner(modeladmin, request, queryset, filename=None, *args, **kwargs): @ensure_filename("xlsx") def export_to_excel_action( - modeladmin, request, queryset, filename=None, field_names=None + modeladmin, + request, + queryset, + filename=None, + field_names=None, + extra_verbose_names=None, ): """Django admin action which exports selected records as an Excel XLSX download""" - headers, rows = flatten_queryset(queryset, field_names=field_names) + headers, rows = flatten_queryset( + queryset, field_names=field_names, extra_verbose_names=extra_verbose_names + ) return export_to_excel_response(filename, headers, rows) @@ -61,10 +68,17 @@ def export_to_excel_action( @ensure_filename("csv") def export_to_csv_action( - modeladmin, request, queryset, filename=None, field_names=None + modeladmin, + request, + queryset, + filename=None, + field_names=None, + extra_verbose_names=None, ): """Django admin action which exports the selected records as a CSV download""" - headers, rows = flatten_queryset(queryset, field_names=field_names) + headers, rows = flatten_queryset( + queryset, field_names=field_names, extra_verbose_names=extra_verbose_names + ) return export_to_csv_response(filename, headers, rows) From 7b4d1afb75dbab4e7c053a0b2441f8b30366633f Mon Sep 17 00:00:00 2001 From: Josh Stegmaier <104993387+joshuastegmaier@users.noreply.github.com> Date: Mon, 12 Aug 2024 13:03:23 -0400 Subject: [PATCH 03/28] Fixed bug where the transcription form wasn't properly unlocked when OCR completes (#2487) --- concordia/static/js/src/contribute.js | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/concordia/static/js/src/contribute.js b/concordia/static/js/src/contribute.js index f477ef02e..d87687011 100644 --- a/concordia/static/js/src/contribute.js +++ b/concordia/static/js/src/contribute.js @@ -117,11 +117,11 @@ function setupPage() { $form.on('submit', function (event) { event.preventDefault(); - var data = $form.data(); + var eventData = $form.data(); lockControls($form); - if (data.lockElement) { - lockControls($(data.lockElement)); + if (eventData.lockElement) { + lockControls($(eventData.lockElement)); } var formData = $form.serializeArray(); @@ -140,8 +140,8 @@ function setupPage() { $form: $form, }); unlockControls($form); - if (data.lockElement) { - unlockControls($(data.lockElement)); + if (eventData.lockElement) { + unlockControls($(eventData.lockElement)); } }) .fail(function (jqXHR, textStatus, errorThrown) { @@ -163,8 +163,8 @@ function setupPage() { jqXHR: jqXHR, }); unlockControls($form); - if (data.lockElement) { - unlockControls($(data.lockElement)); + if (eventData.lockElement) { + unlockControls($(eventData.lockElement)); } } }); From c6b24b732a0509ff557d6a9f1a46204f8422b471 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 13 Aug 2024 07:32:44 -0400 Subject: [PATCH 04/28] Bump twisted from 24.3.0 to 24.7.0 in the pip group across 1 directory (#2488) Bumps the pip group with 1 update in the / directory: [twisted](https://github.com/twisted/twisted). Updates `twisted` from 24.3.0 to 24.7.0 - [Release notes](https://github.com/twisted/twisted/releases) - [Changelog](https://github.com/twisted/twisted/blob/trunk/NEWS.rst) - [Commits](https://github.com/twisted/twisted/compare/twisted-24.3.0...twisted-24.7.0) --- updated-dependencies: - dependency-name: twisted dependency-type: direct:production dependency-group: pip ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Pipfile.lock | 103 ++++++++++++++++++++++++++------------------------- 1 file changed, 52 insertions(+), 51 deletions(-) diff --git a/Pipfile.lock b/Pipfile.lock index 8b167f99d..3c9d9e010 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -65,11 +65,11 @@ }, "attrs": { "hashes": [ - "sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30", - "sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1" + "sha256:5cfb1b9148b5b086569baec03f20d7b6bf3bcacc9a42bebf87ffaaca362f6346", + "sha256:81921eb96de3191c8258c199618104dd27ac608d9366f5e35d011eae1867ede2" ], "markers": "python_version >= '3.7'", - "version": "==23.2.0" + "version": "==24.2.0" }, "autobahn": { "hashes": [ @@ -1225,10 +1225,11 @@ }, "incremental": { "hashes": [ - "sha256:912feeb5e0f7e0188e6f42241d2f450002e11bbc0937c65865045854c24c0bd0", - "sha256:b864a1f30885ee72c5ac2835a761b8fe8aa9c28b9395cacf27286602688d3e51" + "sha256:8cb2c3431530bec48ad70513931a760f446ad6c25e8333ca5d95e24b0ed7b8fe", + "sha256:fb4f1d47ee60efe87d4f6f0ebb5f70b9760db2b2574c59c8e8912be4ebd464c9" ], - "version": "==22.10.0" + "markers": "python_version >= '3.8'", + "version": "==24.7.2" }, "iniconfig": { "hashes": [ @@ -2090,11 +2091,11 @@ }, "setuptools": { "hashes": [ - "sha256:f171bab1dfbc86b132997f26a119f6056a57950d058587841a0082e8830f9dc5", - "sha256:fe384da74336c398e0d956d1cae0669bc02eed936cdb1d49b57de1990dc11ffc" + "sha256:5a03e1860cf56bb6ef48ce186b0e557fdba433237481a9a625176c2831be15d1", + "sha256:8d243eff56d095e5817f796ede6ae32941278f542e0f941867cc05ae52b162ec" ], "markers": "python_version >= '3.8'", - "version": "==70.3.0" + "version": "==72.1.0" }, "setuptools-scm": { "hashes": [ @@ -2193,14 +2194,16 @@ "twisted": { "extras": [ "http2", + "tls", "tls" ], "hashes": [ - "sha256:039f2e6a49ab5108abd94de187fa92377abe5985c7a72d68d0ad266ba19eae63", - "sha256:6b38b6ece7296b5e122c9eb17da2eeab3d98a198f50ca9efd00fb03e5b4fd4ae" + "sha256:5a60147f044187a127ec7da96d170d49bcce50c6fd36f594e60f4587eff4d394", + "sha256:734832ef98108136e222b5230075b1079dad8a3fc5637319615619a7725b0c81" ], + "index": "pypi", "markers": "python_full_version >= '3.8.0'", - "version": "==24.3.0" + "version": "==24.7.0" }, "txaio": { "hashes": [ @@ -2323,45 +2326,43 @@ }, "zope-interface": { "hashes": [ - "sha256:00b5c3e9744dcdc9e84c24ed6646d5cf0cf66551347b310b3ffd70f056535854", - "sha256:0e4fa5d34d7973e6b0efa46fe4405090f3b406f64b6290facbb19dcbf642ad6b", - "sha256:136cacdde1a2c5e5bc3d0b2a1beed733f97e2dad8c2ad3c2e17116f6590a3827", - "sha256:1730c93a38b5a18d24549bc81613223962a19d457cfda9bdc66e542f475a36f4", - "sha256:1a62fd6cd518693568e23e02f41816adedfca637f26716837681c90b36af3671", - "sha256:1c207e6f6dfd5749a26f5a5fd966602d6b824ec00d2df84a7e9a924e8933654e", - "sha256:2eccd5bef45883802848f821d940367c1d0ad588de71e5cabe3813175444202c", - "sha256:33ee982237cffaf946db365c3a6ebaa37855d8e3ca5800f6f48890209c1cfefc", - "sha256:3d136e5b8821073e1a09dde3eb076ea9988e7010c54ffe4d39701adf0c303438", - "sha256:47654177e675bafdf4e4738ce58cdc5c6d6ee2157ac0a78a3fa460942b9d64a8", - "sha256:47937cf2e7ed4e0e37f7851c76edeb8543ec9b0eae149b36ecd26176ff1ca874", - "sha256:4ac46298e0143d91e4644a27a769d1388d5d89e82ee0cf37bf2b0b001b9712a4", - "sha256:4c0b208a5d6c81434bdfa0f06d9b667e5de15af84d8cae5723c3a33ba6611b82", - "sha256:551db2fe892fcbefb38f6f81ffa62de11090c8119fd4e66a60f3adff70751ec7", - "sha256:599f3b07bde2627e163ce484d5497a54a0a8437779362395c6b25e68c6590ede", - "sha256:5ef8356f16b1a83609f7a992a6e33d792bb5eff2370712c9eaae0d02e1924341", - "sha256:5fe919027f29b12f7a2562ba0daf3e045cb388f844e022552a5674fcdf5d21f1", - "sha256:6f0a6be264afb094975b5ef55c911379d6989caa87c4e558814ec4f5125cfa2e", - "sha256:706efc19f9679a1b425d6fa2b4bc770d976d0984335eaea0869bd32f627591d2", - "sha256:73f9752cf3596771c7726f7eea5b9e634ad47c6d863043589a1c3bb31325c7eb", - "sha256:762e616199f6319bb98e7f4f27d254c84c5fb1c25c908c2a9d0f92b92fb27530", - "sha256:866a0f583be79f0def667a5d2c60b7b4cc68f0c0a470f227e1122691b443c934", - "sha256:86a94af4a88110ed4bb8961f5ac72edf782958e665d5bfceaab6bf388420a78b", - "sha256:8e0343a6e06d94f6b6ac52fbc75269b41dd3c57066541a6c76517f69fe67cb43", - "sha256:97e615eab34bd8477c3f34197a17ce08c648d38467489359cb9eb7394f1083f7", - "sha256:a96e6d4074db29b152222c34d7eec2e2db2f92638d2b2b2c704f9e8db3ae0edc", - "sha256:b912750b13d76af8aac45ddf4679535def304b2a48a07989ec736508d0bbfbde", - "sha256:bc2676312cc3468a25aac001ec727168994ea3b69b48914944a44c6a0b251e79", - "sha256:cebff2fe5dc82cb22122e4e1225e00a4a506b1a16fafa911142ee124febf2c9e", - "sha256:d22fce0b0f5715cdac082e35a9e735a1752dc8585f005d045abb1a7c20e197f9", - "sha256:d3f7e001328bd6466b3414215f66dde3c7c13d8025a9c160a75d7b2687090d15", - "sha256:d3fe667935e9562407c2511570dca14604a654988a13d8725667e95161d92e9b", - "sha256:dabb70a6e3d9c22df50e08dc55b14ca2a99da95a2d941954255ac76fd6982bc5", - "sha256:e2fb8e8158306567a3a9a41670c1ff99d0567d7fc96fa93b7abf8b519a46b250", - "sha256:e96ac6b3169940a8cd57b4f2b8edcad8f5213b60efcd197d59fbe52f0accd66e", - "sha256:fbf649bc77510ef2521cf797700b96167bb77838c40780da7ea3edd8b78044d1" - ], - "markers": "python_version >= '3.7'", - "version": "==6.4.post2" + "sha256:03bd5c0db82237bbc47833a8b25f1cc090646e212f86b601903d79d7e6b37031", + "sha256:03f1452d5d1f279184d5bdb663a3dc39902d9320eceb63276240791e849054b6", + "sha256:10ebac566dd0cec66f942dc759d46a994a2b3ba7179420f0e2130f88f8a5f400", + "sha256:192b7a792e3145ed880ff6b1a206fdb783697cfdb4915083bfca7065ec845e60", + "sha256:19c829d52e921b9fe0b2c0c6a8f9a2508c49678ee1be598f87d143335b6a35dc", + "sha256:3f3495462bc0438b76536a0e10d765b168ae636092082531b88340dc40dcd118", + "sha256:3f52050c6a10d4a039ec6f2c58e5b3ade5cc570d16cf9d102711e6b8413c90e6", + "sha256:400d06c9ec8dbcc96f56e79376297e7be07a315605c9a2208720da263d44d76f", + "sha256:4ec212037becf6d2f705b7ed4538d56980b1e7bba237df0d8995cbbed29961dc", + "sha256:51d5713e8e38f2d3ec26e0dfdca398ed0c20abda2eb49ffc15a15a23eb8e5f6d", + "sha256:52f5253cca1b35eaeefa51abd366b87f48f8714097c99b131ba61f3fdbbb58e7", + "sha256:5566fd9271c89ad03d81b0831c37d46ae5e2ed211122c998637130159a120cf1", + "sha256:55bbcc74dc0c7ab489c315c28b61d7a1d03cf938cc99cc58092eb065f120c3a5", + "sha256:696c2a381fc7876b3056711717dba5eddd07c2c9e5ccd50da54029a1293b6e43", + "sha256:6ba4b3638d014918b918aa90a9c8370bd74a03abf8fcf9deb353b3a461a59a84", + "sha256:7039e624bcb820f77cc2ff3d1adcce531932990eee16121077eb51d9c76b6c14", + "sha256:88d108d004e0df25224de77ce349a7e73494ea2cb194031f7c9687e68a88ec9b", + "sha256:8c1dff87b30fd150c61367d0e2cdc49bb55f8b9fd2a303560bbc24b951573ae1", + "sha256:9a8195b99e650e6f329ce4e5eb22d448bdfef0406404080812bc96e2a05674cb", + "sha256:af0b33f04677b57843d529b9257a475d2865403300b48c67654c40abac2f9f24", + "sha256:b419f2144e1762ab845f20316f1df36b15431f2622ebae8a6d5f7e8e712b413c", + "sha256:b59deb0ddc7b431e41d720c00f99d68b52cb9bd1d5605a085dc18f502fe9c47f", + "sha256:bc0615351221926a36a0fbcb2520fb52e0b23e8c22a43754d9cb8f21358c33c0", + "sha256:c203d82069ba31e1f3bc7ba530b2461ec86366cd4bfc9b95ec6ce58b1b559c34", + "sha256:ce6cbb852fb8f2f9bb7b9cdca44e2e37bce783b5f4c167ff82cb5f5128163c8f", + "sha256:d33cb526efdc235a2531433fc1287fcb80d807d5b401f9b801b78bf22df560dd", + "sha256:da0cef4d7e3f19c3bd1d71658d6900321af0492fee36ec01b550a10924cffb9c", + "sha256:da21e7eec49252df34d426c2ee9cf0361c923026d37c24728b0fa4cc0599fd03", + "sha256:ea8d51e5eb29e57d34744369cd08267637aa5a0fefc9b5d33775ab7ff2ebf2e3", + "sha256:ec4e87e6fdc511a535254daa122c20e11959ce043b4e3425494b237692a34f1c", + "sha256:f0f5fda7cbf890371a59ab1d06512da4f2c89a6ea194e595808123c863c38eff", + "sha256:f32ca483e6ade23c7caaee9d5ee5d550cf4146e9b68d2fb6c68bac183aa41c37", + "sha256:f749ca804648d00eda62fe1098f229b082dfca930d8bad8386e572a6eafa7525", + "sha256:f89a420cf5a6f2aa7849dd59e1ff0e477f562d97cf8d6a1ee03461e1eec39887" + ], + "markers": "python_version >= '3.8'", + "version": "==7.0.1" }, "zope.event": { "hashes": [ From c35cbb63fdc46ac408ef0ea774471f2580d736a5 Mon Sep 17 00:00:00 2001 From: Josh Stegmaier <104993387+joshuastegmaier@users.noreply.github.com> Date: Tue, 13 Aug 2024 08:59:11 -0400 Subject: [PATCH 05/28] Updated to psycopg 3 (#2482) Co-authored-by: Jennifer Kuenning <72825410+jkueloc@users.noreply.github.com> --- Dockerfile | 2 +- Pipfile | 2 +- Pipfile.lock | 947 +++++++++++++++++++++--------------------- celerybeat/Dockerfile | 2 +- importer/Dockerfile | 2 +- 5 files changed, 467 insertions(+), 488 deletions(-) diff --git a/Dockerfile b/Dockerfile index 42e16d858..e1b721724 100644 --- a/Dockerfile +++ b/Dockerfile @@ -20,7 +20,7 @@ RUN apt-get update -qy && apt-get dist-upgrade -qy && apt-get install -o Dpkg::O # Pillow/Imaging: https://pillow.readthedocs.io/en/latest/installation.html#external-libraries libz-dev libfreetype6-dev \ libtiff-dev libjpeg-dev libopenjp2-7-dev libwebp-dev zlib1g-dev \ - # Postgres client library to build psycopg2 + # Postgres client library to build psycopg libpq-dev \ locales \ # Weasyprint requirements diff --git a/Pipfile b/Pipfile index f043591a5..b1dd05043 100644 --- a/Pipfile +++ b/Pipfile @@ -33,7 +33,6 @@ sentry-sdk = "*" channels = {extras = ["daphne"], version = "*"} channels-redis = ">=4" more-itertools = "*" -psycopg2 = ">=2.9" nh3 = "*" django-admin-multiple-choice-list-filter = "*" django-npm = "*" @@ -55,6 +54,7 @@ pillow = "*" prometheus-client = "*" xlsxwriter = "*" blinker = "<1.8.0" +psycopg = ">=3.2" [dev-packages] invoke = "*" diff --git a/Pipfile.lock b/Pipfile.lock index 3c9d9e010..424fbecdb 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "86bda40a873907cf7cf5309fbe29838ea4a85faa816454c7105f4aa488b59a73" + "sha256": "8c4e53c0f15830ef951cd629c0c6da48bcc1e898a363aac041b473893333266b" }, "pipfile-spec": 6, "requires": { @@ -73,10 +73,11 @@ }, "autobahn": { "hashes": [ - "sha256:ec9421c52a2103364d1ef0468036e6019ee84f71721e86b36fe19ad6966c1181" + "sha256:a2d71ef1b0cf780b6d11f8b205fd2c7749765e65795f2ea7d823796642ee92c9", + "sha256:c56a2abe7ac78abbfb778c02892d673a4de58fd004d088cd7ab297db25918e81" ], "markers": "python_version >= '3.9'", - "version": "==23.6.2" + "version": "==24.4.2" }, "automat": { "hashes": [ @@ -105,7 +106,7 @@ "sha256:74e3d1928edc070d21748185c46e3fb33490f22f52a3addee9aee0f4f7781051", "sha256:b80878c9f40111313e55da8ba20bdba06d8fa3969fc68304167741bbf9e082ed" ], - "markers": "python_full_version >= '3.6.0'", + "markers": "python_version >= '3.6'", "version": "==4.12.3" }, "billiard": { @@ -118,32 +119,31 @@ }, "black": { "hashes": [ - "sha256:257d724c2c9b1660f353b36c802ccece186a30accc7742c176d29c146df6e474", - "sha256:37aae07b029fa0174d39daf02748b379399b909652a806e5708199bd93899da1", - "sha256:415e686e87dbbe6f4cd5ef0fbf764af7b89f9057b97c908742b6008cc554b9c0", - "sha256:48a85f2cb5e6799a9ef05347b476cce6c182d6c71ee36925a6c194d074336ef8", - "sha256:7768a0dbf16a39aa5e9a3ded568bb545c8c2727396d063bbaf847df05b08cd96", - "sha256:7e122b1c4fb252fd85df3ca93578732b4749d9be076593076ef4d07a0233c3e1", - "sha256:88c57dc656038f1ab9f92b3eb5335ee9b021412feaa46330d5eba4e51fe49b04", - "sha256:8e537d281831ad0e71007dcdcbe50a71470b978c453fa41ce77186bbe0ed6021", - "sha256:98e123f1d5cfd42f886624d84464f7756f60ff6eab89ae845210631714f6db94", - "sha256:accf49e151c8ed2c0cdc528691838afd217c50412534e876a19270fea1e28e2d", - "sha256:b1530ae42e9d6d5b670a34db49a94115a64596bc77710b1d05e9801e62ca0a7c", - "sha256:b9176b9832e84308818a99a561e90aa479e73c523b3f77afd07913380ae2eab7", - "sha256:bdde6f877a18f24844e381d45e9947a49e97933573ac9d4345399be37621e26c", - "sha256:be8bef99eb46d5021bf053114442914baeb3649a89dc5f3a555c88737e5e98fc", - "sha256:bf10f7310db693bb62692609b397e8d67257c55f949abde4c67f9cc574492cc7", - "sha256:c872b53057f000085da66a19c55d68f6f8ddcac2642392ad3a355878406fbd4d", - "sha256:d36ed1124bb81b32f8614555b34cc4259c3fbc7eec17870e8ff8ded335b58d8c", - "sha256:da33a1a5e49c4122ccdfd56cd021ff1ebc4a1ec4e2d01594fef9b6f267a9e741", - "sha256:dd1b5a14e417189db4c7b64a6540f31730713d173f0b63e55fabd52d61d8fdce", - "sha256:e151054aa00bad1f4e1f04919542885f89f5f7d086b8a59e5000e6c616896ffb", - "sha256:eaea3008c281f1038edb473c1aa8ed8143a5535ff18f978a318f10302b254063", - "sha256:ef703f83fc32e131e9bcc0a5094cfe85599e7109f896fe8bc96cc402f3eb4b6e" + "sha256:09cdeb74d494ec023ded657f7092ba518e8cf78fa8386155e4a03fdcc44679e6", + "sha256:1f13f7f386f86f8121d76599114bb8c17b69d962137fc70efe56137727c7047e", + "sha256:2500945420b6784c38b9ee885af039f5e7471ef284ab03fa35ecdde4688cd83f", + "sha256:2b59b250fdba5f9a9cd9d0ece6e6d993d91ce877d121d161e4698af3eb9c1018", + "sha256:3c4285573d4897a7610054af5a890bde7c65cb466040c5f0c8b732812d7f0e5e", + "sha256:505289f17ceda596658ae81b61ebbe2d9b25aa78067035184ed0a9d855d18afd", + "sha256:62e8730977f0b77998029da7971fa896ceefa2c4c4933fcd593fa599ecbf97a4", + "sha256:649f6d84ccbae73ab767e206772cc2d7a393a001070a4c814a546afd0d423aed", + "sha256:6e55d30d44bed36593c3163b9bc63bf58b3b30e4611e4d88a0c3c239930ed5b2", + "sha256:707a1ca89221bc8a1a64fb5e15ef39cd755633daa672a9db7498d1c19de66a42", + "sha256:72901b4913cbac8972ad911dc4098d5753704d1f3c56e44ae8dce99eecb0e3af", + "sha256:73bbf84ed136e45d451a260c6b73ed674652f90a2b3211d6a35e78054563a9bb", + "sha256:7c046c1d1eeb7aea9335da62472481d3bbf3fd986e093cffd35f4385c94ae368", + "sha256:81c6742da39f33b08e791da38410f32e27d632260e599df7245cccee2064afeb", + "sha256:837fd281f1908d0076844bc2b801ad2d369c78c45cf800cad7b61686051041af", + "sha256:972085c618ee94f402da1af548a4f218c754ea7e5dc70acb168bfaca4c2542ed", + "sha256:9e84e33b37be070ba135176c123ae52a51f82306def9f7d063ee302ecab2cf47", + "sha256:b19c9ad992c7883ad84c9b22aaa73562a16b819c1d8db7a1a1a49fb7ec13c7d2", + "sha256:d6417535d99c37cee4091a2f24eb2b6d5ec42b144d50f1f2e436d9fe1916fe1a", + "sha256:eab4dd44ce80dea27dc69db40dab62d4ca96112f87996bca68cd75639aeb2e4c", + "sha256:f490dbd59680d809ca31efdae20e634f3fae27fba3ce0ba3208333b713bc3920", + "sha256:fb6e2c0b86bbd43dee042e48059c9ad7830abd5c94b0bc518c0eeec57c3eddc1" ], "index": "pypi", - "markers": "python_version >= '3.8'", - "version": "==24.4.2" + "version": "==24.8.0" }, "blinker": { "hashes": [ @@ -151,26 +151,23 @@ "sha256:e6820ff6fa4e4d1d8e2747c2283749c3f547e4fee112b98555cdcdae32996182" ], "index": "pypi", - "markers": "python_version >= '3.8'", "version": "==1.7.0" }, "boto3": { "hashes": [ - "sha256:2f3e88b10b8fcc5f6100a9d74cd28230edc9d4fa226d99dd40a3ab38ac213673", - "sha256:b8433d481d50b68a0162c0379c0dd4aabfc3d1ad901800beb5b87815997511c1" + "sha256:7ca22adef4c77ee128e1e1dc7d48bc9512a87cc6fe3d771b3f913d5ecd41c057", + "sha256:864f06528c583dc7b02adf12db395ecfadbf9cb0da90e907e848ffb27128ce19" ], "index": "pypi", - "markers": "python_version >= '3.8'", - "version": "==1.34.144" + "version": "==1.34.154" }, "botocore": { "hashes": [ - "sha256:4215db28d25309d59c99507f1f77df9089e5bebbad35f6e19c7c44ec5383a3e8", - "sha256:a2cf26e1bf10d5917a2285e50257bc44e94a1d16574f282f3274f7a5d8d1f08b" + "sha256:4eef4b1bb809b382ba9dc9c88f5fcc4a133f221a1acb693ee6bee4de9f325979", + "sha256:64d9b4c85a504d77cb56dabb2ad717cd8e1717424a88edb458b01d1e5797262a" ], "index": "pypi", - "markers": "python_version >= '3.8'", - "version": "==1.34.144" + "version": "==1.34.154" }, "brotli": { "hashes": [ @@ -268,7 +265,7 @@ "sha256:369631eb580cf8c51a82721ec538684994f8277637edde2dfc0dacd73ed97f64", "sha256:504a19140e8d3029d5acad88330c541d4c3f64c789d85f94756762d8bca7e706" ], - "markers": "python_version >= '3.8'", + "index": "pypi", "version": "==5.4.0" }, "certifi": { @@ -281,61 +278,76 @@ }, "cffi": { "hashes": [ - "sha256:0c9ef6ff37e974b73c25eecc13952c55bceed9112be2d9d938ded8e856138bcc", - "sha256:131fd094d1065b19540c3d72594260f118b231090295d8c34e19a7bbcf2e860a", - "sha256:1b8ebc27c014c59692bb2664c7d13ce7a6e9a629be20e54e7271fa696ff2b417", - "sha256:2c56b361916f390cd758a57f2e16233eb4f64bcbeee88a4881ea90fca14dc6ab", - "sha256:2d92b25dbf6cae33f65005baf472d2c245c050b1ce709cc4588cdcdd5495b520", - "sha256:31d13b0f99e0836b7ff893d37af07366ebc90b678b6664c955b54561fc36ef36", - "sha256:32c68ef735dbe5857c810328cb2481e24722a59a2003018885514d4c09af9743", - "sha256:3686dffb02459559c74dd3d81748269ffb0eb027c39a6fc99502de37d501faa8", - "sha256:582215a0e9adbe0e379761260553ba11c58943e4bbe9c36430c4ca6ac74b15ed", - "sha256:5b50bf3f55561dac5438f8e70bfcdfd74543fd60df5fa5f62d94e5867deca684", - "sha256:5bf44d66cdf9e893637896c7faa22298baebcd18d1ddb6d2626a6e39793a1d56", - "sha256:6602bc8dc6f3a9e02b6c22c4fc1e47aa50f8f8e6d3f78a5e16ac33ef5fefa324", - "sha256:673739cb539f8cdaa07d92d02efa93c9ccf87e345b9a0b556e3ecc666718468d", - "sha256:68678abf380b42ce21a5f2abde8efee05c114c2fdb2e9eef2efdb0257fba1235", - "sha256:68e7c44931cc171c54ccb702482e9fc723192e88d25a0e133edd7aff8fcd1f6e", - "sha256:6b3d6606d369fc1da4fd8c357d026317fbb9c9b75d36dc16e90e84c26854b088", - "sha256:748dcd1e3d3d7cd5443ef03ce8685043294ad6bd7c02a38d1bd367cfd968e000", - "sha256:7651c50c8c5ef7bdb41108b7b8c5a83013bfaa8a935590c5d74627c047a583c7", - "sha256:7b78010e7b97fef4bee1e896df8a4bbb6712b7f05b7ef630f9d1da00f6444d2e", - "sha256:7e61e3e4fa664a8588aa25c883eab612a188c725755afff6289454d6362b9673", - "sha256:80876338e19c951fdfed6198e70bc88f1c9758b94578d5a7c4c91a87af3cf31c", - "sha256:8895613bcc094d4a1b2dbe179d88d7fb4a15cee43c052e8885783fac397d91fe", - "sha256:88e2b3c14bdb32e440be531ade29d3c50a1a59cd4e51b1dd8b0865c54ea5d2e2", - "sha256:8f8e709127c6c77446a8c0a8c8bf3c8ee706a06cd44b1e827c3e6a2ee6b8c098", - "sha256:9cb4a35b3642fc5c005a6755a5d17c6c8b6bcb6981baf81cea8bfbc8903e8ba8", - "sha256:9f90389693731ff1f659e55c7d1640e2ec43ff725cc61b04b2f9c6d8d017df6a", - "sha256:a09582f178759ee8128d9270cd1344154fd473bb77d94ce0aeb2a93ebf0feaf0", - "sha256:a6a14b17d7e17fa0d207ac08642c8820f84f25ce17a442fd15e27ea18d67c59b", - "sha256:a72e8961a86d19bdb45851d8f1f08b041ea37d2bd8d4fd19903bc3083d80c896", - "sha256:abd808f9c129ba2beda4cfc53bde801e5bcf9d6e0f22f095e45327c038bfe68e", - "sha256:ac0f5edd2360eea2f1daa9e26a41db02dd4b0451b48f7c318e217ee092a213e9", - "sha256:b29ebffcf550f9da55bec9e02ad430c992a87e5f512cd63388abb76f1036d8d2", - "sha256:b2ca4e77f9f47c55c194982e10f058db063937845bb2b7a86c84a6cfe0aefa8b", - "sha256:b7be2d771cdba2942e13215c4e340bfd76398e9227ad10402a8767ab1865d2e6", - "sha256:b84834d0cf97e7d27dd5b7f3aca7b6e9263c56308ab9dc8aae9784abb774d404", - "sha256:b86851a328eedc692acf81fb05444bdf1891747c25af7529e39ddafaf68a4f3f", - "sha256:bcb3ef43e58665bbda2fb198698fcae6776483e0c4a631aa5647806c25e02cc0", - "sha256:c0f31130ebc2d37cdd8e44605fb5fa7ad59049298b3f745c74fa74c62fbfcfc4", - "sha256:c6a164aa47843fb1b01e941d385aab7215563bb8816d80ff3a363a9f8448a8dc", - "sha256:d8a9d3ebe49f084ad71f9269834ceccbf398253c9fac910c4fd7053ff1386936", - "sha256:db8e577c19c0fda0beb7e0d4e09e0ba74b1e4c092e0e40bfa12fe05b6f6d75ba", - "sha256:dc9b18bf40cc75f66f40a7379f6a9513244fe33c0e8aa72e2d56b0196a7ef872", - "sha256:e09f3ff613345df5e8c3667da1d918f9149bd623cd9070c983c013792a9a62eb", - "sha256:e4108df7fe9b707191e55f33efbcb2d81928e10cea45527879a4749cbe472614", - "sha256:e6024675e67af929088fda399b2094574609396b1decb609c55fa58b028a32a1", - "sha256:e70f54f1796669ef691ca07d046cd81a29cb4deb1e5f942003f401c0c4a2695d", - "sha256:e715596e683d2ce000574bae5d07bd522c781a822866c20495e52520564f0969", - "sha256:e760191dd42581e023a68b758769e2da259b5d52e3103c6060ddc02c9edb8d7b", - "sha256:ed86a35631f7bfbb28e108dd96773b9d5a6ce4811cf6ea468bb6a359b256b1e4", - "sha256:ee07e47c12890ef248766a6e55bd38ebfb2bb8edd4142d56db91b21ea68b7627", - "sha256:fa3a0128b152627161ce47201262d3140edb5a5c3da88d73a1b790a959126956", - "sha256:fcc8eb6d5902bb1cf6dc4f187ee3ea80a1eba0a89aba40a5cb20a5087d961357" - ], - "markers": "python_version >= '3.8'", - "version": "==1.16.0" + "sha256:011aff3524d578a9412c8b3cfaa50f2c0bd78e03eb7af7aa5e0df59b158efb2f", + "sha256:0a048d4f6630113e54bb4b77e315e1ba32a5a31512c31a273807d0027a7e69ab", + "sha256:0bb15e7acf8ab35ca8b24b90af52c8b391690ef5c4aec3d31f38f0d37d2cc499", + "sha256:0d46ee4764b88b91f16661a8befc6bfb24806d885e27436fdc292ed7e6f6d058", + "sha256:0e60821d312f99d3e1569202518dddf10ae547e799d75aef3bca3a2d9e8ee693", + "sha256:0fdacad9e0d9fc23e519efd5ea24a70348305e8d7d85ecbb1a5fa66dc834e7fb", + "sha256:14b9cbc8f7ac98a739558eb86fabc283d4d564dafed50216e7f7ee62d0d25377", + "sha256:17c6d6d3260c7f2d94f657e6872591fe8733872a86ed1345bda872cfc8c74885", + "sha256:1a2ddbac59dc3716bc79f27906c010406155031a1c801410f1bafff17ea304d2", + "sha256:2404f3de742f47cb62d023f0ba7c5a916c9c653d5b368cc966382ae4e57da401", + "sha256:24658baf6224d8f280e827f0a50c46ad819ec8ba380a42448e24459daf809cf4", + "sha256:24aa705a5f5bd3a8bcfa4d123f03413de5d86e497435693b638cbffb7d5d8a1b", + "sha256:2770bb0d5e3cc0e31e7318db06efcbcdb7b31bcb1a70086d3177692a02256f59", + "sha256:331ad15c39c9fe9186ceaf87203a9ecf5ae0ba2538c9e898e3a6967e8ad3db6f", + "sha256:3aa9d43b02a0c681f0bfbc12d476d47b2b2b6a3f9287f11ee42989a268a1833c", + "sha256:41f4915e09218744d8bae14759f983e466ab69b178de38066f7579892ff2a555", + "sha256:4304d4416ff032ed50ad6bb87416d802e67139e31c0bde4628f36a47a3164bfa", + "sha256:435a22d00ec7d7ea533db494da8581b05977f9c37338c80bc86314bec2619424", + "sha256:45f7cd36186db767d803b1473b3c659d57a23b5fa491ad83c6d40f2af58e4dbb", + "sha256:48b389b1fd5144603d61d752afd7167dfd205973a43151ae5045b35793232aa2", + "sha256:4e67d26532bfd8b7f7c05d5a766d6f437b362c1bf203a3a5ce3593a645e870b8", + "sha256:516a405f174fd3b88829eabfe4bb296ac602d6a0f68e0d64d5ac9456194a5b7e", + "sha256:5ba5c243f4004c750836f81606a9fcb7841f8874ad8f3bf204ff5e56332b72b9", + "sha256:5bdc0f1f610d067c70aa3737ed06e2726fd9d6f7bfee4a351f4c40b6831f4e82", + "sha256:6107e445faf057c118d5050560695e46d272e5301feffda3c41849641222a828", + "sha256:6327b572f5770293fc062a7ec04160e89741e8552bf1c358d1a23eba68166759", + "sha256:669b29a9eca6146465cc574659058ed949748f0809a2582d1f1a324eb91054dc", + "sha256:6ce01337d23884b21c03869d2f68c5523d43174d4fc405490eb0091057943118", + "sha256:6d872186c1617d143969defeadac5a904e6e374183e07977eedef9c07c8953bf", + "sha256:6f76a90c345796c01d85e6332e81cab6d70de83b829cf1d9762d0a3da59c7932", + "sha256:70d2aa9fb00cf52034feac4b913181a6e10356019b18ef89bc7c12a283bf5f5a", + "sha256:7cbc78dc018596315d4e7841c8c3a7ae31cc4d638c9b627f87d52e8abaaf2d29", + "sha256:856bf0924d24e7f93b8aee12a3a1095c34085600aa805693fb7f5d1962393206", + "sha256:8a98748ed1a1df4ee1d6f927e151ed6c1a09d5ec21684de879c7ea6aa96f58f2", + "sha256:93a7350f6706b31f457c1457d3a3259ff9071a66f312ae64dc024f049055f72c", + "sha256:964823b2fc77b55355999ade496c54dde161c621cb1f6eac61dc30ed1b63cd4c", + "sha256:a003ac9edc22d99ae1286b0875c460351f4e101f8c9d9d2576e78d7e048f64e0", + "sha256:a0ce71725cacc9ebf839630772b07eeec220cbb5f03be1399e0457a1464f8e1a", + "sha256:a47eef975d2b8b721775a0fa286f50eab535b9d56c70a6e62842134cf7841195", + "sha256:a8b5b9712783415695663bd463990e2f00c6750562e6ad1d28e072a611c5f2a6", + "sha256:a9015f5b8af1bb6837a3fcb0cdf3b874fe3385ff6274e8b7925d81ccaec3c5c9", + "sha256:aec510255ce690d240f7cb23d7114f6b351c733a74c279a84def763660a2c3bc", + "sha256:b00e7bcd71caa0282cbe3c90966f738e2db91e64092a877c3ff7f19a1628fdcb", + "sha256:b50aaac7d05c2c26dfd50c3321199f019ba76bb650e346a6ef3616306eed67b0", + "sha256:b7b6ea9e36d32582cda3465f54c4b454f62f23cb083ebc7a94e2ca6ef011c3a7", + "sha256:bb9333f58fc3a2296fb1d54576138d4cf5d496a2cc118422bd77835e6ae0b9cb", + "sha256:c1c13185b90bbd3f8b5963cd8ce7ad4ff441924c31e23c975cb150e27c2bf67a", + "sha256:c3b8bd3133cd50f6b637bb4322822c94c5ce4bf0d724ed5ae70afce62187c492", + "sha256:c5d97162c196ce54af6700949ddf9409e9833ef1003b4741c2b39ef46f1d9720", + "sha256:c815270206f983309915a6844fe994b2fa47e5d05c4c4cef267c3b30e34dbe42", + "sha256:cab2eba3830bf4f6d91e2d6718e0e1c14a2f5ad1af68a89d24ace0c6b17cced7", + "sha256:d1df34588123fcc88c872f5acb6f74ae59e9d182a2707097f9e28275ec26a12d", + "sha256:d6bdcd415ba87846fd317bee0774e412e8792832e7805938987e4ede1d13046d", + "sha256:db9a30ec064129d605d0f1aedc93e00894b9334ec74ba9c6bdd08147434b33eb", + "sha256:dbc183e7bef690c9abe5ea67b7b60fdbca81aa8da43468287dae7b5c046107d4", + "sha256:dca802c8db0720ce1c49cce1149ff7b06e91ba15fa84b1d59144fef1a1bc7ac2", + "sha256:dec6b307ce928e8e112a6bb9921a1cb00a0e14979bf28b98e084a4b8a742bd9b", + "sha256:df8bb0010fdd0a743b7542589223a2816bdde4d94bb5ad67884348fa2c1c67e8", + "sha256:e4094c7b464cf0a858e75cd14b03509e84789abf7b79f8537e6a72152109c76e", + "sha256:e4760a68cab57bfaa628938e9c2971137e05ce48e762a9cb53b76c9b569f1204", + "sha256:eb09b82377233b902d4c3fbeeb7ad731cdab579c6c6fda1f763cd779139e47c3", + "sha256:eb862356ee9391dc5a0b3cbc00f416b48c1b9a52d252d898e5b7696a5f9fe150", + "sha256:ef9528915df81b8f4c7612b19b8628214c65c9b7f74db2e34a646a0a2a0da2d4", + "sha256:f3157624b7558b914cb039fd1af735e5e8049a87c817cc215109ad1c8779df76", + "sha256:f3e0992f23bbb0be00a921eae5363329253c3b86287db27092461c887b791e5e", + "sha256:f9338cc05451f1942d0d8203ec2c346c830f8e86469903d5126c1f0a13a2bcbb", + "sha256:ffef8fd58a36fb5f1196919638f73dd3ae0db1a878982b27a9a5a176ede4ba91" + ], + "markers": "python_version >= '3.8'", + "version": "==1.17.0" }, "channels": { "extras": [ @@ -345,7 +357,7 @@ "sha256:a3c4419307f582c3f71d67bfb6eff748ae819c2f360b9b141694d84f242baa48", "sha256:e0ed375719f5c1851861f05ed4ce78b0166f9245ca0ecd836cb77d4bb531489d" ], - "markers": "python_version >= '3.8'", + "index": "pypi", "version": "==4.1.0" }, "channels-redis": { @@ -354,7 +366,6 @@ "sha256:2c5b944a39bd984b72aa8005a3ae11637bf29b5092adeb91c9aad4ab819a8ac4" ], "index": "pypi", - "markers": "python_version >= '3.8'", "version": "==4.2.0" }, "charset-normalizer": { @@ -450,7 +461,7 @@ "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519", "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561" ], - "markers": "python_full_version >= '3.7.0'", + "markers": "python_version >= '3.7'", "version": "==3.3.2" }, "click": { @@ -523,41 +534,36 @@ }, "cryptography": { "hashes": [ - "sha256:013629ae70b40af70c9a7a5db40abe5d9054e6f4380e50ce769947b73bf3caad", - "sha256:2346b911eb349ab547076f47f2e035fc8ff2c02380a7cbbf8d87114fa0f1c583", - "sha256:2f66d9cd9147ee495a8374a45ca445819f8929a3efcd2e3df6428e46c3cbb10b", - "sha256:2f88d197e66c65be5e42cd72e5c18afbfae3f741742070e3019ac8f4ac57262c", - "sha256:31f721658a29331f895a5a54e7e82075554ccfb8b163a18719d342f5ffe5ecb1", - "sha256:343728aac38decfdeecf55ecab3264b015be68fc2816ca800db649607aeee648", - "sha256:5226d5d21ab681f432a9c1cf8b658c0cb02533eece706b155e5fbd8a0cdd3949", - "sha256:57080dee41209e556a9a4ce60d229244f7a66ef52750f813bfbe18959770cfba", - "sha256:5a94eccb2a81a309806027e1670a358b99b8fe8bfe9f8d329f27d72c094dde8c", - "sha256:6b7c4f03ce01afd3b76cf69a5455caa9cfa3de8c8f493e0d3ab7d20611c8dae9", - "sha256:7016f837e15b0a1c119d27ecd89b3515f01f90a8615ed5e9427e30d9cdbfed3d", - "sha256:81884c4d096c272f00aeb1f11cf62ccd39763581645b0812e99a91505fa48e0c", - "sha256:81d8a521705787afe7a18d5bfb47ea9d9cc068206270aad0b96a725022e18d2e", - "sha256:8d09d05439ce7baa8e9e95b07ec5b6c886f548deb7e0f69ef25f64b3bce842f2", - "sha256:961e61cefdcb06e0c6d7e3a1b22ebe8b996eb2bf50614e89384be54c48c6b63d", - "sha256:9c0c1716c8447ee7dbf08d6db2e5c41c688544c61074b54fc4564196f55c25a7", - "sha256:a0608251135d0e03111152e41f0cc2392d1e74e35703960d4190b2e0f4ca9c70", - "sha256:a0c5b2b0585b6af82d7e385f55a8bc568abff8923af147ee3c07bd8b42cda8b2", - "sha256:ad803773e9df0b92e0a817d22fd8a3675493f690b96130a5e24f1b8fabbea9c7", - "sha256:b297f90c5723d04bcc8265fc2a0f86d4ea2e0f7ab4b6994459548d3a6b992a14", - "sha256:ba4f0a211697362e89ad822e667d8d340b4d8d55fae72cdd619389fb5912eefe", - "sha256:c4783183f7cb757b73b2ae9aed6599b96338eb957233c58ca8f49a49cc32fd5e", - "sha256:c9bb2ae11bfbab395bdd072985abde58ea9860ed84e59dbc0463a5d0159f5b71", - "sha256:cafb92b2bc622cd1aa6a1dce4b93307792633f4c5fe1f46c6b97cf67073ec961", - "sha256:d45b940883a03e19e944456a558b67a41160e367a719833c53de6911cabba2b7", - "sha256:dc0fdf6787f37b1c6b08e6dfc892d9d068b5bdb671198c72072828b80bd5fe4c", - "sha256:dea567d1b0e8bc5764b9443858b673b734100c2871dc93163f58c46a97a83d28", - "sha256:dec9b018df185f08483f294cae6ccac29e7a6e0678996587363dc352dc65c842", - "sha256:e3ec3672626e1b9e55afd0df6d774ff0e953452886e06e0f1eb7eb0c832e8902", - "sha256:e599b53fd95357d92304510fb7bda8523ed1f79ca98dce2f43c115950aa78801", - "sha256:fa76fbb7596cc5839320000cdd5d0955313696d9511debab7ee7278fc8b5c84a", - "sha256:fff12c88a672ab9c9c1cf7b0c80e3ad9e2ebd9d828d955c126be4fd3e5578c9e" + "sha256:0663585d02f76929792470451a5ba64424acc3cd5227b03921dab0e2f27b1709", + "sha256:08a24a7070b2b6804c1940ff0f910ff728932a9d0e80e7814234269f9d46d069", + "sha256:232ce02943a579095a339ac4b390fbbe97f5b5d5d107f8a08260ea2768be8cc2", + "sha256:2905ccf93a8a2a416f3ec01b1a7911c3fe4073ef35640e7ee5296754e30b762b", + "sha256:299d3da8e00b7e2b54bb02ef58d73cd5f55fb31f33ebbf33bd00d9aa6807df7e", + "sha256:2c6d112bf61c5ef44042c253e4859b3cbbb50df2f78fa8fae6747a7814484a70", + "sha256:31e44a986ceccec3d0498e16f3d27b2ee5fdf69ce2ab89b52eaad1d2f33d8778", + "sha256:3d9a1eca329405219b605fac09ecfc09ac09e595d6def650a437523fcd08dd22", + "sha256:3dcdedae5c7710b9f97ac6bba7e1052b95c7083c9d0e9df96e02a1932e777895", + "sha256:47ca71115e545954e6c1d207dd13461ab81f4eccfcb1345eac874828b5e3eaaf", + "sha256:4a997df8c1c2aae1e1e5ac49c2e4f610ad037fc5a3aadc7b64e39dea42249431", + "sha256:51956cf8730665e2bdf8ddb8da0056f699c1a5715648c1b0144670c1ba00b48f", + "sha256:5bcb8a5620008a8034d39bce21dc3e23735dfdb6a33a06974739bfa04f853947", + "sha256:64c3f16e2a4fc51c0d06af28441881f98c5d91009b8caaff40cf3548089e9c74", + "sha256:6e2b11c55d260d03a8cf29ac9b5e0608d35f08077d8c087be96287f43af3ccdc", + "sha256:7b3f5fe74a5ca32d4d0f302ffe6680fcc5c28f8ef0dc0ae8f40c0f3a1b4fca66", + "sha256:844b6d608374e7d08f4f6e6f9f7b951f9256db41421917dfb2d003dde4cd6b66", + "sha256:9a8d6802e0825767476f62aafed40532bd435e8a5f7d23bd8b4f5fd04cc80ecf", + "sha256:aae4d918f6b180a8ab8bf6511a419473d107df4dbb4225c7b48c5c9602c38c7f", + "sha256:ac1955ce000cb29ab40def14fd1bbfa7af2017cca696ee696925615cafd0dce5", + "sha256:b88075ada2d51aa9f18283532c9f60e72170041bba88d7f37e49cbb10275299e", + "sha256:cb013933d4c127349b3948aa8aaf2f12c0353ad0eccd715ca789c8a0f671646f", + "sha256:cc70b4b581f28d0a254d006f26949245e3657d40d8857066c2ae22a61222ef55", + "sha256:e9c5266c432a1e23738d178e51c2c7a5e2ddf790f248be939448c0ba2021f9d1", + "sha256:ea9e57f8ea880eeea38ab5abf9fbe39f923544d7884228ec67d666abd60f5a47", + "sha256:ee0c405832ade84d4de74b9029bedb7b31200600fa524d218fc29bfa371e97f5", + "sha256:fdcb265de28585de5b859ae13e3846a8e805268a823a12a4da2597f1f5afc9f0" ], "markers": "python_version >= '3.7'", - "version": "==42.0.8" + "version": "==43.0.0" }, "cssselect2": { "hashes": [ @@ -584,12 +590,11 @@ }, "django": { "hashes": [ - "sha256:3ec32bc2c616ab02834b9cac93143a7dc1cdcd5b822d78ac95fc20a38c534240", - "sha256:fc6919875a6226c7ffcae1a7d51e0f2ceaf6f160393180818f6c95f51b1e7b96" + "sha256:61ee4a130efb8c451ef3467c67ca99fdce400fedd768634efc86a68c18d80d30", + "sha256:c77f926b81129493961e19c0e02188f8d07c112a1162df69bfab178ae447f94a" ], "index": "pypi", - "markers": "python_version >= '3.8'", - "version": "==4.2.14" + "version": "==4.2.15" }, "django-admin-multiple-choice-list-filter": { "hashes": [ @@ -605,7 +610,6 @@ "sha256:b555d87740a571036f100ad6026b1f62aabcb913404fb7f08f521881019b14bc" ], "index": "pypi", - "markers": "python_version >= '3.8'", "version": "==24.3" }, "django-celery-beat": { @@ -621,7 +625,6 @@ "sha256:3beb671c9ec44ffb817fad2780667f172bd1c067dbcabad6268ce39a81335f45" ], "index": "pypi", - "markers": "python_version >= '3.8'", "version": "==4.4.6" }, "django-elasticsearch-dsl": { @@ -638,7 +641,6 @@ "sha256:ff6940cf37e07d6d0c4ac28c5420c8cfc478b62541473dba4aa02d600f7db9fc" ], "index": "pypi", - "markers": "python_version >= '3.7'", "version": "==5.0.13" }, "django-maintenance-mode": { @@ -668,7 +670,6 @@ "sha256:d047a31cf94d83ef1465d7543ca66c6fc16695559b5f8d814d1b51df15110b92" ], "index": "pypi", - "markers": "python_version >= '3.7'", "version": "==4.1.0" }, "django-redis": { @@ -677,7 +678,6 @@ "sha256:ebc88df7da810732e2af9987f7f426c96204bf89319df4c6da6ca9a2942edd5b" ], "index": "pypi", - "markers": "python_version >= '3.6'", "version": "==5.4.0" }, "django-registration": { @@ -686,7 +686,6 @@ "sha256:fa76df481189794f47eb73043ee5cc9bfb0963194b901d7bd8cf914beab1ddd0" ], "index": "pypi", - "markers": "python_version >= '3.7'", "version": "==3.4" }, "django-robots": { @@ -695,7 +694,6 @@ "sha256:f86bcc3d16d7d7c2a4e37af6063cb4785f50ae16943f82248b48c9e7ac034f1d" ], "index": "pypi", - "markers": "python_version >= '3.7'", "version": "==6.1" }, "django-simple-captcha": { @@ -712,7 +710,6 @@ "sha256:d61930acb4a25e3aebebc6addaf946a3b1df31c803a6bf1af2f31c9047febaa3" ], "index": "pypi", - "markers": "python_version >= '3.7'", "version": "==1.14.4" }, "django-timezone-field": { @@ -729,7 +726,6 @@ "sha256:9804836e6d2b08de3b03a27c100f8c2e9633549913eff8b323678a10cd48b94e" ], "index": "pypi", - "markers": "python_version >= '3.8'", "version": "==4.1.0" }, "elasticsearch": { @@ -738,7 +734,6 @@ "sha256:5920df0ab2630778680376d86bea349dc99860977eec9b6d2bd0860f337313f2" ], "index": "pypi", - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3' and python_version < '4'", "version": "==7.13.4" }, "elasticsearch-dsl": { @@ -779,7 +774,6 @@ "sha256:458d93580de34403a8dec1e8d5e6be2fee96c4deca63b95d71df7a6a80a690de" ], "index": "pypi", - "markers": "python_version >= '3.8'", "version": "==23.3.0" }, "flask": { @@ -1050,7 +1044,6 @@ "sha256:4a0b436239ff76fb33f11c07a16482c521a7e09c1ce3cc293c2330afe01bec63" ], "index": "pypi", - "markers": "python_version >= '3.7'", "version": "==22.0.0" }, "h11": { @@ -1070,119 +1063,103 @@ }, "hiredis": { "hashes": [ - "sha256:01b6c24c0840ac7afafbc4db236fd55f56a9a0919a215c25a238f051781f4772", - "sha256:02fc71c8333586871602db4774d3a3e403b4ccf6446dc4603ec12df563127cee", - "sha256:0c0773266e1c38a06e7593bd08870ac1503f5f0ce0f5c63f2b4134b090b5d6a4", - "sha256:0c5f6972d2bdee3cd301d5c5438e31195cf1cabf6fd9274491674d4ceb46914d", - "sha256:0da56915bda1e0a49157191b54d3e27689b70960f0685fdd5c415dacdee2fbed", - "sha256:14c7b43205e515f538a9defb4e411e0f0576caaeeda76bb9993ed505486f7562", - "sha256:16b01d9ceae265d4ab9547be0cd628ecaff14b3360357a9d30c029e5ae8b7e7f", - "sha256:1979334ccab21a49c544cd1b8d784ffb2747f99a51cb0bd0976eebb517628382", - "sha256:1c4c0bcf786f0eac9593367b6279e9b89534e008edbf116dcd0de956524702c8", - "sha256:1d63318ca189fddc7e75f6a4af8eae9c0545863619fb38cfba5f43e81280b286", - "sha256:27e9619847e9dc70b14b1ad2d0fb4889e7ca18996585c3463cff6c951fd6b10b", - "sha256:28adecb308293e705e44087a1c2d557a816f032430d8a2a9bb7873902a1c6d48", - "sha256:28bd184b33e0dd6d65816c16521a4ba1ffbe9ff07d66873c42ea4049a62fed83", - "sha256:322c668ee1c12d6c5750a4b1057e6b4feee2a75b3d25d630922a463cfe5e7478", - "sha256:333b5e04866758b11bda5f5315b4e671d15755fc6ed3b7969721bc6311d0ee36", - "sha256:33d5ebc93c39aed4b5bc769f8ce0819bc50e74bb95d57a35f838f1c4378978e0", - "sha256:380e029bb4b1d34cf560fcc8950bf6b57c2ef0c9c8b7c7ac20b7c524a730fadd", - "sha256:387f655444d912a963ab68abf64bf6e178a13c8e4aa945cb27388fd01a02e6f1", - "sha256:3dd63d0bbbe75797b743f35d37a4cca7ca7ba35423a0de742ae2985752f20c6d", - "sha256:419780f8583ddb544ffa86f9d44a7fcc183cd826101af4e5ffe535b6765f5f6b", - "sha256:4852f4bf88f0e2d9bdf91279892f5740ed22ae368335a37a52b92a5c88691140", - "sha256:49532d7939cc51f8e99efc326090c54acf5437ed88b9c904cc8015b3c4eda9c9", - "sha256:4baf4b579b108062e91bd2a991dc98b9dc3dc06e6288db2d98895eea8acbac22", - "sha256:4d59f88c4daa36b8c38e59ac7bffed6f5d7f68eaccad471484bf587b28ccc478", - "sha256:4fc242e9da4af48714199216eb535b61e8f8d66552c8819e33fc7806bd465a09", - "sha256:532a84a82156a82529ec401d1c25d677c6543c791e54a263aa139541c363995f", - "sha256:5341ce3d01ef3c7418a72e370bf028c7aeb16895e79e115fe4c954fff990489e", - "sha256:53d0f2c59bce399b8010a21bc779b4f8c32d0f582b2284ac8c98dc7578b27bc4", - "sha256:55ce31bf4711da879b96d511208efb65a6165da4ba91cb3a96d86d5a8d9d23e6", - "sha256:56e9b7d6051688ca94e68c0c8a54a243f8db841911b683cedf89a29d4de91509", - "sha256:57c0d0c7e308ed5280a4900d4468bbfec51f0e1b4cde1deae7d4e639bc6b7766", - "sha256:5986fb5f380169270a0293bebebd95466a1c85010b4f1afc2727e4d17c452512", - "sha256:5bd42d0d45ea47a2f96babd82a659fbc60612ab9423a68e4a8191e538b85542a", - "sha256:5c614552c6bd1d0d907f448f75550f6b24fb56cbfce80c094908b7990cad9702", - "sha256:63a090761ddc3c1f7db5e67aa4e247b4b3bb9890080bdcdadd1b5200b8b89ac4", - "sha256:63b99b5ea9fe4f21469fb06a16ca5244307678636f11917359e3223aaeca0b67", - "sha256:66ab949424ac6504d823cba45c4c4854af5c59306a1531edb43b4dd22e17c102", - "sha256:684840b014ce83541a087fcf2d48227196576f56ae3e944d4dfe14c0a3e0ccb7", - "sha256:6871306d8b98a15e53a5f289ec1106a3a1d43e7ab6f4d785f95fcef9a7bd9504", - "sha256:6b4edee59dc089bc3948f4f6fba309f51aa2ccce63902364900aa0a553a85e97", - "sha256:6d7302b4b17fcc1cc727ce84ded7f6be4655701e8d58744f73b09cb9ed2b13df", - "sha256:6dbfe1887ffa5cf3030451a56a8f965a9da2fa82b7149357752b67a335a05fc6", - "sha256:70d226ab0306a5b8d408235cabe51d4bf3554c9e8a72d53ce0b3c5c84cf78881", - "sha256:7298562a49d95570ab1c7fc4051e72824c6a80e907993a21a41ba204223e7334", - "sha256:733e2456b68f3f126ddaf2cd500a33b25146c3676b97ea843665717bda0c5d43", - "sha256:742093f33d374098aa21c1696ac6e4874b52658c870513a297a89265a4d08fe5", - "sha256:7bac7e02915b970c3723a7a7c5df4ba7a11a3426d2a3f181e041aa506a1ff028", - "sha256:7e8bf4444b09419b77ce671088db9f875b26720b5872d97778e2545cd87dba4a", - "sha256:7f39f28ffc65de577c3bc0c7615f149e35bc927802a0f56e612db9b530f316f9", - "sha256:80441b55edbef868e2563842f5030982b04349408396e5ac2b32025fb06b5212", - "sha256:80b02d27864ebaf9b153d4b99015342382eeaed651f5591ce6f07e840307c56d", - "sha256:88cb0b35b63717ef1e41d62f4f8717166f7c6245064957907cfe177cc144357c", - "sha256:8c490191fa1218851f8a80c5a21a05a6f680ac5aebc2e688b71cbfe592f8fec6", - "sha256:8e3f8b1733078ac663dad57e20060e16389a60ab542f18a97931f3a2a2dd64a4", - "sha256:8f34801b251ca43ad70691fb08b606a2e55f06b9c9fb1fc18fd9402b19d70f7b", - "sha256:8fc7197ff33047ce43a67851ccf190acb5b05c52fd4a001bb55766358f04da68", - "sha256:92830c16885f29163e1c2da1f3c1edb226df1210ec7e8711aaabba3dd0d5470a", - "sha256:9412a06b8a8e09abd6313d96864b6d7713c6003a365995a5c70cfb9209df1570", - "sha256:948d9f2ca7841794dd9b204644963a4bcd69ced4e959b0d4ecf1b8ce994a6daa", - "sha256:9a0026cfbf29f07649b0e34509091a2a6016ff8844b127de150efce1c3aff60b", - "sha256:9c431431abf55b64347ddc8df68b3ef840269cb0aa5bc2d26ad9506eb4b1b866", - "sha256:9e14fb70ca4f7efa924f508975199353bf653f452e4ef0a1e47549e208f943d7", - "sha256:a45857e87e9d2b005e81ddac9d815a33efd26ec67032c366629f023fe64fb415", - "sha256:a50c8af811b35b8a43b1590cf890b61ff2233225257a3cad32f43b3ec7ff1b9f", - "sha256:a6481c3b7673a86276220140456c2a6fbfe8d1fb5c613b4728293c8634134824", - "sha256:a6b54dabfaa5dbaa92f796f0c32819b4636e66aa8e9106c3d421624bd2a2d676", - "sha256:a797d8c7df9944314d309b0d9e1b354e2fa4430a05bb7604da13b6ad291bf959", - "sha256:a91a14dd95e24dc078204b18b0199226ee44644974c645dc54ee7b00c3157330", - "sha256:adfbf2e9c38b77d0db2fb32c3bdaea638fa76b4e75847283cd707521ad2475ef", - "sha256:ba3dc0af0def8c21ce7d903c59ea1e8ec4cb073f25ece9edaec7f92a286cd219", - "sha256:bb777a38797c8c7df0444533119570be18d1a4ce5478dffc00c875684df7bfcb", - "sha256:bcbe47da0aebc00a7cfe3ebdcff0373b86ce2b1856251c003e3d69c9db44b5a7", - "sha256:bd1cee053416183adcc8e6134704c46c60c3f66b8faaf9e65bf76191ca59a2f7", - "sha256:bd40d2e2f82a483de0d0a6dfd8c3895a02e55e5c9949610ecbded18188fd0a56", - "sha256:bfa73e3f163c6e8b2ec26f22285d717a5f77ab2120c97a2605d8f48b26950dac", - "sha256:c1f567489f422d40c21e53212a73bef4638d9f21043848150f8544ef1f3a6ad1", - "sha256:c3dde4ca00fe9eee3b76209711f1941bb86db42b8a75d7f2249ff9dfc026ab0e", - "sha256:c8937f1100435698c18e4da086968c4b5d70e86ea718376f833475ab3277c9aa", - "sha256:ca33c175c1cf60222d9c6d01c38fc17ec3a484f32294af781de30226b003e00f", - "sha256:ce42649e2676ad783186264d5ffc788a7612ecd7f9effb62d51c30d413a3eefe", - "sha256:cfa67afe2269b2d203cd1389c00c5bc35a287cd57860441fb0e53b371ea6a029", - "sha256:d47c915897a99d0d34a39fad4be97b4b709ab3d0d3b779ebccf2b6024a8c681e", - "sha256:d4dd676107a1d3c724a56a9d9db38166ad4cf44f924ee701414751bd18a784a0", - "sha256:d711c107e83117129b7f8bd08e9820c43ceec6204fff072a001fd82f6d13db9f", - "sha256:dc1c3fd49930494a67dcec37d0558d99d84eca8eb3f03b17198424538f2608d7", - "sha256:de3a32b4b76d46f1eb42b24a918d51d8ca52411a381748196241d59a895f7c5c", - "sha256:dfa904045d7cebfb0f01dad51352551cce1d873d7c3f80c7ded7d42f8cac8f89", - "sha256:e138d141ec5a6ec800b6d01ddc3e5561ce1c940215e0eb9960876bfde7186aae", - "sha256:e15a408f71a6c8c87b364f1f15a6cd9c1baca12bbc47a326ac8ab99ec7ad3c64", - "sha256:e1d86b75de787481b04d112067a4033e1ecfda2a060e50318a74e4e1c9b2948c", - "sha256:e2674a5a3168349435b08fa0b82998ed2536eb9acccf7087efe26e4cd088a525", - "sha256:e58494f282215fc461b06709e9a195a24c12ba09570f25bdf9efb036acc05101", - "sha256:e627d8ef5e100556e09fb44c9571a432b10e11596d3c4043500080ca9944a91a", - "sha256:e741ffe4e2db78a1b9dd6e5d29678ce37fbaaf65dfe132e5b82a794413302ef1", - "sha256:e81aa4e9a1fcf604c8c4b51aa5d258e195a6ba81efe1da82dea3204443eba01c", - "sha256:e96cd35df012a17c87ae276196ea8f215e77d6eeca90709eb03999e2d5e3fd8a", - "sha256:ea002656a8d974daaf6089863ab0a306962c8b715db6b10879f98b781a2a5bf5", - "sha256:eae62ed60d53b3561148bcd8c2383e430af38c0deab9f2dd15f8874888ffd26f", - "sha256:eb8797b528c1ff81eef06713623562b36db3dafa106b59f83a6468df788ff0d1", - "sha256:eb98038ccd368e0d88bd92ee575c58cfaf33e77f788c36b2a89a84ee1936dc6b", - "sha256:ec444ab8f27562a363672d6a7372bc0700a1bdc9764563c57c5f9efa0e592b5f", - "sha256:ed63e8b75c193c5e5a8288d9d7b011da076cc314fafc3bfd59ec1d8a750d48c8", - "sha256:f2c9c0d910dd3f7df92f0638e7f65d8edd7f442203caf89c62fc79f11b0b73f8", - "sha256:f3020b60e3fc96d08c2a9b011f1c2e2a6bdcc09cb55df93c509b88be5cb791df", - "sha256:f47775e27388b58ce52f4f972f80e45b13c65113e9e6b6bf60148f893871dc9b", - "sha256:f70481213373d44614148f0f2e38e7905be3f021902ae5167289413196de4ba4", - "sha256:f9de7586522e5da6bee83c9cf0dcccac0857a43249cb4d721a2e312d98a684d1", - "sha256:f9f606e810858207d4b4287b4ef0dc622c2aa469548bf02b59dcc616f134f811", - "sha256:fa45f7d771094b8145af10db74704ab0f698adb682fbf3721d8090f90e42cc49" + "sha256:00018f22f38530768b73ea86c11f47e8d4df65facd4e562bd78773bd1baef35e", + "sha256:034925b5fb514f7b11aac38cd55b3fd7e9d3af23bd6497f3f20aa5b8ba58e232", + "sha256:038756db735e417ab36ee6fd7725ce412385ed2bd0767e8179a4755ea11b804f", + "sha256:04ccae6dcd9647eae6025425ab64edb4d79fde8b9e6e115ebfabc6830170e3b2", + "sha256:0aacc0a78e1d94d843a6d191f224a35893e6bdfeb77a4a89264155015c65f126", + "sha256:0bb6f9fd92f147ba11d338ef5c68af4fd2908739c09e51f186e1d90958c68cc1", + "sha256:0dcfa684966f25b335072115de2f920228a3c2caf79d4bfa2b30f6e4f674a948", + "sha256:100431e04d25a522ef2c3b94f294c4219c4de3bfc7d557b6253296145a144c11", + "sha256:120f2dda469b28d12ccff7c2230225162e174657b49cf4cd119db525414ae281", + "sha256:122171ff47d96ed8dd4bba6c0e41d8afaba3e8194949f7720431a62aa29d8895", + "sha256:13c275b483a052dd645eb2cb60d6380f1f5215e4c22d6207e17b86be6dd87ffa", + "sha256:13c345e7278c210317e77e1934b27b61394fee0dec2e8bd47e71570900f75823", + "sha256:1f669212c390eebfbe03c4e20181f5970b82c5d0a0ad1df1785f7ffbe7d61150", + "sha256:1fb8de899f0145d6c4d5d4bd0ee88a78eb980a7ffabd51e9889251b8f58f1785", + "sha256:204b79b30a0e6be0dc2301a4d385bb61472809f09c49f400497f1cdd5a165c66", + "sha256:22c17c96143c2a62dfd61b13803bc5de2ac526b8768d2141c018b965d0333b66", + "sha256:23142a8af92a13fc1e3f2ca1d940df3dcf2af1d176be41fe8d89e30a837a0b60", + "sha256:3d22c53f0ec5c18ecb3d92aa9420563b1c5d657d53f01356114978107b00b860", + "sha256:3dc8043959b50141df58ab4f398e8ae84c6f9e673a2c9407be65fc789138f4a6", + "sha256:3ea635101b739c12effd189cc19b2671c268abb03013fd1f6321ca29df3ca625", + "sha256:41afc0d3c18b59eb50970479a9c0e5544fb4b95e3a79cf2fbaece6ddefb926fe", + "sha256:4664dedcd5933364756d7251a7ea86d60246ccf73a2e00912872dacbfcef8978", + "sha256:466f836dbcf86de3f9692097a7a01533dc9926986022c6617dc364a402b265c5", + "sha256:467d28112c7faa29b7db743f40803d927c8591e9da02b6ce3d5fadc170a542a2", + "sha256:47de0bbccf4c8a9f99d82d225f7672b9dd690d8fd872007b933ef51a302c9fa6", + "sha256:484025d2eb8f6348f7876fc5a2ee742f568915039fcb31b478fd5c242bb0fe3a", + "sha256:48727d7d405d03977d01885f317328dc21d639096308de126c2c4e9950cbd3c9", + "sha256:4b182791c41c5eb1d9ed736f0ff81694b06937ca14b0d4dadde5dadba7ff6dae", + "sha256:4c6efcbb5687cf8d2aedcc2c3ed4ac6feae90b8547427d417111194873b66b06", + "sha256:4ea3a86405baa8eb0d3639ced6926ad03e07113de54cb00fd7510cb0db76a89d", + "sha256:50a196af0ce657fcde9bf8a0bbe1032e22c64d8fcec2bc926a35e7ff68b3a166", + "sha256:50da7a9edf371441dfcc56288d790985ee9840d982750580710a9789b8f4a290", + "sha256:51b99cfac514173d7b8abdfe10338193e8a0eccdfe1870b646009d2fb7cbe4b5", + "sha256:54a6dd7b478e6eb01ce15b3bb5bf771e108c6c148315bf194eb2ab776a3cac4d", + "sha256:562eaf820de045eb487afaa37e6293fe7eceb5b25e158b5a1974b7e40bf04543", + "sha256:5a8dffb5f5b3415a4669d25de48b617fd9d44b0bccfc4c2ab24b06406ecc9ecb", + "sha256:5b5cff42a522a0d81c2ae7eae5e56d0ee7365e0c4ad50c4de467d8957aff4414", + "sha256:63482db3fadebadc1d01ad33afa6045ebe2ea528eb77ccaabd33ee7d9c2bad48", + "sha256:6ca41fa40fa019cde42c21add74aadd775e71458051a15a352eabeb12eb4d084", + "sha256:6eecb343c70629f5af55a8b3e53264e44fa04e155ef7989de13668a0cb102a90", + "sha256:719c32147ba29528cb451f037bf837dcdda4ff3ddb6cdb12c4216b0973174718", + "sha256:77c8006c12154c37691b24ff293c077300c22944018c3ff70094a33e10c1d795", + "sha256:793c80a3d6b0b0e8196a2d5de37a08330125668c8012922685e17aa9108c33ac", + "sha256:7d99b91e42217d7b4b63354b15b41ce960e27d216783e04c4a350224d55842a4", + "sha256:82f794d564f4bc76b80c50b03267fe5d6589e93f08e66b7a2f674faa2fa76ebc", + "sha256:83a29cc7b21b746cb6a480189e49f49b2072812c445e66a9e38d2004d496b81c", + "sha256:869f6d5537d243080f44253491bb30aa1ec3c21754003b3bddeadedeb65842b0", + "sha256:8854969e7480e8d61ed7549eb232d95082a743e94138d98d7222ba4e9f7ecacd", + "sha256:898636a06d9bf575d2c594129085ad6b713414038276a4bfc5db7646b8a5be78", + "sha256:8e0bb6102ebe2efecf8a3292c6660a0e6fac98176af6de67f020bea1c2343717", + "sha256:8fed69bbaa307040c62195a269f82fc3edf46b510a17abb6b30a15d7dab548df", + "sha256:9862db92ef67a8a02e0d5370f07d380e14577ecb281b79720e0d7a89aedb9ee5", + "sha256:98a152052b8878e5e43a2e3a14075218adafc759547c98668a21e9485882696c", + "sha256:99516d99316062824a24d145d694f5b0d030c80da693ea6f8c4ecf71a251d8bb", + "sha256:9b285ef6bf1581310b0d5e8f6ce64f790a1c40e89c660e1320b35f7515433672", + "sha256:a131377493a59fb0f5eaeb2afd49c6540cafcfba5b0b3752bed707be9e7c4eaf", + "sha256:a1c81c89ed765198da27412aa21478f30d54ef69bf5e4480089d9c3f77b8f882", + "sha256:a2537b2cd98192323fce4244c8edbf11f3cac548a9d633dbbb12b48702f379f4", + "sha256:a41be8af1fd78ca97bc948d789a09b730d1e7587d07ca53af05758f31f4b985d", + "sha256:a631e2990b8be23178f655cae8ac6c7422af478c420dd54e25f2e26c29e766f1", + "sha256:a6a49ef161739f8018c69b371528bdb47d7342edfdee9ddc75a4d8caddf45a6e", + "sha256:ac6d929cb33dd12ad3424b75725975f0a54b5b12dbff95f2a2d660c510aa106d", + "sha256:b23291951959141173eec10f8573538e9349fa27f47a0c34323d1970bf891ee5", + "sha256:ba9fc605ac558f0de67463fb588722878641e6fa1dabcda979e8e69ff581d0bd", + "sha256:bdc144d56333c52c853c31b4e2e52cfbdb22d3da4374c00f5f3d67c42158970f", + "sha256:c073848d2b1d5561f3903879ccf4e1a70c9b1e7566c7bdcc98d082fa3e7f0a1d", + "sha256:c1018cc7f12824506f165027eabb302735b49e63af73eb4d5450c66c88f47026", + "sha256:c3ece960008dab66c6b8bb3a1350764677ee7c74ccd6270aaf1b1caf9ccebb46", + "sha256:c3fdad75e7837a475900a1d3a5cc09aa024293c3b0605155da2d42f41bc0e482", + "sha256:c8a1df39d74ec507d79c7a82c8063eee60bf80537cdeee652f576059b9cdd15c", + "sha256:c8a91e9520fbc65a799943e5c970ffbcd67905744d8becf2e75f9f0a5e8414f0", + "sha256:d10fcd9e0eeab835f492832b2a6edb5940e2f1230155f33006a8dfd3bd2c94e4", + "sha256:d435ae89073d7cd51e6b6bf78369c412216261c9c01662e7008ff00978153729", + "sha256:d7a4c1791d7aa7e192f60fe028ae409f18ccdd540f8b1e6aeb0df7816c77e4a4", + "sha256:dc384874a719c767b50a30750f937af18842ee5e288afba95a5a3ed703b1515a", + "sha256:df274e3abb4df40f4c7274dd3e587dfbb25691826c948bc98d5fead019dfb001", + "sha256:e069967cbd5e1900aafc4b5943888f6d34937fc59bf8918a1a546cb729b4b1e4", + "sha256:e194a0d5df9456995d8f510eab9f529213e7326af6b94770abf8f8b7952ddcaa", + "sha256:e1a9c14ae9573d172dc050a6f63a644457df5d01ec4d35a6a0f097f812930f83", + "sha256:e241fab6332e8fb5f14af00a4a9c6aefa22f19a336c069b7ddbf28ef8341e8d6", + "sha256:e421ac9e4b5efc11705a0d5149e641d4defdc07077f748667f359e60dc904420", + "sha256:e43679eca508ba8240d016d8cca9d27342d70184773c15bea78a23c87a1922f1", + "sha256:e584fe5f4e6681d8762982be055f1534e0170f6308a7a90f58d737bab12ff6a8", + "sha256:f114a6c86edbf17554672b050cce72abf489fe58d583c7921904d5f1c9691605", + "sha256:f2f312eef8aafc2255e3585dcf94d5da116c43ef837db91db9ecdc1bc930072d", + "sha256:f359175197fd833c8dd7a8c288f1516be45415bb5c939862ab60c2918e1e1943", + "sha256:f75999ae00a920f7dce6ecae76fa5e8674a3110e5a75f12c7a2c75ae1af53396", + "sha256:f91456507427ba36fd81b2ca11053a8e112c775325acc74e993201ea912d63e9", + "sha256:fa1fcad89d8a41d8dc10b1e54951ec1e161deabd84ed5a2c95c3c7213bdb3514", + "sha256:fa86bf9a0ed339ec9e8a9a9d0ae4dccd8671625c83f9f9f2640729b15e07fbfd", + "sha256:fcdb552ffd97151dab8e7bc3ab556dfa1512556b48a367db94b5c20253a35ee1", + "sha256:fcecbd39bd42cef905c0b51c9689c39d0cc8b88b1671e7f40d4fb213423aef3a", + "sha256:fe91d62b0594db5ea7d23fc2192182b1a7b6973f628a9b8b2e0a42a2be721ac6", + "sha256:fed8581ae26345dea1f1e0d1a96e05041a727a45e7d8d459164583e23c6ac441" ], "index": "pypi", - "markers": "python_version >= '3.7'", - "version": "==2.3.2" + "version": "==3.0.0" }, "hpack": { "hashes": [ @@ -1265,21 +1242,19 @@ }, "kombu": { "hashes": [ - "sha256:011c4cd9a355c14a1de8d35d257314a1d2456d52b7140388561acac3cf1a97bf", - "sha256:5634c511926309c7f9789f1433e9ed402616b56836ef9878f01bd59267b4c7a9" + "sha256:ad200a8dbdaaa2bbc5f26d2ee7d707d9a1fded353a0f4bd751ce8c7d9f449c60", + "sha256:c8dd99820467610b4febbc7a9e8a0d3d7da2d35116b67184418b51cc520ea6b6" ], "index": "pypi", - "markers": "python_version >= '3.8'", - "version": "==5.3.7" + "version": "==5.4.0" }, "locust": { "hashes": [ - "sha256:2e0628a59e2689a50cb4735a9a43709e30f2da7ed276c15d877c5325507f44b1", - "sha256:8b15daab44cdf50eef1860a32bb30969423e3795247115e5a37446da3240c6d6" + "sha256:20756509939004e95c622ac3042886edab38b736f00534cc03ce2774064e7f71", + "sha256:d26b7333cdef80645f3978d8ff9aabab4d53e41ed82cc8490212aa68e8498fdd" ], "index": "pypi", - "markers": "python_version >= '3.9'", - "version": "==2.29.1" + "version": "==2.31.1" }, "markdown": { "hashes": [ @@ -1287,7 +1262,6 @@ "sha256:ed4f41f6daecbeeb96e576ce414c41d2d876daa9a16cb35fa8ed8c2ddfad0224" ], "index": "pypi", - "markers": "python_version >= '3.8'", "version": "==3.6" }, "markdown-it-py": { @@ -1378,7 +1352,6 @@ "sha256:ea6a02e24a9161e51faad17a8782b92a0df82c12c1c8886fec7f0c3fa1a1b320" ], "index": "pypi", - "markers": "python_version >= '3.8'", "version": "==10.3.0" }, "msgpack": { @@ -1479,7 +1452,6 @@ "sha256:e47805627aebcf860edb4edf7987b1309c1b3632f3750538ed962bbcc3bd7449" ], "index": "pypi", - "markers": "python_version >= '3.6'", "version": "==3.0.10" }, "outcome": { @@ -1590,7 +1562,6 @@ "sha256:ff337c552345e95702c5fde3158acb0625111017d0e5f24bf3acdb9cc16b90d1" ], "index": "pypi", - "markers": "python_version >= '3.8'", "version": "==10.4.0" }, "platformdirs": { @@ -1622,7 +1593,6 @@ "sha256:cde524a85bce83ca359cc837f28b8c0db5cac7aa653a588fd7e84ba061c329e7" ], "index": "pypi", - "markers": "python_version >= '3.8'", "version": "==0.20.0" }, "prompt-toolkit": { @@ -1630,7 +1600,7 @@ "sha256:0d7bfa67001d5e39d02c224b663abc33687405033a8c422d0d675a5a13361d10", "sha256:1e1b29cb58080b1e69f207c893a1a7bf16d127a5c30c9d17a25a5d77792e5360" ], - "markers": "python_full_version >= '3.7.0'", + "markers": "python_version >= '3.7'", "version": "==3.0.47" }, "psutil": { @@ -1656,25 +1626,13 @@ "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'", "version": "==6.0.0" }, - "psycopg2": { - "hashes": [ - "sha256:121081ea2e76729acfb0673ff33755e8703d45e926e416cb59bae3a86c6a4981", - "sha256:38a8dcc6856f569068b47de286b472b7c473ac7977243593a288ebce0dc89516", - "sha256:426f9f29bde126913a20a96ff8ce7d73fd8a216cfb323b1f04da402d452853c3", - "sha256:5e0d98cade4f0e0304d7d6f25bbfbc5bd186e07b38eac65379309c4ca3193efa", - "sha256:7e2dacf8b009a1c1e843b5213a87f7c544b2b042476ed7755be813eaf4e8347a", - "sha256:a7653d00b732afb6fc597e29c50ad28087dcb4fbfb28e86092277a559ae4e693", - "sha256:ade01303ccf7ae12c356a5e10911c9e1c51136003a9a1d92f7aa9d010fb98372", - "sha256:bac58c024c9922c23550af2a581998624d6e02350f4ae9c5f0bc642c633a2d5e", - "sha256:c92811b2d4c9b6ea0285942b2e7cac98a59e166d59c588fe5cfe1eda58e72d59", - "sha256:d1454bde93fb1e224166811694d600e746430c006fbb031ea06ecc2ea41bf156", - "sha256:d735786acc7dd25815e89cc4ad529a43af779db2e25aa7c626de864127e5a024", - "sha256:de80739447af31525feddeb8effd640782cf5998e1a4e9192ebdf829717e3913", - "sha256:ff432630e510709564c01dafdbe996cb552e0b9f3f065eb89bdce5bd31fabf4c" + "psycopg": { + "hashes": [ + "sha256:dc8da6dc8729dacacda3cc2f17d2c9397a70a66cf0d2b69c91065d60d5f00cb7", + "sha256:ece385fb413a37db332f97c49208b36cf030ff02b199d7635ed2fbd378724175" ], "index": "pypi", - "markers": "python_version >= '3.7'", - "version": "==2.9.9" + "version": "==3.2.1" }, "pyasn1": { "hashes": [ @@ -1682,7 +1640,6 @@ "sha256:cca4bb0f2df5504f02f6f8a775b6e416ff9b0b3b16f7ee80b5a3153d9b804473" ], "index": "pypi", - "markers": "python_version >= '3.8'", "version": "==0.6.0" }, "pyasn1-modules": { @@ -1826,7 +1783,6 @@ "sha256:5b7932c7bbd5a7cb4f519126ccc261f8b5867cc25126199c64795a5efc7c84d4" ], "index": "pypi", - "markers": "python_full_version >= '3.8.1'", "version": "==1.21.0" }, "pylibmc": { @@ -1856,7 +1812,6 @@ "sha256:f536d73632007358796654ab088d65c55a1a4368a85cfd7c956d2100e2cd8d89" ], "index": "pypi", - "markers": "python_version >= '3.6'", "version": "==1.6.3" }, "pymemcache": { @@ -1865,23 +1820,22 @@ "sha256:f507bc20e0dc8d562f8df9d872107a278df049fa496805c1431b926f3ddd0eab" ], "index": "pypi", - "markers": "python_version >= '3.7'", "version": "==4.0.0" }, "pyopenssl": { "hashes": [ - "sha256:17ed5be5936449c5418d1cd269a1a9e9081bc54c17aed272b45856a3d3dc86ad", - "sha256:cabed4bfaa5df9f1a16c0ef64a0cb65318b5cd077a7eda7d6970131ca2f41a6f" + "sha256:4247f0dbe3748d560dcbb2ff3ea01af0f9a1a001ef5f7c4c647956ed8cbf0e95", + "sha256:967d5719b12b243588573f39b0c677637145c7a1ffedcd495a487e58177fbb8d" ], - "version": "==24.1.0" + "version": "==24.2.1" }, "pyphen": { "hashes": [ - "sha256:999b430916ab42ae9912537cd95c074e0c6691e89a9d05999f9b610a68f34858", - "sha256:a430623decac53dc3691241253263cba36b9dd7a44ffd2680b706af368cda2f2" + "sha256:2c006b3ddf072c9571ab97606d9ab3c26a92eaced4c0d59fd1d26988f308f413", + "sha256:b4a4c6d7d5654b698b5fc68123148bb799b3debe0175d1d5dc3edfe93066fc4c" ], "markers": "python_version >= '3.8'", - "version": "==0.15.0" + "version": "==0.16.0" }, "pysocks": { "hashes": [ @@ -1898,16 +1852,15 @@ "sha256:f1c3a8b0f07fd01a1085d451f5b8315be6eec1d5577a6796d46dc7a62bd4120f" ], "index": "pypi", - "markers": "python_version >= '3.7'", "version": "==0.3.10" }, "pytest": { "hashes": [ - "sha256:c434598117762e2bd304e526244f67bf66bbd7b5d6cf22138be51ff661980343", - "sha256:de4bb8104e201939ccdc688b27a89a7be2079b22e2bd2b07f806b6ba71117977" + "sha256:4ba08f9ae7dcf84ded419494d229b48d0903ea6407b030eaec46df5e6a73bba5", + "sha256:c132345d12ce551242c87269de812483f5bcc87cdbb4722e48487ba194f9fdce" ], "markers": "python_version >= '3.8'", - "version": "==8.2.2" + "version": "==8.3.2" }, "pytest-xdist": { "hashes": [ @@ -1941,105 +1894,126 @@ }, "pyzmq": { "hashes": [ - "sha256:01fbfbeb8249a68d257f601deb50c70c929dc2dfe683b754659569e502fbd3aa", - "sha256:0270b49b6847f0d106d64b5086e9ad5dc8a902413b5dbbb15d12b60f9c1747a4", - "sha256:03c0ae165e700364b266876d712acb1ac02693acd920afa67da2ebb91a0b3c09", - "sha256:068ca17214038ae986d68f4a7021f97e187ed278ab6dccb79f837d765a54d753", - "sha256:082a2988364b60bb5de809373098361cf1dbb239623e39e46cb18bc035ed9c0c", - "sha256:0aaf982e68a7ac284377d051c742610220fd06d330dcd4c4dbb4cdd77c22a537", - "sha256:0c0991f5a96a8e620f7691e61178cd8f457b49e17b7d9cfa2067e2a0a89fc1d5", - "sha256:115f8359402fa527cf47708d6f8a0f8234f0e9ca0cab7c18c9c189c194dbf620", - "sha256:15c59e780be8f30a60816a9adab900c12a58d79c1ac742b4a8df044ab2a6d920", - "sha256:1b7d0e124948daa4d9686d421ef5087c0516bc6179fdcf8828b8444f8e461a77", - "sha256:1c8eb19abe87029c18f226d42b8a2c9efdd139d08f8bf6e085dd9075446db450", - "sha256:204e0f176fd1d067671157d049466869b3ae1fc51e354708b0dc41cf94e23a3a", - "sha256:2136f64fbb86451dbbf70223635a468272dd20075f988a102bf8a3f194a411dc", - "sha256:2b291d1230845871c00c8462c50565a9cd6026fe1228e77ca934470bb7d70ea0", - "sha256:2c18645ef6294d99b256806e34653e86236eb266278c8ec8112622b61db255de", - "sha256:2cc4e280098c1b192c42a849de8de2c8e0f3a84086a76ec5b07bfee29bda7d18", - "sha256:2ed8357f4c6e0daa4f3baf31832df8a33334e0fe5b020a61bc8b345a3db7a606", - "sha256:3191d312c73e3cfd0f0afdf51df8405aafeb0bad71e7ed8f68b24b63c4f36500", - "sha256:3401613148d93ef0fd9aabdbddb212de3db7a4475367f49f590c837355343972", - "sha256:34106f68e20e6ff253c9f596ea50397dbd8699828d55e8fa18bd4323d8d966e6", - "sha256:3516119f4f9b8671083a70b6afaa0a070f5683e431ab3dc26e9215620d7ca1ad", - "sha256:38ece17ec5f20d7d9b442e5174ae9f020365d01ba7c112205a4d59cf19dc38ee", - "sha256:3b4032a96410bdc760061b14ed6a33613ffb7f702181ba999df5d16fb96ba16a", - "sha256:3bf8b000a4e2967e6dfdd8656cd0757d18c7e5ce3d16339e550bd462f4857e59", - "sha256:3e3070e680f79887d60feeda051a58d0ac36622e1759f305a41059eff62c6da7", - "sha256:4496b1282c70c442809fc1b151977c3d967bfb33e4e17cedbf226d97de18f709", - "sha256:44dd6fc3034f1eaa72ece33588867df9e006a7303725a12d64c3dff92330f625", - "sha256:4adfbb5451196842a88fda3612e2c0414134874bffb1c2ce83ab4242ec9e027d", - "sha256:4b7c0c0b3244bb2275abe255d4a30c050d541c6cb18b870975553f1fb6f37527", - "sha256:4c82a6d952a1d555bf4be42b6532927d2a5686dd3c3e280e5f63225ab47ac1f5", - "sha256:5344b896e79800af86ad643408ca9aa303a017f6ebff8cee5a3163c1e9aec987", - "sha256:5bde86a2ed3ce587fa2b207424ce15b9a83a9fa14422dcc1c5356a13aed3df9d", - "sha256:5bf6c237f8c681dfb91b17f8435b2735951f0d1fad10cc5dfd96db110243370b", - "sha256:5dbb9c997932473a27afa93954bb77a9f9b786b4ccf718d903f35da3232317de", - "sha256:69ea9d6d9baa25a4dc9cef5e2b77b8537827b122214f210dd925132e34ae9b12", - "sha256:6b3146f9ae6af82c47a5282ac8803523d381b3b21caeae0327ed2f7ecb718798", - "sha256:6bcb34f869d431799c3ee7d516554797f7760cb2198ecaa89c3f176f72d062be", - "sha256:6ca08b840fe95d1c2bd9ab92dac5685f949fc6f9ae820ec16193e5ddf603c3b2", - "sha256:6ca7a9a06b52d0e38ccf6bca1aeff7be178917893f3883f37b75589d42c4ac20", - "sha256:703c60b9910488d3d0954ca585c34f541e506a091a41930e663a098d3b794c67", - "sha256:715bdf952b9533ba13dfcf1f431a8f49e63cecc31d91d007bc1deb914f47d0e4", - "sha256:72b67f966b57dbd18dcc7efbc1c7fc9f5f983e572db1877081f075004614fcdd", - "sha256:74423631b6be371edfbf7eabb02ab995c2563fee60a80a30829176842e71722a", - "sha256:77a85dca4c2430ac04dc2a2185c2deb3858a34fe7f403d0a946fa56970cf60a1", - "sha256:7821d44fe07335bea256b9f1f41474a642ca55fa671dfd9f00af8d68a920c2d4", - "sha256:788f15721c64109cf720791714dc14afd0f449d63f3a5487724f024345067381", - "sha256:7ca684ee649b55fd8f378127ac8462fb6c85f251c2fb027eb3c887e8ee347bcd", - "sha256:7daa3e1369355766dea11f1d8ef829905c3b9da886ea3152788dc25ee6079e02", - "sha256:7e6bc96ebe49604df3ec2c6389cc3876cabe475e6bfc84ced1bf4e630662cb35", - "sha256:80b12f25d805a919d53efc0a5ad7c0c0326f13b4eae981a5d7b7cc343318ebb7", - "sha256:871587bdadd1075b112e697173e946a07d722459d20716ceb3d1bd6c64bd08ce", - "sha256:88b88282e55fa39dd556d7fc04160bcf39dea015f78e0cecec8ff4f06c1fc2b5", - "sha256:8d7a498671ca87e32b54cb47c82a92b40130a26c5197d392720a1bce1b3c77cf", - "sha256:926838a535c2c1ea21c903f909a9a54e675c2126728c21381a94ddf37c3cbddf", - "sha256:971e8990c5cc4ddcff26e149398fc7b0f6a042306e82500f5e8db3b10ce69f84", - "sha256:9b273ecfbc590a1b98f014ae41e5cf723932f3b53ba9367cfb676f838038b32c", - "sha256:a42db008d58530efa3b881eeee4991146de0b790e095f7ae43ba5cc612decbc5", - "sha256:a72a84570f84c374b4c287183debc776dc319d3e8ce6b6a0041ce2e400de3f32", - "sha256:ac97a21de3712afe6a6c071abfad40a6224fd14fa6ff0ff8d0c6e6cd4e2f807a", - "sha256:acb704195a71ac5ea5ecf2811c9ee19ecdc62b91878528302dd0be1b9451cc90", - "sha256:b32bff85fb02a75ea0b68f21e2412255b5731f3f389ed9aecc13a6752f58ac97", - "sha256:b3cd31f859b662ac5d7f4226ec7d8bd60384fa037fc02aee6ff0b53ba29a3ba8", - "sha256:b63731993cdddcc8e087c64e9cf003f909262b359110070183d7f3025d1c56b5", - "sha256:b6907da3017ef55139cf0e417c5123a84c7332520e73a6902ff1f79046cd3b94", - "sha256:ba6e5e6588e49139a0979d03a7deb9c734bde647b9a8808f26acf9c547cab1bf", - "sha256:c1c8f2a2ca45292084c75bb6d3a25545cff0ed931ed228d3a1810ae3758f975f", - "sha256:ce828058d482ef860746bf532822842e0ff484e27f540ef5c813d516dd8896d2", - "sha256:d0a2d1bd63a4ad79483049b26514e70fa618ce6115220da9efdff63688808b17", - "sha256:d0cdde3c78d8ab5b46595054e5def32a755fc028685add5ddc7403e9f6de9879", - "sha256:d57dfbf9737763b3a60d26e6800e02e04284926329aee8fb01049635e957fe81", - "sha256:d8416c23161abd94cc7da80c734ad7c9f5dbebdadfdaa77dad78244457448223", - "sha256:dba7d9f2e047dfa2bca3b01f4f84aa5246725203d6284e3790f2ca15fba6b40a", - "sha256:dbf012d8fcb9f2cf0643b65df3b355fdd74fc0035d70bb5c845e9e30a3a4654b", - "sha256:e1258c639e00bf5e8a522fec6c3eaa3e30cf1c23a2f21a586be7e04d50c9acab", - "sha256:e222562dc0f38571c8b1ffdae9d7adb866363134299264a1958d077800b193b7", - "sha256:e4946d6bdb7ba972dfda282f9127e5756d4f299028b1566d1245fa0d438847e6", - "sha256:e746524418b70f38550f2190eeee834db8850088c834d4c8406fbb9bc1ae10b2", - "sha256:e76654e9dbfb835b3518f9938e565c7806976c07b37c33526b574cc1a1050480", - "sha256:e8918973fbd34e7814f59143c5f600ecd38b8038161239fd1a3d33d5817a38b8", - "sha256:e891ce81edd463b3b4c3b885c5603c00141151dd9c6936d98a680c8c72fe5c67", - "sha256:ebbbd0e728af5db9b04e56389e2299a57ea8b9dd15c9759153ee2455b32be6ad", - "sha256:eeb438a26d87c123bb318e5f2b3d86a36060b01f22fbdffd8cf247d52f7c9a2b", - "sha256:eed56b6a39216d31ff8cd2f1d048b5bf1700e4b32a01b14379c3b6dde9ce3aa3", - "sha256:f17cde1db0754c35a91ac00b22b25c11da6eec5746431d6e5092f0cd31a3fea9", - "sha256:f1a9b7d00fdf60b4039f4455afd031fe85ee8305b019334b72dcf73c567edc47", - "sha256:f4b6cecbbf3b7380f3b61de3a7b93cb721125dc125c854c14ddc91225ba52f83", - "sha256:f6b1d1c631e5940cac5a0b22c5379c86e8df6a4ec277c7a856b714021ab6cfad", - "sha256:f6c21c00478a7bea93caaaef9e7629145d4153b15a8653e8bb4609d4bc70dbfc" + "sha256:038ae4ffb63e3991f386e7fda85a9baab7d6617fe85b74a8f9cab190d73adb2b", + "sha256:05bacc4f94af468cc82808ae3293390278d5f3375bb20fef21e2034bb9a505b6", + "sha256:0614aed6f87d550b5cecb03d795f4ddbb1544b78d02a4bd5eecf644ec98a39f6", + "sha256:08f74904cb066e1178c1ec706dfdb5c6c680cd7a8ed9efebeac923d84c1f13b1", + "sha256:093a1a3cae2496233f14b57f4b485da01b4ff764582c854c0f42c6dd2be37f3d", + "sha256:0a1f6ea5b1d6cdbb8cfa0536f0d470f12b4b41ad83625012e575f0e3ecfe97f0", + "sha256:0e6cea102ffa16b737d11932c426f1dc14b5938cf7bc12e17269559c458ac334", + "sha256:263cf1e36862310bf5becfbc488e18d5d698941858860c5a8c079d1511b3b18e", + "sha256:28a8b2abb76042f5fd7bd720f7fea48c0fd3e82e9de0a1bf2c0de3812ce44a42", + "sha256:2ae7c57e22ad881af78075e0cea10a4c778e67234adc65c404391b417a4dda83", + "sha256:2cd0f4d314f4a2518e8970b6f299ae18cff7c44d4a1fc06fc713f791c3a9e3ea", + "sha256:2fa76ebcebe555cce90f16246edc3ad83ab65bb7b3d4ce408cf6bc67740c4f88", + "sha256:314d11564c00b77f6224d12eb3ddebe926c301e86b648a1835c5b28176c83eab", + "sha256:347e84fc88cc4cb646597f6d3a7ea0998f887ee8dc31c08587e9c3fd7b5ccef3", + "sha256:359c533bedc62c56415a1f5fcfd8279bc93453afdb0803307375ecf81c962402", + "sha256:393daac1bcf81b2a23e696b7b638eedc965e9e3d2112961a072b6cd8179ad2eb", + "sha256:3b3b8e36fd4c32c0825b4461372949ecd1585d326802b1321f8b6dc1d7e9318c", + "sha256:3c397b1b450f749a7e974d74c06d69bd22dd362142f370ef2bd32a684d6b480c", + "sha256:3d3146b1c3dcc8a1539e7cc094700b2be1e605a76f7c8f0979b6d3bde5ad4072", + "sha256:3ee647d84b83509b7271457bb428cc347037f437ead4b0b6e43b5eba35fec0aa", + "sha256:416ac51cabd54f587995c2b05421324700b22e98d3d0aa2cfaec985524d16f1d", + "sha256:451e16ae8bea3d95649317b463c9f95cd9022641ec884e3d63fc67841ae86dfe", + "sha256:45cb1a70eb00405ce3893041099655265fabcd9c4e1e50c330026e82257892c1", + "sha256:46d6800b45015f96b9d92ece229d92f2aef137d82906577d55fadeb9cf5fcb71", + "sha256:471312a7375571857a089342beccc1a63584315188560c7c0da7e0a23afd8a5c", + "sha256:471880c4c14e5a056a96cd224f5e71211997d40b4bf5e9fdded55dafab1f98f2", + "sha256:5384c527a9a004445c5074f1e20db83086c8ff1682a626676229aafd9cf9f7d1", + "sha256:57bb2acba798dc3740e913ffadd56b1fcef96f111e66f09e2a8db3050f1f12c8", + "sha256:58c33dc0e185dd97a9ac0288b3188d1be12b756eda67490e6ed6a75cf9491d79", + "sha256:59d0acd2976e1064f1b398a00e2c3e77ed0a157529779e23087d4c2fb8aaa416", + "sha256:5a6ed52f0b9bf8dcc64cc82cce0607a3dfed1dbb7e8c6f282adfccc7be9781de", + "sha256:5bc2431167adc50ba42ea3e5e5f5cd70d93e18ab7b2f95e724dd8e1bd2c38120", + "sha256:5cca7b4adb86d7470e0fc96037771981d740f0b4cb99776d5cb59cd0e6684a73", + "sha256:61dfa5ee9d7df297c859ac82b1226d8fefaf9c5113dc25c2c00ecad6feeeb04f", + "sha256:63c1d3a65acb2f9c92dce03c4e1758cc552f1ae5c78d79a44e3bb88d2fa71f3a", + "sha256:65c6e03cc0222eaf6aad57ff4ecc0a070451e23232bb48db4322cc45602cede0", + "sha256:67976d12ebfd61a3bc7d77b71a9589b4d61d0422282596cf58c62c3866916544", + "sha256:68a0a1d83d33d8367ddddb3e6bb4afbb0f92bd1dac2c72cd5e5ddc86bdafd3eb", + "sha256:6c5aeea71f018ebd3b9115c7cb13863dd850e98ca6b9258509de1246461a7e7f", + "sha256:754c99a9840839375ee251b38ac5964c0f369306eddb56804a073b6efdc0cd88", + "sha256:75a95c2358fcfdef3374cb8baf57f1064d73246d55e41683aaffb6cfe6862917", + "sha256:7688653574392d2eaeef75ddcd0b2de5b232d8730af29af56c5adf1df9ef8d6f", + "sha256:77ce6a332c7e362cb59b63f5edf730e83590d0ab4e59c2aa5bd79419a42e3449", + "sha256:7907419d150b19962138ecec81a17d4892ea440c184949dc29b358bc730caf69", + "sha256:79e45a4096ec8388cdeb04a9fa5e9371583bcb826964d55b8b66cbffe7b33c86", + "sha256:7bcbfbab4e1895d58ab7da1b5ce9a327764f0366911ba5b95406c9104bceacb0", + "sha256:80b0c9942430d731c786545da6be96d824a41a51742e3e374fedd9018ea43106", + "sha256:8b88641384e84a258b740801cd4dbc45c75f148ee674bec3149999adda4a8598", + "sha256:8d4dac7d97f15c653a5fedcafa82626bd6cee1450ccdaf84ffed7ea14f2b07a4", + "sha256:8d906d43e1592be4b25a587b7d96527cb67277542a5611e8ea9e996182fae410", + "sha256:8efb782f5a6c450589dbab4cb0f66f3a9026286333fe8f3a084399149af52f29", + "sha256:906e532c814e1d579138177a00ae835cd6becbf104d45ed9093a3aaf658f6a6a", + "sha256:90d4feb2e83dfe9ace6374a847e98ee9d1246ebadcc0cb765482e272c34e5820", + "sha256:911c43a4117915203c4cc8755e0f888e16c4676a82f61caee2f21b0c00e5b894", + "sha256:91d1a20bdaf3b25f3173ff44e54b1cfbc05f94c9e8133314eb2962a89e05d6e3", + "sha256:94c4262626424683feea0f3c34951d39d49d354722db2745c42aa6bb50ecd93b", + "sha256:96d7c1d35ee4a495df56c50c83df7af1c9688cce2e9e0edffdbf50889c167595", + "sha256:9869fa984c8670c8ab899a719eb7b516860a29bc26300a84d24d8c1b71eae3ec", + "sha256:98c03bd7f3339ff47de7ea9ac94a2b34580a8d4df69b50128bb6669e1191a895", + "sha256:995301f6740a421afc863a713fe62c0aaf564708d4aa057dfdf0f0f56525294b", + "sha256:998444debc8816b5d8d15f966e42751032d0f4c55300c48cc337f2b3e4f17d03", + "sha256:9a6847c92d9851b59b9f33f968c68e9e441f9a0f8fc972c5580c5cd7cbc6ee24", + "sha256:9bdfcb74b469b592972ed881bad57d22e2c0acc89f5e8c146782d0d90fb9f4bf", + "sha256:9f136a6e964830230912f75b5a116a21fe8e34128dcfd82285aa0ef07cb2c7bd", + "sha256:a0f0ab9df66eb34d58205913f4540e2ad17a175b05d81b0b7197bc57d000e829", + "sha256:a4b7a989c8f5a72ab1b2bbfa58105578753ae77b71ba33e7383a31ff75a504c4", + "sha256:a7b8aab50e5a288c9724d260feae25eda69582be84e97c012c80e1a5e7e03fb2", + "sha256:ad875277844cfaeca7fe299ddf8c8d8bfe271c3dc1caf14d454faa5cdbf2fa7a", + "sha256:add52c78a12196bc0fda2de087ba6c876ea677cbda2e3eba63546b26e8bf177b", + "sha256:b10163e586cc609f5f85c9b233195554d77b1e9a0801388907441aaeb22841c5", + "sha256:b24079a14c9596846bf7516fe75d1e2188d4a528364494859106a33d8b48be38", + "sha256:b281b5ff5fcc9dcbfe941ac5c7fcd4b6c065adad12d850f95c9d6f23c2652384", + "sha256:b3bb34bebaa1b78e562931a1687ff663d298013f78f972a534f36c523311a84d", + "sha256:b45e6445ac95ecb7d728604bae6538f40ccf4449b132b5428c09918523abc96d", + "sha256:ba0a31d00e8616149a5ab440d058ec2da621e05d744914774c4dde6837e1f545", + "sha256:baba2fd199b098c5544ef2536b2499d2e2155392973ad32687024bd8572a7d1c", + "sha256:bd13f0231f4788db619347b971ca5f319c5b7ebee151afc7c14632068c6261d3", + "sha256:bd3f6329340cef1c7ba9611bd038f2d523cea79f09f9c8f6b0553caba59ec562", + "sha256:bdeb2c61611293f64ac1073f4bf6723b67d291905308a7de9bb2ca87464e3273", + "sha256:bef24d3e4ae2c985034439f449e3f9e06bf579974ce0e53d8a507a1577d5b2ab", + "sha256:c0665d85535192098420428c779361b8823d3d7ec4848c6af3abb93bc5c915bf", + "sha256:c5668dac86a869349828db5fc928ee3f58d450dce2c85607067d581f745e4fb1", + "sha256:c9b9305004d7e4e6a824f4f19b6d8f32b3578aad6f19fc1122aaf320cbe3dc83", + "sha256:ccb42ca0a4a46232d716779421bbebbcad23c08d37c980f02cc3a6bd115ad277", + "sha256:ce6f2b66799971cbae5d6547acefa7231458289e0ad481d0be0740535da38d8b", + "sha256:d36b8fffe8b248a1b961c86fbdfa0129dfce878731d169ede7fa2631447331be", + "sha256:d3dd5523ed258ad58fed7e364c92a9360d1af8a9371e0822bd0146bdf017ef4c", + "sha256:d416f2088ac8f12daacffbc2e8918ef4d6be8568e9d7155c83b7cebed49d2322", + "sha256:d4fafc2eb5d83f4647331267808c7e0c5722c25a729a614dc2b90479cafa78bd", + "sha256:d5c8b17f6e8f29138678834cf8518049e740385eb2dbf736e8f07fc6587ec682", + "sha256:d9270fbf038bf34ffca4855bcda6e082e2c7f906b9eb8d9a8ce82691166060f7", + "sha256:dcc37d9d708784726fafc9c5e1232de655a009dbf97946f117aefa38d5985a0f", + "sha256:ddbb2b386128d8eca92bd9ca74e80f73fe263bcca7aa419f5b4cbc1661e19741", + "sha256:e1e5d0a25aea8b691a00d6b54b28ac514c8cc0d8646d05f7ca6cb64b97358250", + "sha256:e5c88b2f13bcf55fee78ea83567b9fe079ba1a4bef8b35c376043440040f7edb", + "sha256:e7eca8b89e56fb8c6c26dd3e09bd41b24789022acf1cf13358e96f1cafd8cae3", + "sha256:e8746ce968be22a8a1801bf4a23e565f9687088580c3ed07af5846580dd97f76", + "sha256:ec7248673ffc7104b54e4957cee38b2f3075a13442348c8d651777bf41aa45ee", + "sha256:ecb6c88d7946166d783a635efc89f9a1ff11c33d680a20df9657b6902a1d133b", + "sha256:ef3b048822dca6d231d8a8ba21069844ae38f5d83889b9b690bf17d2acc7d099", + "sha256:f133d05aaf623519f45e16ab77526e1e70d4e1308e084c2fb4cedb1a0c764bbb", + "sha256:f3292d384537b9918010769b82ab3e79fca8b23d74f56fc69a679106a3e2c2cf", + "sha256:f774841bb0e8588505002962c02da420bcfb4c5056e87a139c6e45e745c0e2e2", + "sha256:f9499c70c19ff0fbe1007043acb5ad15c1dec7d8e84ab429bca8c87138e8f85c", + "sha256:f99de52b8fbdb2a8f5301ae5fc0f9e6b3ba30d1d5fc0421956967edcc6914242", + "sha256:fa25a620eed2a419acc2cf10135b995f8f0ce78ad00534d729aa761e4adcef8a", + "sha256:fbf558551cf415586e91160d69ca6416f3fce0b86175b64e4293644a7416b81b", + "sha256:fc82269d24860cfa859b676d18850cbb8e312dcd7eada09e7d5b007e2f3d9eb1", + "sha256:ff832cce719edd11266ca32bc74a626b814fff236824aa1aeaad399b69fe6eae" ], "markers": "python_version >= '3.7'", - "version": "==26.0.3" + "version": "==26.1.0" }, "redis": { "hashes": [ - "sha256:0e479e24da960c690be5d9b96d21f7b918a98c0cf49af3b6fafaa0753f93a0db", - "sha256:8f611490b93c8109b50adc317b31bfd84fff31def3475b92e7e80bf39f48175b" + "sha256:0c5b10d387568dfe0698c6fad6615750c24170e548ca2deac10c649d463e9870", + "sha256:56134ee08ea909106090934adc36f65c9bcbbaecea5b21ba704ba6fb561f8eb4" ], "markers": "python_version >= '3.7'", - "version": "==5.0.7" + "version": "==5.0.8" }, "requests": { "hashes": [ @@ -2047,7 +2021,6 @@ "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6" ], "index": "pypi", - "markers": "python_version >= '3.8'", "version": "==2.32.3" }, "rich": { @@ -2067,20 +2040,19 @@ }, "selenium": { "hashes": [ - "sha256:903c8c9d61b3eea6fcc9809dc7d9377e04e2ac87709876542cc8f863e482c4ce", - "sha256:e424991196e9857e19bf04fe5c1c0a4aac076794ff5e74615b1124e729d93104" + "sha256:128d099e66284437e7128d2279176ec7a06e6ec7426e167f5d34987166bd8f46", + "sha256:3a8d9f23dc636bd3840dd56f00c2739e32ec0c1e34a821dd553e15babef24477" ], "markers": "python_version >= '3.8'", - "version": "==4.22.0" + "version": "==4.23.1" }, "sentry-sdk": { "hashes": [ - "sha256:545fcc6e36c335faa6d6cda84669b6e17025f31efbf3b2211ec14efe008b75d1", - "sha256:87b3d413c87d8e7f816cc9334bff255a83d8b577db2b22042651c30c19c09190" + "sha256:7a8d5163d2ba5c5f4464628c6b68f85e86972f7c636acc78aed45c61b98b7a5e", + "sha256:8763840497b817d44c49b3fe3f5f7388d083f2337ffedf008b2cdb63b5c86dc6" ], "index": "pypi", - "markers": "python_version >= '3.6'", - "version": "==2.10.0" + "version": "==2.12.0" }, "service-identity": { "hashes": [ @@ -2103,7 +2075,6 @@ "sha256:897a3226a6fd4a6eb2f068745e49733261a21f70b1bb28fce0339feb978d9af3" ], "index": "pypi", - "markers": "python_version >= '3.8'", "version": "==8.1.0" }, "shellingham": { @@ -2146,11 +2117,11 @@ }, "sqlparse": { "hashes": [ - "sha256:714d0a4932c059d16189f58ef5411ec2287a4360f17cdd0edd2d09d4c5087c93", - "sha256:c204494cd97479d0e39f28c93d46c0b2d5959c7b9ab904762ea6c7af211c8663" + "sha256:773dcbf9a5ab44a090f3441e2180efe2560220203dc2f8c0b0fa141e18b505e4", + "sha256:bb6b4df465655ef332548e24f08e205afc81b9ab86cb1c45657a7ff173a3a00e" ], "markers": "python_version >= '3.8'", - "version": "==0.5.0" + "version": "==0.5.1" }, "tesseract": { "hashes": [ @@ -2177,11 +2148,11 @@ }, "trio": { "hashes": [ - "sha256:67c5ec3265dd4abc7b1d1ab9ca4fe4c25b896f9c93dac73713778adab487f9c4", - "sha256:bb9c1b259591af941fccfbabbdc65bc7ed764bd2db76428454c894cd5e3d2032" + "sha256:6d2fe7ee656146d598ec75128ff4a2386576801b42b691f4a91cc2c18508544a", + "sha256:998bbdc5797621e1976c86820b1bc341cc66b51d2618a31cc8720ddd7df8affe" ], "markers": "python_version >= '3.8'", - "version": "==0.26.0" + "version": "==0.26.1" }, "trio-websocket": { "hashes": [ @@ -2241,14 +2212,11 @@ "version": "==2024.1" }, "urllib3": { - "extras": [ - "socks" - ], "hashes": [ "sha256:37a0344459b199fce0e80b0d3569837ec6b6937435c5244e7fd73fa6006830f3", "sha256:3e3d753a8618b86d7de333b4223005f68720bcd6a7d2bcb9fbd2229ec7c1e429" ], - "markers": "python_version >= '3.10'", + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'", "version": "==1.26.19" }, "vine": { @@ -2272,7 +2240,6 @@ "sha256:d31048646ce15084e135b33e334a61f526aa68d2f679fcc109ed0e0f5edaed21" ], "index": "pypi", - "markers": "python_version >= '3.9'", "version": "==62.3" }, "webencodings": { @@ -2304,7 +2271,6 @@ "sha256:a1ae85e01fdc9815d12fa33f17765bc132ed2c54fa76daf9e39e879dd93566f6" ], "index": "pypi", - "markers": "python_version >= '3.8'", "version": "==6.7.0" }, "wsproto": { @@ -2312,7 +2278,7 @@ "sha256:ad565f26ecb92588a3e43bc3d96164de84cd9902482b130d0ddbaa9664a85065", "sha256:b9acddd652b585d75b20477888c56642fdade28bdfd3579aa24a4d2c037dd736" ], - "markers": "python_full_version >= '3.7.0'", + "markers": "python_version >= '3.7'", "version": "==1.2.0" }, "xlsxwriter": { @@ -2321,7 +2287,6 @@ "sha256:ecfd5405b3e0e228219bcaf24c2ca0915e012ca9464a14048021d21a995d490e" ], "index": "pypi", - "markers": "python_version >= '3.6'", "version": "==3.2.0" }, "zope-interface": { @@ -2458,62 +2423,81 @@ }, "coverage": { "hashes": [ - "sha256:0086cd4fc71b7d485ac93ca4239c8f75732c2ae3ba83f6be1c9be59d9e2c6382", - "sha256:01c322ef2bbe15057bc4bf132b525b7e3f7206f071799eb8aa6ad1940bcf5fb1", - "sha256:03cafe82c1b32b770a29fd6de923625ccac3185a54a5e66606da26d105f37dac", - "sha256:044a0985a4f25b335882b0966625270a8d9db3d3409ddc49a4eb00b0ef5e8cee", - "sha256:07ed352205574aad067482e53dd606926afebcb5590653121063fbf4e2175166", - "sha256:0d1b923fc4a40c5832be4f35a5dab0e5ff89cddf83bb4174499e02ea089daf57", - "sha256:0e7b27d04131c46e6894f23a4ae186a6a2207209a05df5b6ad4caee6d54a222c", - "sha256:1fad32ee9b27350687035cb5fdf9145bc9cf0a094a9577d43e909948ebcfa27b", - "sha256:289cc803fa1dc901f84701ac10c9ee873619320f2f9aff38794db4a4a0268d51", - "sha256:3c59105f8d58ce500f348c5b56163a4113a440dad6daa2294b5052a10db866da", - "sha256:46c3d091059ad0b9c59d1034de74a7f36dcfa7f6d3bde782c49deb42438f2450", - "sha256:482855914928c8175735a2a59c8dc5806cf7d8f032e4820d52e845d1f731dca2", - "sha256:49c76cdfa13015c4560702574bad67f0e15ca5a2872c6a125f6327ead2b731dd", - "sha256:4b03741e70fb811d1a9a1d75355cf391f274ed85847f4b78e35459899f57af4d", - "sha256:4bea27c4269234e06f621f3fac3925f56ff34bc14521484b8f66a580aacc2e7d", - "sha256:4d5fae0a22dc86259dee66f2cc6c1d3e490c4a1214d7daa2a93d07491c5c04b6", - "sha256:543ef9179bc55edfd895154a51792b01c017c87af0ebaae092720152e19e42ca", - "sha256:54dece71673b3187c86226c3ca793c5f891f9fc3d8aa183f2e3653da18566169", - "sha256:6379688fb4cfa921ae349c76eb1a9ab26b65f32b03d46bb0eed841fd4cb6afb1", - "sha256:65fa405b837060db569a61ec368b74688f429b32fa47a8929a7a2f9b47183713", - "sha256:6616d1c9bf1e3faea78711ee42a8b972367d82ceae233ec0ac61cc7fec09fa6b", - "sha256:6fe885135c8a479d3e37a7aae61cbd3a0fb2deccb4dda3c25f92a49189f766d6", - "sha256:7221f9ac9dad9492cecab6f676b3eaf9185141539d5c9689d13fd6b0d7de840c", - "sha256:76d5f82213aa78098b9b964ea89de4617e70e0d43e97900c2778a50856dac605", - "sha256:7792f0ab20df8071d669d929c75c97fecfa6bcab82c10ee4adb91c7a54055463", - "sha256:831b476d79408ab6ccfadaaf199906c833f02fdb32c9ab907b1d4aa0713cfa3b", - "sha256:9146579352d7b5f6412735d0f203bbd8d00113a680b66565e205bc605ef81bc6", - "sha256:9cc44bf0315268e253bf563f3560e6c004efe38f76db03a1558274a6e04bf5d5", - "sha256:a73d18625f6a8a1cbb11eadc1d03929f9510f4131879288e3f7922097a429f63", - "sha256:a8659fd33ee9e6ca03950cfdcdf271d645cf681609153f218826dd9805ab585c", - "sha256:a94925102c89247530ae1dab7dc02c690942566f22e189cbd53579b0693c0783", - "sha256:ad4567d6c334c46046d1c4c20024de2a1c3abc626817ae21ae3da600f5779b44", - "sha256:b2e16f4cd2bc4d88ba30ca2d3bbf2f21f00f382cf4e1ce3b1ddc96c634bc48ca", - "sha256:bbdf9a72403110a3bdae77948b8011f644571311c2fb35ee15f0f10a8fc082e8", - "sha256:beb08e8508e53a568811016e59f3234d29c2583f6b6e28572f0954a6b4f7e03d", - "sha256:c4cbe651f3904e28f3a55d6f371203049034b4ddbce65a54527a3f189ca3b390", - "sha256:c7b525ab52ce18c57ae232ba6f7010297a87ced82a2383b1afd238849c1ff933", - "sha256:ca5d79cfdae420a1d52bf177de4bc2289c321d6c961ae321503b2ca59c17ae67", - "sha256:cdab02a0a941af190df8782aafc591ef3ad08824f97850b015c8c6a8b3877b0b", - "sha256:d17c6a415d68cfe1091d3296ba5749d3d8696e42c37fca5d4860c5bf7b729f03", - "sha256:d39bd10f0ae453554798b125d2f39884290c480f56e8a02ba7a6ed552005243b", - "sha256:d4b3cd1ca7cd73d229487fa5caca9e4bc1f0bca96526b922d61053ea751fe791", - "sha256:d50a252b23b9b4dfeefc1f663c568a221092cbaded20a05a11665d0dbec9b8fb", - "sha256:da8549d17489cd52f85a9829d0e1d91059359b3c54a26f28bec2c5d369524807", - "sha256:dcd070b5b585b50e6617e8972f3fbbee786afca71b1936ac06257f7e178f00f6", - "sha256:ddaaa91bfc4477d2871442bbf30a125e8fe6b05da8a0015507bfbf4718228ab2", - "sha256:df423f351b162a702c053d5dddc0fc0ef9a9e27ea3f449781ace5f906b664428", - "sha256:dff044f661f59dace805eedb4a7404c573b6ff0cdba4a524141bc63d7be5c7fd", - "sha256:e7e128f85c0b419907d1f38e616c4f1e9f1d1b37a7949f44df9a73d5da5cd53c", - "sha256:ed8d1d1821ba5fc88d4a4f45387b65de52382fa3ef1f0115a4f7a20cdfab0e94", - "sha256:f2501d60d7497fd55e391f423f965bbe9e650e9ffc3c627d5f0ac516026000b8", - "sha256:f7db0b6ae1f96ae41afe626095149ecd1b212b424626175a6633c2999eaad45b" + "sha256:06a737c882bd26d0d6ee7269b20b12f14a8704807a01056c80bb881a4b2ce6ca", + "sha256:07e2ca0ad381b91350c0ed49d52699b625aab2b44b65e1b4e02fa9df0e92ad2d", + "sha256:0c0420b573964c760df9e9e86d1a9a622d0d27f417e1a949a8a66dd7bcee7bc6", + "sha256:0dbde0f4aa9a16fa4d754356a8f2e36296ff4d83994b2c9d8398aa32f222f989", + "sha256:1125ca0e5fd475cbbba3bb67ae20bd2c23a98fac4e32412883f9bcbaa81c314c", + "sha256:13b0a73a0896988f053e4fbb7de6d93388e6dd292b0d87ee51d106f2c11b465b", + "sha256:166811d20dfea725e2e4baa71fffd6c968a958577848d2131f39b60043400223", + "sha256:170d444ab405852903b7d04ea9ae9b98f98ab6d7e63e1115e82620807519797f", + "sha256:1f4aa8219db826ce6be7099d559f8ec311549bfc4046f7f9fe9b5cea5c581c56", + "sha256:225667980479a17db1048cb2bf8bfb39b8e5be8f164b8f6628b64f78a72cf9d3", + "sha256:260933720fdcd75340e7dbe9060655aff3af1f0c5d20f46b57f262ab6c86a5e8", + "sha256:2bdb062ea438f22d99cba0d7829c2ef0af1d768d1e4a4f528087224c90b132cb", + "sha256:2c09f4ce52cb99dd7505cd0fc8e0e37c77b87f46bc9c1eb03fe3bc9991085388", + "sha256:3115a95daa9bdba70aea750db7b96b37259a81a709223c8448fa97727d546fe0", + "sha256:3e0cadcf6733c09154b461f1ca72d5416635e5e4ec4e536192180d34ec160f8a", + "sha256:3f1156e3e8f2872197af3840d8ad307a9dd18e615dc64d9ee41696f287c57ad8", + "sha256:4421712dbfc5562150f7554f13dde997a2e932a6b5f352edcce948a815efee6f", + "sha256:44df346d5215a8c0e360307d46ffaabe0f5d3502c8a1cefd700b34baf31d411a", + "sha256:502753043567491d3ff6d08629270127e0c31d4184c4c8d98f92c26f65019962", + "sha256:547f45fa1a93154bd82050a7f3cddbc1a7a4dd2a9bf5cb7d06f4ae29fe94eaf8", + "sha256:5621a9175cf9d0b0c84c2ef2b12e9f5f5071357c4d2ea6ca1cf01814f45d2391", + "sha256:609b06f178fe8e9f89ef676532760ec0b4deea15e9969bf754b37f7c40326dbc", + "sha256:645786266c8f18a931b65bfcefdbf6952dd0dea98feee39bd188607a9d307ed2", + "sha256:6878ef48d4227aace338d88c48738a4258213cd7b74fd9a3d4d7582bb1d8a155", + "sha256:6a89ecca80709d4076b95f89f308544ec8f7b4727e8a547913a35f16717856cb", + "sha256:6db04803b6c7291985a761004e9060b2bca08da6d04f26a7f2294b8623a0c1a0", + "sha256:6e2cd258d7d927d09493c8df1ce9174ad01b381d4729a9d8d4e38670ca24774c", + "sha256:6e81d7a3e58882450ec4186ca59a3f20a5d4440f25b1cff6f0902ad890e6748a", + "sha256:702855feff378050ae4f741045e19a32d57d19f3e0676d589df0575008ea5004", + "sha256:78b260de9790fd81e69401c2dc8b17da47c8038176a79092a89cb2b7d945d060", + "sha256:7bb65125fcbef8d989fa1dd0e8a060999497629ca5b0efbca209588a73356232", + "sha256:7dea0889685db8550f839fa202744652e87c60015029ce3f60e006f8c4462c93", + "sha256:8284cf8c0dd272a247bc154eb6c95548722dce90d098c17a883ed36e67cdb129", + "sha256:877abb17e6339d96bf08e7a622d05095e72b71f8afd8a9fefc82cf30ed944163", + "sha256:8929543a7192c13d177b770008bc4e8119f2e1f881d563fc6b6305d2d0ebe9de", + "sha256:8ae539519c4c040c5ffd0632784e21b2f03fc1340752af711f33e5be83a9d6c6", + "sha256:8f59d57baca39b32db42b83b2a7ba6f47ad9c394ec2076b084c3f029b7afca23", + "sha256:9054a0754de38d9dbd01a46621636689124d666bad1936d76c0341f7d71bf569", + "sha256:953510dfb7b12ab69d20135a0662397f077c59b1e6379a768e97c59d852ee51d", + "sha256:95cae0efeb032af8458fc27d191f85d1717b1d4e49f7cb226cf526ff28179778", + "sha256:9bc572be474cafb617672c43fe989d6e48d3c83af02ce8de73fff1c6bb3c198d", + "sha256:9c56863d44bd1c4fe2abb8a4d6f5371d197f1ac0ebdee542f07f35895fc07f36", + "sha256:9e0b2df163b8ed01d515807af24f63de04bebcecbd6c3bfeff88385789fdf75a", + "sha256:a09ece4a69cf399510c8ab25e0950d9cf2b42f7b3cb0374f95d2e2ff594478a6", + "sha256:a1ac0ae2b8bd743b88ed0502544847c3053d7171a3cff9228af618a068ed9c34", + "sha256:a318d68e92e80af8b00fa99609796fdbcdfef3629c77c6283566c6f02c6d6704", + "sha256:a4acd025ecc06185ba2b801f2de85546e0b8ac787cf9d3b06e7e2a69f925b106", + "sha256:a6d3adcf24b624a7b778533480e32434a39ad8fa30c315208f6d3e5542aeb6e9", + "sha256:a78d169acd38300060b28d600344a803628c3fd585c912cacc9ea8790fe96862", + "sha256:a95324a9de9650a729239daea117df21f4b9868ce32e63f8b650ebe6cef5595b", + "sha256:abd5fd0db5f4dc9289408aaf34908072f805ff7792632250dcb36dc591d24255", + "sha256:b06079abebbc0e89e6163b8e8f0e16270124c154dc6e4a47b413dd538859af16", + "sha256:b43c03669dc4618ec25270b06ecd3ee4fa94c7f9b3c14bae6571ca00ef98b0d3", + "sha256:b48f312cca9621272ae49008c7f613337c53fadca647d6384cc129d2996d1133", + "sha256:b5d7b556859dd85f3a541db6a4e0167b86e7273e1cdc973e5b175166bb634fdb", + "sha256:b9f222de8cded79c49bf184bdbc06630d4c58eec9459b939b4a690c82ed05657", + "sha256:c3c02d12f837d9683e5ab2f3d9844dc57655b92c74e286c262e0fc54213c216d", + "sha256:c44fee9975f04b33331cb8eb272827111efc8930cfd582e0320613263ca849ca", + "sha256:cf4b19715bccd7ee27b6b120e7e9dd56037b9c0681dcc1adc9ba9db3d417fa36", + "sha256:d0c212c49b6c10e6951362f7c6df3329f04c2b1c28499563d4035d964ab8e08c", + "sha256:d3296782ca4eab572a1a4eca686d8bfb00226300dcefdf43faa25b5242ab8a3e", + "sha256:d85f5e9a5f8b73e2350097c3756ef7e785f55bd71205defa0bfdaf96c31616ff", + "sha256:da511e6ad4f7323ee5702e6633085fb76c2f893aaf8ce4c51a0ba4fc07580ea7", + "sha256:e05882b70b87a18d937ca6768ff33cc3f72847cbc4de4491c8e73880766718e5", + "sha256:e61c0abb4c85b095a784ef23fdd4aede7a2628478e7baba7c5e3deba61070a02", + "sha256:e6a08c0be454c3b3beb105c0596ebdc2371fab6bb90c0c0297f4e58fd7e1012c", + "sha256:e9a6e0eb86070e8ccaedfbd9d38fec54864f3125ab95419970575b42af7541df", + "sha256:ed37bd3c3b063412f7620464a9ac1314d33100329f39799255fb8d3027da50d3", + "sha256:f1adfc8ac319e1a348af294106bc6a8458a0f1633cc62a1446aebc30c5fa186a", + "sha256:f5796e664fe802da4f57a168c85359a8fbf3eab5e55cd4e4569fbacecc903959", + "sha256:fc5a77d0c516700ebad189b587de289a20a78324bc54baee03dd486f0855d234", + "sha256:fd21f6ae3f08b41004dfb433fa895d858f3f5979e7762d052b12aef444e29afc" ], "index": "pypi", - "markers": "python_version >= '3.8'", - "version": "==7.6.0" + "version": "==7.6.1" }, "distlib": { "hashes": [ @@ -2524,12 +2508,11 @@ }, "django": { "hashes": [ - "sha256:3ec32bc2c616ab02834b9cac93143a7dc1cdcd5b822d78ac95fc20a38c534240", - "sha256:fc6919875a6226c7ffcae1a7d51e0f2ceaf6f160393180818f6c95f51b1e7b96" + "sha256:61ee4a130efb8c451ef3467c67ca99fdce400fedd768634efc86a68c18d80d30", + "sha256:c77f926b81129493961e19c0e02188f8d07c112a1162df69bfab178ae447f94a" ], "index": "pypi", - "markers": "python_version >= '3.8'", - "version": "==4.2.14" + "version": "==4.2.15" }, "django-debug-toolbar": { "hashes": [ @@ -2537,7 +2520,6 @@ "sha256:3beb671c9ec44ffb817fad2780667f172bd1c067dbcabad6268ce39a81335f45" ], "index": "pypi", - "markers": "python_version >= '3.8'", "version": "==4.4.6" }, "django-extensions": { @@ -2546,7 +2528,6 @@ "sha256:9600b7562f79a92cbf1fde6403c04fee314608fefbb595502e34383ae8203401" ], "index": "pypi", - "markers": "python_version >= '3.6'", "version": "==3.2.3" }, "filelock": { @@ -2571,7 +2552,6 @@ "sha256:ee6cbb101af1a859c7fe84f2a264c059020b0cb7fe3535f9424300ab568f6bd5" ], "index": "pypi", - "markers": "python_version >= '3.6'", "version": "==2.2.0" }, "nodeenv": { @@ -2592,12 +2572,11 @@ }, "pre-commit": { "hashes": [ - "sha256:8ca3ad567bc78a4972a3f1a477e94a79d4597e8140a6e0b651c5e33899c3654a", - "sha256:fae36fd1d7ad7d6a5a1c0b0d5adb2ed1a3bda5a21bf6c3e5372073d7a11cd4c5" + "sha256:8bb6494d4a20423842e198980c9ecf9f96607a07ea29549e180eef9ae80fe7af", + "sha256:9a90a53bf82fdd8778d58085faf8d83df56e40dfe18f45b19446e26bf1b3a63f" ], "index": "pypi", - "markers": "python_version >= '3.9'", - "version": "==3.7.1" + "version": "==3.8.0" }, "pyyaml": { "hashes": [ @@ -2658,11 +2637,11 @@ }, "sqlparse": { "hashes": [ - "sha256:714d0a4932c059d16189f58ef5411ec2287a4360f17cdd0edd2d09d4c5087c93", - "sha256:c204494cd97479d0e39f28c93d46c0b2d5959c7b9ab904762ea6c7af211c8663" + "sha256:773dcbf9a5ab44a090f3441e2180efe2560220203dc2f8c0b0fa141e18b505e4", + "sha256:bb6b4df465655ef332548e24f08e205afc81b9ab86cb1c45657a7ff173a3a00e" ], "markers": "python_version >= '3.8'", - "version": "==0.5.0" + "version": "==0.5.1" }, "typing-extensions": { "hashes": [ diff --git a/celerybeat/Dockerfile b/celerybeat/Dockerfile index 25ca9282d..a0f2ed1d4 100644 --- a/celerybeat/Dockerfile +++ b/celerybeat/Dockerfile @@ -20,7 +20,7 @@ RUN apt-get update -qy && apt-get dist-upgrade -qy && apt-get install -o Dpkg::O # Pillow/Imaging: https://pillow.readthedocs.io/en/latest/installation.html#external-libraries libz-dev libfreetype6-dev \ libtiff-dev libjpeg-dev libopenjp2-7-dev libwebp-dev zlib1g-dev \ - # Postgres client library to build psycopg2 + # Postgres client library to build psycopg libpq-dev \ locales \ # Weasyprint requirements diff --git a/importer/Dockerfile b/importer/Dockerfile index ea068933b..772a5acb9 100644 --- a/importer/Dockerfile +++ b/importer/Dockerfile @@ -20,7 +20,7 @@ RUN apt-get update -qy && apt-get dist-upgrade -qy && apt-get install -o Dpkg::O # Pillow/Imaging: https://pillow.readthedocs.io/en/latest/installation.html#external-libraries libz-dev libfreetype6-dev \ libtiff-dev libjpeg-dev libopenjp2-7-dev libwebp-dev zlib1g-dev \ - # Postgres client library to build psycopg2 + # Postgres client library to build psycopg libpq-dev \ locales \ # Weasyprint requirements From daec2e114cf02a07d5fc01dc4736591bf0369220 Mon Sep 17 00:00:00 2001 From: rasarkar <105652044+rasarkar@users.noreply.github.com> Date: Wed, 14 Aug 2024 08:17:50 -0400 Subject: [PATCH 06/28] CONCD-904 Update language in profile page top count (#2489) --- concordia/static/scss/base.scss | 4 +++- concordia/templates/account/profile.html | 3 +++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/concordia/static/scss/base.scss b/concordia/static/scss/base.scss index 5478d3ace..12e860531 100644 --- a/concordia/static/scss/base.scss +++ b/concordia/static/scss/base.scss @@ -1305,7 +1305,6 @@ div.related-links { background-color: #f6f6f6; border: 1px solid black; flex: 1; - font-weight: bold; margin: 0.5rem; padding-bottom: 15px; padding-top: 5px; @@ -1315,10 +1314,13 @@ div.related-links { .contribution-highlight .value { color: $blue; font-size: xxx-large; + font-weight: bold; } .contribution-highlight .label { font-size: large; + font-weight: bold; + margin-bottom: 0; } .contribution-table a { diff --git a/concordia/templates/account/profile.html b/concordia/templates/account/profile.html index 3f434f270..6f57e5c5b 100644 --- a/concordia/templates/account/profile.html +++ b/concordia/templates/account/profile.html @@ -113,14 +113,17 @@

My Contributions

{{ user_profile_activity.count|intcomma }}

Campaigns

+

Your saves, submits, and reviews

{{ pages_worked_on|intcomma }}

Pages Worked On

+

Campaigns you've worked on

{{ totalCount|intcomma }}

Actions

+

Pages you've worked on

From 10a517be1f9b449ea0ce075d3b9c95200d3be168 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 14 Aug 2024 09:11:31 -0400 Subject: [PATCH 07/28] Bump the npm_and_yarn group across 1 directory with 2 updates (#2490) Bumps the npm_and_yarn group with 2 updates in the / directory: [bootstrap](https://github.com/twbs/bootstrap) and [axios](https://github.com/axios/axios). Updates `bootstrap` from 4.5.3 to 5.0.0 - [Release notes](https://github.com/twbs/bootstrap/releases) - [Commits](https://github.com/twbs/bootstrap/compare/v4.5.3...v5.0.0) Updates `axios` from 1.6.7 to 1.7.4 - [Release notes](https://github.com/axios/axios/releases) - [Changelog](https://github.com/axios/axios/blob/v1.x/CHANGELOG.md) - [Commits](https://github.com/axios/axios/compare/v1.6.7...v1.7.4) --- updated-dependencies: - dependency-name: bootstrap dependency-type: direct:production dependency-group: npm_and_yarn - dependency-name: axios dependency-type: indirect dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 29 +++++++++++++++++++---------- package.json | 2 +- 2 files changed, 20 insertions(+), 11 deletions(-) diff --git a/package-lock.json b/package-lock.json index bb992afcf..441971e80 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,7 +11,7 @@ "dependencies": { "@duetds/date-picker": "^1.4.0", "@fortawesome/fontawesome-free": "^5.15.1", - "bootstrap": "4.5.3", + "bootstrap": "5.0.0", "codemirror": "^5.58.2", "gulp": "^5.0.0", "gulp-rename": "^2.0.0", @@ -473,6 +473,16 @@ "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, + "node_modules/@popperjs/core": { + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", + "peer": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, "node_modules/@puppeteer/browsers": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.0.1.tgz", @@ -873,12 +883,12 @@ } }, "node_modules/axios": { - "version": "1.6.7", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.7.tgz", - "integrity": "sha512-/hDJGff6/c7u0hDkvkGxR/oy6CbCs8ziCsC7SqmhjfozqiJGc8Z11wrv9z9lYfY4K8l+H9TpjcMDX0xOZmx+RA==", + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.4.tgz", + "integrity": "sha512-DukmaFRnY6AzAALSH4J2M3k6PkaC+MfaAGdEERRWcC9q3/TWQwLpHR8ZRLKTdQ3aBDL64EdluRDjJqKw+BPZEw==", "dev": true, "dependencies": { - "follow-redirects": "^1.15.4", + "follow-redirects": "^1.15.6", "form-data": "^4.0.0", "proxy-from-env": "^1.1.0" } @@ -1029,16 +1039,15 @@ } }, "node_modules/bootstrap": { - "version": "4.5.3", - "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.5.3.tgz", - "integrity": "sha512-o9ppKQioXGqhw8Z7mah6KdTYpNQY//tipnkxppWhPbiSWdD+1raYsnhwEZjkTHYbGee4cVQ0Rx65EhOY/HNLcQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.0.0.tgz", + "integrity": "sha512-tmhPET9B9qCl8dCofvHeiIhi49iBt0EehmIsziZib65k1erBW1rHhj2s/2JsuQh5Pq+xz2E9bEbzp9B7xHG+VA==", "funding": { "type": "opencollective", "url": "https://opencollective.com/bootstrap" }, "peerDependencies": { - "jquery": "1.9.1 - 3", - "popper.js": "^1.16.1" + "@popperjs/core": "^2.9.2" } }, "node_modules/brace-expansion": { diff --git a/package.json b/package.json index b1237c8e1..cde5ef2fb 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,7 @@ "dependencies": { "@duetds/date-picker": "^1.4.0", "@fortawesome/fontawesome-free": "^5.15.1", - "bootstrap": "4.5.3", + "bootstrap": "5.0.0", "codemirror": "^5.58.2", "gulp": "^5.0.0", "gulp-rename": "^2.0.0", From 7aa2263a17537a17eec0f78c0d37bf4b3061bc2f Mon Sep 17 00:00:00 2001 From: Josh Stegmaier <104993387+joshuastegmaier@users.noreply.github.com> Date: Wed, 14 Aug 2024 12:30:40 -0400 Subject: [PATCH 08/28] Encapsulate the asset_details.html scripts (#2491) * Made guide.js into a module. Removed inline 'onclick' handlers, moving those to the module. Moved guide template to live with the rest of the asset_detail sub-templates. Reorganized guide.js slightly and removed unused code. Changed eslint configurations to handle modules * Moved resuable code from quick-tips.js to modules/quick-tips.js. Renamed existing quick-tips.js to quick-tips-setup.js to reflect what it does, and modified to use the modules/quick-tips.js module.. Modified base.html quick-tips code to use the module. Modified tempalte to hide 'Campaign Tips' link/button for campaigns that don't have any cards. * Updated ocr.js to be a module and export selectLanguage. Changed inline onclick handler for select language to be in ocr.js * Switched asset-reservation.js and contribute.js to be modules. Moved data for asset-reservation.js to separate script element to allow access from within the module--passing it directly to the script tag of a module does not work like it does for a normal script. * Made viewer.js and viewer-split.js into modules. Moved data for viewer.js to separate script element to allowing access to the data in the module. Moved inline onclick handlers for viewer image filters into click handlers in viewer.js * Changed vendor scripts in asset_detail to be modules. Moved explicit split.js import to viewer-split.js and removed script tag for it. --- .eslintrc.yaml | 2 +- concordia/static/js/src/asset-reservation.js | 21 ++++-- concordia/static/js/src/contribute.js | 4 +- concordia/static/js/src/guide.js | 65 +++++++++---------- concordia/static/js/src/modules/quick-tips.js | 21 ++++++ concordia/static/js/src/ocr.js | 3 +- .../{quick-tips.js => quick-tips-setup.js} | 18 +++-- concordia/static/js/src/viewer-split.js | 15 +++-- concordia/static/js/src/viewer.js | 30 ++++++++- concordia/templates/base.html | 26 ++------ .../transcriptions/asset_detail.html | 26 +++++--- .../transcriptions/asset_detail/editor.html | 16 +++-- .../asset_detail/guide.html} | 2 +- .../asset_detail/ocr_transcription_modal.html | 2 +- .../asset_detail/viewer_filters.html | 10 +-- 15 files changed, 155 insertions(+), 106 deletions(-) create mode 100644 concordia/static/js/src/modules/quick-tips.js rename concordia/static/js/src/{quick-tips.js => quick-tips-setup.js} (88%) rename concordia/templates/{fragments/_how-to-guide.html => transcriptions/asset_detail/guide.html} (98%) diff --git a/.eslintrc.yaml b/.eslintrc.yaml index 56959c746..d8359860c 100644 --- a/.eslintrc.yaml +++ b/.eslintrc.yaml @@ -20,5 +20,5 @@ env: browser: true es2024: true parserOptions: - sourceType: script + sourceType: module ecmaVersion: latest diff --git a/concordia/static/js/src/asset-reservation.js b/concordia/static/js/src/asset-reservation.js index 9e2299b59..cacecbed7 100644 --- a/concordia/static/js/src/asset-reservation.js +++ b/concordia/static/js/src/asset-reservation.js @@ -1,10 +1,11 @@ /* global jQuery displayMessage displayHtmlMessage buildErrorMessage Sentry */ -/* exported attemptToReserveAsset reserveAssetForEditing */ -const assetData = document.currentScript.dataset; +const assetReservationData = document.getElementById( + 'asset-reservation-data', +).dataset; function attemptToReserveAsset(reservationURL, findANewPageURL, actionType) { - var $transcriptionEditor = jQuery('#transcription-editor'); + let $transcriptionEditor = jQuery('#transcription-editor'); jQuery .ajax({ @@ -77,7 +78,7 @@ function attemptToReserveAsset(reservationURL, findANewPageURL, actionType) { }); window.addEventListener('beforeunload', function () { - var payload = { + let payload = { release: true, csrfmiddlewaretoken: jQuery( 'input[name="csrfmiddlewaretoken"]', @@ -99,13 +100,19 @@ function attemptToReserveAsset(reservationURL, findANewPageURL, actionType) { } function reserveAssetForEditing() { - if (assetData.reserveAssetUrl) { - attemptToReserveAsset(assetData.reserveAssetUrl, '', 'transcribe'); + if (assetReservationData.reserveAssetUrl) { + attemptToReserveAsset( + assetReservationData.reserveAssetUrl, + '', + 'transcribe', + ); } } jQuery(function () { - if (assetData.reserveForEditing) { + if (assetReservationData.reserveForEditing) { reserveAssetForEditing(); } }); + +export {reserveAssetForEditing}; diff --git a/concordia/static/js/src/contribute.js b/concordia/static/js/src/contribute.js index d87687011..3b287bb56 100644 --- a/concordia/static/js/src/contribute.js +++ b/concordia/static/js/src/contribute.js @@ -1,4 +1,6 @@ -/* global $ displayMessage buildErrorMessage reserveAssetForEditing */ +/* global $ displayMessage buildErrorMessage */ + +import {reserveAssetForEditing} from './asset-reservation.js'; function lockControls($container) { if (!$container) { diff --git a/concordia/static/js/src/guide.js b/concordia/static/js/src/guide.js index 2bfe28570..d701feb70 100644 --- a/concordia/static/js/src/guide.js +++ b/concordia/static/js/src/guide.js @@ -1,8 +1,7 @@ /* global $ trackUIInteraction */ -/* exported openOffcanvas closeOffcanvas showPane hidePane */ function openOffcanvas() { - var guide = document.getElementById('guide-sidebar'); + let guide = document.getElementById('guide-sidebar'); guide.classList.remove('offscreen'); guide.style.borderWidth = '0 0 thick thick'; guide.style.borderStyle = 'solid'; @@ -16,46 +15,16 @@ function openOffcanvas() { } function closeOffcanvas() { - var guide = document.getElementById('guide-sidebar'); + let guide = document.getElementById('guide-sidebar'); guide.classList.add('offscreen'); guide.style.border = 'none'; document.getElementById('open-guide').style.display = 'block'; } -function showPane(elementId) { - document.getElementById(elementId).classList.add('show', 'active'); - document.getElementById('guide-nav').classList.remove('show', 'active'); -} - -function hidePane(elementId) { - document.getElementById(elementId).classList.remove('show', 'active'); - document.getElementById('guide-nav').classList.add('show', 'active'); -} - -function trackHowToInteraction(element, label) { - trackUIInteraction(element, 'How To Guide', 'click', label); -} +$('#open-guide').on('click', openOffcanvas); -$('#open-guide').on('click', function () { - trackHowToInteraction($(this), 'Open'); -}); -$('#close-guide').on('click', function () { - trackHowToInteraction($(this), 'Close'); -}); -$('#previous-guide').on('click', function () { - trackHowToInteraction($(this), 'Back'); -}); -$('#next-guide').on('click', function () { - trackHowToInteraction($(this), 'Next'); -}); -$('#guide-bars').on('click', function () { - trackHowToInteraction($(this), 'Hamburger Menu'); -}); -$('#guide-sidebar .nav-link').on('click', function () { - let label = $(this).text().trim(); - trackHowToInteraction($(this), label); -}); +$('#close-guide').on('click', closeOffcanvas); $('#guide-carousel') .carousel({ @@ -84,3 +53,29 @@ $('#card-carousel').on('slid.bs.carousel', function () { $('#next-card').show(); } }); + +function trackHowToInteraction(element, label) { + trackUIInteraction(element, 'How To Guide', 'click', label); +} + +$('#open-guide').on('click', function () { + trackHowToInteraction($(this), 'Open'); +}); +$('#close-guide').on('click', function () { + trackHowToInteraction($(this), 'Close'); +}); +$('#previous-guide').on('click', function () { + trackHowToInteraction($(this), 'Back'); +}); +$('#next-guide').on('click', function () { + trackHowToInteraction($(this), 'Next'); +}); +$('#guide-bars').on('click', function () { + trackHowToInteraction($(this), 'Hamburger Menu'); +}); +$('#guide-sidebar .nav-link').on('click', function () { + let label = $(this).text().trim(); + trackHowToInteraction($(this), label); +}); + +export {openOffcanvas, closeOffcanvas}; diff --git a/concordia/static/js/src/modules/quick-tips.js b/concordia/static/js/src/modules/quick-tips.js new file mode 100644 index 000000000..f8871155f --- /dev/null +++ b/concordia/static/js/src/modules/quick-tips.js @@ -0,0 +1,21 @@ +/* global $ */ + +function setTutorialHeight() { + let $carouselItems = $('#card-carousel .carousel-item'); + let heights = $carouselItems.map(function () { + let height = $(this).height(); + if (height <= 0) { + let firstChild = $(this).children[0]; + if (firstChild) { + height = firstChild.offsetHeight + 48; + } else { + return 517.195; + } + } + return height; + }); + let maxHeight = Math.max.apply(this, heights); + $carouselItems.height(maxHeight); +} + +export {setTutorialHeight}; diff --git a/concordia/static/js/src/ocr.js b/concordia/static/js/src/ocr.js index 8c5cf0d07..8c8d881af 100644 --- a/concordia/static/js/src/ocr.js +++ b/concordia/static/js/src/ocr.js @@ -1,7 +1,8 @@ /* global $ */ -/* exported selectLanguage */ function selectLanguage() { $('#ocr-transcription-modal').modal('hide'); $('#language-selection-modal').modal('show'); } + +$('#select-language-button').on('click', selectLanguage); diff --git a/concordia/static/js/src/quick-tips.js b/concordia/static/js/src/quick-tips-setup.js similarity index 88% rename from concordia/static/js/src/quick-tips.js rename to concordia/static/js/src/quick-tips-setup.js index 139eb3acf..86451e71e 100644 --- a/concordia/static/js/src/quick-tips.js +++ b/concordia/static/js/src/quick-tips-setup.js @@ -1,10 +1,9 @@ -/* global $ trackUIInteraction setTutorialHeight */ +/* global $ trackUIInteraction */ -function trackQuickTipsInteraction(element, label) { - trackUIInteraction(element, 'Quick Tips', 'click', label); -} +import {setTutorialHeight} from './modules/quick-tips.js'; + +let mainContentHeight = $('#contribute-main-content').height(); -var mainContentHeight = $('#contribute-main-content').height(); if (mainContentHeight < 710) { $('.sidebar').height(mainContentHeight - 130); } @@ -13,23 +12,32 @@ $('#tutorial-popup').on('shown.bs.modal', function () { setTutorialHeight(); }); +function trackQuickTipsInteraction(element, label) { + trackUIInteraction(element, 'Quick Tips', 'click', label); +} + $('#quick-tips').on('click', function () { trackQuickTipsInteraction($(this), 'Open'); }); + $('#previous-card').on('click', function () { trackQuickTipsInteraction($(this), 'Back'); }); + $('#next-card').on('click', function () { trackQuickTipsInteraction($(this), 'Next'); }); + $('.carousel-indicators li').on('click', function () { let index = [...this.parentElement.children].indexOf(this); trackQuickTipsInteraction($(this), `Carousel ${index}`); }); + $('#tutorial-popup').on('hidden.bs.modal', function () { // We're tracking whenever the popup closes, so we don't separately track the close button being clicked trackUIInteraction($(this), 'Quick Tips', 'click', 'Close'); }); + $('#tutorial-popup').on('shown-on-load', function () { // We set a timeout to make sure the analytics code is loaded before trying to track setTimeout(function () { diff --git a/concordia/static/js/src/viewer-split.js b/concordia/static/js/src/viewer-split.js index 2769b7b49..f425121b8 100644 --- a/concordia/static/js/src/viewer-split.js +++ b/concordia/static/js/src/viewer-split.js @@ -1,4 +1,5 @@ -/* global Split seadragonViewer */ +import {seadragonViewer} from './viewer.js'; +import Split from '/static/split.js/dist/split.es.js'; let pageSplit; let contributeContainer = document.getElementById('contribute-container'); @@ -107,6 +108,12 @@ function horizontalSplit() { }); } +if (splitDirection == 'v') { + pageSplit = verticalSplit(); +} else { + pageSplit = horizontalSplit(); +} + document .getElementById('viewer-layout-horizontal') .addEventListener('click', function () { @@ -138,9 +145,3 @@ document }, 10); } }); - -if (splitDirection == 'v') { - pageSplit = verticalSplit(); -} else { - pageSplit = horizontalSplit(); -} diff --git a/concordia/static/js/src/viewer.js b/concordia/static/js/src/viewer.js index 9ad073409..7c306d992 100644 --- a/concordia/static/js/src/viewer.js +++ b/concordia/static/js/src/viewer.js @@ -1,9 +1,8 @@ /* global OpenSeadragon screenfull debounce */ -/* exported seadragonView stepUp stepDown resetImageFilterForms */ -const viewerData = document.currentScript.dataset; +const viewerData = document.getElementById('viewer-data').dataset; -var seadragonViewer = OpenSeadragon({ +let seadragonViewer = OpenSeadragon({ id: 'asset-image', prefixUrl: viewerData.prefixUrl, tileSources: { @@ -188,6 +187,16 @@ gammaRange.addEventListener('input', function () { gammaNumber.value = gammaRange.value; }); +let gammaUp = document.getElementById('gamma-up'); +gammaUp.addEventListener('click', function () { + stepUp('gamma'); +}); + +let gammaDown = document.getElementById('gamma-down'); +gammaDown.addEventListener('click', function () { + stepDown('gamma'); +}); + let thresholdNumber = document.getElementById('threshold'); let thresholdRange = document.getElementById('threshold-range'); @@ -198,3 +207,18 @@ thresholdNumber.addEventListener('input', function () { thresholdRange.addEventListener('input', function () { thresholdNumber.value = thresholdRange.value; }); + +let thresholdUp = document.getElementById('threshold-up'); +thresholdUp.addEventListener('click', function () { + stepUp('threshold'); +}); + +let thresholdDown = document.getElementById('threshold-down'); +thresholdDown.addEventListener('click', function () { + stepDown('threshold'); +}); + +let reset = document.getElementById('viewer-reset'); +reset.addEventListener('click', resetImageFilterForms); + +export {seadragonViewer}; diff --git a/concordia/templates/base.html b/concordia/templates/base.html index ad435e9db..b201e8364 100644 --- a/concordia/templates/base.html +++ b/concordia/templates/base.html @@ -280,27 +280,6 @@

Follow {% include "fragments/common-scripts.html" %} - - - {% block body_scripts %}{% endblock body_scripts %} - - - - - - - - - - + + + + + + + + + + + {% endblock head_content %} {% block breadcrumbs %} diff --git a/concordia/templates/transcriptions/asset_detail/editor.html b/concordia/templates/transcriptions/asset_detail/editor.html index 92a09da5e..4798976be 100644 --- a/concordia/templates/transcriptions/asset_detail/editor.html +++ b/concordia/templates/transcriptions/asset_detail/editor.html @@ -44,11 +44,13 @@

- + {% if cards %} + + {% endif %}

{% spaceless %} @@ -62,8 +64,8 @@

{% if guides %} - - {% include "fragments/_how-to-guide.html" %} + + {% include "transcriptions/asset_detail/guide.html" %} {% endif %}

diff --git a/concordia/templates/fragments/_how-to-guide.html b/concordia/templates/transcriptions/asset_detail/guide.html similarity index 98% rename from concordia/templates/fragments/_how-to-guide.html rename to concordia/templates/transcriptions/asset_detail/guide.html index ae944dfde..9e06e60c7 100644 --- a/concordia/templates/fragments/_how-to-guide.html +++ b/concordia/templates/transcriptions/asset_detail/guide.html @@ -4,7 +4,7 @@

How-To Guide

-
diff --git a/concordia/templates/transcriptions/asset_detail/ocr_transcription_modal.html b/concordia/templates/transcriptions/asset_detail/ocr_transcription_modal.html index 39ef4601b..17dac56fc 100644 --- a/concordia/templates/transcriptions/asset_detail/ocr_transcription_modal.html +++ b/concordia/templates/transcriptions/asset_detail/ocr_transcription_modal.html @@ -15,7 +15,7 @@ {% if transcription_status == "not_started" or transcription_status == "in_progress" %} - + Yes, Select Language {% endif %} diff --git a/concordia/templates/transcriptions/asset_detail/viewer_filters.html b/concordia/templates/transcriptions/asset_detail/viewer_filters.html index 3170aae21..5857930eb 100644 --- a/concordia/templates/transcriptions/asset_detail/viewer_filters.html +++ b/concordia/templates/transcriptions/asset_detail/viewer_filters.html @@ -18,7 +18,7 @@
-
@@ -40,13 +40,13 @@
-
- @@ -94,13 +94,13 @@
-
- From 78b0b6306a45525ef68a0f2c3243e5c20aa9045c Mon Sep 17 00:00:00 2001 From: rasarkar <105652044+rasarkar@users.noreply.github.com> Date: Thu, 15 Aug 2024 08:22:10 -0400 Subject: [PATCH 09/28] CONCD-903 Update How-to instructions in transcription view to a button (#2492) * CONCD-903 Update How-to instructions in transcription view to a button (WiP) * CONCD-903 don't hide the button * CONCD-903 as long as the guide is open, the button should be navy * CONCD-903 adding a little margin --- concordia/static/js/src/guide.js | 6 +++--- concordia/static/scss/base.scss | 10 +--------- .../templates/transcriptions/asset_detail/editor.html | 4 +++- 3 files changed, 7 insertions(+), 13 deletions(-) diff --git a/concordia/static/js/src/guide.js b/concordia/static/js/src/guide.js index d701feb70..9dd729920 100644 --- a/concordia/static/js/src/guide.js +++ b/concordia/static/js/src/guide.js @@ -6,20 +6,20 @@ function openOffcanvas() { guide.style.borderWidth = '0 0 thick thick'; guide.style.borderStyle = 'solid'; guide.style.borderColor = '#0076ad'; - document.getElementById('open-guide').style.display = 'none'; document.addEventListener('keydown', function (event) { if (event.key == 'Escape') { closeOffcanvas(); } }); + document.getElementById('open-guide').style.background = '#002347'; } function closeOffcanvas() { let guide = document.getElementById('guide-sidebar'); guide.classList.add('offscreen'); - guide.style.border = 'none'; - document.getElementById('open-guide').style.display = 'block'; + + document.getElementById('open-guide').style.background = '#0076AD'; } $('#open-guide').on('click', openOffcanvas); diff --git a/concordia/static/scss/base.scss b/concordia/static/scss/base.scss index 12e860531..c4320e9aa 100644 --- a/concordia/static/scss/base.scss +++ b/concordia/static/scss/base.scss @@ -1116,16 +1116,8 @@ $card-progress-height: 12px; /* How to Guide */ #open-guide { - transform: rotate(-90deg) translateY(-50%); - position: absolute; border-radius: 0; - right: 0; - font-size: 0.75rem; - margin-right: -55px; - margin-top: 39px; - max-height: 32px; white-space: nowrap; - width: 110px; } #close-guide { @@ -1139,7 +1131,7 @@ $card-progress-height: 12px; width: 450px; position: absolute; /* Stay in place */ z-index: 1; /* Stay on top */ - top: 129px; + top: 135px; right: 0; overflow: hidden auto; /* Disable horizontal scrolling */ transition: 0.3s; diff --git a/concordia/templates/transcriptions/asset_detail/editor.html b/concordia/templates/transcriptions/asset_detail/editor.html index 4798976be..2a7d1528c 100644 --- a/concordia/templates/transcriptions/asset_detail/editor.html +++ b/concordia/templates/transcriptions/asset_detail/editor.html @@ -49,6 +49,9 @@

Campaign Tips + {% if guides %} + + {% endif %}

{% endif %}
@@ -64,7 +67,6 @@

{% if guides %} - {% include "transcriptions/asset_detail/guide.html" %} {% endif %}

From c5f3584bdc649d9e64841a18ded9b709342c5e88 Mon Sep 17 00:00:00 2001 From: Josh Stegmaier <104993387+joshuastegmaier@users.noreply.github.com> Date: Thu, 15 Aug 2024 13:37:09 -0400 Subject: [PATCH 10/28] Reverted bootstrap version change (#2493) --- package-lock.json | 21 ++++++--------------- package.json | 2 +- 2 files changed, 7 insertions(+), 16 deletions(-) diff --git a/package-lock.json b/package-lock.json index 441971e80..2052c1a1d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,7 +11,7 @@ "dependencies": { "@duetds/date-picker": "^1.4.0", "@fortawesome/fontawesome-free": "^5.15.1", - "bootstrap": "5.0.0", + "bootstrap": "^4.5.3", "codemirror": "^5.58.2", "gulp": "^5.0.0", "gulp-rename": "^2.0.0", @@ -473,16 +473,6 @@ "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/@popperjs/core": { - "version": "2.11.8", - "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", - "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", - "peer": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/popperjs" - } - }, "node_modules/@puppeteer/browsers": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.0.1.tgz", @@ -1039,15 +1029,16 @@ } }, "node_modules/bootstrap": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.0.0.tgz", - "integrity": "sha512-tmhPET9B9qCl8dCofvHeiIhi49iBt0EehmIsziZib65k1erBW1rHhj2s/2JsuQh5Pq+xz2E9bEbzp9B7xHG+VA==", + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.5.3.tgz", + "integrity": "sha512-o9ppKQioXGqhw8Z7mah6KdTYpNQY//tipnkxppWhPbiSWdD+1raYsnhwEZjkTHYbGee4cVQ0Rx65EhOY/HNLcQ==", "funding": { "type": "opencollective", "url": "https://opencollective.com/bootstrap" }, "peerDependencies": { - "@popperjs/core": "^2.9.2" + "jquery": "1.9.1 - 3", + "popper.js": "^1.16.1" } }, "node_modules/brace-expansion": { diff --git a/package.json b/package.json index cde5ef2fb..0f9465725 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,7 @@ "dependencies": { "@duetds/date-picker": "^1.4.0", "@fortawesome/fontawesome-free": "^5.15.1", - "bootstrap": "5.0.0", + "bootstrap": "^4.5.3", "codemirror": "^5.58.2", "gulp": "^5.0.0", "gulp-rename": "^2.0.0", From 0283e5e1defb1bab9cc10ff707d7b0747d96d93b Mon Sep 17 00:00:00 2001 From: rasarkar <105652044+rasarkar@users.noreply.github.com> Date: Fri, 16 Aug 2024 06:47:35 -0400 Subject: [PATCH 11/28] CONCD-889 Add underline hyperlinks in global styling (#2494) --- concordia/static/scss/base.scss | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/concordia/static/scss/base.scss b/concordia/static/scss/base.scss index c4320e9aa..663cc072a 100644 --- a/concordia/static/scss/base.scss +++ b/concordia/static/scss/base.scss @@ -174,6 +174,14 @@ h1, font-weight: bold; } +p a { + text-decoration: underline; +} + +p a:hover { + text-decoration: none; +} + a .campaign-title:hover, .hero-text a:hover { color: $dark; From edc456686bbeeeb9294d30620780cae6468042b5 Mon Sep 17 00:00:00 2001 From: rasarkar <105652044+rasarkar@users.noreply.github.com> Date: Thu, 22 Aug 2024 09:44:33 -0400 Subject: [PATCH 12/28] CONCD-904 put the labels under the correct headings (#2495) --- concordia/templates/account/profile.html | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/concordia/templates/account/profile.html b/concordia/templates/account/profile.html index 6f57e5c5b..825748337 100644 --- a/concordia/templates/account/profile.html +++ b/concordia/templates/account/profile.html @@ -113,17 +113,17 @@

My Contributions

{{ user_profile_activity.count|intcomma }}

Campaigns

-

Your saves, submits, and reviews

+

Campaigns you've worked on

{{ pages_worked_on|intcomma }}

Pages Worked On

-

Campaigns you've worked on

+

Pages you've worked on

{{ totalCount|intcomma }}

Actions

-

Pages you've worked on

+

Your saves, submits, and reviews

From d008d1568d5c2cb66021b3f1ec477d94edc10c1c Mon Sep 17 00:00:00 2001 From: rasarkar <105652044+rasarkar@users.noreply.github.com> Date: Thu, 22 Aug 2024 11:26:45 -0400 Subject: [PATCH 13/28] CONCD-889 bulleted lists (#2496) --- concordia/static/scss/base.scss | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/concordia/static/scss/base.scss b/concordia/static/scss/base.scss index 663cc072a..807139b54 100644 --- a/concordia/static/scss/base.scss +++ b/concordia/static/scss/base.scss @@ -143,6 +143,14 @@ main { flex: 1 1 0%; } +main a { + text-decoration: underline; +} + +main a:hover { + text-decoration: none; +} + .close { opacity: 1; } From 44b36b776731d53b46dace46bb47eecb229065ea Mon Sep 17 00:00:00 2001 From: rasarkar <105652044+rasarkar@users.noreply.github.com> Date: Fri, 23 Aug 2024 09:36:28 -0400 Subject: [PATCH 14/28] CONCD-904 (#2497) * CONCD-903 More padding is needed between How To Guide button and Quick Tips link. * CONCD-903 When How To is open, clicking the button again should close it. * CONCD-903 Allow How To button to work even on a page that is reserved by another user --- concordia/static/js/src/contribute.js | 2 +- concordia/static/js/src/guide.js | 24 +++++++++++-------- concordia/static/scss/base.scss | 1 + .../transcriptions/asset_detail/editor.html | 2 +- 4 files changed, 17 insertions(+), 12 deletions(-) diff --git a/concordia/static/js/src/contribute.js b/concordia/static/js/src/contribute.js index 3b287bb56..26a54619d 100644 --- a/concordia/static/js/src/contribute.js +++ b/concordia/static/js/src/contribute.js @@ -9,7 +9,7 @@ function lockControls($container) { // Locks all of the controls in the provided jQuery element $container.find('input, textarea').attr('readonly', 'readonly'); $container.find('input:checkbox').attr('disabled', 'disabled'); - $container.find('button').attr('disabled', 'disabled'); + $container.find('button:not(#open-guide)').attr('disabled', 'disabled'); } function unlockControls($container) { diff --git a/concordia/static/js/src/guide.js b/concordia/static/js/src/guide.js index 9dd729920..09f772af6 100644 --- a/concordia/static/js/src/guide.js +++ b/concordia/static/js/src/guide.js @@ -2,16 +2,20 @@ function openOffcanvas() { let guide = document.getElementById('guide-sidebar'); - guide.classList.remove('offscreen'); - guide.style.borderWidth = '0 0 thick thick'; - guide.style.borderStyle = 'solid'; - guide.style.borderColor = '#0076ad'; - document.addEventListener('keydown', function (event) { - if (event.key == 'Escape') { - closeOffcanvas(); - } - }); - document.getElementById('open-guide').style.background = '#002347'; + if (guide.classList.contains('offscreen')) { + guide.classList.remove('offscreen'); + guide.style.borderWidth = '0 0 thick thick'; + guide.style.borderStyle = 'solid'; + guide.style.borderColor = '#0076ad'; + document.addEventListener('keydown', function (event) { + if (event.key == 'Escape') { + closeOffcanvas(); + } + }); + document.getElementById('open-guide').style.background = '#002347'; + } else { + closeOffcanvas(); + } } function closeOffcanvas() { diff --git a/concordia/static/scss/base.scss b/concordia/static/scss/base.scss index 807139b54..a6ee8572f 100644 --- a/concordia/static/scss/base.scss +++ b/concordia/static/scss/base.scss @@ -1133,6 +1133,7 @@ $card-progress-height: 12px; /* How to Guide */ #open-guide { border-radius: 0; + margin: 0 5px 0 9px; white-space: nowrap; } diff --git a/concordia/templates/transcriptions/asset_detail/editor.html b/concordia/templates/transcriptions/asset_detail/editor.html index 2a7d1528c..de98041c7 100644 --- a/concordia/templates/transcriptions/asset_detail/editor.html +++ b/concordia/templates/transcriptions/asset_detail/editor.html @@ -50,7 +50,7 @@

Campaign Tips {% if guides %} - + {% endif %}

{% endif %} From 972eaf15299871adc1d3ab80ac5fab68acd18cec Mon Sep 17 00:00:00 2001 From: rasarkar <105652044+rasarkar@users.noreply.github.com> Date: Mon, 26 Aug 2024 06:42:35 -0400 Subject: [PATCH 15/28] CONCD-889 trying to avoid unintended consequences (#2498) --- concordia/static/scss/base.scss | 4 ++-- concordia/templates/static-page.html | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/concordia/static/scss/base.scss b/concordia/static/scss/base.scss index a6ee8572f..9571be630 100644 --- a/concordia/static/scss/base.scss +++ b/concordia/static/scss/base.scss @@ -143,11 +143,11 @@ main { flex: 1 1 0%; } -main a { +.simple-page a { text-decoration: underline; } -main a:hover { +.simple-page a:hover { text-decoration: none; } diff --git a/concordia/templates/static-page.html b/concordia/templates/static-page.html index e5b03b625..298de1004 100644 --- a/concordia/templates/static-page.html +++ b/concordia/templates/static-page.html @@ -18,7 +18,7 @@

{{ title }}

-
+
{% if add_navigation %}
From facc1072d2522ea982240aa006d02d942b69c7ef Mon Sep 17 00:00:00 2001 From: rasarkar <105652044+rasarkar@users.noreply.github.com> Date: Mon, 26 Aug 2024 10:14:45 -0400 Subject: [PATCH 16/28] CONCD-914 Update transcriptions dashboard to add campaign slug & remove "Updated On" (#2499) --- concordia/admin/__init__.py | 2 +- concordia/models.py | 3 +++ concordia/tests/test_models.py | 5 +++++ 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/concordia/admin/__init__.py b/concordia/admin/__init__.py index 46a8081e9..bd318e8e7 100644 --- a/concordia/admin/__init__.py +++ b/concordia/admin/__init__.py @@ -781,7 +781,7 @@ class TranscriptionAdmin(admin.ModelAdmin): "user", "truncated_text", "created_on", - "updated_on", + "campaign_slug", "accepted", "rejected", "reviewed_by", diff --git a/concordia/models.py b/concordia/models.py index e9c8b7939..17de74b26 100644 --- a/concordia/models.py +++ b/concordia/models.py @@ -956,6 +956,9 @@ class Meta: def __str__(self): return f"Transcription #{self.pk}" + def campaign_slug(self): + return self.asset.item.project.campaign.slug + def clean(self): if ( self.user diff --git a/concordia/tests/test_models.py b/concordia/tests/test_models.py index bee7580fa..6eab495a5 100644 --- a/concordia/tests/test_models.py +++ b/concordia/tests/test_models.py @@ -231,6 +231,11 @@ def setUp(self): ) self.transcription2 = create_transcription(asset=self.asset, user=self.user2) + def test_campaign_slug(self): + self.assertEqual( + self.asset.item.project.campaign.slug, self.transcription1.campaign_slug() + ) + def test_clean(self): bad_transcription = Transcription(asset=self.asset, user=self.user) bad_transcription.clean() From 05ce45b3ada9b7474ea0e826621a9a38d9de191e Mon Sep 17 00:00:00 2001 From: rasarkar <105652044+rasarkar@users.noreply.github.com> Date: Mon, 26 Aug 2024 14:03:46 -0400 Subject: [PATCH 17/28] CONCD-923 Implement an import map for JavaScript modules (#2500) --- concordia/static/js/src/contribute.js | 2 +- concordia/static/js/src/viewer-split.js | 2 +- concordia/templates/transcriptions/asset_detail.html | 12 ++++++++---- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/concordia/static/js/src/contribute.js b/concordia/static/js/src/contribute.js index 26a54619d..45f39b6e5 100644 --- a/concordia/static/js/src/contribute.js +++ b/concordia/static/js/src/contribute.js @@ -1,6 +1,6 @@ /* global $ displayMessage buildErrorMessage */ -import {reserveAssetForEditing} from './asset-reservation.js'; +import {reserveAssetForEditing} from 'asset-reservation'; function lockControls($container) { if (!$container) { diff --git a/concordia/static/js/src/viewer-split.js b/concordia/static/js/src/viewer-split.js index f425121b8..8672d3046 100644 --- a/concordia/static/js/src/viewer-split.js +++ b/concordia/static/js/src/viewer-split.js @@ -1,4 +1,4 @@ -import {seadragonViewer} from './viewer.js'; +import {seadragonViewer} from 'viewer'; import Split from '/static/split.js/dist/split.es.js'; let pageSplit; diff --git a/concordia/templates/transcriptions/asset_detail.html b/concordia/templates/transcriptions/asset_detail.html index 0cb1144c6..d832a69da 100644 --- a/concordia/templates/transcriptions/asset_detail.html +++ b/concordia/templates/transcriptions/asset_detail.html @@ -31,6 +31,14 @@ data-tile-source-url="{% asset_media_url asset %}?canvas" > + @@ -39,10 +47,6 @@ - - {% endblock head_content %} {% block breadcrumbs %} From 49f5fdebf41538f79a127e3eee21d9364e30e568 Mon Sep 17 00:00:00 2001 From: Josh Stegmaier <104993387+joshuastegmaier@users.noreply.github.com> Date: Tue, 27 Aug 2024 14:09:35 -0400 Subject: [PATCH 18/28] Fixed transcription admin breaking (#2505) --- concordia/admin/__init__.py | 1 + 1 file changed, 1 insertion(+) diff --git a/concordia/admin/__init__.py b/concordia/admin/__init__.py index bd318e8e7..3b4929ed1 100644 --- a/concordia/admin/__init__.py +++ b/concordia/admin/__init__.py @@ -812,6 +812,7 @@ class TranscriptionAdmin(admin.ModelAdmin): "reviewed_by", "supersedes", "text", + "source", ) EXPORT_FIELDS = ( From 0c859220a491f44e2676133b09dbbee2d58d5965 Mon Sep 17 00:00:00 2001 From: Josh Stegmaier <104993387+joshuastegmaier@users.noreply.github.com> Date: Tue, 27 Aug 2024 14:25:04 -0400 Subject: [PATCH 19/28] Removed automatic unlocking of buttons on the transcription form to fix the bug causing the save button to be unlocked when it shouldn't be (#2507) Co-authored-by: Jennifer Kuenning <72825410+jkueloc@users.noreply.github.com> --- concordia/static/js/src/contribute.js | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/concordia/static/js/src/contribute.js b/concordia/static/js/src/contribute.js index 45f39b6e5..2403045ea 100644 --- a/concordia/static/js/src/contribute.js +++ b/concordia/static/js/src/contribute.js @@ -16,17 +16,17 @@ function unlockControls($container) { if (!$container) { return; } - // Unlocks all of the controls in the provided jQuery element + // Unlocks all of the controls except buttons in the provided jQuery element $container.find('input, textarea').removeAttr('readonly'); $container.find('input:checkbox').removeAttr('disabled'); - // We exclude the rollback/forward buttons because the logic - // is handled in the template (both on first load and - // when updated via AJAX). - $container - .find('button') - .not('#rollback-transcription-button') - .not('#rollforward-transcription-button') - .removeAttr('disabled'); + + // Though we lock all buttons in lockControls, we don't automatically + // unlock most of them. Which buttons should be locked or unlocked + // is more complicated logic handled by the update-ui-state + // listener on the transcription form and the form + // results handlers. + // The only buttons unlocked here are ones that should always be unlocked. + $container.find('button#open-guide').removeAttr('disabled'); } $(document).on('keydown', function (event) { @@ -270,7 +270,8 @@ function setupPage() { } if (data.transcriptionId && !data.unsavedChanges) { - // We have a transcription ID and it's not stale, so we can submit the transcription for review: + // We have a transcription ID and it's not stale, + // so we can submit the transcription for review and disable the save button: $saveButton.attr('disabled', 'disabled'); $submitButton.removeAttr('disabled'); // We only want to do this the first time the editor ui is updated (i.e., on first load) From 4e7e75b19864cba11f96340874dc3b7a0e3b6057 Mon Sep 17 00:00:00 2001 From: rasarkar <105652044+rasarkar@users.noreply.github.com> Date: Tue, 27 Aug 2024 14:52:39 -0400 Subject: [PATCH 20/28] CONCD-904 (#2508) * Removed automatic unlocking of buttons on the transcription form to fix the bug causing the save button to be unlocked when it shouldn't be * CONCD-904 a couple more language tweaks --------- Co-authored-by: joshuastegmaier --- concordia/templates/account/profile.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/concordia/templates/account/profile.html b/concordia/templates/account/profile.html index 825748337..f7593915b 100644 --- a/concordia/templates/account/profile.html +++ b/concordia/templates/account/profile.html @@ -113,11 +113,11 @@

My Contributions

{{ user_profile_activity.count|intcomma }}

Campaigns

-

Campaigns you've worked on

+

Projects you've worked on

{{ pages_worked_on|intcomma }}
-

Pages Worked On

+

Pages

Pages you've worked on

From 1b89910c8e6afe9e9df8a2c20616278090f49f16 Mon Sep 17 00:00:00 2001 From: rasarkar <105652044+rasarkar@users.noreply.github.com> Date: Wed, 28 Aug 2024 07:04:55 -0400 Subject: [PATCH 21/28] CONCD-914 move the campaign slug column (#2510) --- concordia/admin/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/concordia/admin/__init__.py b/concordia/admin/__init__.py index 3b4929ed1..e21f5e771 100644 --- a/concordia/admin/__init__.py +++ b/concordia/admin/__init__.py @@ -779,9 +779,9 @@ class TranscriptionAdmin(admin.ModelAdmin): "id", "asset", "user", + "campaign_slug", "truncated_text", "created_on", - "campaign_slug", "accepted", "rejected", "reviewed_by", From 7704cf229317199e8f925900d6711a8c5dea8f43 Mon Sep 17 00:00:00 2001 From: Josh Stegmaier <104993387+joshuastegmaier@users.noreply.github.com> Date: Wed, 28 Aug 2024 11:19:37 -0400 Subject: [PATCH 22/28] Switched to psycopg binary package (#2511) * Switched to psycopg binary package * Updated Pipfile.lock * Changed psycopg package --- Pipfile | 2 +- Pipfile.lock | 573 ++++++++++++++++++++++++++++----------------------- 2 files changed, 319 insertions(+), 256 deletions(-) diff --git a/Pipfile b/Pipfile index b1dd05043..0b6b448cc 100644 --- a/Pipfile +++ b/Pipfile @@ -54,7 +54,7 @@ pillow = "*" prometheus-client = "*" xlsxwriter = "*" blinker = "<1.8.0" -psycopg = ">=3.2" +psycopg = {version = ">=3.2", extras = ["binary"]} [dev-packages] invoke = "*" diff --git a/Pipfile.lock b/Pipfile.lock index 424fbecdb..243cb5483 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "8c4e53c0f15830ef951cd629c0c6da48bcc1e898a363aac041b473893333266b" + "sha256": "e282373f8a58202477a9431b20da9a09a8e33fb9444f3026289da0ccd8c1d9d8" }, "pipfile-spec": 6, "requires": { @@ -81,10 +81,11 @@ }, "automat": { "hashes": [ - "sha256:c3164f8742b9dc440f3682482d32aaff7bb53f71740dd018533f9de286b64180", - "sha256:e56beb84edad19dcc11d30e8d9b895f75deeb5ef5e96b84a467066b3b84bb04e" + "sha256:b34227cf63f6325b8ad2399ede780675083e439b20c323d376373d8ee6306d88", + "sha256:bf029a7bc3da1e2c24da2343e7598affaa9f10bf0ab63ff808566ce90551e02a" ], - "version": "==22.10.0" + "markers": "python_version >= '3.8'", + "version": "==24.8.1" }, "axe-selenium-python": { "hashes": [ @@ -155,19 +156,19 @@ }, "boto3": { "hashes": [ - "sha256:7ca22adef4c77ee128e1e1dc7d48bc9512a87cc6fe3d771b3f913d5ecd41c057", - "sha256:864f06528c583dc7b02adf12db395ecfadbf9cb0da90e907e848ffb27128ce19" + "sha256:05bd349cf260ba177924f38d721e427e2b3a6dd0fa8a18fa4ffc1b889633b181", + "sha256:bfbdf7c8f2e3eb70e4309cdcf5c9c7940e1fed4f645cdfb52581e7e67d3c8cab" ], "index": "pypi", - "version": "==1.34.154" + "version": "==1.35.7" }, "botocore": { "hashes": [ - "sha256:4eef4b1bb809b382ba9dc9c88f5fcc4a133f221a1acb693ee6bee4de9f325979", - "sha256:64d9b4c85a504d77cb56dabb2ad717cd8e1717424a88edb458b01d1e5797262a" + "sha256:324e58518a92f2946bc6653e5e1272bc88d4b6313413f938bdc51cb90d34cbba", + "sha256:85e4b58f2c6e54dfbf52eaee72ebc9b70188fd1716d47f626874abadcee45512" ], "index": "pypi", - "version": "==1.34.154" + "version": "==1.35.7" }, "brotli": { "hashes": [ @@ -527,10 +528,10 @@ }, "cron-descriptor": { "hashes": [ - "sha256:7b1a00d7d25d6ae6896c0da4457e790b98cba778398a3d48e341e5e0d33f0488", - "sha256:a67ba21804983b1427ed7f3e1ec27ee77bf24c652b0430239c268c5ddfbf9dc0" + "sha256:736b3ae9d1a99bc3dbfc5b55b5e6e7c12031e7ba5de716625772f8b02dcd6013", + "sha256:f51ce4ffc1d1f2816939add8524f206c376a42c87a5fca3091ce26725b3b1bca" ], - "version": "==1.4.3" + "version": "==1.4.5" }, "cryptography": { "hashes": [ @@ -614,10 +615,11 @@ }, "django-celery-beat": { "hashes": [ - "sha256:f75b2d129731f1214be8383e18fae6bfeacdb55dffb2116ce849222c0106f9ad" + "sha256:8482034925e09b698c05ad61c36ed2a8dbc436724a3fe119215193a4ca6dc967", + "sha256:851c680d8fbf608ca5fecd5836622beea89fa017bc2b3f94a5b8c648c32d84b1" ], "index": "pypi", - "version": "==2.6.0" + "version": "==2.7.0" }, "django-debug-toolbar": { "hashes": [ @@ -1040,11 +1042,11 @@ }, "gunicorn": { "hashes": [ - "sha256:350679f91b24062c86e386e198a15438d53a7a8207235a78ba1b53df4c4378d9", - "sha256:4a0b436239ff76fb33f11c07a16482c521a7e09c1ce3cc293c2330afe01bec63" + "sha256:ec400d38950de4dfd418cff8328b2c8faed0edb0d517d3394e457c317908ca4d", + "sha256:f014447a0101dc57e294f6c18ca6b40227a4c90e9bdb586042628030cba004ec" ], "index": "pypi", - "version": "==22.0.0" + "version": "==23.0.0" }, "h11": { "hashes": [ @@ -1194,11 +1196,11 @@ }, "idna": { "hashes": [ - "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc", - "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0" + "sha256:050b4e5baadcd44d760cedbd2b8e639f2ff89bbc7a5730fcc662954303377aac", + "sha256:d838c2c0ed6fced7693d5e8ab8e734d5f8fda53a039c0164afb0b82e771e3603" ], - "markers": "python_version >= '3.5'", - "version": "==3.7" + "markers": "python_version >= '3.6'", + "version": "==3.8" }, "incremental": { "hashes": [ @@ -1250,19 +1252,19 @@ }, "locust": { "hashes": [ - "sha256:20756509939004e95c622ac3042886edab38b736f00534cc03ce2774064e7f71", - "sha256:d26b7333cdef80645f3978d8ff9aabab4d53e41ed82cc8490212aa68e8498fdd" + "sha256:1f056173aefa6ba42501c3bf04bb700df9eddd165e38bb721f7b00643b68b825", + "sha256:566d89b5c4a7b69e3ab6844c1a373909918ee9d04f5d2bab6a8104e43a5721d8" ], "index": "pypi", - "version": "==2.31.1" + "version": "==2.31.4" }, "markdown": { "hashes": [ - "sha256:48f276f4d8cfb8ce6527c8f79e2ee29708508bf4d40aa410fbc3b4ee832c850f", - "sha256:ed4f41f6daecbeeb96e576ce414c41d2d876daa9a16cb35fa8ed8c2ddfad0224" + "sha256:2ae2471477cfd02dbbf038d5d9bc226d40def84b4fe2986e49b59b6b472bbed2", + "sha256:7eb6df5690b81a1d7942992c97fad2938e956e79df20cbc6186e9c3a77b1c803" ], "index": "pypi", - "version": "==3.6" + "version": "==3.7" }, "markdown-it-py": { "hashes": [ @@ -1348,11 +1350,11 @@ }, "more-itertools": { "hashes": [ - "sha256:e5d93ef411224fbcef366a6e8ddc4c5781bc6359d43412a65dd5964e46111463", - "sha256:ea6a02e24a9161e51faad17a8782b92a0df82c12c1c8886fec7f0c3fa1a1b320" + "sha256:0f7d9f83a0a8dcfa8a2694a770590d98a67ea943e3d9f5298309a484758c4e27", + "sha256:fe0e63c4ab068eac62410ab05cccca2dc71ec44ba8ef29916a0090df061cf923" ], "index": "pypi", - "version": "==10.3.0" + "version": "==10.4.0" }, "msgpack": { "hashes": [ @@ -1627,6 +1629,9 @@ "version": "==6.0.0" }, "psycopg": { + "extras": [ + "binary" + ], "hashes": [ "sha256:dc8da6dc8729dacacda3cc2f17d2c9397a70a66cf0d2b69c91065d60d5f00cb7", "sha256:ece385fb413a37db332f97c49208b36cf030ff02b199d7635ed2fbd378724175" @@ -1634,6 +1639,64 @@ "index": "pypi", "version": "==3.2.1" }, + "psycopg-binary": { + "hashes": [ + "sha256:059cbd4e6da2337e17707178fe49464ed01de867dc86c677b30751755ec1dc51", + "sha256:06a7aae34edfe179ddc04da005e083ff6c6b0020000399a2cbf0a7121a8a22ea", + "sha256:0879b5d76b7d48678d31278242aaf951bc2d69ca4e4d7cef117e4bbf7bfefda9", + "sha256:0ab58213cc976a1666f66bc1cb2e602315cd753b7981a8e17237ac2a185bd4a1", + "sha256:0b018631e5c80ce9bc210b71ea885932f9cca6db131e4df505653d7e3873a938", + "sha256:101472468d59c74bb8565fab603e032803fd533d16be4b2d13da1bab8deb32a3", + "sha256:1d353e028b8f848b9784450fc2abf149d53a738d451eab3ee4c85703438128b9", + "sha256:1d6833f607f3fc7b22226a9e121235d3b84c0eda1d3caab174673ef698f63788", + "sha256:21927f41c4d722ae8eb30d62a6ce732c398eac230509af5ba1749a337f8a63e2", + "sha256:28ada5f610468c57d8a4a055a8ea915d0085a43d794266c4f3b9d02f4288f4db", + "sha256:2e8213bf50af073b1aa8dc3cff123bfeedac86332a16c1b7274910bc88a847c7", + "sha256:302b86f92c0d76e99fe1b5c22c492ae519ce8b98b88d37ef74fda4c9e24c6b46", + "sha256:334046a937bb086c36e2c6889fe327f9f29bfc085d678f70fac0b0618949f674", + "sha256:33e6669091d09f8ba36e10ce678a6d9916e110446236a9b92346464a3565635e", + "sha256:3c838806eeb99af39f934b7999e35f947a8e577997cc892c12b5053a97a9057f", + "sha256:40bb515d042f6a345714ec0403df68ccf13f73b05e567837d80c886c7c9d3805", + "sha256:413977d18412ff83486eeb5875eb00b185a9391c57febac45b8993bf9c0ff489", + "sha256:415c3b72ea32119163255c6504085f374e47ae7345f14bc3f0ef1f6e0976a879", + "sha256:42781ba94e8842ee98bca5a7d0c44cc9d067500fedca2d6a90fa3609b6d16b42", + "sha256:463d55345f73ff391df8177a185ad57b552915ad33f5cc2b31b930500c068b22", + "sha256:4a42b8f9ab39affcd5249b45cac763ac3cf12df962b67e23fd15a2ee2932afe5", + "sha256:4c84fcac8a3a3479ac14673095cc4e1fdba2935499f72c436785ac679bec0d1a", + "sha256:592b27d6c46a40f9eeaaeea7c1fef6f3c60b02c634365eb649b2d880669f149f", + "sha256:62b1b7b07e00ee490afb39c0a47d8282a9c2822c7cfed9553a04b0058adf7e7f", + "sha256:6418712ba63cebb0c88c050b3997185b0ef54173b36568522d5634ac06153040", + "sha256:6f9e13600647087df5928875559f0eb8f496f53e6278b7da9511b4b3d0aff960", + "sha256:7066d3dca196ed0dc6172f9777b2d62e4f138705886be656cccff2d555234d60", + "sha256:73f9c9b984be9c322b5ec1515b12df1ee5896029f5e72d46160eb6517438659c", + "sha256:74d623261655a169bc84a9669890975c229f2fa6e19a7f2d10a77675dcf1a707", + "sha256:788ffc43d7517c13e624c83e0e553b7b8823c9655e18296566d36a829bfb373f", + "sha256:78c2007caf3c90f08685c5378e3ceb142bafd5636be7495f7d86ec8a977eaeef", + "sha256:7a84b5eb194a258116154b2a4ff2962ea60ea52de089508db23a51d3d6b1c7d1", + "sha256:7ce965caf618061817f66c0906f0452aef966c293ae0933d4fa5a16ea6eaf5bb", + "sha256:84837e99353d16c6980603b362d0f03302d4b06c71672a6651f38df8a482923d", + "sha256:8f28ff0cb9f1defdc4a6f8c958bf6787274247e7dfeca811f6e2f56602695fb1", + "sha256:921f0c7f39590763d64a619de84d1b142587acc70fd11cbb5ba8fa39786f3073", + "sha256:950fd666ec9e9fe6a8eeb2b5a8f17301790e518953730ad44d715b59ffdbc67f", + "sha256:9a997efbaadb5e1a294fb5760e2f5643d7b8e4e3fe6cb6f09e6d605fd28e0291", + "sha256:aa3931f308ab4a479d0ee22dc04bea867a6365cac0172e5ddcba359da043854b", + "sha256:af0469c00f24c4bec18c3d2ede124bf62688d88d1b8a5f3c3edc2f61046fe0d7", + "sha256:b0104a72a17aa84b3b7dcab6c84826c595355bf54bb6ea6d284dcb06d99c6801", + "sha256:b09e8a576a2ac69d695032ee76f31e03b30781828b5dd6d18c6a009e5a3d1c35", + "sha256:b140182830c76c74d17eba27df3755a46442ce8d4fb299e7f1cf2f74a87c877b", + "sha256:b1f087bd84bdcac78bf9f024ebdbfacd07fc0a23ec8191448a50679e2ac4a19e", + "sha256:c1d2b6438fb83376f43ebb798bf0ad5e57bc56c03c9c29c85bc15405c8c0ac5a", + "sha256:cad2de17804c4cfee8640ae2b279d616bb9e4734ac3c17c13db5e40982bd710d", + "sha256:cc304a46be1e291031148d9d95c12451ffe783ff0cc72f18e2cc7ec43cdb8c68", + "sha256:dc314a47d44fe1a8069b075a64abffad347a3a1d8652fed1bab5d3baea37acb2", + "sha256:f092114f10f81fb6bae544a0ec027eb720e2d9c74a4fcdaa9dd3899873136935", + "sha256:f34e369891f77d0738e5d25727c307d06d5344948771e5379ea29c76c6d84555", + "sha256:f8a509aeaac364fa965454e80cd110fe6d48ba2c80f56c9b8563423f0b5c3cfd", + "sha256:f8afb07114ea9b924a4a0305ceb15354ccf0ef3c0e14d54b8dbeb03e50182dd7", + "sha256:f99e59f8a5f4dcd9cbdec445f3d8ac950a492fc0e211032384d6992ed3c17eb7" + ], + "version": "==3.2.1" + }, "pyasn1": { "hashes": [ "sha256:3a35ab2c4b5ef98e17dfdec8ab074046fbda76e281c5a706ccd82328cfc8f64c", @@ -1848,11 +1911,11 @@ }, "pytesseract": { "hashes": [ - "sha256:8f22cc98f765bf13517ead0c70effedb46c153540d25783e04014f28b55a5fc6", - "sha256:f1c3a8b0f07fd01a1085d451f5b8315be6eec1d5577a6796d46dc7a62bd4120f" + "sha256:4bf5f880c99406f52a3cfc2633e42d9dc67615e69d8a509d74867d3baddb5db9", + "sha256:7a99c6c2ac598360693d83a416e36e0b33a67638bb9d77fdcac094a3589d4b34" ], "index": "pypi", - "version": "==0.3.10" + "version": "==0.3.13" }, "pytest": { "hashes": [ @@ -1894,118 +1957,118 @@ }, "pyzmq": { "hashes": [ - "sha256:038ae4ffb63e3991f386e7fda85a9baab7d6617fe85b74a8f9cab190d73adb2b", - "sha256:05bacc4f94af468cc82808ae3293390278d5f3375bb20fef21e2034bb9a505b6", - "sha256:0614aed6f87d550b5cecb03d795f4ddbb1544b78d02a4bd5eecf644ec98a39f6", - "sha256:08f74904cb066e1178c1ec706dfdb5c6c680cd7a8ed9efebeac923d84c1f13b1", - "sha256:093a1a3cae2496233f14b57f4b485da01b4ff764582c854c0f42c6dd2be37f3d", - "sha256:0a1f6ea5b1d6cdbb8cfa0536f0d470f12b4b41ad83625012e575f0e3ecfe97f0", - "sha256:0e6cea102ffa16b737d11932c426f1dc14b5938cf7bc12e17269559c458ac334", - "sha256:263cf1e36862310bf5becfbc488e18d5d698941858860c5a8c079d1511b3b18e", - "sha256:28a8b2abb76042f5fd7bd720f7fea48c0fd3e82e9de0a1bf2c0de3812ce44a42", - "sha256:2ae7c57e22ad881af78075e0cea10a4c778e67234adc65c404391b417a4dda83", - "sha256:2cd0f4d314f4a2518e8970b6f299ae18cff7c44d4a1fc06fc713f791c3a9e3ea", - "sha256:2fa76ebcebe555cce90f16246edc3ad83ab65bb7b3d4ce408cf6bc67740c4f88", - "sha256:314d11564c00b77f6224d12eb3ddebe926c301e86b648a1835c5b28176c83eab", - "sha256:347e84fc88cc4cb646597f6d3a7ea0998f887ee8dc31c08587e9c3fd7b5ccef3", - "sha256:359c533bedc62c56415a1f5fcfd8279bc93453afdb0803307375ecf81c962402", - "sha256:393daac1bcf81b2a23e696b7b638eedc965e9e3d2112961a072b6cd8179ad2eb", - "sha256:3b3b8e36fd4c32c0825b4461372949ecd1585d326802b1321f8b6dc1d7e9318c", - "sha256:3c397b1b450f749a7e974d74c06d69bd22dd362142f370ef2bd32a684d6b480c", - "sha256:3d3146b1c3dcc8a1539e7cc094700b2be1e605a76f7c8f0979b6d3bde5ad4072", - "sha256:3ee647d84b83509b7271457bb428cc347037f437ead4b0b6e43b5eba35fec0aa", - "sha256:416ac51cabd54f587995c2b05421324700b22e98d3d0aa2cfaec985524d16f1d", - "sha256:451e16ae8bea3d95649317b463c9f95cd9022641ec884e3d63fc67841ae86dfe", - "sha256:45cb1a70eb00405ce3893041099655265fabcd9c4e1e50c330026e82257892c1", - "sha256:46d6800b45015f96b9d92ece229d92f2aef137d82906577d55fadeb9cf5fcb71", - "sha256:471312a7375571857a089342beccc1a63584315188560c7c0da7e0a23afd8a5c", - "sha256:471880c4c14e5a056a96cd224f5e71211997d40b4bf5e9fdded55dafab1f98f2", - "sha256:5384c527a9a004445c5074f1e20db83086c8ff1682a626676229aafd9cf9f7d1", - "sha256:57bb2acba798dc3740e913ffadd56b1fcef96f111e66f09e2a8db3050f1f12c8", - "sha256:58c33dc0e185dd97a9ac0288b3188d1be12b756eda67490e6ed6a75cf9491d79", - "sha256:59d0acd2976e1064f1b398a00e2c3e77ed0a157529779e23087d4c2fb8aaa416", - "sha256:5a6ed52f0b9bf8dcc64cc82cce0607a3dfed1dbb7e8c6f282adfccc7be9781de", - "sha256:5bc2431167adc50ba42ea3e5e5f5cd70d93e18ab7b2f95e724dd8e1bd2c38120", - "sha256:5cca7b4adb86d7470e0fc96037771981d740f0b4cb99776d5cb59cd0e6684a73", - "sha256:61dfa5ee9d7df297c859ac82b1226d8fefaf9c5113dc25c2c00ecad6feeeb04f", - "sha256:63c1d3a65acb2f9c92dce03c4e1758cc552f1ae5c78d79a44e3bb88d2fa71f3a", - "sha256:65c6e03cc0222eaf6aad57ff4ecc0a070451e23232bb48db4322cc45602cede0", - "sha256:67976d12ebfd61a3bc7d77b71a9589b4d61d0422282596cf58c62c3866916544", - "sha256:68a0a1d83d33d8367ddddb3e6bb4afbb0f92bd1dac2c72cd5e5ddc86bdafd3eb", - "sha256:6c5aeea71f018ebd3b9115c7cb13863dd850e98ca6b9258509de1246461a7e7f", - "sha256:754c99a9840839375ee251b38ac5964c0f369306eddb56804a073b6efdc0cd88", - "sha256:75a95c2358fcfdef3374cb8baf57f1064d73246d55e41683aaffb6cfe6862917", - "sha256:7688653574392d2eaeef75ddcd0b2de5b232d8730af29af56c5adf1df9ef8d6f", - "sha256:77ce6a332c7e362cb59b63f5edf730e83590d0ab4e59c2aa5bd79419a42e3449", - "sha256:7907419d150b19962138ecec81a17d4892ea440c184949dc29b358bc730caf69", - "sha256:79e45a4096ec8388cdeb04a9fa5e9371583bcb826964d55b8b66cbffe7b33c86", - "sha256:7bcbfbab4e1895d58ab7da1b5ce9a327764f0366911ba5b95406c9104bceacb0", - "sha256:80b0c9942430d731c786545da6be96d824a41a51742e3e374fedd9018ea43106", - "sha256:8b88641384e84a258b740801cd4dbc45c75f148ee674bec3149999adda4a8598", - "sha256:8d4dac7d97f15c653a5fedcafa82626bd6cee1450ccdaf84ffed7ea14f2b07a4", - "sha256:8d906d43e1592be4b25a587b7d96527cb67277542a5611e8ea9e996182fae410", - "sha256:8efb782f5a6c450589dbab4cb0f66f3a9026286333fe8f3a084399149af52f29", - "sha256:906e532c814e1d579138177a00ae835cd6becbf104d45ed9093a3aaf658f6a6a", - "sha256:90d4feb2e83dfe9ace6374a847e98ee9d1246ebadcc0cb765482e272c34e5820", - "sha256:911c43a4117915203c4cc8755e0f888e16c4676a82f61caee2f21b0c00e5b894", - "sha256:91d1a20bdaf3b25f3173ff44e54b1cfbc05f94c9e8133314eb2962a89e05d6e3", - "sha256:94c4262626424683feea0f3c34951d39d49d354722db2745c42aa6bb50ecd93b", - "sha256:96d7c1d35ee4a495df56c50c83df7af1c9688cce2e9e0edffdbf50889c167595", - "sha256:9869fa984c8670c8ab899a719eb7b516860a29bc26300a84d24d8c1b71eae3ec", - "sha256:98c03bd7f3339ff47de7ea9ac94a2b34580a8d4df69b50128bb6669e1191a895", - "sha256:995301f6740a421afc863a713fe62c0aaf564708d4aa057dfdf0f0f56525294b", - "sha256:998444debc8816b5d8d15f966e42751032d0f4c55300c48cc337f2b3e4f17d03", - "sha256:9a6847c92d9851b59b9f33f968c68e9e441f9a0f8fc972c5580c5cd7cbc6ee24", - "sha256:9bdfcb74b469b592972ed881bad57d22e2c0acc89f5e8c146782d0d90fb9f4bf", - "sha256:9f136a6e964830230912f75b5a116a21fe8e34128dcfd82285aa0ef07cb2c7bd", - "sha256:a0f0ab9df66eb34d58205913f4540e2ad17a175b05d81b0b7197bc57d000e829", - "sha256:a4b7a989c8f5a72ab1b2bbfa58105578753ae77b71ba33e7383a31ff75a504c4", - "sha256:a7b8aab50e5a288c9724d260feae25eda69582be84e97c012c80e1a5e7e03fb2", - "sha256:ad875277844cfaeca7fe299ddf8c8d8bfe271c3dc1caf14d454faa5cdbf2fa7a", - "sha256:add52c78a12196bc0fda2de087ba6c876ea677cbda2e3eba63546b26e8bf177b", - "sha256:b10163e586cc609f5f85c9b233195554d77b1e9a0801388907441aaeb22841c5", - "sha256:b24079a14c9596846bf7516fe75d1e2188d4a528364494859106a33d8b48be38", - "sha256:b281b5ff5fcc9dcbfe941ac5c7fcd4b6c065adad12d850f95c9d6f23c2652384", - "sha256:b3bb34bebaa1b78e562931a1687ff663d298013f78f972a534f36c523311a84d", - "sha256:b45e6445ac95ecb7d728604bae6538f40ccf4449b132b5428c09918523abc96d", - "sha256:ba0a31d00e8616149a5ab440d058ec2da621e05d744914774c4dde6837e1f545", - "sha256:baba2fd199b098c5544ef2536b2499d2e2155392973ad32687024bd8572a7d1c", - "sha256:bd13f0231f4788db619347b971ca5f319c5b7ebee151afc7c14632068c6261d3", - "sha256:bd3f6329340cef1c7ba9611bd038f2d523cea79f09f9c8f6b0553caba59ec562", - "sha256:bdeb2c61611293f64ac1073f4bf6723b67d291905308a7de9bb2ca87464e3273", - "sha256:bef24d3e4ae2c985034439f449e3f9e06bf579974ce0e53d8a507a1577d5b2ab", - "sha256:c0665d85535192098420428c779361b8823d3d7ec4848c6af3abb93bc5c915bf", - "sha256:c5668dac86a869349828db5fc928ee3f58d450dce2c85607067d581f745e4fb1", - "sha256:c9b9305004d7e4e6a824f4f19b6d8f32b3578aad6f19fc1122aaf320cbe3dc83", - "sha256:ccb42ca0a4a46232d716779421bbebbcad23c08d37c980f02cc3a6bd115ad277", - "sha256:ce6f2b66799971cbae5d6547acefa7231458289e0ad481d0be0740535da38d8b", - "sha256:d36b8fffe8b248a1b961c86fbdfa0129dfce878731d169ede7fa2631447331be", - "sha256:d3dd5523ed258ad58fed7e364c92a9360d1af8a9371e0822bd0146bdf017ef4c", - "sha256:d416f2088ac8f12daacffbc2e8918ef4d6be8568e9d7155c83b7cebed49d2322", - "sha256:d4fafc2eb5d83f4647331267808c7e0c5722c25a729a614dc2b90479cafa78bd", - "sha256:d5c8b17f6e8f29138678834cf8518049e740385eb2dbf736e8f07fc6587ec682", - "sha256:d9270fbf038bf34ffca4855bcda6e082e2c7f906b9eb8d9a8ce82691166060f7", - "sha256:dcc37d9d708784726fafc9c5e1232de655a009dbf97946f117aefa38d5985a0f", - "sha256:ddbb2b386128d8eca92bd9ca74e80f73fe263bcca7aa419f5b4cbc1661e19741", - "sha256:e1e5d0a25aea8b691a00d6b54b28ac514c8cc0d8646d05f7ca6cb64b97358250", - "sha256:e5c88b2f13bcf55fee78ea83567b9fe079ba1a4bef8b35c376043440040f7edb", - "sha256:e7eca8b89e56fb8c6c26dd3e09bd41b24789022acf1cf13358e96f1cafd8cae3", - "sha256:e8746ce968be22a8a1801bf4a23e565f9687088580c3ed07af5846580dd97f76", - "sha256:ec7248673ffc7104b54e4957cee38b2f3075a13442348c8d651777bf41aa45ee", - "sha256:ecb6c88d7946166d783a635efc89f9a1ff11c33d680a20df9657b6902a1d133b", - "sha256:ef3b048822dca6d231d8a8ba21069844ae38f5d83889b9b690bf17d2acc7d099", - "sha256:f133d05aaf623519f45e16ab77526e1e70d4e1308e084c2fb4cedb1a0c764bbb", - "sha256:f3292d384537b9918010769b82ab3e79fca8b23d74f56fc69a679106a3e2c2cf", - "sha256:f774841bb0e8588505002962c02da420bcfb4c5056e87a139c6e45e745c0e2e2", - "sha256:f9499c70c19ff0fbe1007043acb5ad15c1dec7d8e84ab429bca8c87138e8f85c", - "sha256:f99de52b8fbdb2a8f5301ae5fc0f9e6b3ba30d1d5fc0421956967edcc6914242", - "sha256:fa25a620eed2a419acc2cf10135b995f8f0ce78ad00534d729aa761e4adcef8a", - "sha256:fbf558551cf415586e91160d69ca6416f3fce0b86175b64e4293644a7416b81b", - "sha256:fc82269d24860cfa859b676d18850cbb8e312dcd7eada09e7d5b007e2f3d9eb1", - "sha256:ff832cce719edd11266ca32bc74a626b814fff236824aa1aeaad399b69fe6eae" + "sha256:007137c9ac9ad5ea21e6ad97d3489af654381324d5d3ba614c323f60dab8fae6", + "sha256:034da5fc55d9f8da09015d368f519478a52675e558c989bfcb5cf6d4e16a7d2a", + "sha256:05590cdbc6b902101d0e65d6a4780af14dc22914cc6ab995d99b85af45362cc9", + "sha256:070672c258581c8e4f640b5159297580a9974b026043bd4ab0470be9ed324f1f", + "sha256:0aca98bc423eb7d153214b2df397c6421ba6373d3397b26c057af3c904452e37", + "sha256:0bed0e799e6120b9c32756203fb9dfe8ca2fb8467fed830c34c877e25638c3fc", + "sha256:0d987a3ae5a71c6226b203cfd298720e0086c7fe7c74f35fa8edddfbd6597eed", + "sha256:0eaa83fc4c1e271c24eaf8fb083cbccef8fde77ec8cd45f3c35a9a123e6da097", + "sha256:160c7e0a5eb178011e72892f99f918c04a131f36056d10d9c1afb223fc952c2d", + "sha256:17bf5a931c7f6618023cdacc7081f3f266aecb68ca692adac015c383a134ca52", + "sha256:17c412bad2eb9468e876f556eb4ee910e62d721d2c7a53c7fa31e643d35352e6", + "sha256:18c8dc3b7468d8b4bdf60ce9d7141897da103c7a4690157b32b60acb45e333e6", + "sha256:1a534f43bc738181aa7cbbaf48e3eca62c76453a40a746ab95d4b27b1111a7d2", + "sha256:1c17211bc037c7d88e85ed8b7d8f7e52db6dc8eca5590d162717c654550f7282", + "sha256:1f3496d76b89d9429a656293744ceca4d2ac2a10ae59b84c1da9b5165f429ad3", + "sha256:1fcc03fa4997c447dce58264e93b5aa2d57714fbe0f06c07b7785ae131512732", + "sha256:226af7dcb51fdb0109f0016449b357e182ea0ceb6b47dfb5999d569e5db161d5", + "sha256:23f4aad749d13698f3f7b64aad34f5fc02d6f20f05999eebc96b89b01262fb18", + "sha256:25bf2374a2a8433633c65ccb9553350d5e17e60c8eb4de4d92cc6bd60f01d306", + "sha256:28ad5233e9c3b52d76196c696e362508959741e1a005fb8fa03b51aea156088f", + "sha256:28c812d9757fe8acecc910c9ac9dafd2ce968c00f9e619db09e9f8f54c3a68a3", + "sha256:29c6a4635eef69d68a00321e12a7d2559fe2dfccfa8efae3ffb8e91cd0b36a8b", + "sha256:29c7947c594e105cb9e6c466bace8532dc1ca02d498684128b339799f5248277", + "sha256:2a50625acdc7801bc6f74698c5c583a491c61d73c6b7ea4dee3901bb99adb27a", + "sha256:2ae90ff9dad33a1cfe947d2c40cb9cb5e600d759ac4f0fd22616ce6540f72797", + "sha256:2c4a71d5d6e7b28a47a394c0471b7e77a0661e2d651e7ae91e0cab0a587859ca", + "sha256:2ea4ad4e6a12e454de05f2949d4beddb52460f3de7c8b9d5c46fbb7d7222e02c", + "sha256:2eb7735ee73ca1b0d71e0e67c3739c689067f055c764f73aac4cc8ecf958ee3f", + "sha256:31507f7b47cc1ead1f6e86927f8ebb196a0bab043f6345ce070f412a59bf87b5", + "sha256:35cffef589bcdc587d06f9149f8d5e9e8859920a071df5a2671de2213bef592a", + "sha256:367b4f689786fca726ef7a6c5ba606958b145b9340a5e4808132cc65759abd44", + "sha256:39887ac397ff35b7b775db7201095fc6310a35fdbae85bac4523f7eb3b840e20", + "sha256:3a495b30fc91db2db25120df5847d9833af237546fd59170701acd816ccc01c4", + "sha256:3b55a4229ce5da9497dd0452b914556ae58e96a4381bb6f59f1305dfd7e53fc8", + "sha256:402b190912935d3db15b03e8f7485812db350d271b284ded2b80d2e5704be780", + "sha256:43a47408ac52647dfabbc66a25b05b6a61700b5165807e3fbd40063fcaf46386", + "sha256:4661c88db4a9e0f958c8abc2b97472e23061f0bc737f6f6179d7a27024e1faa5", + "sha256:46a446c212e58456b23af260f3d9fb785054f3e3653dbf7279d8f2b5546b21c2", + "sha256:470d4a4f6d48fb34e92d768b4e8a5cc3780db0d69107abf1cd7ff734b9766eb0", + "sha256:49d34ab71db5a9c292a7644ce74190b1dd5a3475612eefb1f8be1d6961441971", + "sha256:4d29ab8592b6ad12ebbf92ac2ed2bedcfd1cec192d8e559e2e099f648570e19b", + "sha256:4d80b1dd99c1942f74ed608ddb38b181b87476c6a966a88a950c7dee118fdf50", + "sha256:4da04c48873a6abdd71811c5e163bd656ee1b957971db7f35140a2d573f6949c", + "sha256:4f78c88905461a9203eac9faac157a2a0dbba84a0fd09fd29315db27be40af9f", + "sha256:4ff9dc6bc1664bb9eec25cd17506ef6672d506115095411e237d571e92a58231", + "sha256:5506f06d7dc6ecf1efacb4a013b1f05071bb24b76350832c96449f4a2d95091c", + "sha256:55cf66647e49d4621a7e20c8d13511ef1fe1efbbccf670811864452487007e08", + "sha256:5a509df7d0a83a4b178d0f937ef14286659225ef4e8812e05580776c70e155d5", + "sha256:5c2b3bfd4b9689919db068ac6c9911f3fcb231c39f7dd30e3138be94896d18e6", + "sha256:6835dd60355593de10350394242b5757fbbd88b25287314316f266e24c61d073", + "sha256:689c5d781014956a4a6de61d74ba97b23547e431e9e7d64f27d4922ba96e9d6e", + "sha256:6a96179a24b14fa6428cbfc08641c779a53f8fcec43644030328f44034c7f1f4", + "sha256:6ace4f71f1900a548f48407fc9be59c6ba9d9aaf658c2eea6cf2779e72f9f317", + "sha256:6b274e0762c33c7471f1a7471d1a2085b1a35eba5cdc48d2ae319f28b6fc4de3", + "sha256:706e794564bec25819d21a41c31d4df2d48e1cc4b061e8d345d7fb4dd3e94072", + "sha256:70fc7fcf0410d16ebdda9b26cbd8bf8d803d220a7f3522e060a69a9c87bf7bad", + "sha256:7133d0a1677aec369d67dd78520d3fa96dd7f3dcec99d66c1762870e5ea1a50a", + "sha256:7445be39143a8aa4faec43b076e06944b8f9d0701b669df4af200531b21e40bb", + "sha256:76589c020680778f06b7e0b193f4b6dd66d470234a16e1df90329f5e14a171cd", + "sha256:76589f2cd6b77b5bdea4fca5992dc1c23389d68b18ccc26a53680ba2dc80ff2f", + "sha256:77eb0968da535cba0470a5165468b2cac7772cfb569977cff92e240f57e31bef", + "sha256:794a4562dcb374f7dbbfb3f51d28fb40123b5a2abadee7b4091f93054909add5", + "sha256:7ad1bc8d1b7a18497dda9600b12dc193c577beb391beae5cd2349184db40f187", + "sha256:7f98f6dfa8b8ccaf39163ce872bddacca38f6a67289116c8937a02e30bbe9711", + "sha256:8423c1877d72c041f2c263b1ec6e34360448decfb323fa8b94e85883043ef988", + "sha256:8685fa9c25ff00f550c1fec650430c4b71e4e48e8d852f7ddcf2e48308038640", + "sha256:878206a45202247781472a2d99df12a176fef806ca175799e1c6ad263510d57c", + "sha256:89289a5ee32ef6c439086184529ae060c741334b8970a6855ec0b6ad3ff28764", + "sha256:8ab5cad923cc95c87bffee098a27856c859bd5d0af31bd346035aa816b081fe1", + "sha256:8b435f2753621cd36e7c1762156815e21c985c72b19135dac43a7f4f31d28dd1", + "sha256:8be4700cd8bb02cc454f630dcdf7cfa99de96788b80c51b60fe2fe1dac480289", + "sha256:8c997098cc65e3208eca09303630e84d42718620e83b733d0fd69543a9cab9cb", + "sha256:8ea039387c10202ce304af74def5021e9adc6297067f3441d348d2b633e8166a", + "sha256:8f7e66c7113c684c2b3f1c83cdd3376103ee0ce4c49ff80a648643e57fb22218", + "sha256:90412f2db8c02a3864cbfc67db0e3dcdbda336acf1c469526d3e869394fe001c", + "sha256:92a78853d7280bffb93df0a4a6a2498cba10ee793cc8076ef797ef2f74d107cf", + "sha256:989d842dc06dc59feea09e58c74ca3e1678c812a4a8a2a419046d711031f69c7", + "sha256:9cb3a6460cdea8fe8194a76de8895707e61ded10ad0be97188cc8463ffa7e3a8", + "sha256:9dd8cd1aeb00775f527ec60022004d030ddc51d783d056e3e23e74e623e33726", + "sha256:9ed69074a610fad1c2fda66180e7b2edd4d31c53f2d1872bc2d1211563904cd9", + "sha256:9edda2df81daa129b25a39b86cb57dfdfe16f7ec15b42b19bfac503360d27a93", + "sha256:a2224fa4a4c2ee872886ed00a571f5e967c85e078e8e8c2530a2fb01b3309b88", + "sha256:a4f96f0d88accc3dbe4a9025f785ba830f968e21e3e2c6321ccdfc9aef755115", + "sha256:aedd5dd8692635813368e558a05266b995d3d020b23e49581ddd5bbe197a8ab6", + "sha256:aee22939bb6075e7afededabad1a56a905da0b3c4e3e0c45e75810ebe3a52672", + "sha256:b1d464cb8d72bfc1a3adc53305a63a8e0cac6bc8c5a07e8ca190ab8d3faa43c2", + "sha256:b8f86dd868d41bea9a5f873ee13bf5551c94cf6bc51baebc6f85075971fe6eea", + "sha256:bc6bee759a6bddea5db78d7dcd609397449cb2d2d6587f48f3ca613b19410cfc", + "sha256:bea2acdd8ea4275e1278350ced63da0b166421928276c7c8e3f9729d7402a57b", + "sha256:bfa832bfa540e5b5c27dcf5de5d82ebc431b82c453a43d141afb1e5d2de025fa", + "sha256:c0e6091b157d48cbe37bd67233318dbb53e1e6327d6fc3bb284afd585d141003", + "sha256:c3789bd5768ab5618ebf09cef6ec2b35fed88709b104351748a63045f0ff9797", + "sha256:c530e1eecd036ecc83c3407f77bb86feb79916d4a33d11394b8234f3bd35b940", + "sha256:c811cfcd6a9bf680236c40c6f617187515269ab2912f3d7e8c0174898e2519db", + "sha256:c92d73464b886931308ccc45b2744e5968cbaade0b1d6aeb40d8ab537765f5bc", + "sha256:cccba051221b916a4f5e538997c45d7d136a5646442b1231b916d0164067ea27", + "sha256:cdeabcff45d1c219636ee2e54d852262e5c2e085d6cb476d938aee8d921356b3", + "sha256:ced65e5a985398827cc9276b93ef6dfabe0273c23de8c7931339d7e141c2818e", + "sha256:d049df610ac811dcffdc147153b414147428567fbbc8be43bb8885f04db39d98", + "sha256:dacd995031a01d16eec825bf30802fceb2c3791ef24bcce48fa98ce40918c27b", + "sha256:ddf33d97d2f52d89f6e6e7ae66ee35a4d9ca6f36eda89c24591b0c40205a3629", + "sha256:ded0fc7d90fe93ae0b18059930086c51e640cdd3baebdc783a695c77f123dcd9", + "sha256:e3e0210287329272539eea617830a6a28161fbbd8a3271bf4150ae3e58c5d0e6", + "sha256:e6fa2e3e683f34aea77de8112f6483803c96a44fd726d7358b9888ae5bb394ec", + "sha256:ea0eb6af8a17fa272f7b98d7bebfab7836a0d62738e16ba380f440fceca2d951", + "sha256:ea7f69de383cb47522c9c208aec6dd17697db7875a4674c4af3f8cfdac0bdeae", + "sha256:eac5174677da084abf378739dbf4ad245661635f1600edd1221f150b165343f4", + "sha256:fc4f7a173a5609631bb0c42c23d12c49df3966f89f496a51d3eb0ec81f4519d6", + "sha256:fdb5b3e311d4d4b0eb8b3e8b4d1b0a512713ad7e6a68791d0923d1aec433d919" ], "markers": "python_version >= '3.7'", - "version": "==26.1.0" + "version": "==26.2.0" }, "redis": { "hashes": [ @@ -2025,10 +2088,10 @@ }, "rich": { "hashes": [ - "sha256:4edbae314f59eb482f54e9e30bf00d33350aaa94f4bfcd4e9e3110e64d0d7222", - "sha256:9be308cb1fe2f1f57d67ce99e95af38a1e2bc71ad9813b0e247cf7ffbcc3a432" + "sha256:2e85306a063b9492dffc86278197a60cbece75bcb766022f3436f567cae11bdc", + "sha256:a5ac1f1cd448ade0d59cc3356f7db7a7ccda2c8cbae9c7a90c28ff463d3e91f4" ], - "version": "==13.7.1" + "version": "==13.8.0" }, "s3transfer": { "hashes": [ @@ -2040,19 +2103,19 @@ }, "selenium": { "hashes": [ - "sha256:128d099e66284437e7128d2279176ec7a06e6ec7426e167f5d34987166bd8f46", - "sha256:3a8d9f23dc636bd3840dd56f00c2739e32ec0c1e34a821dd553e15babef24477" + "sha256:42c23f60753d5415b261b236cecbd69bd4eb5271e1563915f546b443cb6b71c6", + "sha256:88281e5b5b90fe231868905d5ea745b9ee5e30db280b33498cc73fb0fa06d571" ], "markers": "python_version >= '3.8'", - "version": "==4.23.1" + "version": "==4.24.0" }, "sentry-sdk": { "hashes": [ - "sha256:7a8d5163d2ba5c5f4464628c6b68f85e86972f7c636acc78aed45c61b98b7a5e", - "sha256:8763840497b817d44c49b3fe3f5f7388d083f2337ffedf008b2cdb63b5c86dc6" + "sha256:6beede8fc2ab4043da7f69d95534e320944690680dd9a963178a49de71d726c6", + "sha256:8d4a576f7a98eb2fdb40e13106e41f330e5c79d72a68be1316e7852cf4995260" ], "index": "pypi", - "version": "==2.12.0" + "version": "==2.13.0" }, "service-identity": { "hashes": [ @@ -2063,11 +2126,11 @@ }, "setuptools": { "hashes": [ - "sha256:5a03e1860cf56bb6ef48ce186b0e557fdba433237481a9a625176c2831be15d1", - "sha256:8d243eff56d095e5817f796ede6ae32941278f542e0f941867cc05ae52b162ec" + "sha256:0274581a0037b638b9fc1c6883cc71c0210865aaa76073f7882376b641b84e8f", + "sha256:a85e96b8be2b906f3e3e789adec6a9323abf79758ecfa3065bd740d81158b11e" ], "markers": "python_version >= '3.8'", - "version": "==72.1.0" + "version": "==74.0.0" }, "setuptools-scm": { "hashes": [ @@ -2109,11 +2172,11 @@ }, "soupsieve": { "hashes": [ - "sha256:5663d5a7b3bfaeee0bc4372e7fc48f9cff4940b3eec54a6451cc5299f1097690", - "sha256:eaa337ff55a1579b6549dc679565eac1e3d000563bcb1c8ab0d0fefbc0c2cdc7" + "sha256:e2e68417777af359ec65daac1057404a3c8a5455bb8abc36f1a9866ab1a51abb", + "sha256:e72c4ff06e4fb6e4b5a9f0f55fe6e81514581fca1515028625d0f299c602ccc9" ], "markers": "python_version >= '3.8'", - "version": "==2.5" + "version": "==2.6" }, "sqlparse": { "hashes": [ @@ -2148,11 +2211,11 @@ }, "trio": { "hashes": [ - "sha256:6d2fe7ee656146d598ec75128ff4a2386576801b42b691f4a91cc2c18508544a", - "sha256:998bbdc5797621e1976c86820b1bc341cc66b51d2618a31cc8720ddd7df8affe" + "sha256:0346c3852c15e5c7d40ea15972c4805689ef2cb8b5206f794c9c19450119f3a4", + "sha256:c5237e8133eb0a1d72f09a971a55c28ebe69e351c783fc64bc37db8db8bbe1d0" ], "markers": "python_version >= '3.8'", - "version": "==0.26.1" + "version": "==0.26.2" }, "trio-websocket": { "hashes": [ @@ -2165,7 +2228,6 @@ "twisted": { "extras": [ "http2", - "tls", "tls" ], "hashes": [ @@ -2173,7 +2235,6 @@ "sha256:734832ef98108136e222b5230075b1079dad8a3fc5637319615619a7725b0c81" ], "index": "pypi", - "markers": "python_full_version >= '3.8.0'", "version": "==24.7.0" }, "txaio": { @@ -2259,11 +2320,11 @@ }, "werkzeug": { "hashes": [ - "sha256:097e5bfda9f0aba8da6b8545146def481d06aa7d3266e7448e2cccf67dd8bd18", - "sha256:fc9645dc43e03e4d630d23143a04a7f947a9a3b5727cd535fdfe155a17cc48c8" + "sha256:02c9eb92b7d6c06f31a782811505d2157837cea66aaede3e217c7c27c039476c", + "sha256:34f2371506b250df4d4f84bfe7b0921e4762525762bbd936614909fe25cd7306" ], "markers": "python_version >= '3.8'", - "version": "==3.0.3" + "version": "==3.0.4" }, "whitenoise": { "hashes": [ @@ -2291,43 +2352,43 @@ }, "zope-interface": { "hashes": [ - "sha256:03bd5c0db82237bbc47833a8b25f1cc090646e212f86b601903d79d7e6b37031", - "sha256:03f1452d5d1f279184d5bdb663a3dc39902d9320eceb63276240791e849054b6", - "sha256:10ebac566dd0cec66f942dc759d46a994a2b3ba7179420f0e2130f88f8a5f400", - "sha256:192b7a792e3145ed880ff6b1a206fdb783697cfdb4915083bfca7065ec845e60", - "sha256:19c829d52e921b9fe0b2c0c6a8f9a2508c49678ee1be598f87d143335b6a35dc", - "sha256:3f3495462bc0438b76536a0e10d765b168ae636092082531b88340dc40dcd118", - "sha256:3f52050c6a10d4a039ec6f2c58e5b3ade5cc570d16cf9d102711e6b8413c90e6", - "sha256:400d06c9ec8dbcc96f56e79376297e7be07a315605c9a2208720da263d44d76f", - "sha256:4ec212037becf6d2f705b7ed4538d56980b1e7bba237df0d8995cbbed29961dc", - "sha256:51d5713e8e38f2d3ec26e0dfdca398ed0c20abda2eb49ffc15a15a23eb8e5f6d", - "sha256:52f5253cca1b35eaeefa51abd366b87f48f8714097c99b131ba61f3fdbbb58e7", - "sha256:5566fd9271c89ad03d81b0831c37d46ae5e2ed211122c998637130159a120cf1", - "sha256:55bbcc74dc0c7ab489c315c28b61d7a1d03cf938cc99cc58092eb065f120c3a5", - "sha256:696c2a381fc7876b3056711717dba5eddd07c2c9e5ccd50da54029a1293b6e43", - "sha256:6ba4b3638d014918b918aa90a9c8370bd74a03abf8fcf9deb353b3a461a59a84", - "sha256:7039e624bcb820f77cc2ff3d1adcce531932990eee16121077eb51d9c76b6c14", - "sha256:88d108d004e0df25224de77ce349a7e73494ea2cb194031f7c9687e68a88ec9b", - "sha256:8c1dff87b30fd150c61367d0e2cdc49bb55f8b9fd2a303560bbc24b951573ae1", - "sha256:9a8195b99e650e6f329ce4e5eb22d448bdfef0406404080812bc96e2a05674cb", - "sha256:af0b33f04677b57843d529b9257a475d2865403300b48c67654c40abac2f9f24", - "sha256:b419f2144e1762ab845f20316f1df36b15431f2622ebae8a6d5f7e8e712b413c", - "sha256:b59deb0ddc7b431e41d720c00f99d68b52cb9bd1d5605a085dc18f502fe9c47f", - "sha256:bc0615351221926a36a0fbcb2520fb52e0b23e8c22a43754d9cb8f21358c33c0", - "sha256:c203d82069ba31e1f3bc7ba530b2461ec86366cd4bfc9b95ec6ce58b1b559c34", - "sha256:ce6cbb852fb8f2f9bb7b9cdca44e2e37bce783b5f4c167ff82cb5f5128163c8f", - "sha256:d33cb526efdc235a2531433fc1287fcb80d807d5b401f9b801b78bf22df560dd", - "sha256:da0cef4d7e3f19c3bd1d71658d6900321af0492fee36ec01b550a10924cffb9c", - "sha256:da21e7eec49252df34d426c2ee9cf0361c923026d37c24728b0fa4cc0599fd03", - "sha256:ea8d51e5eb29e57d34744369cd08267637aa5a0fefc9b5d33775ab7ff2ebf2e3", - "sha256:ec4e87e6fdc511a535254daa122c20e11959ce043b4e3425494b237692a34f1c", - "sha256:f0f5fda7cbf890371a59ab1d06512da4f2c89a6ea194e595808123c863c38eff", - "sha256:f32ca483e6ade23c7caaee9d5ee5d550cf4146e9b68d2fb6c68bac183aa41c37", - "sha256:f749ca804648d00eda62fe1098f229b082dfca930d8bad8386e572a6eafa7525", - "sha256:f89a420cf5a6f2aa7849dd59e1ff0e477f562d97cf8d6a1ee03461e1eec39887" + "sha256:01e6e58078ad2799130c14a1d34ec89044ada0e1495329d72ee0407b9ae5100d", + "sha256:064ade95cb54c840647205987c7b557f75d2b2f7d1a84bfab4cf81822ef6e7d1", + "sha256:11fa1382c3efb34abf16becff8cb214b0b2e3144057c90611621f2d186b7e1b7", + "sha256:1bee1b722077d08721005e8da493ef3adf0b7908e0cd85cc7dc836ac117d6f32", + "sha256:1eeeb92cb7d95c45e726e3c1afe7707919370addae7ed14f614e22217a536958", + "sha256:21a207c6b2c58def5011768140861a73f5240f4f39800625072ba84e76c9da0b", + "sha256:2545d6d7aac425d528cd9bf0d9e55fcd47ab7fd15f41a64b1c4bf4c6b24946dc", + "sha256:2c4316a30e216f51acbd9fb318aa5af2e362b716596d82cbb92f9101c8f8d2e7", + "sha256:35062d93bc49bd9b191331c897a96155ffdad10744ab812485b6bad5b588d7e4", + "sha256:382d31d1e68877061daaa6499468e9eb38eb7625d4369b1615ac08d3860fe896", + "sha256:3aa8fcbb0d3c2be1bfd013a0f0acd636f6ed570c287743ae2bbd467ee967154d", + "sha256:3d4b91821305c8d8f6e6207639abcbdaf186db682e521af7855d0bea3047c8ca", + "sha256:3de1d553ce72868b77a7e9d598c9bff6d3816ad2b4cc81c04f9d8914603814f3", + "sha256:3fcdc76d0cde1c09c37b7c6b0f8beba2d857d8417b055d4f47df9c34ec518bdd", + "sha256:5112c530fa8aa2108a3196b9c2f078f5738c1c37cfc716970edc0df0414acda8", + "sha256:53d678bb1c3b784edbfb0adeebfeea6bf479f54da082854406a8f295d36f8386", + "sha256:6195c3c03fef9f87c0dbee0b3b6451df6e056322463cf35bca9a088e564a3c58", + "sha256:6d04b11ea47c9c369d66340dbe51e9031df2a0de97d68f442305ed7625ad6493", + "sha256:6dd647fcd765030638577fe6984284e0ebba1a1008244c8a38824be096e37fe3", + "sha256:799ef7a444aebbad5a145c3b34bff012b54453cddbde3332d47ca07225792ea4", + "sha256:7d92920416f31786bc1b2f34cc4fc4263a35a407425319572cbf96b51e835cd3", + "sha256:7e0c151a6c204f3830237c59ee4770cc346868a7a1af6925e5e38650141a7f05", + "sha256:84f8794bd59ca7d09d8fce43ae1b571be22f52748169d01a13d3ece8394d8b5b", + "sha256:95e5913ec718010dc0e7c215d79a9683b4990e7026828eedfda5268e74e73e11", + "sha256:9b9369671a20b8d039b8e5a1a33abd12e089e319a3383b4cc0bf5c67bd05fe7b", + "sha256:ab985c566a99cc5f73bc2741d93f1ed24a2cc9da3890144d37b9582965aff996", + "sha256:af94e429f9d57b36e71ef4e6865182090648aada0cb2d397ae2b3f7fc478493a", + "sha256:c96b3e6b0d4f6ddfec4e947130ec30bd2c7b19db6aa633777e46c8eecf1d6afd", + "sha256:cd2690d4b08ec9eaf47a85914fe513062b20da78d10d6d789a792c0b20307fb1", + "sha256:d3b7ce6d46fb0e60897d62d1ff370790ce50a57d40a651db91a3dde74f73b738", + "sha256:d976fa7b5faf5396eb18ce6c132c98e05504b52b60784e3401f4ef0b2e66709b", + "sha256:db6237e8fa91ea4f34d7e2d16d74741187e9105a63bbb5686c61fea04cdbacca", + "sha256:ecd32f30f40bfd8511b17666895831a51b532e93fc106bfa97f366589d3e4e0e", + "sha256:f418c88f09c3ba159b95a9d1cfcdbe58f208443abb1f3109f4b9b12fd60b187c" ], "markers": "python_version >= '3.8'", - "version": "==7.0.1" + "version": "==7.0.3" }, "zope.event": { "hashes": [ @@ -2580,60 +2641,62 @@ }, "pyyaml": { "hashes": [ - "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5", - "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc", - "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df", - "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741", - "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206", - "sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27", - "sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595", - "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62", - "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98", - "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696", - "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290", - "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9", - "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d", - "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6", - "sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867", - "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47", - "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486", - "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6", - "sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3", - "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007", - "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938", - "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0", - "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c", - "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735", - "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d", - "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28", - "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4", - "sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba", - "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8", - "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef", - "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5", - "sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd", - "sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3", - "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0", - "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515", - "sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c", - "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c", - "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924", - "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34", - "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43", - "sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859", - "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673", - "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54", - "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a", - "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b", - "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab", - "sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa", - "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c", - "sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585", - "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d", - "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f" + "sha256:01179a4a8559ab5de078078f37e5c1a30d76bb88519906844fd7bdea1b7729ff", + "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48", + "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086", + "sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e", + "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133", + "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5", + "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484", + "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee", + "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5", + "sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68", + "sha256:24471b829b3bf607e04e88d79542a9d48bb037c2267d7927a874e6c205ca7e9a", + "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf", + "sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99", + "sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8", + "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85", + "sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19", + "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc", + "sha256:43fa96a3ca0d6b1812e01ced1044a003533c47f6ee8aca31724f78e93ccc089a", + "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1", + "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317", + "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c", + "sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631", + "sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d", + "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652", + "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5", + "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e", + "sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b", + "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8", + "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476", + "sha256:82d09873e40955485746739bcb8b4586983670466c23382c19cffecbf1fd8706", + "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563", + "sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237", + "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b", + "sha256:9056c1ecd25795207ad294bcf39f2db3d845767be0ea6e6a34d856f006006083", + "sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180", + "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425", + "sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e", + "sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f", + "sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725", + "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183", + "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab", + "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774", + "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725", + "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e", + "sha256:d7fded462629cfa4b685c5416b949ebad6cec74af5e2d42905d41e257e0869f5", + "sha256:d84a1718ee396f54f3a086ea0a66d8e552b2ab2017ef8b420e92edbc841c352d", + "sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290", + "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44", + "sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed", + "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4", + "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba", + "sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12", + "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4" ], - "markers": "python_version >= '3.6'", - "version": "==6.0.1" + "markers": "python_version >= '3.8'", + "version": "==6.0.2" }, "sqlparse": { "hashes": [ From 6156c19af42796be2ada5ace24ed978f6c5ae78d Mon Sep 17 00:00:00 2001 From: Josh Stegmaier <104993387+joshuastegmaier@users.noreply.github.com> Date: Wed, 28 Aug 2024 11:36:38 -0400 Subject: [PATCH 23/28] Fixed ocr and guide close button being disabled after saving a transcription (#2513) --- concordia/static/js/src/contribute.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/concordia/static/js/src/contribute.js b/concordia/static/js/src/contribute.js index 2403045ea..03a429a22 100644 --- a/concordia/static/js/src/contribute.js +++ b/concordia/static/js/src/contribute.js @@ -27,6 +27,8 @@ function unlockControls($container) { // results handlers. // The only buttons unlocked here are ones that should always be unlocked. $container.find('button#open-guide').removeAttr('disabled'); + $container.find('button#ocr-transcription-button').removeAttr('disabled'); + $container.find('button#close-guide').removeAttr('disabled'); } $(document).on('keydown', function (event) { From c6cf5ee2db688415e70d6e8e302085d16799507f Mon Sep 17 00:00:00 2001 From: rasarkar <105652044+rasarkar@users.noreply.github.com> Date: Thu, 29 Aug 2024 07:05:02 -0400 Subject: [PATCH 24/28] CONCD-904 center within the square (#2515) --- concordia/static/scss/base.scss | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/concordia/static/scss/base.scss b/concordia/static/scss/base.scss index 9571be630..7dd3e5675 100644 --- a/concordia/static/scss/base.scss +++ b/concordia/static/scss/base.scss @@ -1315,8 +1315,8 @@ div.related-links { border: 1px solid black; flex: 1; margin: 0.5rem; - padding-bottom: 15px; - padding-top: 5px; + padding-bottom: 10px; + padding-top: 10px; text-align: center; } From 53d4cd652d904b5fc45b28b74afc6144a1a2974c Mon Sep 17 00:00:00 2001 From: Josh Stegmaier <104993387+joshuastegmaier@users.noreply.github.com> Date: Thu, 29 Aug 2024 14:07:54 -0400 Subject: [PATCH 25/28] Reverted upgrade to psycopg3 (#2516) --- Pipfile | 2 +- Pipfile.lock | 106 ++++++++++++++------------------------------------- 2 files changed, 29 insertions(+), 79 deletions(-) diff --git a/Pipfile b/Pipfile index 0b6b448cc..f4b8646a4 100644 --- a/Pipfile +++ b/Pipfile @@ -54,7 +54,7 @@ pillow = "*" prometheus-client = "*" xlsxwriter = "*" blinker = "<1.8.0" -psycopg = {version = ">=3.2", extras = ["binary"]} +psycopg2 = "*" [dev-packages] invoke = "*" diff --git a/Pipfile.lock b/Pipfile.lock index 243cb5483..157642672 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "e282373f8a58202477a9431b20da9a09a8e33fb9444f3026289da0ccd8c1d9d8" + "sha256": "884c7b6b2c524de8a4cc75faac6d34ee17c14451bb8c3ce3462952945995aef6" }, "pipfile-spec": 6, "requires": { @@ -156,19 +156,19 @@ }, "boto3": { "hashes": [ - "sha256:05bd349cf260ba177924f38d721e427e2b3a6dd0fa8a18fa4ffc1b889633b181", - "sha256:bfbdf7c8f2e3eb70e4309cdcf5c9c7940e1fed4f645cdfb52581e7e67d3c8cab" + "sha256:06eac4757de2a9c6020381205cb902f05964caad80b56e58c8931284a133b4cb", + "sha256:b9587131372a808bf6f99c5ed8b11be55cd113261cc3b437a917b4acc6c30bfe" ], "index": "pypi", - "version": "==1.35.7" + "version": "==1.35.8" }, "botocore": { "hashes": [ - "sha256:324e58518a92f2946bc6653e5e1272bc88d4b6313413f938bdc51cb90d34cbba", - "sha256:85e4b58f2c6e54dfbf52eaee72ebc9b70188fd1716d47f626874abadcee45512" + "sha256:4b820cf680ab5d778bd2fe4feeef1ff8a2b96d5c535d4638ab30f703ade282f8", + "sha256:adf389eb8fd87775f193300e3431d1353f925807ad3a39958172cb644f0d60a1" ], "index": "pypi", - "version": "==1.35.7" + "version": "==1.35.8" }, "brotli": { "hashes": [ @@ -1628,74 +1628,24 @@ "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'", "version": "==6.0.0" }, - "psycopg": { - "extras": [ - "binary" - ], - "hashes": [ - "sha256:dc8da6dc8729dacacda3cc2f17d2c9397a70a66cf0d2b69c91065d60d5f00cb7", - "sha256:ece385fb413a37db332f97c49208b36cf030ff02b199d7635ed2fbd378724175" + "psycopg2": { + "hashes": [ + "sha256:121081ea2e76729acfb0673ff33755e8703d45e926e416cb59bae3a86c6a4981", + "sha256:38a8dcc6856f569068b47de286b472b7c473ac7977243593a288ebce0dc89516", + "sha256:426f9f29bde126913a20a96ff8ce7d73fd8a216cfb323b1f04da402d452853c3", + "sha256:5e0d98cade4f0e0304d7d6f25bbfbc5bd186e07b38eac65379309c4ca3193efa", + "sha256:7e2dacf8b009a1c1e843b5213a87f7c544b2b042476ed7755be813eaf4e8347a", + "sha256:a7653d00b732afb6fc597e29c50ad28087dcb4fbfb28e86092277a559ae4e693", + "sha256:ade01303ccf7ae12c356a5e10911c9e1c51136003a9a1d92f7aa9d010fb98372", + "sha256:bac58c024c9922c23550af2a581998624d6e02350f4ae9c5f0bc642c633a2d5e", + "sha256:c92811b2d4c9b6ea0285942b2e7cac98a59e166d59c588fe5cfe1eda58e72d59", + "sha256:d1454bde93fb1e224166811694d600e746430c006fbb031ea06ecc2ea41bf156", + "sha256:d735786acc7dd25815e89cc4ad529a43af779db2e25aa7c626de864127e5a024", + "sha256:de80739447af31525feddeb8effd640782cf5998e1a4e9192ebdf829717e3913", + "sha256:ff432630e510709564c01dafdbe996cb552e0b9f3f065eb89bdce5bd31fabf4c" ], "index": "pypi", - "version": "==3.2.1" - }, - "psycopg-binary": { - "hashes": [ - "sha256:059cbd4e6da2337e17707178fe49464ed01de867dc86c677b30751755ec1dc51", - "sha256:06a7aae34edfe179ddc04da005e083ff6c6b0020000399a2cbf0a7121a8a22ea", - "sha256:0879b5d76b7d48678d31278242aaf951bc2d69ca4e4d7cef117e4bbf7bfefda9", - "sha256:0ab58213cc976a1666f66bc1cb2e602315cd753b7981a8e17237ac2a185bd4a1", - "sha256:0b018631e5c80ce9bc210b71ea885932f9cca6db131e4df505653d7e3873a938", - "sha256:101472468d59c74bb8565fab603e032803fd533d16be4b2d13da1bab8deb32a3", - "sha256:1d353e028b8f848b9784450fc2abf149d53a738d451eab3ee4c85703438128b9", - "sha256:1d6833f607f3fc7b22226a9e121235d3b84c0eda1d3caab174673ef698f63788", - "sha256:21927f41c4d722ae8eb30d62a6ce732c398eac230509af5ba1749a337f8a63e2", - "sha256:28ada5f610468c57d8a4a055a8ea915d0085a43d794266c4f3b9d02f4288f4db", - "sha256:2e8213bf50af073b1aa8dc3cff123bfeedac86332a16c1b7274910bc88a847c7", - "sha256:302b86f92c0d76e99fe1b5c22c492ae519ce8b98b88d37ef74fda4c9e24c6b46", - "sha256:334046a937bb086c36e2c6889fe327f9f29bfc085d678f70fac0b0618949f674", - "sha256:33e6669091d09f8ba36e10ce678a6d9916e110446236a9b92346464a3565635e", - "sha256:3c838806eeb99af39f934b7999e35f947a8e577997cc892c12b5053a97a9057f", - "sha256:40bb515d042f6a345714ec0403df68ccf13f73b05e567837d80c886c7c9d3805", - "sha256:413977d18412ff83486eeb5875eb00b185a9391c57febac45b8993bf9c0ff489", - "sha256:415c3b72ea32119163255c6504085f374e47ae7345f14bc3f0ef1f6e0976a879", - "sha256:42781ba94e8842ee98bca5a7d0c44cc9d067500fedca2d6a90fa3609b6d16b42", - "sha256:463d55345f73ff391df8177a185ad57b552915ad33f5cc2b31b930500c068b22", - "sha256:4a42b8f9ab39affcd5249b45cac763ac3cf12df962b67e23fd15a2ee2932afe5", - "sha256:4c84fcac8a3a3479ac14673095cc4e1fdba2935499f72c436785ac679bec0d1a", - "sha256:592b27d6c46a40f9eeaaeea7c1fef6f3c60b02c634365eb649b2d880669f149f", - "sha256:62b1b7b07e00ee490afb39c0a47d8282a9c2822c7cfed9553a04b0058adf7e7f", - "sha256:6418712ba63cebb0c88c050b3997185b0ef54173b36568522d5634ac06153040", - "sha256:6f9e13600647087df5928875559f0eb8f496f53e6278b7da9511b4b3d0aff960", - "sha256:7066d3dca196ed0dc6172f9777b2d62e4f138705886be656cccff2d555234d60", - "sha256:73f9c9b984be9c322b5ec1515b12df1ee5896029f5e72d46160eb6517438659c", - "sha256:74d623261655a169bc84a9669890975c229f2fa6e19a7f2d10a77675dcf1a707", - "sha256:788ffc43d7517c13e624c83e0e553b7b8823c9655e18296566d36a829bfb373f", - "sha256:78c2007caf3c90f08685c5378e3ceb142bafd5636be7495f7d86ec8a977eaeef", - "sha256:7a84b5eb194a258116154b2a4ff2962ea60ea52de089508db23a51d3d6b1c7d1", - "sha256:7ce965caf618061817f66c0906f0452aef966c293ae0933d4fa5a16ea6eaf5bb", - "sha256:84837e99353d16c6980603b362d0f03302d4b06c71672a6651f38df8a482923d", - "sha256:8f28ff0cb9f1defdc4a6f8c958bf6787274247e7dfeca811f6e2f56602695fb1", - "sha256:921f0c7f39590763d64a619de84d1b142587acc70fd11cbb5ba8fa39786f3073", - "sha256:950fd666ec9e9fe6a8eeb2b5a8f17301790e518953730ad44d715b59ffdbc67f", - "sha256:9a997efbaadb5e1a294fb5760e2f5643d7b8e4e3fe6cb6f09e6d605fd28e0291", - "sha256:aa3931f308ab4a479d0ee22dc04bea867a6365cac0172e5ddcba359da043854b", - "sha256:af0469c00f24c4bec18c3d2ede124bf62688d88d1b8a5f3c3edc2f61046fe0d7", - "sha256:b0104a72a17aa84b3b7dcab6c84826c595355bf54bb6ea6d284dcb06d99c6801", - "sha256:b09e8a576a2ac69d695032ee76f31e03b30781828b5dd6d18c6a009e5a3d1c35", - "sha256:b140182830c76c74d17eba27df3755a46442ce8d4fb299e7f1cf2f74a87c877b", - "sha256:b1f087bd84bdcac78bf9f024ebdbfacd07fc0a23ec8191448a50679e2ac4a19e", - "sha256:c1d2b6438fb83376f43ebb798bf0ad5e57bc56c03c9c29c85bc15405c8c0ac5a", - "sha256:cad2de17804c4cfee8640ae2b279d616bb9e4734ac3c17c13db5e40982bd710d", - "sha256:cc304a46be1e291031148d9d95c12451ffe783ff0cc72f18e2cc7ec43cdb8c68", - "sha256:dc314a47d44fe1a8069b075a64abffad347a3a1d8652fed1bab5d3baea37acb2", - "sha256:f092114f10f81fb6bae544a0ec027eb720e2d9c74a4fcdaa9dd3899873136935", - "sha256:f34e369891f77d0738e5d25727c307d06d5344948771e5379ea29c76c6d84555", - "sha256:f8a509aeaac364fa965454e80cd110fe6d48ba2c80f56c9b8563423f0b5c3cfd", - "sha256:f8afb07114ea9b924a4a0305ceb15354ccf0ef3c0e14d54b8dbeb03e50182dd7", - "sha256:f99e59f8a5f4dcd9cbdec445f3d8ac950a492fc0e211032384d6992ed3c17eb7" - ], - "version": "==3.2.1" + "version": "==2.9.9" }, "pyasn1": { "hashes": [ @@ -2261,7 +2211,7 @@ "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d", "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8" ], - "markers": "python_version >= '3.8'", + "markers": "python_version < '3.11'", "version": "==4.12.2" }, "tzdata": { @@ -2274,11 +2224,11 @@ }, "urllib3": { "hashes": [ - "sha256:37a0344459b199fce0e80b0d3569837ec6b6937435c5244e7fd73fa6006830f3", - "sha256:3e3d753a8618b86d7de333b4223005f68720bcd6a7d2bcb9fbd2229ec7c1e429" + "sha256:0ed14ccfbf1c30a9072c7ca157e4319b70d65f623e91e7b32fadb2853431016e", + "sha256:40c2dc0c681e47eb8f90e7e27bf6ff7df2e677421fd46756da1161c39ca70d32" ], "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'", - "version": "==1.26.19" + "version": "==1.26.20" }, "vine": { "hashes": [ @@ -2711,7 +2661,7 @@ "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d", "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8" ], - "markers": "python_version >= '3.8'", + "markers": "python_version < '3.11'", "version": "==4.12.2" }, "virtualenv": { From 73d62544ec71cab4c2ab908163cc6958219901f5 Mon Sep 17 00:00:00 2001 From: rasarkar <105652044+rasarkar@users.noreply.github.com> Date: Fri, 30 Aug 2024 08:36:55 -0400 Subject: [PATCH 26/28] CONCD-903 move the button up (#2517) --- concordia/static/scss/base.scss | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/concordia/static/scss/base.scss b/concordia/static/scss/base.scss index 7dd3e5675..66d6e5e7f 100644 --- a/concordia/static/scss/base.scss +++ b/concordia/static/scss/base.scss @@ -613,6 +613,10 @@ $card-progress-height: 12px; vertical-align: baseline; } +#transcription-status-message { + max-width: 270px; +} + // Campaign small blocks .small-campaign-title { @@ -1133,7 +1137,7 @@ $card-progress-height: 12px; /* How to Guide */ #open-guide { border-radius: 0; - margin: 0 5px 0 9px; + margin: -14px 5px 0 9px; white-space: nowrap; } From 0edaa72479e39569cb6367f2d024af61b9d4e628 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 5 Sep 2024 09:11:53 -0400 Subject: [PATCH 27/28] Bump flask-cors from 4.0.1 to 5.0.0 in the pip group across 1 directory (#2518) Bumps the pip group with 1 update in the / directory: [flask-cors](https://github.com/corydolphin/flask-cors). Updates `flask-cors` from 4.0.1 to 5.0.0 - [Release notes](https://github.com/corydolphin/flask-cors/releases) - [Changelog](https://github.com/corydolphin/flask-cors/blob/main/CHANGELOG.md) - [Commits](https://github.com/corydolphin/flask-cors/compare/4.0.1...5.0.0) --- updated-dependencies: - dependency-name: flask-cors dependency-type: indirect dependency-group: pip ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Pipfile.lock | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/Pipfile.lock b/Pipfile.lock index 157642672..d450144d8 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -152,6 +152,7 @@ "sha256:e6820ff6fa4e4d1d8e2747c2283749c3f547e4fee112b98555cdcdae32996182" ], "index": "pypi", + "markers": "python_version >= '3.8'", "version": "==1.7.0" }, "boto3": { @@ -788,10 +789,11 @@ }, "flask-cors": { "hashes": [ - "sha256:eeb69b342142fdbf4766ad99357a7f3876a2ceb77689dc10ff912aac06c389e4", - "sha256:f2a704e4458665580c074b714c4627dd5a306b333deb9074d0b1794dfa2fb677" + "sha256:5aadb4b950c4e93745034594d9f3ea6591f734bb3662e16e255ffbf5e89c88ef", + "sha256:b9e307d082a9261c100d8fb0ba909eec6a228ed1b60a8315fd85f783d61910bc" ], - "version": "==4.0.1" + "index": "pypi", + "version": "==5.0.0" }, "flask-login": { "hashes": [ From 962273b3622370183c65f5cf1bb0d5e808f96d64 Mon Sep 17 00:00:00 2001 From: Jennifer Kuenning <72825410+jkueloc@users.noreply.github.com> Date: Fri, 6 Sep 2024 12:30:18 -0400 Subject: [PATCH 28/28] changed db instance type to one compatible withpostgresql v15.5 (#2522) --- cloudformation/infrastructure/rds.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cloudformation/infrastructure/rds.yaml b/cloudformation/infrastructure/rds.yaml index f49df9288..bb1e4b53f 100644 --- a/cloudformation/infrastructure/rds.yaml +++ b/cloudformation/infrastructure/rds.yaml @@ -41,10 +41,10 @@ Resources: AllocatedStorage: '20' AllowMajorVersionUpgrade: false AutoMinorVersionUpgrade: true - DBInstanceClass: db.t2.medium + DBInstanceClass: db.t4g.medium Port: '5432' PubliclyAccessible: false - StorageType: gp2 + StorageType: gp3 StorageEncrypted: True BackupRetentionPeriod: 31 MasterUsername: !Ref DbUsername