diff --git a/.env.sample b/.env.sample
index 8bdd297d..4771b438 100644
--- a/.env.sample
+++ b/.env.sample
@@ -18,6 +18,19 @@ CONTACT_EMAIL=hello+local@weallcode.org
SENDGRID_API_KEY=CHANGEME
SENDGRID_UNSUB_CLASSANNOUNCE=1234567890
+# Salesforce
+SALESFORCE_TOKEN=
+SALESFORCE_USER=
+SALESFORCE_PASSWORD=
+
+# AllAuth
+ALLAUTH_GOOGLE_CLIENT_ID=
+ALLAUTH_GOOGLE_SECRET=
+ALLAUTH_FACEBOOK_CLIENT_ID=
+ALLAUTH_FACEBOOK_SECRET=
+ALLAUTH_LINKEDIN_CLIENT_ID=
+ALLAUTH_LINKEDIN_SECRET=
+
# Slack
SLACK_ALERTS_CHANNEL=REPLACE_ME
SLACK_WEBHOOK_URL=REPLACE_ME
diff --git a/coderdojochi/admin.py b/coderdojochi/admin.py
index 25f78a64..026e80a4 100644
--- a/coderdojochi/admin.py
+++ b/coderdojochi/admin.py
@@ -151,7 +151,7 @@ class MentorAdmin(ImportExportMixin, ImportExportActionModelAdmin):
]
filter_horizontal = [
- "race_ethnicity",
+ # "race_ethnicity",
]
def view_on_site(self, obj):
@@ -282,7 +282,7 @@ class GuardianAdmin(ImportExportMixin, ImportExportActionModelAdmin):
]
filter_horizontal = [
- "race_ethnicity",
+ # "race_ethnicity",
]
date_hierarchy = "created_at"
@@ -410,7 +410,7 @@ class StudentAdmin(ImportExportMixin, ImportExportActionModelAdmin):
]
filter_horizontal = [
- "race_ethnicity",
+ # "race_ethnicity",
]
ordering = [
diff --git a/coderdojochi/cron.py b/coderdojochi/cron.py
index a3be15dc..c2bd40e3 100644
--- a/coderdojochi/cron.py
+++ b/coderdojochi/cron.py
@@ -1,6 +1,7 @@
from datetime import timedelta
from django.conf import settings
+from django.core.mail import send_mail
from django.utils import timezone
import arrow
@@ -10,218 +11,242 @@
from coderdojochi.util import email
-class SendReminders(CronJobBase):
- RUN_AT_TIMES = ["10:00", "14:00"]
-
- schedule = Schedule(run_at_times=RUN_AT_TIMES)
- code = "coderdojochi.send_reminders"
-
- def do(self):
- orders_within_a_week = Order.objects.filter(
- is_active=True,
- week_reminder_sent=False,
- session__start_date__lte=(timezone.now() + timedelta(days=7)),
- session__start_date__gte=(timezone.now() + timedelta(days=1)),
- )
- orders_within_a_day = Order.objects.filter(
- is_active=True,
- day_reminder_sent=False,
- session__start_date__lte=(timezone.now() + timedelta(days=1)),
- session__start_date__gte=(timezone.now() - timedelta(days=2)),
- )
- sessions_within_a_week = Session.objects.filter(
- is_active=True,
- mentors_week_reminder_sent=False,
- start_date__lte=(timezone.now() + timedelta(days=7)),
- start_date__gte=(timezone.now() + timedelta(days=1)),
- )
- sessions_within_a_day = Session.objects.filter(
- is_active=True,
- mentors_day_reminder_sent=False,
- start_date__lte=(timezone.now() + timedelta(days=1)),
- start_date__gte=(timezone.now() - timedelta(days=2)),
- )
-
- # Clear email send data
- merge_data = {}
- recipients = []
-
- for order in orders_within_a_week:
- recipients.append(order.guardian.email)
- merge_data[order.guardian.email] = {
- "first_name": order.guardian.first_name,
- "last_name": order.guardian.last_name,
- "student_first_name": order.student.first_name,
- "student_last_name": order.student.last_name,
- "class_code": order.session.course.code,
- "class_title": order.session.course.title,
- "class_description": order.session.course.description,
- "class_start_date": arrow.get(order.session.start_date).to("local").format("dddd, MMMM D, YYYY"),
- "class_start_time": arrow.get(order.session.start_date).to("local").format("h:mma"),
- "class_end_date": arrow.get(order.session.end_date).to("local").format("dddd, MMMM D, YYYY"),
- "class_end_time": arrow.get(order.session.end_date).to("local").format("h:mma"),
- "class_location_name": order.session.location.name,
- "class_location_address": order.session.location.address,
- "class_location_city": order.session.location.city,
- "class_location_state": order.session.location.state,
- "class_location_zip": order.session.location.zip,
- "class_additional_info": order.session.additional_info,
- "class_url": f"{settings.SITE_URL}{order.session.get_absolute_url()}",
- "class_calendar_url": f"{settings.SITE_URL}{order.session.get_calendar_url()}",
- "microdata_start_date": arrow.get(order.session.start_date).to("local").isoformat(),
- "microdata_end_date": arrow.get(order.session.end_date).to("local").isoformat(),
- "order_id": order.id,
- "online_video_link": order.session.online_video_link,
- "online_video_description": order.session.online_video_description,
- }
-
- email(
- subject="Upcoming class reminder",
- template_name="class_reminder_guardian_one_week",
- merge_data=merge_data,
- recipients=recipients,
- preheader="Your class is just a few days away!",
- unsub_group_id=settings.SENDGRID_UNSUB_CLASSANNOUNCE,
- )
-
- for order in orders_within_a_week:
- order.week_reminder_sent = True
- order.save()
-
- # Clear email send data
- merge_data = {}
- recipients = []
-
- for order in orders_within_a_day:
- recipients.append(order.guardian.email)
- merge_data[order.guardian.email] = {
- "first_name": order.guardian.first_name,
- "last_name": order.guardian.last_name,
- "student_first_name": order.student.first_name,
- "student_last_name": order.student.last_name,
- "class_code": order.session.course.code,
- "class_title": order.session.course.title,
- "class_description": order.session.course.description,
- "class_start_date": arrow.get(order.session.start_date).to("local").format("dddd, MMMM D, YYYY"),
- "class_start_time": arrow.get(order.session.start_date).to("local").format("h:mma"),
- "class_end_date": arrow.get(order.session.end_date).to("local").format("dddd, MMMM D, YYYY"),
- "class_end_time": arrow.get(order.session.end_date).to("local").format("h:mma"),
- "class_location_name": order.session.location.name,
- "class_location_address": order.session.location.address,
- "class_location_city": order.session.location.city,
- "class_location_state": order.session.location.state,
- "class_location_zip": order.session.location.zip,
- "class_additional_info": order.session.additional_info,
- "class_url": f"{settings.SITE_URL}{order.session.get_absolute_url()}",
- "class_calendar_url": f"{settings.SITE_URL}{order.session.get_calendar_url()}",
- "microdata_start_date": arrow.get(order.session.start_date).to("local").isoformat(),
- "microdata_end_date": arrow.get(order.session.end_date).to("local").isoformat(),
- "order_id": order.id,
- "online_video_link": order.session.online_video_link,
- "online_video_description": order.session.online_video_description,
- }
-
- email(
- subject="Your class is coming up!",
- template_name="class_reminder_guardian_24_hour",
- merge_data=merge_data,
- recipients=recipients,
- preheader="Your class is just hours away!",
- unsub_group_id=settings.SENDGRID_UNSUB_CLASSANNOUNCE,
- )
-
- for order in orders_within_a_day:
- order.day_reminder_sent = True
- order.save()
-
- for session in sessions_within_a_week:
- orders = MentorOrder.objects.filter(session=session)
-
- # Clear email send data
- merge_data = {}
- recipients = []
-
- for order in orders:
- recipients.append(order.mentor.email)
- merge_data[order.mentor.email] = {
- "first_name": order.mentor.first_name,
- "last_name": order.mentor.last_name,
- "class_code": order.session.course.code,
- "class_title": order.session.course.title,
- "class_description": order.session.course.description,
- "class_start_date": (
- arrow.get(order.session.mentor_start_date).to("local").format("dddd, MMMM D, YYYY")
- ),
- "class_start_time": arrow.get(order.session.mentor_start_date).to("local").format("h:mma"),
- "class_end_date": arrow.get(order.session.mentor_end_date).to("local").format("dddd, MMMM D, YYYY"),
- "class_end_time": arrow.get(order.session.mentor_end_date).to("local").format("h:mma"),
- "class_location_name": order.session.location.name,
- "class_location_address": order.session.location.address,
- "class_location_city": order.session.location.city,
- "class_location_state": order.session.location.state,
- "class_location_zip": order.session.location.zip,
- "class_additional_info": order.session.additional_info,
- "class_url": f"{settings.SITE_URL}{order.session.get_absolute_url()}",
- "class_calendar_url": f"{settings.SITE_URL}{order.session.get_calendar_url()}",
- "microdata_start_date": arrow.get(order.session.start_date).to("local").isoformat(),
- "microdata_end_date": arrow.get(order.session.end_date).to("local").isoformat(),
- "order_id": order.id,
- "online_video_link": order.session.online_video_link,
- "online_video_description": order.session.online_video_description,
- }
-
- email(
- subject="Your We All Code class is in less than a week!",
- template_name="class_reminder_mentor_one_week",
- merge_data=merge_data,
- recipients=recipients,
- preheader="The class is just a few days away!",
- unsub_group_id=settings.SENDGRID_UNSUB_CLASSANNOUNCE,
- )
-
- session.mentors_week_reminder_sent = True
- session.save()
-
- for session in sessions_within_a_day:
- orders = MentorOrder.objects.filter(session=session)
-
- for order in orders:
- recipients.append(order.mentor.email)
- merge_data[order.mentor.email] = {
- "first_name": order.mentor.user.first_name,
- "last_name": order.mentor.user.last_name,
- "class_code": order.session.course.code,
- "class_title": order.session.course.title,
- "class_description": order.session.course.description,
- "class_start_date": (
- arrow.get(order.session.mentor_start_date).to("local").format("dddd, MMMM D, YYYY")
- ),
- "class_start_time": arrow.get(order.session.mentor_start_date).to("local").format("h:mma"),
- "class_end_date": arrow.get(order.session.mentor_end_date).to("local").format("dddd, MMMM D, YYYY"),
- "class_end_time": arrow.get(order.session.mentor_end_date).to("local").format("h:mma"),
- "class_location_name": order.session.location.name,
- "class_location_address": order.session.location.address,
- "class_location_city": order.session.location.city,
- "class_location_state": order.session.location.state,
- "class_location_zip": order.session.location.zip,
- "class_additional_info": order.session.additional_info,
- "class_url": f"{settings.SITE_URL}{order.session.get_absolute_url()}",
- "class_calendar_url": f"{settings.SITE_URL}{order.session.get_calendar_url()}",
- "microdata_start_date": arrow.get(order.session.start_date).to("local").isoformat(),
- "microdata_end_date": arrow.get(order.session.end_date).to("local").isoformat(),
- "order_id": order.id,
- "online_video_link": order.session.online_video_link,
- "online_video_description": order.session.online_video_description,
- }
-
- email(
- subject="Your We All Code class is tomorrow!",
- template_name="class_reminder_mentor_24_hour",
- merge_data=merge_data,
- recipients=recipients,
- preheader="The class is just a few hours away!",
- unsub_group_id=settings.SENDGRID_UNSUB_CLASSANNOUNCE,
- )
-
- session.mentors_day_reminder_sent = True
- session.save()
+def my_scheduled_job():
+ print("Sending Reminder")
+ email(
+ subject="Test Email",
+ template_name="class_reminder_mentor_24_hour",
+ merge_data={"oreoflorentino98@gmail.com": {"first_name": "Gregorio", "last_name": "Florentino"}},
+ recipients=["oreoflorentino98@gmail.com"],
+ preheader="This is a test!",
+ # unsub_group_id=settings.SENDGRID_UNSUB_CLASSANNOUNCE,
+ )
+ print("Reminder sent")
+
+
+# class SendReminders(CronJobBase):
+# RUN_EVERY_MINS = 1
+
+# schedule = Schedule(run_every_mins=RUN_EVERY_MINS)
+# code = "coderdojochi.send_reminders"
+
+# print("-------------------------Send reminders-------------------------")
+# def do(self):
+# print("Sending Reminder")
+# email(
+# subject="Test Email",
+# template_name="class_reminder_mentor_24_hour",
+# merge_data={"oreoflorentino98@gmail.com":{"first_name":"Gregorio","last_name": "Florentino"}},
+# recipients=["oreoflorentino98@gmail.com"],
+# preheader="This is a test!",
+# # unsub_group_id=settings.SENDGRID_UNSUB_CLASSANNOUNCE,
+# )
+# print("Reminder sent")
+# orders_within_a_week = Order.objects.filter(
+# is_active=True,
+# week_reminder_sent=False,
+# session__start_date__lte=(timezone.now() + timedelta(days=7)),
+# session__start_date__gte=(timezone.now() + timedelta(days=1)),
+# )
+# orders_within_a_day = Order.objects.filter(
+# is_active=True,
+# day_reminder_sent=False,
+# session__start_date__lte=(timezone.now() + timedelta(days=1)),
+# session__start_date__gte=(timezone.now() - timedelta(days=2)),
+# )
+# sessions_within_a_week = Session.objects.filter(
+# is_active=True,
+# mentors_week_reminder_sent=False,
+# start_date__lte=(timezone.now() + timedelta(days=7)),
+# start_date__gte=(timezone.now() + timedelta(days=1)),
+# )
+# sessions_within_a_day = Session.objects.filter(
+# is_active=True,
+# mentors_day_reminder_sent=False,
+# start_date__lte=(timezone.now() + timedelta(days=1)),
+# start_date__gte=(timezone.now() - timedelta(days=2)),
+# )
+
+# # Clear email send data
+# merge_data = {}
+# recipients = []
+
+# for order in orders_within_a_week:
+# recipients.append(order.guardian.email)
+# merge_data[order.guardian.email] = {
+# "first_name": order.guardian.first_name,
+# "last_name": order.guardian.last_name,
+# "student_first_name": order.student.first_name,
+# "student_last_name": order.student.last_name,
+# "class_code": order.session.course.code,
+# "class_title": order.session.course.title,
+# "class_description": order.session.course.description,
+# "class_start_date": arrow.get(order.session.start_date).to("local").format("dddd, MMMM D, YYYY"),
+# "class_start_time": arrow.get(order.session.start_date).to("local").format("h:mma"),
+# "class_end_date": arrow.get(order.session.end_date).to("local").format("dddd, MMMM D, YYYY"),
+# "class_end_time": arrow.get(order.session.end_date).to("local").format("h:mma"),
+# "class_location_name": order.session.location.name,
+# "class_location_address": order.session.location.address,
+# "class_location_city": order.session.location.city,
+# "class_location_state": order.session.location.state,
+# "class_location_zip": order.session.location.zip,
+# "class_additional_info": order.session.additional_info,
+# "class_url": f"{settings.SITE_URL}{order.session.get_absolute_url()}",
+# "class_calendar_url": f"{settings.SITE_URL}{order.session.get_calendar_url()}",
+# "microdata_start_date": arrow.get(order.session.start_date).to("local").isoformat(),
+# "microdata_end_date": arrow.get(order.session.end_date).to("local").isoformat(),
+# "order_id": order.id,
+# "online_video_link": order.session.online_video_link,
+# "online_video_description": order.session.online_video_description,
+# }
+
+# email(
+# subject="Upcoming class reminder",
+# template_name="class_reminder_guardian_one_week",
+# merge_data=merge_data,
+# recipients=recipients,
+# preheader="Your class is just a few days away!",
+# unsub_group_id=settings.SENDGRID_UNSUB_CLASSANNOUNCE,
+# )
+
+# for order in orders_within_a_week:
+# order.week_reminder_sent = True
+# order.save()
+
+# # Clear email send data
+# merge_data = {}
+# recipients = []
+
+# for order in orders_within_a_day:
+# recipients.append(order.guardian.email)
+# merge_data[order.guardian.email] = {
+# "first_name": order.guardian.first_name,
+# "last_name": order.guardian.last_name,
+# "student_first_name": order.student.first_name,
+# "student_last_name": order.student.last_name,
+# "class_code": order.session.course.code,
+# "class_title": order.session.course.title,
+# "class_description": order.session.course.description,
+# "class_start_date": arrow.get(order.session.start_date).to("local").format("dddd, MMMM D, YYYY"),
+# "class_start_time": arrow.get(order.session.start_date).to("local").format("h:mma"),
+# "class_end_date": arrow.get(order.session.end_date).to("local").format("dddd, MMMM D, YYYY"),
+# "class_end_time": arrow.get(order.session.end_date).to("local").format("h:mma"),
+# "class_location_name": order.session.location.name,
+# "class_location_address": order.session.location.address,
+# "class_location_city": order.session.location.city,
+# "class_location_state": order.session.location.state,
+# "class_location_zip": order.session.location.zip,
+# "class_additional_info": order.session.additional_info,
+# "class_url": f"{settings.SITE_URL}{order.session.get_absolute_url()}",
+# "class_calendar_url": f"{settings.SITE_URL}{order.session.get_calendar_url()}",
+# "microdata_start_date": arrow.get(order.session.start_date).to("local").isoformat(),
+# "microdata_end_date": arrow.get(order.session.end_date).to("local").isoformat(),
+# "order_id": order.id,
+# "online_video_link": order.session.online_video_link,
+# "online_video_description": order.session.online_video_description,
+# }
+
+# email(
+# subject="Your class is coming up!",
+# template_name="class_reminder_guardian_24_hour",
+# merge_data=merge_data,
+# recipients=recipients,
+# preheader="Your class is just hours away!",
+# unsub_group_id=settings.SENDGRID_UNSUB_CLASSANNOUNCE,
+# )
+
+# for order in orders_within_a_day:
+# order.day_reminder_sent = True
+# order.save()
+
+# for session in sessions_within_a_week:
+# orders = MentorOrder.objects.filter(session=session)
+
+# # Clear email send data
+# merge_data = {}
+# recipients = []
+
+# for order in orders:
+# recipients.append(order.mentor.email)
+# merge_data[order.mentor.email] = {
+# "first_name": order.mentor.first_name,
+# "last_name": order.mentor.last_name,
+# "class_code": order.session.course.code,
+# "class_title": order.session.course.title,
+# "class_description": order.session.course.description,
+# "class_start_date": (
+# arrow.get(order.session.mentor_start_date).to("local").format("dddd, MMMM D, YYYY")
+# ),
+# "class_start_time": arrow.get(order.session.mentor_start_date).to("local").format("h:mma"),
+# "class_end_date": arrow.get(order.session.mentor_end_date).to("local").format("dddd, MMMM D, YYYY"),
+# "class_end_time": arrow.get(order.session.mentor_end_date).to("local").format("h:mma"),
+# "class_location_name": order.session.location.name,
+# "class_location_address": order.session.location.address,
+# "class_location_city": order.session.location.city,
+# "class_location_state": order.session.location.state,
+# "class_location_zip": order.session.location.zip,
+# "class_additional_info": order.session.additional_info,
+# "class_url": f"{settings.SITE_URL}{order.session.get_absolute_url()}",
+# "class_calendar_url": f"{settings.SITE_URL}{order.session.get_calendar_url()}",
+# "microdata_start_date": arrow.get(order.session.start_date).to("local").isoformat(),
+# "microdata_end_date": arrow.get(order.session.end_date).to("local").isoformat(),
+# "order_id": order.id,
+# "online_video_link": order.session.online_video_link,
+# "online_video_description": order.session.online_video_description,
+# }
+
+# email(
+# subject="Your We All Code class is in less than a week!",
+# template_name="class_reminder_mentor_one_week",
+# merge_data=merge_data,
+# recipients=recipients,
+# preheader="The class is just a few days away!",
+# unsub_group_id=settings.SENDGRID_UNSUB_CLASSANNOUNCE,
+# )
+
+# session.mentors_week_reminder_sent = True
+# session.save()
+
+# for session in sessions_within_a_day:
+# orders = MentorOrder.objects.filter(session=session)
+
+# for order in orders:
+# recipients.append(order.mentor.email)
+# merge_data[order.mentor.email] = {
+# "first_name": order.mentor.user.first_name,
+# "last_name": order.mentor.user.last_name,
+# "class_code": order.session.course.code,
+# "class_title": order.session.course.title,
+# "class_description": order.session.course.description,
+# "class_start_date": (
+# arrow.get(order.session.mentor_start_date).to("local").format("dddd, MMMM D, YYYY")
+# ),
+# "class_start_time": arrow.get(order.session.mentor_start_date).to("local").format("h:mma"),
+# "class_end_date": arrow.get(order.session.mentor_end_date).to("local").format("dddd, MMMM D, YYYY"),
+# "class_end_time": arrow.get(order.session.mentor_end_date).to("local").format("h:mma"),
+# "class_location_name": order.session.location.name,
+# "class_location_address": order.session.location.address,
+# "class_location_city": order.session.location.city,
+# "class_location_state": order.session.location.state,
+# "class_location_zip": order.session.location.zip,
+# "class_additional_info": order.session.additional_info,
+# "class_url": f"{settings.SITE_URL}{order.session.get_absolute_url()}",
+# "class_calendar_url": f"{settings.SITE_URL}{order.session.get_calendar_url()}",
+# "microdata_start_date": arrow.get(order.session.start_date).to("local").isoformat(),
+# "microdata_end_date": arrow.get(order.session.end_date).to("local").isoformat(),
+# "order_id": order.id,
+# "online_video_link": order.session.online_video_link,
+# "online_video_description": order.session.online_video_description,
+# }
+
+# email(
+# subject="Your We All Code class is tomorrow!",
+# template_name="class_reminder_mentor_24_hour",
+# merge_data=merge_data,
+# recipients=recipients,
+# preheader="The class is just a few hours away!",
+# unsub_group_id=settings.SENDGRID_UNSUB_CLASSANNOUNCE,
+# )
+
+# session.mentors_day_reminder_sent = True
+# session.save()
diff --git a/coderdojochi/forms.py b/coderdojochi/forms.py
index d7c7d83a..82d56375 100644
--- a/coderdojochi/forms.py
+++ b/coderdojochi/forms.py
@@ -248,11 +248,11 @@ class StudentForm(CDCModelForm):
required=False,
)
- race_ethnicity = forms.ModelMultipleChoiceField(
- widget=forms.CheckboxSelectMultiple,
- queryset=RaceEthnicity.objects.filter(is_visible=True),
- required=False,
- )
+ # race_ethnicity = forms.ModelMultipleChoiceField(
+ # widget=forms.CheckboxSelectMultiple,
+ # queryset=RaceEthnicity.objects.filter(is_visible=True),
+ # required=False,
+ # )
birthday = forms.CharField(
widget=html5_widgets.DateInput(
diff --git a/coderdojochi/migrations/0040_auto_20210722_1527.py b/coderdojochi/migrations/0040_auto_20210722_1527.py
new file mode 100644
index 00000000..b7561365
--- /dev/null
+++ b/coderdojochi/migrations/0040_auto_20210722_1527.py
@@ -0,0 +1,27 @@
+# Generated by Django 3.2.5 on 2021-07-22 20:27
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('coderdojochi', '0039_auto_20210611_1044'),
+ ]
+
+ operations = [
+ migrations.RemoveField(
+ model_name='student',
+ name='race_ethnicity',
+ ),
+ migrations.AddField(
+ model_name='student',
+ name='ethnicity',
+ field=models.CharField(choices=[('Hispanic', 'Hispanic'), ('Not Hispanic', 'Not Hispanic')], default='', max_length=255),
+ ),
+ migrations.AddField(
+ model_name='student',
+ name='race',
+ field=models.CharField(default='', max_length=255),
+ ),
+ ]
diff --git a/coderdojochi/migrations/0041_auto_20210723_1013.py b/coderdojochi/migrations/0041_auto_20210723_1013.py
new file mode 100644
index 00000000..4d53d023
--- /dev/null
+++ b/coderdojochi/migrations/0041_auto_20210723_1013.py
@@ -0,0 +1,26 @@
+# Generated by Django 3.2.5 on 2021-07-23 15:13
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('coderdojochi', '0040_auto_20210722_1527'),
+ ]
+
+ operations = [
+ migrations.RemoveField(
+ model_name='student',
+ name='ethnicity',
+ ),
+ migrations.RemoveField(
+ model_name='student',
+ name='race',
+ ),
+ migrations.AddField(
+ model_name='student',
+ name='race_ethnicity',
+ field=models.ManyToManyField(blank=True, to='coderdojochi.RaceEthnicity'),
+ ),
+ ]
diff --git a/coderdojochi/migrations/0042_auto_20210727_0925.py b/coderdojochi/migrations/0042_auto_20210727_0925.py
new file mode 100644
index 00000000..6f574c0e
--- /dev/null
+++ b/coderdojochi/migrations/0042_auto_20210727_0925.py
@@ -0,0 +1,55 @@
+# Generated by Django 3.2.5 on 2021-07-27 14:25
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('coderdojochi', '0041_auto_20210723_1013'),
+ ]
+
+ operations = [
+ migrations.RemoveField(
+ model_name='guardian',
+ name='race_ethnicity',
+ ),
+ migrations.RemoveField(
+ model_name='mentor',
+ name='race_ethnicity',
+ ),
+ migrations.RemoveField(
+ model_name='student',
+ name='race_ethnicity',
+ ),
+ migrations.AddField(
+ model_name='guardian',
+ name='ethnicity',
+ field=models.CharField(choices=[('Hispanic', 'Hispanic'), ('Not Hispanic', 'Not Hispanic')], default='', max_length=12),
+ ),
+ migrations.AddField(
+ model_name='guardian',
+ name='race',
+ field=models.CharField(choices=[('White', 'White'), ('Black', 'Black'), ('Asian', 'Asian'), ('American Indian', 'American Indian'), ('Native Hawaiin', 'Native Hawaiin'), ('Middle Eastern', 'Middle Eastern')], default='', max_length=15),
+ ),
+ migrations.AddField(
+ model_name='mentor',
+ name='ethnicity',
+ field=models.CharField(choices=[('Hispanic', 'Hispanic'), ('Not Hispanic', 'Not Hispanic')], default='', max_length=12),
+ ),
+ migrations.AddField(
+ model_name='mentor',
+ name='race',
+ field=models.CharField(choices=[('White', 'White'), ('Black', 'Black'), ('Asian', 'Asian'), ('American Indian', 'American Indian'), ('Native Hawaiin', 'Native Hawaiin'), ('Middle Eastern', 'Middle Eastern')], default='', max_length=15),
+ ),
+ migrations.AddField(
+ model_name='student',
+ name='ethnicity',
+ field=models.CharField(choices=[('Hispanic', 'Hispanic'), ('Not Hispanic', 'Not Hispanic')], default='', max_length=12),
+ ),
+ migrations.AddField(
+ model_name='student',
+ name='race',
+ field=models.CharField(choices=[('White', 'White'), ('Black', 'Black'), ('Asian', 'Asian'), ('American Indian', 'American Indian'), ('Native Hawaiin', 'Native Hawaiin'), ('Middle Eastern', 'Middle Eastern')], default='', max_length=15),
+ ),
+ ]
diff --git a/coderdojochi/migrations/0043_session_title.py b/coderdojochi/migrations/0043_session_title.py
new file mode 100644
index 00000000..6ada86f9
--- /dev/null
+++ b/coderdojochi/migrations/0043_session_title.py
@@ -0,0 +1,18 @@
+# Generated by Django 3.2.5 on 2021-07-27 20:52
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('coderdojochi', '0042_auto_20210727_0925'),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name='session',
+ name='title',
+ field=models.TextField(blank=True, default='', null=True),
+ ),
+ ]
diff --git a/coderdojochi/models/common.py b/coderdojochi/models/common.py
index 40464977..dd1ed284 100644
--- a/coderdojochi/models/common.py
+++ b/coderdojochi/models/common.py
@@ -1,5 +1,17 @@
+import json
+from datetime import date, datetime, timedelta
+from logging import Formatter
+from re import S
+
+from django.conf import settings
from django.db import models
+from pytz import timezone
+from simple_salesforce import Salesforce as sf
+from simple_salesforce.format import format_soql
+
+from coderdojochi.settings import SALESFORCE_TOKEN
+
class CommonInfo(models.Model):
# Auto create/update
@@ -13,3 +25,626 @@ class CommonInfo(models.Model):
class Meta:
abstract = True
+
+
+class Salesforce:
+ def __init__(self):
+ self.salesforce_obj = sf(
+ username=settings.SALESFORCE_USER,
+ password=settings.SALESFORCE_PASSWORD,
+ security_token=settings.SALESFORCE_TOKEN,
+ domain=settings.SALESFORCE_DOMAIN,
+ )
+
+ def in_account_list(self, household_name):
+ query = "SELECT Id FROM Account WHERE Name = {}"
+ formatted = format_soql(query, household_name)
+ results = self.salesforce_obj.query(formatted)
+
+ exists = results["totalSize"]
+
+ if exists:
+ id = results["records"][0]["Id"]
+ return id
+
+ return exists
+
+ def contact_id_query(self, ext_id):
+ query = "SELECT Id FROM Contact WHERE External_Id__c = '{}'"
+
+ formatted = format_soql(query, ext_id)
+
+ results = self.salesforce_obj.query(formatted)
+
+ if results["totalSize"]:
+ id = results["records"][0]["Id"]
+
+ return id
+
+ return None
+
+ def course_query(self, course_id):
+ query = "SELECT Id FROM hed__Course__c WHERE hed__Course_ID__c = {}"
+ formatted = format_soql(query, course_id)
+ results = self.salesforce_obj.query(formatted)
+
+ exists = results["totalSize"]
+
+ if exists:
+ return results["records"][0]["Id"]
+
+ return None
+
+ def general_query(self, ext_id, object):
+ query = (
+ f"SELECT Id FROM {object} WHERE " + "External_Id__c = '{}'"
+ if isinstance(ext_id, int)
+ else f"SELECT Id FROM {object} WHERE " + "External_Id__c = {}"
+ )
+ formatted_query = format_soql(query, ext_id)
+ print(formatted_query)
+
+ results = self.salesforce_obj.query(formatted_query)
+ exists = results["totalSize"]
+
+ if exists:
+ return results["records"][0]["Id"]
+
+ return None
+
+ def create_relationship(
+ self,
+ parent_first_name,
+ parent_last_name,
+ child_first_name,
+ child_last_name,
+ ):
+ parent_query = format_soql(
+ "SELECT Id FROM Contact WHERE FirstName = {} AND LastName = {}",
+ parent_first_name,
+ parent_last_name,
+ )
+ parent_result = self.salesforce_obj.query(parent_query)
+ parent = parent_result["records"][0]["Id"] if parent_result["totalSize"] > 0 else None
+
+ child_query = format_soql(
+ "SELECT Id FROM Contact WHERE FirstName = {} AND LastName = {}",
+ child_first_name,
+ child_last_name,
+ )
+ child_result = self.salesforce_obj.query(child_query)
+ child = child_result["records"][0]["Id"] if child_result["totalSize"] > 0 else None
+
+ relationship_query = format_soql(
+ "SELECT Id FROM hed__Relationship__c WHERE hed__Contact__c = {} AND hed__RelatedContact__c = {}",
+ parent,
+ child,
+ )
+ relationship_results = self.salesforce_obj.query(relationship_query)
+ exist = relationship_results["totalSize"]
+
+ if not exist and parent and child:
+ self.salesforce_obj.hed__Relationship__c.create(
+ {
+ "hed__Contact__c": parent,
+ "hed__RelatedContact__c": child,
+ "hed__Type__c": "Child",
+ "hed__Status__c": "Current",
+ }
+ )
+ else:
+ print(f"Relationship btwn {child_first_name} and {parent_first_name}")
+
+ def upsert_contact(
+ self,
+ first_name,
+ last_name,
+ birthdate,
+ gender,
+ race,
+ ethnicity,
+ role,
+ active,
+ ext_id,
+ school_name=None,
+ school_type=None,
+ medical=None,
+ medications=None,
+ work_place=None,
+ phone=None,
+ email=None,
+ zip_code=None,
+ parent=None,
+ ):
+ exists = self.general_query(ext_id=ext_id, object="Contact")
+
+ household_name = f"{last_name} Household"
+ account_created = self.in_account_list(household_name)
+
+ parent_id = (
+ self.general_query(ext_id=parent.id, object="Contact")
+ if (parent is not None and parent != ext_id)
+ else None
+ )
+
+ data = {
+ "FirstName": first_name,
+ "LastName": last_name,
+ "Birthdate": birthdate.__str__(),
+ "Gender__c": gender,
+ "hed__Race__c": race,
+ "hed__Ethnicity__c": ethnicity,
+ "School_Name__c": school_name,
+ "School_Type__c": school_type,
+ "Role__c": role,
+ "Parent__c": parent_id,
+ "Medical_Conditions__c": medical,
+ "Medications__c": medications,
+ "Active__c": active,
+ "GW_Volunteers__Volunteer_Organization__c": work_place,
+ "Phone": phone,
+ "Zip__c": zip_code,
+ "External_Id__c": ext_id,
+ "Email": email,
+ }
+
+ if not exists:
+ if account_created:
+
+ data["AccountId"] = account_created
+
+ self.salesforce_obj.Contact.create(
+ data,
+ )
+ else:
+
+ self.salesforce_obj.Contact.create(
+ data,
+ )
+ else:
+
+ self.salesforce_obj.Contact.update(
+ exists,
+ data,
+ )
+
+ def upsert_course(
+ self,
+ name,
+ active,
+ course_id,
+ course_type,
+ description,
+ duration,
+ minimum_age,
+ maximum_age,
+ ):
+
+ exists = self.course_query(course_id=course_id)
+
+ if not exists:
+ self.salesforce_obj.hed__Course__c.create(
+ {
+ "Name": name,
+ "Active__c": active,
+ "hed__Course_ID__c": course_id,
+ "Course_Type__c": course_type,
+ "hed__Description__c": description,
+ "hed__Account__c": "0012f00000ffAGVAA2", # hardcoded
+ "Course_Duration__c": duration.__str__(),
+ "Minimum_Age__c": minimum_age.__str__(),
+ "Maximum_Age__c": maximum_age.__str__(),
+ }
+ )
+
+ else:
+ self.salesforce_obj.hed__Course__c.update(
+ exists,
+ {
+ "Name": name,
+ "Active__c": active,
+ "hed__Course_ID__c": course_id,
+ "Course_Type__c": course_type,
+ "hed__Description__c": description,
+ "hed__Account__c": "0012f00000ffAGVAA2", # hardcoded
+ "Course_Duration__c": duration.__str__(),
+ "Minimum_Age__c": minimum_age.__str__(),
+ "Maximum_Age__c": maximum_age.__str__(),
+ },
+ )
+
+ def create_session(
+ self,
+ course,
+ title,
+ start_datetime,
+ location,
+ capacity,
+ mentor_capacity,
+ mentor,
+ ext_id,
+ online_link,
+ video_meeting_id,
+ meeting_password,
+ cost,
+ minimum_cost,
+ maximum_cost,
+ additional_info,
+ assistant=None,
+ ):
+
+ exist = self.general_query(ext_id=ext_id, object="hed__Course_Offering__c")
+ course_id = self.course_query(course_id=course.code)
+ mentor_id = self.general_query(
+ ext_id=mentor.id,
+ object="Contact",
+ )
+
+ # Session times are stored as timeblock objects in Salesforce
+ # Need to query the appropriate block to assign to session based on start and end time
+ # Timezone issue may vary by user; in this case, 5 hour difference was for Eastern Daylight Savings
+
+ end_date = (start_datetime + course.duration).strftime("%Y-%m-%d")
+ start_time = (start_datetime - timedelta(hours=5)).strftime("%H:%M:%S")
+ end_time = (start_datetime + course.duration - timedelta(hours=5)).strftime("%H:%M:%S")
+
+ minimum_cost_converted = int(minimum_cost) if minimum_cost else None
+ maximum_cost_converted = int(maximum_cost) if maximum_cost else None
+ cost_converted = int(cost) if cost else None
+
+ data = {
+ "hed__Course__c": course_id,
+ "Name": title,
+ "hed__Start_Date__c": start_datetime.strftime("%Y-%m-%d"),
+ "hed__End_Date__c": end_date,
+ "Location_Name__c": location.name,
+ "hed__Capacity__c": capacity,
+ "Mentor_Capacity__c": mentor_capacity,
+ "hed__Faculty__c": mentor_id,
+ "hed__Term__c": "a1P2f0000003vaEEAQ", # hardcoded
+ "Cost__c": cost_converted,
+ "Minimum_Cost__c": minimum_cost_converted,
+ "Maximum_Cost__c": maximum_cost_converted,
+ "Additional_Information__c": additional_info,
+ "Online_Video_Link__c": online_link,
+ "Online_Video_Meeting_Id__c": video_meeting_id,
+ "Password__c": meeting_password,
+ "Start_Time__c": start_time,
+ "End_Time__c": end_time,
+ "External_Id__c": ext_id,
+ }
+
+ if exist is None:
+ self.salesforce_obj.hed__Course_Offering__c.create(
+ data,
+ )
+ else:
+ self.salesforce_obj.hed__Course_Offering__c.update(
+ exist,
+ data,
+ )
+
+ def create_order(
+ self,
+ session,
+ main_contact,
+ active,
+ ip,
+ check_in,
+ ext_id,
+ alternate_guardian=None,
+ guardian=None,
+ affiliate=None,
+ is_mentor=False,
+ ):
+ guardian_id = None
+
+ if guardian:
+ guardian_id = self.general_query(
+ ext_id=guardian.id,
+ object="Contact",
+ )
+
+ contact_id = self.general_query(
+ ext_id=main_contact.id,
+ object="Contact",
+ )
+
+ session_id = self.general_query(
+ ext_id=session.id,
+ object="hed__Course_Offering__c",
+ )
+
+ order_id = self.general_query(
+ ext_id=ext_id,
+ object="hed__Course_Enrollment__c",
+ )
+
+ print(order_id)
+ print(ext_id)
+
+ # Date/time must be in below format for Salesforce to accept it
+ converted = (check_in - timedelta(hours=5)) if check_in else None
+ temp = converted.strftime("%Y-%m-%dT%H:%M:%SZ").__str__() if check_in else None
+
+ data = {
+ "Parent__c": guardian_id,
+ "hed__Contact__c": contact_id,
+ "hed__Course_Offering__c": session_id,
+ "IP__c": ip,
+ "Check_in__c": temp,
+ "Active__c": active,
+ "Alternate_Guardian__c": alternate_guardian,
+ "External_Id__c": ext_id,
+ "Affiliate__c": affiliate,
+ "Is_Mentor__c": is_mentor,
+ }
+
+ # print(ext_id)
+ # print(self.salesforce_obj.hed__Course_Enrollment__c.get('a192f000000i2Gx'))
+
+ if order_id is None:
+ self.salesforce_obj.hed__Course_Enrollment__c.create(
+ data,
+ )
+ else:
+ self.salesforce_obj.hed__Course_Enrollment__c.update(
+ order_id,
+ data,
+ )
+
+ def add_donation(
+ self,
+ session,
+ amount,
+ first_name,
+ email,
+ is_verified,
+ receipt_sent,
+ referral_code,
+ ext_id,
+ last_name="",
+ ):
+ session_id = (
+ self.general_query(
+ ext_id=session.id,
+ object="hed__Course_Offering__c",
+ )
+ if session
+ else None
+ )
+ donation_id = self.general_query(
+ ext_id=ext_id,
+ object="Donation__c",
+ )
+
+ data = {
+ "Name": f"{first_name} {last_name}'s Donation",
+ "Amount__c": amount,
+ "Course_Offering__c": session_id,
+ "First_Name__c": first_name,
+ "Last_Name__c": last_name,
+ "Email__c": email,
+ "Is_Verified__c": is_verified,
+ "Receipt_Sent__c": receipt_sent,
+ "Referral_Code__c": referral_code,
+ "External_Id__c": ext_id,
+ }
+
+ if not donation_id:
+ self.salesforce_obj.Donation__c.create(
+ data,
+ )
+ else:
+ self.salesforce_obj.Donation__c.update(
+ donation_id,
+ data,
+ )
+
+ def add_email_content(
+ self,
+ nickname,
+ subject,
+ body,
+ is_active,
+ ):
+
+ self.salesforce_obj.Email_Content__c.create(
+ {
+ "Nickname__c": nickname,
+ "Subject__c": subject,
+ "Body__c": body,
+ "Active__c": is_active,
+ }
+ )
+
+ def add_equipment_type(self, name, ext_id):
+
+ type_id = self.general_query(
+ ext_id=ext_id,
+ object="Equipment_Type__c",
+ )
+
+ if not type_id:
+ self.salesforce_obj.Equipment_Type__c.create(
+ {
+ "Name": name,
+ "External_Id__c": ext_id,
+ }
+ )
+ else:
+ self.salesforce_obj.Equipment_Type__c.update(
+ type_id,
+ {
+ "Name": name,
+ "External_Id__c": ext_id,
+ },
+ )
+
+ def add_equipment(
+ self,
+ uuid,
+ equipment_type,
+ make,
+ model,
+ asset_tag,
+ acquisition_date,
+ condition,
+ notes,
+ last_system_update_check_in,
+ last_system_update,
+ force_update_on_next_boot,
+ ext_id,
+ ):
+
+ equipment_type_id = self.general_query(
+ ext_id=equipment_type.id,
+ object="Equipment_Type__c",
+ )
+ formatted_time = acquisition_date.strftime("%Y-%m-%dT%H:%M:%SZ").__str__() if acquisition_date else None
+ equipment_id = self.general_query(ext_id=ext_id, object="Equipment__c")
+
+ data = {
+ "uuid__c": uuid,
+ "Type__c": equipment_type_id,
+ "Make__c": make,
+ "Model__c": model,
+ "Asset_Tag__c": asset_tag,
+ "Acquisition_Date__c": formatted_time,
+ "Condition__c": condition,
+ "Notes__c": notes,
+ "Last_System_Update__c": last_system_update,
+ "Last_System_Update_Checkin__c": last_system_update_check_in,
+ "Force_Update_On_Next_Boot__c": force_update_on_next_boot,
+ "External_Id__c": ext_id,
+ }
+
+ if not equipment_id:
+ self.salesforce_obj.Equipment__c.create(
+ data,
+ )
+ else:
+ self.salesforce_obj.Equipment__c.update(
+ equipment_id,
+ data,
+ )
+
+ def add_location(
+ self,
+ name,
+ address,
+ city,
+ state,
+ zip,
+ is_active,
+ ext_id,
+ ):
+
+ location_id = self.general_query(ext_id=ext_id, object="CLocation__c")
+
+ if not location_id:
+
+ self.salesforce_obj.CLocation__c.create(
+ {
+ "Active__c": is_active,
+ "Address__c": address,
+ "City__c": city,
+ "External_Id__c": ext_id,
+ "Name__c": name,
+ "State__c": state,
+ "Zip__c": zip,
+ }
+ )
+
+ else:
+ self.salesforce_obj.CLocation__c.update(
+ location_id,
+ {
+ "Active__c": is_active,
+ "Address__c": address,
+ "City__c": city,
+ "External_Id__c": ext_id,
+ "Name__c": name,
+ "State__c": state,
+ "Zip__c": zip,
+ },
+ )
+
+ def add_meeting_type(
+ self,
+ code,
+ title,
+ slug,
+ description,
+ ext_id,
+ ):
+ type_id = self.meeting_type_query(ext_id=ext_id, object="Meeting_Type__c")
+
+ if not type_id:
+ self.salesforce_obj.Meeting_Type__c.create(
+ {
+ "Code__c": code,
+ "Description__c": description,
+ "Title__c": title,
+ "Slug__c": slug,
+ "External_Id__c": ext_id,
+ }
+ )
+ else:
+ self.salesforce_obj.Meeting_Type__c.update(
+ type_id,
+ {
+ "Code__c": code,
+ "Description__c": description,
+ "Title__c": title,
+ "Slug__c": slug,
+ "External_Id__c": ext_id,
+ },
+ )
+
+ def add_meeting(
+ self,
+ meeting_type,
+ additional_info,
+ start_date,
+ end_date,
+ location,
+ external_enrollment_url,
+ is_public,
+ is_active,
+ ext_id,
+ announced_date,
+ ):
+
+ meeting_type_id = self.general_query(ext_id=meeting_type.id, object="Meeting_Type__c")
+ location_id = self.general_query(
+ ext_id=location.id,
+ object="CLocation__c",
+ )
+ meeting_id = self.general_query(ext_id=ext_id, object="Meeting__c")
+
+ formatted_start = start_date.strftime("%Y-%m-%dT%H:%M:%SZ").__str__() if start_date else None
+ formatted_end = end_date.strftime("%Y-%m-%dT%H:%M:%SZ").__str__() if end_date else None
+ formatted_announced = announced_date.strftime("%Y-%m-%dT%H:%M:%SZ").__str__() if announced_date else None
+
+ data = {
+ "Location__c": location_id,
+ "Meeting_Type__c": meeting_type_id,
+ "Additional_Information__c": additional_info,
+ "Start_Date__c": formatted_start,
+ "End_Date__c": formatted_end,
+ "External_Enrollment_URL__c": external_enrollment_url,
+ "Is_Public__c": is_public,
+ "Is_Active__c": is_active,
+ "Announced_Date__c": formatted_announced,
+ }
+
+ if not meeting_id:
+ self.salesforce_obj.Meeting__c.create(
+ data,
+ )
+ else:
+ self.salesforce_obj.Meeting__c.update(
+ meeting_id,
+ data,
+ )
diff --git a/coderdojochi/models/course.py b/coderdojochi/models/course.py
index 74b5ac36..e8d6f1e9 100644
--- a/coderdojochi/models/course.py
+++ b/coderdojochi/models/course.py
@@ -3,7 +3,10 @@
from django.core.validators import MaxValueValidator, MinValueValidator
from django.db import models
-from .common import CommonInfo
+
+from .common import CommonInfo, Salesforce
+from django.db.models.signals import pre_save
+from django.dispatch import receiver
class Course(CommonInfo):
@@ -63,3 +66,20 @@ def __str__(self):
return f"{self.code} | {self.title}"
return f"{self.title}"
+
+ def save(self, *args, **kwargs):
+
+ super().save(*args, **kwargs)
+
+ sf = Salesforce()
+
+ sf.upsert_course(
+ name=self.title,
+ active=self.is_active,
+ course_id=self.code,
+ course_type=self.course_type,
+ description=self.description,
+ duration=self.duration,
+ minimum_age=self.minimum_age,
+ maximum_age=self.maximum_age,
+ )
diff --git a/coderdojochi/models/donation.py b/coderdojochi/models/donation.py
index 6478c630..05e14f81 100644
--- a/coderdojochi/models/donation.py
+++ b/coderdojochi/models/donation.py
@@ -1,8 +1,10 @@
+from calendar import firstweekday
+
from django.contrib.contenttypes.models import ContentType
from django.db import models
from django.urls import reverse
-from .common import CommonInfo
+from .common import CommonInfo, Salesforce
class Donation(CommonInfo):
@@ -81,3 +83,21 @@ def get_email(self):
return self.email
get_email.short_description = "Email"
+
+ def save(self, *args, **kwargs):
+
+ super().save(*args, **kwargs)
+
+ sf = Salesforce()
+
+ sf.add_donation(
+ session=self.session,
+ first_name=self.first_name,
+ last_name=self.last_name,
+ email=self.email,
+ is_verified=self.is_verified,
+ receipt_sent=self.receipt_sent,
+ referral_code=self.referral_code,
+ amount=self.amount,
+ ext_id=self.id,
+ )
diff --git a/coderdojochi/models/email_content.py b/coderdojochi/models/email_content.py
index 7d8f455a..d9dfc0c3 100644
--- a/coderdojochi/models/email_content.py
+++ b/coderdojochi/models/email_content.py
@@ -1,6 +1,6 @@
from django.db import models
-from .common import CommonInfo
+from .common import CommonInfo, Salesforce
class EmailContent(CommonInfo):
@@ -29,3 +29,15 @@ class Meta:
def __str__(self):
return f"{self.nickname} | {self.subject}"
+
+ def save(self, *args, **kwargs):
+ super().save(*args, **kwargs)
+
+ sf = Salesforce()
+
+ sf.add_email_content(
+ nickname=self.nickname,
+ subject=self.subject,
+ body=self.body,
+ is_active=self.is_active,
+ )
diff --git a/coderdojochi/models/equipment.py b/coderdojochi/models/equipment.py
index 2e0b6eb4..4a7e0b5f 100644
--- a/coderdojochi/models/equipment.py
+++ b/coderdojochi/models/equipment.py
@@ -1,6 +1,8 @@
from django.db import models
-from .common import CommonInfo
+from .common import CommonInfo, Salesforce
+
+sf = Salesforce()
class EquipmentType(CommonInfo):
@@ -14,6 +16,14 @@ class EquipmentType(CommonInfo):
def __str__(self):
return self.name
+ def save(self, *args, **kwargs):
+ super().save(*args, **kwargs)
+
+ sf.add_equipment_type(
+ name=self.name,
+ ext_id=self.id,
+ )
+
class Equipment(CommonInfo):
WORKING = "working"
@@ -87,3 +97,22 @@ class Meta:
def __str__(self):
return f"{self.equipment_type.name} | {self.make} {self.model} | {self.acquisition_date}"
+
+ def save(self, *args, **kwargs):
+
+ super().save(*args, **kwargs)
+
+ sf.add_equipment(
+ uuid=self.uuid,
+ equipment_type=self.equipment_type,
+ make=self.make,
+ model=self.model,
+ asset_tag=self.asset_tag,
+ acquisition_date=self.acquisition_date,
+ condition=self.condition,
+ notes=self.notes,
+ last_system_update=self.last_system_update,
+ last_system_update_check_in=self.last_system_update_check_in,
+ force_update_on_next_boot=self.force_update_on_next_boot,
+ ext_id=self.id,
+ )
diff --git a/coderdojochi/models/guardian.py b/coderdojochi/models/guardian.py
index aedf2a6d..87343c2a 100644
--- a/coderdojochi/models/guardian.py
+++ b/coderdojochi/models/guardian.py
@@ -1,11 +1,35 @@
from django.db import models
-from .common import CommonInfo
+from .common import CommonInfo, Salesforce
from .race_ethnicity import RaceEthnicity
from .user import CDCUser
class Guardian(CommonInfo):
+ HISPANIC = "Hispanic"
+ NOT_HISPANIC = "Not Hispanic"
+
+ ETHNICITY = [
+ (HISPANIC, "Hispanic"),
+ (NOT_HISPANIC, "Not Hispanic"),
+ ]
+
+ WHITE = "White"
+ BLACK = "Black"
+ ASIAN = "Asian"
+ AMERICAN_INDIAN = "American Indian"
+ NATIVE_HAWAIIN = "Native Hawaiin"
+ MIDDLE_EASTERN = "Middle Eastern"
+
+ RACES = [
+ (WHITE, "White"),
+ (BLACK, "Black"),
+ (ASIAN, "Asian"),
+ (AMERICAN_INDIAN, "American Indian"),
+ (NATIVE_HAWAIIN, "Native Hawaiin"),
+ (MIDDLE_EASTERN, "Middle Eastern"),
+ ]
+
user = models.ForeignKey(
CDCUser,
on_delete=models.CASCADE,
@@ -31,9 +55,15 @@ class Guardian(CommonInfo):
blank=False,
null=True,
)
- race_ethnicity = models.ManyToManyField(
- RaceEthnicity,
- blank=False,
+ ethnicity = models.CharField(
+ choices=ETHNICITY,
+ max_length=12,
+ default="",
+ )
+ race = models.CharField(
+ choices=RACES,
+ max_length=15,
+ default="",
)
def __str__(self):
@@ -62,3 +92,25 @@ def get_students(self):
guardian=self,
is_active=True,
)
+
+ def save(self, *args, **kwargs):
+
+ super().save(*args, **kwargs)
+
+ sf = Salesforce()
+
+ if self.birthday and self.zip:
+ sf.upsert_contact(
+ first_name=self.first_name,
+ last_name=self.last_name,
+ birthdate=self.birthday,
+ gender=self.gender,
+ email=self.email,
+ race=self.race,
+ ethnicity=self.ethnicity,
+ role="guardian",
+ active=self.is_active,
+ zip_code=self.zip.replace("-", ""),
+ phone=self.phone,
+ ext_id=self.id,
+ )
diff --git a/coderdojochi/models/location.py b/coderdojochi/models/location.py
index 1a7f9ad5..be654dae 100644
--- a/coderdojochi/models/location.py
+++ b/coderdojochi/models/location.py
@@ -1,6 +1,7 @@
+from os import stat
from django.db import models
-from .common import CommonInfo
+from .common import CommonInfo, Salesforce
class Location(CommonInfo):
@@ -42,3 +43,18 @@ class Meta:
def __str__(self):
return self.name
+
+ def save(self, *args, **kwargs):
+ super().save(*args, **kwargs)
+
+ sf = Salesforce()
+
+ sf.add_location(
+ name=self.name,
+ address=self.address,
+ city=self.city,
+ state=self.state,
+ zip=self.zip,
+ is_active=self.is_active,
+ ext_id=self.id,
+ )
diff --git a/coderdojochi/models/meeting.py b/coderdojochi/models/meeting.py
index 91af8780..d5942e45 100644
--- a/coderdojochi/models/meeting.py
+++ b/coderdojochi/models/meeting.py
@@ -2,7 +2,7 @@
from django.urls import reverse
from django.utils import formats
-from .common import CommonInfo
+from .common import CommonInfo, Salesforce
from .location import Location
from .mentor import Mentor
@@ -33,6 +33,19 @@ def __str__(self):
return f"{self.title}"
+ def save(self, *args, **kwargs):
+ super().save(*args, **kwargs)
+
+ sf = Salesforce()
+
+ sf.add_meeting_type(
+ code=self.code,
+ title=self.title,
+ slug=self.slug,
+ description=self.description,
+ ext_id=f"{self.code}{self.id}",
+ )
+
class Meeting(CommonInfo):
meeting_type = models.ForeignKey(
@@ -83,8 +96,10 @@ class Meeting(CommonInfo):
)
def __str__(self):
- date = formats.date_format(self.start_date, "SHORT_DATETIME_FORMAT")
- return f"{self.meeting_type.title} | {date}"
+ if self.start_date:
+ date = formats.date_format(self.start_date, "SHORT_DATETIME_FORMAT")
+ return f"{self.meeting_type.title} | {date}"
+ return ""
def get_absolute_url(self):
return reverse("meeting-detail", args=[str(self.id)])
@@ -135,6 +150,24 @@ def get_mentor_count(self):
get_mentor_count.short_description = "Mentors"
+ def save(self, *args, **kwargs):
+ super().save(*args, **kwargs)
+
+ sf = Salesforce()
+
+ sf.add_meeting(
+ meeting_type=self.meeting_type,
+ additional_info=self.additional_info,
+ start_date=self.start_date,
+ end_date=self.end_date,
+ location=self.location,
+ external_enrollment_url=self.external_enrollment_url,
+ is_public=self.is_public,
+ is_active=self.is_active,
+ ext_id=self.id,
+ announced_date=self.announced_date,
+ )
+
class MeetingOrder(CommonInfo):
mentor = models.ForeignKey(
diff --git a/coderdojochi/models/mentor.py b/coderdojochi/models/mentor.py
index c8a20b5d..3fff8cf9 100644
--- a/coderdojochi/models/mentor.py
+++ b/coderdojochi/models/mentor.py
@@ -6,7 +6,7 @@
from stdimage.models import StdImageField
from ..notifications import NewMentorBgCheckNotification, NewMentorNotification, NewMentorOrderNotification
-from .common import CommonInfo
+from .common import CommonInfo, Salesforce
from .race_ethnicity import RaceEthnicity
from .user import CDCUser
@@ -19,6 +19,30 @@ def generate_filename(instance, filename):
# TODO: Add MentorManager
class Mentor(CommonInfo):
+ HISPANIC = "Hispanic"
+ NOT_HISPANIC = "Not Hispanic"
+
+ ETHNICITY = [
+ (HISPANIC, "Hispanic"),
+ (NOT_HISPANIC, "Not Hispanic"),
+ ]
+
+ WHITE = "White"
+ BLACK = "Black"
+ ASIAN = "Asian"
+ AMERICAN_INDIAN = "American Indian"
+ NATIVE_HAWAIIN = "Native Hawaiin"
+ MIDDLE_EASTERN = "Middle Eastern"
+
+ RACES = [
+ (WHITE, "White"),
+ (BLACK, "Black"),
+ (ASIAN, "Asian"),
+ (AMERICAN_INDIAN, "American Indian"),
+ (NATIVE_HAWAIIN, "Native Hawaiin"),
+ (MIDDLE_EASTERN, "Middle Eastern"),
+ ]
+
user = models.ForeignKey(
CDCUser,
on_delete=models.CASCADE,
@@ -30,9 +54,11 @@ class Mentor(CommonInfo):
is_active = models.BooleanField(
default=True,
)
+ # Add background check field
background_check = models.BooleanField(
default=False,
)
+ # Add ispublic field
is_public = models.BooleanField(
default=False,
)
@@ -59,9 +85,15 @@ class Mentor(CommonInfo):
blank=False,
null=True,
)
- race_ethnicity = models.ManyToManyField(
- RaceEthnicity,
- blank=False,
+ ethnicity = models.CharField(
+ choices=ETHNICITY,
+ max_length=12,
+ default="",
+ )
+ race = models.CharField(
+ choices=RACES,
+ max_length=15,
+ default="",
)
work_place = models.CharField(
max_length=255,
@@ -176,3 +208,24 @@ def get_avatar(self):
}
return avatar
+
+ def save(self, *args, **kwargs):
+
+ super().save(*args, **kwargs)
+
+ sf = Salesforce()
+
+ if self.birthday:
+ sf.upsert_contact(
+ first_name=self.first_name,
+ last_name=self.last_name,
+ birthdate=self.birthday,
+ gender=self.gender,
+ email=self.email,
+ race=self.race,
+ ethnicity=self.ethnicity,
+ role="mentor",
+ active=self.is_active,
+ work_place=self.work_place,
+ ext_id=self.id,
+ )
diff --git a/coderdojochi/models/mentor_order.py b/coderdojochi/models/mentor_order.py
index 923c4d37..645550e5 100644
--- a/coderdojochi/models/mentor_order.py
+++ b/coderdojochi/models/mentor_order.py
@@ -3,7 +3,7 @@
from django.db import models
from ..notifications import NewMentorOrderNotification
-from .common import CommonInfo
+from .common import CommonInfo, Salesforce
class MentorOrder(CommonInfo):
@@ -62,3 +62,19 @@ def save(self, *args, **kwargs):
NewMentorOrderNotification(self).send()
super().save(*args, **kwargs)
+
+ print("SElf id is below")
+ print(self.id)
+
+ sf = Salesforce()
+
+ sf.create_order(
+ session=self.session,
+ main_contact=self.mentor,
+ active=self.is_active,
+ ip=self.ip,
+ check_in=self.check_in,
+ ext_id=f"mo{self.id}",
+ affiliate=self.affiliate,
+ is_mentor=True,
+ )
diff --git a/coderdojochi/models/order.py b/coderdojochi/models/order.py
index 86c9a2c6..26c63976 100644
--- a/coderdojochi/models/order.py
+++ b/coderdojochi/models/order.py
@@ -1,6 +1,6 @@
from django.db import models
-from .common import CommonInfo
+from .common import CommonInfo, Salesforce
class Order(CommonInfo):
@@ -71,3 +71,20 @@ def get_student_gender(self):
return self.student.get_clean_gender().title()
get_student_gender.short_description = "Gender"
+
+ def save(self, *args, **kwargs):
+
+ super().save(*args, **kwargs)
+
+ sf = Salesforce()
+
+ sf.create_order(
+ session=self.session,
+ guardian=self.guardian,
+ main_contact=self.student,
+ active=self.is_active,
+ ip=self.ip,
+ check_in=self.check_in,
+ ext_id=self.id.__str__(),
+ alternate_guardian=self.alternate_guardian,
+ )
diff --git a/coderdojochi/models/session.py b/coderdojochi/models/session.py
index 560a7007..d67ffdf2 100644
--- a/coderdojochi/models/session.py
+++ b/coderdojochi/models/session.py
@@ -1,12 +1,14 @@
from datetime import timedelta
-
+from tasks import start
+import random
from django.core.validators import MaxValueValidator, MinValueValidator
from django.db import models
from django.urls.base import reverse
from django.utils import formats
from django.utils.functional import cached_property
+from requests.sessions import session
-from .common import CommonInfo
+from .common import CommonInfo, Salesforce
class Session(CommonInfo):
@@ -28,6 +30,11 @@ class Session(CommonInfo):
on_delete=models.CASCADE,
limit_choices_to={"is_active": True},
)
+ title = models.TextField(
+ blank=True,
+ null=True,
+ default="",
+ )
start_date = models.DateTimeField()
location = models.ForeignKey(
Location,
@@ -330,6 +337,46 @@ def get_checked_in_students(self):
return Order.objects.filter(is_active=True, session=self).exclude(check_in=None).values("student")
+ def save(self, *args, **kwargs):
+
+ rand_num = random.randrange(1000)
+
+ self.title = f"{self.course.title} Offering: {rand_num}"
+
+ super().save(*args, **kwargs)
+
+ sf = Salesforce()
+
+ # first_assistant = None
+
+ # print("SElff assistan all")
+ print(self.assistant.all())
+ # for assist in self.assistant.all():
+ # print("Assistants")
+ # print(assist)
+ # # print("Printed")
+ # print("Assistant type")
+ # print(type(self.assistant))
+
+ sf.create_session(
+ course=self.course,
+ title=self.title,
+ start_datetime=self.start_date,
+ location=self.location,
+ capacity=self.capacity,
+ mentor_capacity=self.mentor_capacity,
+ mentor=self.instructor,
+ ext_id=self.id,
+ # assistant=self.assistant,
+ online_link=self.online_video_link,
+ video_meeting_id=self.online_video_meeting_id,
+ meeting_password=self.online_video_meeting_password,
+ cost=self.cost,
+ minimum_cost=self.minimum_cost,
+ maximum_cost=self.maximum_cost,
+ additional_info=self.additional_info,
+ )
+
class PartnerPasswordAccess(CommonInfo):
from .user import CDCUser
diff --git a/coderdojochi/models/student.py b/coderdojochi/models/student.py
index 88f6643f..22898bef 100644
--- a/coderdojochi/models/student.py
+++ b/coderdojochi/models/student.py
@@ -1,13 +1,40 @@
from django.db import models
from django.utils import timezone
-from .common import CommonInfo
-from .race_ethnicity import RaceEthnicity
+# from simple_salesforce import format_soql
+
+from .common import CommonInfo, Salesforce
+
+# from .race_ethnicity import RaceEthnicity
class Student(CommonInfo):
from .guardian import Guardian
+ HISPANIC = "Hispanic"
+ NOT_HISPANIC = "Not Hispanic"
+
+ ETHNICITY = [
+ (HISPANIC, "Hispanic"),
+ (NOT_HISPANIC, "Not Hispanic"),
+ ]
+
+ WHITE = "White"
+ BLACK = "Black"
+ ASIAN = "Asian"
+ AMERICAN_INDIAN = "American Indian"
+ NATIVE_HAWAIIN = "Native Hawaiin"
+ MIDDLE_EASTERN = "Middle Eastern"
+
+ RACES = [
+ (WHITE, "White"),
+ (BLACK, "Black"),
+ (ASIAN, "Asian"),
+ (AMERICAN_INDIAN, "American Indian"),
+ (NATIVE_HAWAIIN, "Native Hawaiin"),
+ (MIDDLE_EASTERN, "Middle Eastern"),
+ ]
+
guardian = models.ForeignKey(
Guardian,
on_delete=models.CASCADE,
@@ -22,10 +49,18 @@ class Student(CommonInfo):
gender = models.CharField(
max_length=255,
)
- race_ethnicity = models.ManyToManyField(
- RaceEthnicity,
- blank=True,
+
+ ethnicity = models.CharField(
+ choices=ETHNICITY,
+ max_length=12,
+ default="",
+ )
+ race = models.CharField(
+ choices=RACES,
+ max_length=15,
+ default="",
)
+
school_name = models.CharField(
max_length=255,
null=True,
@@ -116,3 +151,33 @@ def is_within_gender_limitation(self, limitation):
return False
else:
return True
+
+ def save(self, *args, **kwargs):
+ # How to get self.guardian first and last name for querying
+ super().save(*args, **kwargs)
+
+ obj = Salesforce()
+
+ obj.upsert_contact(
+ first_name=self.first_name,
+ last_name=self.last_name,
+ birthdate=self.birthday,
+ gender=self.gender,
+ race=self.race,
+ ethnicity=self.ethnicity,
+ role="student",
+ parent=self.guardian,
+ active=self.is_active,
+ school_name=self.school_name,
+ school_type=self.school_type,
+ medical=self.medical_conditions,
+ medications=self.medications,
+ ext_id=self.id,
+ )
+
+ obj.create_relationship(
+ parent_first_name=self.guardian.first_name,
+ parent_last_name=self.guardian.last_name,
+ child_first_name=self.first_name,
+ child_last_name=self.last_name,
+ )
diff --git a/coderdojochi/settings.py b/coderdojochi/settings.py
index e73ec4e4..daf5c611 100644
--- a/coderdojochi/settings.py
+++ b/coderdojochi/settings.py
@@ -86,6 +86,8 @@
"django.contrib.admin",
"django.contrib.redirects",
"django.contrib.sitemaps",
+ "django_cron",
+ "django_crontab",
# vendor
"active_link",
"allauth",
@@ -120,6 +122,12 @@
"django.contrib.redirects.middleware.RedirectFallbackMiddleware",
]
+CRON_CLASSES = [
+ "coderdojochi.cron.SendReminders",
+]
+
+CRONJOBS = [("* * * * *", "coderdojochi.cron.my_scheduled_job")]
+
ROOT_URLCONF = "coderdojochi.urls"
TEMPLATES = [
@@ -337,14 +345,33 @@ def MediaRootS3BotoStorage():
# Email
-ANYMAIL = {
- "SENDGRID_API_KEY": env("SENDGRID_API_KEY"),
-}
-EMAIL_BACKEND = "anymail.backends.sendgrid.EmailBackend"
-DEFAULT_FROM_EMAIL = env("DEFAULT_FROM_EMAIL")
+# ANYMAIL = {
+# "SENDGRID_API_KEY": env("SENDGRID_API_KEY"),
+# }
+# EMAIL_BACKEND = "anymail.backends.sendgrid.EmailBackend"
+# DEFAULT_FROM_EMAIL = env("DEFAULT_FROM_EMAIL")
+# CONTACT_EMAIL = env("CONTACT_EMAIL")
+# SENDGRID_UNSUB_CLASSANNOUNCE = env.int("SENDGRID_UNSUB_CLASSANNOUNCE")
+
+# EMAIL
+# ------------------------------------------------------------------------------
CONTACT_EMAIL = env("CONTACT_EMAIL")
-SENDGRID_UNSUB_CLASSANNOUNCE = env.int("SENDGRID_UNSUB_CLASSANNOUNCE")
-
+DEFAULT_FROM_EMAIL = env("DEFAULT_FROM_EMAIL")
+if DEBUG:
+ # https://docs.djangoproject.com/en/dev/ref/settings/#email-host
+ EMAIL_HOST = env("EMAIL_HOST", default="mailhog")
+ # https://docs.djangoproject.com/en/dev/ref/settings/#email-port
+ EMAIL_PORT = 1025
+else:
+ # https://anymail.readthedocs.io/en/stable/esps/sendgrid/
+ EMAIL_BACKEND = "anymail.backends.sendgrid.EmailBackend"
+ ANYMAIL = {
+ "SENDGRID_API_KEY": env("SENDGRID_API_KEY"),
+ "SENDGRID_GENERATE_MESSAGE_ID": env("SENDGRID_GENERATE_MESSAGE_ID", default=True),
+ # "SENDGRID_MERGE_FIELD_FORMAT": env("SENDGRID_MERGE_FIELD_FORMAT"),
+ "SENDGRID_API_URL": env("SENDGRID_API_URL", default="https://api.sendgrid.com/v3/"),
+ }
+ SENDGRID_UNSUB_CLASSANNOUNCE = env.int("SENDGRID_UNSUB_CLASSANNOUNCE")
# Slack
SLACK_WEBHOOK_URL = env("SLACK_WEBHOOK_URL")
@@ -389,6 +416,12 @@ def custom_show_toolbar(request):
"SHOW_COLLAPSED": True,
}
+# Salesforce login
+
+SALESFORCE_USER = os.environ.get("SALESFORCE_USER")
+SALESFORCE_PASSWORD = os.environ.get("SALESFORCE_PASSWORD")
+SALESFORCE_TOKEN = os.environ.get("SALESFORCE_TOKEN")
+SALESFORCE_DOMAIN = os.environ.get("SALESFORCE_DOMAIN")
# Activate Django-Heroku.
django_heroku.settings(locals(), staticfiles=False)
diff --git a/coderdojochi/util.py b/coderdojochi/util.py
index 0da1087e..986e5fd6 100644
--- a/coderdojochi/util.py
+++ b/coderdojochi/util.py
@@ -26,16 +26,19 @@ def email(
reply_to=None,
unsub_group_id=None,
):
-
+ print("Email1")
if not (subject and template_name and recipients):
+ print("Email2")
raise NameError()
if not isinstance(recipients, list):
+ print("Email3")
raise TypeError("recipients must be a list")
# bcc is set to False by default.
# make sure bcc is in a list form when sent over
if bcc not in [False, None] and not isinstance(bcc, list):
+ print("Email4")
raise TypeError("recipients must be a list")
merge_global_data["subject"] = subject
@@ -45,8 +48,8 @@ def email(
merge_global_data["preheader"] = preheader
merge_global_data["unsub_group_id"] = unsub_group_id
- body = render_to_string(f"{template_name}.html", merge_global_data)
-
+ body = "This is a test email"
+ # render_to_string(f"{template_name}.html", merge_global_data)
# If we send values that don't exist in the template,
# SendGrid divides by zero, doesn't pass go, does not collect $200.
merge_field_format = "*|{}|*"
diff --git a/cypress.json b/cypress.json
new file mode 100644
index 00000000..0967ef42
--- /dev/null
+++ b/cypress.json
@@ -0,0 +1 @@
+{}
diff --git a/docker-compose.yml b/docker-compose.yml
index 508938ea..9c476cfc 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -13,6 +13,7 @@ services:
- "8000:8000"
depends_on:
- db
+ - mailhog
db:
image: postgres:12.5-alpine
environment:
@@ -20,3 +21,8 @@ services:
container_name: dojo-v1-db
ports:
- "5432:5432"
+ mailhog:
+ image: mailhog/mailhog:v1.0.0
+ container_name: mailhog
+ ports:
+ - "8025:8025"
diff --git a/fixtures/10-coderdojochi.guardian.json b/fixtures/10-coderdojochi.guardian.json
index 5567a2bd..71895112 100644
--- a/fixtures/10-coderdojochi.guardian.json
+++ b/fixtures/10-coderdojochi.guardian.json
@@ -11,7 +11,8 @@
"zip": "60650",
"birthday": null,
"gender": null,
- "race_ethnicity": []
+ "ethnicity":[],
+ "race" : []
}
}
]
diff --git a/fixtures/12-coderdojochi.mentor.json b/fixtures/12-coderdojochi.mentor.json
index 388de454..64b1470c 100644
--- a/fixtures/12-coderdojochi.mentor.json
+++ b/fixtures/12-coderdojochi.mentor.json
@@ -17,7 +17,8 @@
"work_place": null,
"phone": null,
"home_address": null,
- "race_ethnicity": []
+ "ethnicity" : [],
+ "race" : []
}
},
{
@@ -38,7 +39,8 @@
"work_place": null,
"phone": null,
"home_address": null,
- "race_ethnicity": [2]
+ "ethnicity" : [],
+ "race" : []
}
},
{
@@ -59,7 +61,8 @@
"work_place": null,
"phone": null,
"home_address": null,
- "race_ethnicity": []
+ "ethnicity" : [],
+ "race" : []
}
},
{
@@ -80,7 +83,8 @@
"work_place": null,
"phone": null,
"home_address": null,
- "race_ethnicity": []
+ "ethnicity" : [],
+ "race" : []
}
},
{
@@ -101,7 +105,8 @@
"work_place": null,
"phone": null,
"home_address": null,
- "race_ethnicity": []
+ "ethnicity" : [],
+ "race" : []
}
},
{
@@ -122,7 +127,8 @@
"work_place": null,
"phone": null,
"home_address": null,
- "race_ethnicity": []
+ "ethnicity" : [],
+ "race" : []
}
},
{
@@ -143,7 +149,8 @@
"work_place": null,
"phone": null,
"home_address": null,
- "race_ethnicity": []
+ "ethnicity" : [],
+ "race" : []
}
},
{
@@ -164,7 +171,8 @@
"work_place": null,
"phone": null,
"home_address": null,
- "race_ethnicity": []
+ "ethnicity" : [],
+ "race" : []
}
},
{
@@ -185,7 +193,8 @@
"work_place": null,
"phone": null,
"home_address": null,
- "race_ethnicity": []
+ "ethnicity" : [],
+ "race" : []
}
},
{
@@ -206,7 +215,8 @@
"work_place": null,
"phone": null,
"home_address": null,
- "race_ethnicity": []
+ "ethnicity" : [],
+ "race" : []
}
},
{
@@ -227,7 +237,8 @@
"work_place": null,
"phone": null,
"home_address": null,
- "race_ethnicity": []
+ "ethnicity" : [],
+ "race" : []
}
},
{
@@ -248,7 +259,8 @@
"work_place": null,
"phone": null,
"home_address": null,
- "race_ethnicity": []
+ "ethnicity" : [],
+ "race" : []
}
},
{
@@ -269,7 +281,8 @@
"work_place": null,
"phone": null,
"home_address": null,
- "race_ethnicity": []
+ "ethnicity" : [],
+ "race" : []
}
},
{
@@ -290,7 +303,8 @@
"work_place": null,
"phone": null,
"home_address": null,
- "race_ethnicity": []
+ "ethnicity" : [],
+ "race" : []
}
},
{
@@ -311,7 +325,8 @@
"work_place": null,
"phone": null,
"home_address": null,
- "race_ethnicity": []
+ "ethnicity" : [],
+ "race" : []
}
},
{
@@ -332,7 +347,8 @@
"work_place": null,
"phone": null,
"home_address": null,
- "race_ethnicity": []
+ "ethnicity" : [],
+ "race" : []
}
},
{
@@ -353,7 +369,8 @@
"work_place": null,
"phone": null,
"home_address": null,
- "race_ethnicity": []
+ "ethnicity" : [],
+ "race" : []
}
},
{
@@ -374,7 +391,8 @@
"work_place": null,
"phone": null,
"home_address": null,
- "race_ethnicity": []
+ "ethnicity" : [],
+ "race" : []
}
},
{
@@ -395,7 +413,8 @@
"work_place": null,
"phone": null,
"home_address": null,
- "race_ethnicity": []
+ "ethnicity" : [],
+ "race" : []
}
},
{
@@ -416,7 +435,8 @@
"work_place": null,
"phone": null,
"home_address": null,
- "race_ethnicity": []
+ "ethnicity" : [],
+ "race" : []
}
},
{
@@ -437,7 +457,8 @@
"work_place": null,
"phone": null,
"home_address": null,
- "race_ethnicity": []
+ "ethnicity" : [],
+ "race" : []
}
},
{
@@ -458,7 +479,8 @@
"work_place": null,
"phone": null,
"home_address": null,
- "race_ethnicity": []
+ "ethnicity" : [],
+ "race" : []
}
},
{
@@ -479,7 +501,8 @@
"work_place": null,
"phone": null,
"home_address": null,
- "race_ethnicity": []
+ "ethnicity" : [],
+ "race" : []
}
},
{
@@ -500,7 +523,8 @@
"work_place": null,
"phone": null,
"home_address": null,
- "race_ethnicity": []
+ "ethnicity" : [],
+ "race" : []
}
},
{
@@ -521,7 +545,8 @@
"work_place": null,
"phone": null,
"home_address": null,
- "race_ethnicity": []
+ "ethnicity" : [],
+ "race" : []
}
},
{
@@ -542,7 +567,8 @@
"work_place": null,
"phone": null,
"home_address": null,
- "race_ethnicity": []
+ "ethnicity" : [],
+ "race" : []
}
},
{
@@ -563,7 +589,8 @@
"work_place": null,
"phone": null,
"home_address": null,
- "race_ethnicity": []
+ "ethnicity" : [],
+ "race" : []
}
},
{
@@ -584,7 +611,8 @@
"work_place": null,
"phone": null,
"home_address": null,
- "race_ethnicity": []
+ "ethnicity" : [],
+ "race" : []
}
},
{
@@ -605,7 +633,8 @@
"work_place": null,
"phone": null,
"home_address": null,
- "race_ethnicity": []
+ "ethnicity" : [],
+ "race" : []
}
},
{
@@ -626,7 +655,8 @@
"work_place": null,
"phone": null,
"home_address": null,
- "race_ethnicity": []
+ "ethnicity" : [],
+ "race" : []
}
},
{
@@ -647,7 +677,8 @@
"work_place": null,
"phone": null,
"home_address": null,
- "race_ethnicity": []
+ "ethnicity" : [],
+ "race" : []
}
},
{
@@ -668,7 +699,8 @@
"work_place": null,
"phone": null,
"home_address": null,
- "race_ethnicity": []
+ "ethnicity" : [],
+ "race" : []
}
},
{
@@ -689,7 +721,8 @@
"work_place": null,
"phone": null,
"home_address": null,
- "race_ethnicity": []
+ "ethnicity" : [],
+ "race" : []
}
},
{
@@ -710,7 +743,8 @@
"work_place": null,
"phone": null,
"home_address": null,
- "race_ethnicity": []
+ "ethnicity" : [],
+ "race" : []
}
},
{
@@ -731,7 +765,8 @@
"work_place": null,
"phone": null,
"home_address": null,
- "race_ethnicity": []
+ "ethnicity" : [],
+ "race" : []
}
},
{
@@ -752,7 +787,8 @@
"work_place": null,
"phone": null,
"home_address": null,
- "race_ethnicity": []
+ "ethnicity" : [],
+ "race" : []
}
},
{
@@ -773,7 +809,8 @@
"work_place": null,
"phone": null,
"home_address": null,
- "race_ethnicity": []
+ "ethnicity" : [],
+ "race" : []
}
},
{
@@ -794,7 +831,8 @@
"work_place": null,
"phone": null,
"home_address": null,
- "race_ethnicity": []
+ "ethnicity" : [],
+ "race" : []
}
},
{
@@ -815,7 +853,8 @@
"work_place": null,
"phone": null,
"home_address": null,
- "race_ethnicity": []
+ "ethnicity" : [],
+ "race" : []
}
},
{
@@ -836,7 +875,8 @@
"work_place": null,
"phone": null,
"home_address": null,
- "race_ethnicity": []
+ "ethnicity" : [],
+ "race" : []
}
},
{
@@ -857,7 +897,8 @@
"work_place": null,
"phone": null,
"home_address": null,
- "race_ethnicity": []
+ "ethnicity" : [],
+ "race" : []
}
},
{
@@ -878,7 +919,8 @@
"work_place": null,
"phone": null,
"home_address": null,
- "race_ethnicity": []
+ "ethnicity" : [],
+ "race" : []
}
},
{
@@ -899,7 +941,8 @@
"work_place": null,
"phone": null,
"home_address": null,
- "race_ethnicity": []
+ "ethnicity" : [],
+ "race" : []
}
},
{
@@ -920,7 +963,8 @@
"work_place": null,
"phone": null,
"home_address": null,
- "race_ethnicity": []
+ "ethnicity" : [],
+ "race" : []
}
},
{
@@ -941,7 +985,8 @@
"work_place": null,
"phone": null,
"home_address": null,
- "race_ethnicity": []
+ "ethnicity" : [],
+ "race" : []
}
},
{
@@ -962,7 +1007,8 @@
"work_place": null,
"phone": null,
"home_address": null,
- "race_ethnicity": []
+ "ethnicity" : [],
+ "race" : []
}
},
{
@@ -983,7 +1029,8 @@
"work_place": null,
"phone": null,
"home_address": null,
- "race_ethnicity": []
+ "ethnicity" : [],
+ "race" : []
}
},
{
@@ -1004,7 +1051,8 @@
"work_place": null,
"phone": null,
"home_address": null,
- "race_ethnicity": []
+ "ethnicity" : [],
+ "race" : []
}
},
{
@@ -1025,7 +1073,8 @@
"work_place": null,
"phone": null,
"home_address": null,
- "race_ethnicity": []
+ "ethnicity" : [],
+ "race" : []
}
},
{
@@ -1046,7 +1095,8 @@
"work_place": null,
"phone": null,
"home_address": null,
- "race_ethnicity": []
+ "ethnicity" : [],
+ "race" : []
}
},
{
@@ -1067,7 +1117,8 @@
"work_place": null,
"phone": null,
"home_address": null,
- "race_ethnicity": []
+ "ethnicity" : [],
+ "race" : []
}
},
{
@@ -1088,7 +1139,8 @@
"work_place": null,
"phone": null,
"home_address": null,
- "race_ethnicity": []
+ "ethnicity" : [],
+ "race" : []
}
},
{
@@ -1109,7 +1161,8 @@
"work_place": null,
"phone": null,
"home_address": null,
- "race_ethnicity": []
+ "ethnicity" : [],
+ "race" : []
}
},
{
@@ -1130,7 +1183,8 @@
"work_place": null,
"phone": null,
"home_address": null,
- "race_ethnicity": []
+ "ethnicity" : [],
+ "race" : []
}
},
{
@@ -1151,7 +1205,8 @@
"work_place": null,
"phone": null,
"home_address": null,
- "race_ethnicity": []
+ "ethnicity" : [],
+ "race" : []
}
},
{
@@ -1172,7 +1227,8 @@
"work_place": null,
"phone": null,
"home_address": null,
- "race_ethnicity": []
+ "ethnicity" : [],
+ "race" : []
}
},
{
@@ -1193,7 +1249,8 @@
"work_place": null,
"phone": null,
"home_address": null,
- "race_ethnicity": []
+ "ethnicity" : [],
+ "race" : []
}
},
{
@@ -1214,7 +1271,8 @@
"work_place": null,
"phone": null,
"home_address": null,
- "race_ethnicity": []
+ "ethnicity" : [],
+ "race" : []
}
},
{
@@ -1235,7 +1293,8 @@
"work_place": null,
"phone": null,
"home_address": null,
- "race_ethnicity": []
+ "ethnicity" : [],
+ "race" : []
}
},
{
@@ -1256,7 +1315,8 @@
"work_place": null,
"phone": null,
"home_address": null,
- "race_ethnicity": []
+ "ethnicity" : [],
+ "race" : []
}
},
{
@@ -1277,7 +1337,8 @@
"work_place": null,
"phone": null,
"home_address": null,
- "race_ethnicity": []
+ "ethnicity" : [],
+ "race" : []
}
},
{
@@ -1298,7 +1359,8 @@
"work_place": null,
"phone": null,
"home_address": null,
- "race_ethnicity": []
+ "ethnicity" : [],
+ "race" : []
}
},
{
@@ -1319,7 +1381,8 @@
"work_place": null,
"phone": null,
"home_address": null,
- "race_ethnicity": []
+ "ethnicity" : [],
+ "race" : []
}
},
{
@@ -1340,7 +1403,8 @@
"work_place": null,
"phone": null,
"home_address": null,
- "race_ethnicity": []
+ "ethnicity" : [],
+ "race" : []
}
},
{
@@ -1361,7 +1425,8 @@
"work_place": null,
"phone": null,
"home_address": null,
- "race_ethnicity": []
+ "ethnicity" : [],
+ "race" : []
}
},
{
@@ -1382,7 +1447,8 @@
"work_place": null,
"phone": null,
"home_address": null,
- "race_ethnicity": []
+ "ethnicity" : [],
+ "race" : []
}
},
{
@@ -1403,7 +1469,8 @@
"work_place": null,
"phone": null,
"home_address": null,
- "race_ethnicity": []
+ "ethnicity" : [],
+ "race" : []
}
},
{
@@ -1424,7 +1491,8 @@
"work_place": null,
"phone": null,
"home_address": null,
- "race_ethnicity": []
+ "ethnicity" : [],
+ "race" : []
}
},
{
@@ -1445,7 +1513,8 @@
"work_place": null,
"phone": null,
"home_address": null,
- "race_ethnicity": []
+ "ethnicity" : [],
+ "race" : []
}
},
{
@@ -1466,7 +1535,8 @@
"work_place": null,
"phone": null,
"home_address": null,
- "race_ethnicity": []
+ "ethnicity" : [],
+ "race" : []
}
},
{
@@ -1487,7 +1557,8 @@
"work_place": null,
"phone": null,
"home_address": null,
- "race_ethnicity": []
+ "ethnicity" : [],
+ "race" : []
}
},
{
@@ -1508,7 +1579,8 @@
"work_place": null,
"phone": null,
"home_address": null,
- "race_ethnicity": []
+ "ethnicity" : [],
+ "race" : []
}
},
{
@@ -1529,7 +1601,8 @@
"work_place": null,
"phone": null,
"home_address": null,
- "race_ethnicity": []
+ "ethnicity" : [],
+ "race" : []
}
},
{
@@ -1550,7 +1623,8 @@
"work_place": null,
"phone": null,
"home_address": null,
- "race_ethnicity": []
+ "ethnicity" : [],
+ "race" : []
}
},
{
@@ -1571,7 +1645,8 @@
"work_place": null,
"phone": null,
"home_address": null,
- "race_ethnicity": []
+ "ethnicity" : [],
+ "race" : []
}
},
{
@@ -1592,7 +1667,8 @@
"work_place": null,
"phone": null,
"home_address": null,
- "race_ethnicity": []
+ "ethnicity" : [],
+ "race" : []
}
},
{
@@ -1613,7 +1689,8 @@
"work_place": null,
"phone": null,
"home_address": null,
- "race_ethnicity": []
+ "ethnicity" : [],
+ "race" : []
}
},
{
@@ -1634,7 +1711,8 @@
"work_place": null,
"phone": null,
"home_address": null,
- "race_ethnicity": []
+ "ethnicity" : [],
+ "race" : []
}
},
{
@@ -1655,7 +1733,8 @@
"work_place": null,
"phone": null,
"home_address": null,
- "race_ethnicity": []
+ "ethnicity" : [],
+ "race" : []
}
},
{
@@ -1676,7 +1755,8 @@
"work_place": null,
"phone": null,
"home_address": null,
- "race_ethnicity": []
+ "ethnicity" : [],
+ "race" : []
}
},
{
@@ -1697,7 +1777,8 @@
"work_place": null,
"phone": null,
"home_address": null,
- "race_ethnicity": []
+ "ethnicity" : [],
+ "race" : []
}
},
{
@@ -1718,7 +1799,8 @@
"work_place": null,
"phone": null,
"home_address": null,
- "race_ethnicity": []
+ "ethnicity" : [],
+ "race" : []
}
},
{
@@ -1739,7 +1821,8 @@
"work_place": null,
"phone": null,
"home_address": null,
- "race_ethnicity": []
+ "ethnicity" : [],
+ "race" : []
}
},
{
@@ -1760,7 +1843,8 @@
"work_place": null,
"phone": null,
"home_address": null,
- "race_ethnicity": []
+ "ethnicity" : [],
+ "race" : []
}
},
{
@@ -1781,7 +1865,8 @@
"work_place": null,
"phone": null,
"home_address": null,
- "race_ethnicity": []
+ "ethnicity" : [],
+ "race" : []
}
},
{
@@ -1802,7 +1887,8 @@
"work_place": null,
"phone": null,
"home_address": null,
- "race_ethnicity": []
+ "ethnicity" : [],
+ "race" : []
}
},
{
@@ -1823,7 +1909,8 @@
"work_place": null,
"phone": null,
"home_address": null,
- "race_ethnicity": []
+ "ethnicity" : [],
+ "race" : []
}
},
{
@@ -1844,7 +1931,8 @@
"work_place": null,
"phone": null,
"home_address": null,
- "race_ethnicity": []
+ "ethnicity" : [],
+ "race" : []
}
},
{
@@ -1865,7 +1953,8 @@
"work_place": null,
"phone": null,
"home_address": null,
- "race_ethnicity": []
+ "ethnicity" : [],
+ "race" : []
}
},
{
@@ -1886,7 +1975,8 @@
"work_place": null,
"phone": null,
"home_address": null,
- "race_ethnicity": []
+ "ethnicity" : [],
+ "race" : []
}
},
{
@@ -1907,7 +1997,8 @@
"work_place": null,
"phone": null,
"home_address": null,
- "race_ethnicity": []
+ "ethnicity" : [],
+ "race" : []
}
},
{
@@ -1928,7 +2019,8 @@
"work_place": null,
"phone": null,
"home_address": null,
- "race_ethnicity": []
+ "ethnicity" : [],
+ "race" : []
}
},
{
@@ -1949,7 +2041,8 @@
"work_place": null,
"phone": null,
"home_address": null,
- "race_ethnicity": []
+ "ethnicity" : [],
+ "race" : []
}
},
{
@@ -1970,7 +2063,8 @@
"work_place": null,
"phone": null,
"home_address": null,
- "race_ethnicity": [4,7]
+ "ethnicity" : [],
+ "race" : []
}
},
{
@@ -1991,7 +2085,8 @@
"work_place": null,
"phone": null,
"home_address": null,
- "race_ethnicity": []
+ "ethnicity" : [],
+ "race" : []
}
},
{
@@ -2012,7 +2107,8 @@
"work_place": null,
"phone": null,
"home_address": null,
- "race_ethnicity": []
+ "ethnicity" : [],
+ "race" : []
}
},
{
@@ -2033,7 +2129,8 @@
"work_place": null,
"phone": null,
"home_address": null,
- "race_ethnicity": []
+ "ethnicity" : [],
+ "race" : []
}
},
{
@@ -2054,7 +2151,8 @@
"work_place": null,
"phone": null,
"home_address": null,
- "race_ethnicity": [1,7]
+ "ethnicity" : [],
+ "race" : []
}
},
{
@@ -2075,7 +2173,8 @@
"work_place": null,
"phone": null,
"home_address": null,
- "race_ethnicity": []
+ "ethnicity" : [],
+ "race" : []
}
},
{
@@ -2096,7 +2195,8 @@
"work_place": null,
"phone": null,
"home_address": null,
- "race_ethnicity": []
+ "ethnicity" : [],
+ "race" : []
}
}
]
diff --git a/fixtures/13-coderdojochi.student.json b/fixtures/13-coderdojochi.student.json
index 40a87786..4ac7d0a4 100644
--- a/fixtures/13-coderdojochi.student.json
+++ b/fixtures/13-coderdojochi.student.json
@@ -3,8 +3,6 @@
"model": "coderdojochi.student",
"pk": 1,
"fields": {
- "created_at": "2016-05-08T19:05:21.112Z",
- "updated_at": "2016-05-08T19:05:21.112Z",
"guardian": 1,
"first_name": "David",
"last_name": "Doe",
@@ -16,12 +14,14 @@
"medications": "",
"photo_release": true,
"consent": true,
+ "created_at": "2016-05-08T13:05:21.112",
+ "updated_at": "2016-05-08T13:05:21.112",
"is_active": true,
- "race_ethnicity": [
- 3,
- 4,
- 5,
- 6
+ "race": [
+ 5
+ ],
+ "ethnicity": [
+ 1
]
}
},
@@ -29,8 +29,6 @@
"model": "coderdojochi.student",
"pk": 2,
"fields": {
- "created_at": "2016-05-08T19:05:51.103Z",
- "updated_at": "2016-05-08T19:05:54.813Z",
"guardian": 1,
"first_name": "Rachel",
"last_name": "Doe",
@@ -42,9 +40,14 @@
"medications": "",
"photo_release": true,
"consent": true,
+ "created_at": "2016-05-08T13:05:51.103",
+ "updated_at": "2016-05-08T13:05:54.813",
"is_active": true,
- "race_ethnicity": [
- 2
+ "race": [
+ 1
+ ],
+ "ethnicity": [
+ 1
]
}
},
@@ -52,8 +55,6 @@
"model": "coderdojochi.student",
"pk": 3,
"fields": {
- "created_at": "2016-05-08T19:06:25.378Z",
- "updated_at": "2016-05-08T19:06:31.135Z",
"guardian": 1,
"first_name": "Kelly",
"last_name": "Doe",
@@ -65,9 +66,14 @@
"medications": "",
"photo_release": true,
"consent": true,
+ "created_at": "2016-05-08T13:06:25.378",
+ "updated_at": "2016-05-08T13:06:31.135",
"is_active": true,
- "race_ethnicity": [
- 4
+ "race": [
+ 3
+ ],
+ "ethnicity": [
+ 2
]
}
},
@@ -75,8 +81,6 @@
"model": "coderdojochi.student",
"pk": 4,
"fields": {
- "created_at": "2016-05-08T19:07:00.193Z",
- "updated_at": "2016-05-08T19:07:00.193Z",
"guardian": 1,
"first_name": "Mitch",
"last_name": "Doe",
@@ -88,9 +92,14 @@
"medications": "",
"photo_release": true,
"consent": true,
+ "created_at": "2016-05-08T13:07:00.193",
+ "updated_at": "2016-05-08T13:07:00.193",
"is_active": true,
- "race_ethnicity": [
- 7
+ "race": [
+ 2
+ ],
+ "ethnicity": [
+ 1
]
}
}
diff --git a/poetry.lock b/poetry.lock
index fba7e46e..d976172e 100644
--- a/poetry.lock
+++ b/poetry.lock
@@ -11,7 +11,7 @@ python-dateutil = ">=2.7.0"
[[package]]
name = "asgiref"
-version = "3.3.4"
+version = "3.4.1"
description = "ASGI specs, helper code, and adapters"
category = "main"
optional = false
@@ -20,26 +20,43 @@ python-versions = ">=3.6"
[package.extras]
tests = ["pytest", "pytest-asyncio", "mypy (>=0.800)"]
+[[package]]
+name = "authlib"
+version = "0.15.4"
+description = "The ultimate Python library in building OAuth and OpenID Connect servers."
+category = "main"
+optional = false
+python-versions = "*"
+
+[package.dependencies]
+cryptography = "*"
+
+[package.extras]
+client = ["requests"]
+
[[package]]
name = "boto3"
-version = "1.17.94"
+version = "1.18.19"
description = "The AWS SDK for Python"
category = "main"
optional = false
-python-versions = ">= 2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*"
+python-versions = ">= 3.6"
[package.dependencies]
-botocore = ">=1.20.94,<1.21.0"
+botocore = ">=1.21.19,<1.22.0"
jmespath = ">=0.7.1,<1.0.0"
-s3transfer = ">=0.4.0,<0.5.0"
+s3transfer = ">=0.5.0,<0.6.0"
+
+[package.extras]
+crt = ["botocore[crt] (>=1.21.0,<2.0a0)"]
[[package]]
name = "botocore"
-version = "1.20.94"
+version = "1.21.19"
description = "Low-level, data-driven core of boto 3."
category = "main"
optional = false
-python-versions = ">= 2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*"
+python-versions = ">= 3.6"
[package.dependencies]
jmespath = ">=0.7.1,<1.0.0"
@@ -47,7 +64,7 @@ python-dateutil = ">=2.1,<3.0.0"
urllib3 = ">=1.25.4,<1.27"
[package.extras]
-crt = ["awscrt (==0.11.15)"]
+crt = ["awscrt (==0.11.24)"]
[[package]]
name = "certifi"
@@ -59,7 +76,7 @@ python-versions = "*"
[[package]]
name = "cffi"
-version = "1.14.5"
+version = "1.14.6"
description = "Foreign Function Interface for Python calling C code."
category = "main"
optional = false
@@ -69,12 +86,15 @@ python-versions = "*"
pycparser = "*"
[[package]]
-name = "chardet"
-version = "4.0.0"
-description = "Universal encoding detector for Python 2 and 3"
+name = "charset-normalizer"
+version = "2.0.4"
+description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet."
category = "main"
optional = false
-python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
+python-versions = ">=3.5.0"
+
+[package.extras]
+unicode_backport = ["unicodedata2"]
[[package]]
name = "cryptography"
@@ -121,7 +141,7 @@ python-versions = "*"
[[package]]
name = "django"
-version = "3.2.4"
+version = "3.2.6"
description = "A high-level Python Web framework that encourages rapid development and clean, pragmatic design."
category = "main"
optional = false
@@ -161,7 +181,7 @@ requests-oauthlib = ">=0.3.0"
[[package]]
name = "django-anymail"
-version = "8.3"
+version = "8.4"
description = "Django email integration for Amazon SES, Mailgun, Mailjet, Postmark, SendGrid, SendinBlue, SparkPost and other transactional ESPs"
category = "main"
optional = false
@@ -173,8 +193,8 @@ requests = ">=2.4.3"
[package.extras]
amazon_ses = ["boto3"]
-dev = ["flake8", "sphinx", "sphinx-rtd-theme", "tox", "twine"]
-test = ["mock", "boto3"]
+dev = ["flake8", "sphinx", "sphinx-rtd-theme", "tox", "twine", "wheel"]
+postal = ["cryptography"]
[[package]]
name = "django-appconf"
@@ -229,6 +249,17 @@ python-versions = "*"
Django = ">=1.8.0"
django-common-helpers = ">=0.6.4"
+[[package]]
+name = "django-crontab"
+version = "0.7.1"
+description = "dead simple crontab powered job scheduling for django"
+category = "main"
+optional = false
+python-versions = "*"
+
+[package.dependencies]
+Django = ">=1.8"
+
[[package]]
name = "django-debug-toolbar"
version = "3.2.1"
@@ -398,7 +429,7 @@ doc = ["sphinx", "sphinx-rtd-theme", "sphinxcontrib-spelling"]
[[package]]
name = "faker"
-version = "8.8.0"
+version = "8.11.0"
description = "Faker is a Python package that generates fake data for you."
category = "main"
optional = false
@@ -436,15 +467,15 @@ pytz = "*"
[[package]]
name = "idna"
-version = "2.10"
+version = "3.2"
description = "Internationalized Domain Names in Applications (IDNA)"
category = "main"
optional = false
-python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
+python-versions = ">=3.5"
[[package]]
name = "invoke"
-version = "1.5.0"
+version = "1.6.0"
description = "Pythonic task execution"
category = "main"
optional = false
@@ -532,7 +563,7 @@ et-xmlfile = "*"
[[package]]
name = "pillow"
-version = "8.2.0"
+version = "8.3.1"
description = "Python Imaging Library (Fork)"
category = "main"
optional = false
@@ -540,19 +571,19 @@ python-versions = ">=3.6"
[[package]]
name = "psycopg2"
-version = "2.8.6"
+version = "2.9.1"
description = "psycopg2 - Python-PostgreSQL Database Adapter"
category = "main"
optional = false
-python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*"
+python-versions = ">=3.6"
[[package]]
name = "psycopg2-binary"
-version = "2.8.6"
+version = "2.9.1"
description = "psycopg2 - Python-PostgreSQL Database Adapter"
category = "main"
optional = false
-python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*"
+python-versions = ">=3.6"
[[package]]
name = "pycparser"
@@ -581,7 +612,7 @@ tests = ["pytest (>=6.0.0,<7.0.0)", "coverage[toml] (==5.0.4)"]
[[package]]
name = "python-dateutil"
-version = "2.8.1"
+version = "2.8.2"
description = "Extensions to the standard Python datetime module"
category = "main"
optional = false
@@ -623,21 +654,21 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*"
[[package]]
name = "requests"
-version = "2.25.1"
+version = "2.26.0"
description = "Python HTTP for Humans."
category = "main"
optional = false
-python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*"
[package.dependencies]
certifi = ">=2017.4.17"
-chardet = ">=3.0.2,<5"
-idna = ">=2.5,<3"
+charset-normalizer = {version = ">=2.0.0,<2.1.0", markers = "python_version >= \"3\""}
+idna = {version = ">=2.5,<4", markers = "python_version >= \"3\""}
urllib3 = ">=1.21.1,<1.27"
[package.extras]
-security = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)"]
socks = ["PySocks (>=1.5.6,!=1.5.7)", "win-inet-pton"]
+use_chardet_on_py3 = ["chardet (>=3.0.2,<5)"]
[[package]]
name = "requests-oauthlib"
@@ -656,11 +687,11 @@ rsa = ["oauthlib[signedtoken] (>=3.0.0)"]
[[package]]
name = "s3transfer"
-version = "0.4.2"
+version = "0.5.0"
description = "An Amazon S3 Transfer Manager"
category = "main"
optional = false
-python-versions = "*"
+python-versions = ">= 3.6"
[package.dependencies]
botocore = ">=1.12.36,<2.0a.0"
@@ -670,7 +701,7 @@ crt = ["botocore[crt] (>=1.20.29,<2.0a.0)"]
[[package]]
name = "sentry-sdk"
-version = "1.1.0"
+version = "1.3.1"
description = "Python client for Sentry (https://sentry.io)"
category = "main"
optional = false
@@ -689,6 +720,7 @@ chalice = ["chalice (>=1.16.0)"]
django = ["django (>=1.8)"]
falcon = ["falcon (>=1.4)"]
flask = ["flask (>=0.11)", "blinker (>=1.1)"]
+httpx = ["httpx (>=0.16.0)"]
pure_eval = ["pure-eval", "executing", "asttokens"]
pyspark = ["pyspark (>=2.4.4)"]
rq = ["rq (>=0.6)"]
@@ -696,6 +728,18 @@ sanic = ["sanic (>=0.8)"]
sqlalchemy = ["sqlalchemy (>=1.2)"]
tornado = ["tornado (>=5)"]
+[[package]]
+name = "simple-salesforce"
+version = "1.11.3"
+description = "A basic Salesforce.com REST API client."
+category = "main"
+optional = false
+python-versions = "*"
+
+[package.dependencies]
+authlib = "*"
+requests = ">=2.22.0"
+
[[package]]
name = "six"
version = "1.16.0"
@@ -748,7 +792,7 @@ python-versions = "*"
[[package]]
name = "urllib3"
-version = "1.26.5"
+version = "1.26.6"
description = "HTTP library with thread-safe connection pooling, file post, and more."
category = "main"
optional = false
@@ -761,7 +805,7 @@ socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"]
[[package]]
name = "whitenoise"
-version = "5.2.0"
+version = "5.3.0"
description = "Radically simplified static file serving for WSGI applications"
category = "main"
optional = false
@@ -794,7 +838,7 @@ python-versions = "*"
[metadata]
lock-version = "1.1"
python-versions = "3.9.1"
-content-hash = "1b4a8e15ee0f820f7da0bfd0cac0e80475503a01493d7ae393847aad9caaebbc"
+content-hash = "917736ad2b8f0549b702b42a567c658dbe8603da5321f4945c60bad5fa137024"
[metadata.files]
arrow = [
@@ -802,75 +846,75 @@ arrow = [
{file = "arrow-0.17.0.tar.gz", hash = "sha256:ff08d10cda1d36c68657d6ad20d74fbea493d980f8b2d45344e00d6ed2bf6ed4"},
]
asgiref = [
- {file = "asgiref-3.3.4-py3-none-any.whl", hash = "sha256:92906c611ce6c967347bbfea733f13d6313901d54dcca88195eaeb52b2a8e8ee"},
- {file = "asgiref-3.3.4.tar.gz", hash = "sha256:d1216dfbdfb63826470995d31caed36225dcaf34f182e0fa257a4dd9e86f1b78"},
+ {file = "asgiref-3.4.1-py3-none-any.whl", hash = "sha256:ffc141aa908e6f175673e7b1b3b7af4fdb0ecb738fc5c8b88f69f055c2415214"},
+ {file = "asgiref-3.4.1.tar.gz", hash = "sha256:4ef1ab46b484e3c706329cedeff284a5d40824200638503f5768edb6de7d58e9"},
+]
+authlib = [
+ {file = "Authlib-0.15.4-py2.py3-none-any.whl", hash = "sha256:d9fe5edb59801b16583faa86f88d798d99d952979b9616d5c735b9170b41ae2c"},
+ {file = "Authlib-0.15.4.tar.gz", hash = "sha256:37df3a2554bc6fe0da3cc6848c44fac2ae40634a7f8fc72543947f4330b26464"},
]
boto3 = [
- {file = "boto3-1.17.94-py2.py3-none-any.whl", hash = "sha256:6180272094030bda3ee5c242881892cd3d9d19c05cb513945f530e396c7de1e4"},
- {file = "boto3-1.17.94.tar.gz", hash = "sha256:95d814d16fe55ae55e1e4a3db248596f9647a0c42f4796c6e05be0bfaffb1830"},
+ {file = "boto3-1.18.19-py3-none-any.whl", hash = "sha256:72b1f70a5a42dff0a9c26a71486d3dcb3e098fac5b36126bc8fdcdec8c4d3cf4"},
+ {file = "boto3-1.18.19.tar.gz", hash = "sha256:096f771c259484dc7140af2b7a9078e9c3efba28e2a298d1e8e40fed404fa38e"},
]
botocore = [
- {file = "botocore-1.20.94-py2.py3-none-any.whl", hash = "sha256:ba8a7951be535e25219a82dea15c30d7bdf0c51e7c1623c3306248493c1616ac"},
- {file = "botocore-1.20.94.tar.gz", hash = "sha256:60a382a5b2f7d77b1b575d54fba819097526e3fdd0f3004f4d1142d50af0d642"},
+ {file = "botocore-1.21.19-py3-none-any.whl", hash = "sha256:2fa40a39b338888c9492dc1e36734d8807f9e1c6f5dd3514247338e97f4da0f6"},
+ {file = "botocore-1.21.19.tar.gz", hash = "sha256:7dce88db827e9b5c88701c978df00742c854d2b751fbda8db7656fb9a571afc5"},
]
certifi = [
{file = "certifi-2021.5.30-py2.py3-none-any.whl", hash = "sha256:50b1e4f8446b06f41be7dd6338db18e0990601dce795c2b1686458aa7e8fa7d8"},
{file = "certifi-2021.5.30.tar.gz", hash = "sha256:2bbf76fd432960138b3ef6dda3dde0544f27cbf8546c458e60baf371917ba9ee"},
]
cffi = [
- {file = "cffi-1.14.5-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:bb89f306e5da99f4d922728ddcd6f7fcebb3241fc40edebcb7284d7514741991"},
- {file = "cffi-1.14.5-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:34eff4b97f3d982fb93e2831e6750127d1355a923ebaeeb565407b3d2f8d41a1"},
- {file = "cffi-1.14.5-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:99cd03ae7988a93dd00bcd9d0b75e1f6c426063d6f03d2f90b89e29b25b82dfa"},
- {file = "cffi-1.14.5-cp27-cp27m-win32.whl", hash = "sha256:65fa59693c62cf06e45ddbb822165394a288edce9e276647f0046e1ec26920f3"},
- {file = "cffi-1.14.5-cp27-cp27m-win_amd64.whl", hash = "sha256:51182f8927c5af975fece87b1b369f722c570fe169f9880764b1ee3bca8347b5"},
- {file = "cffi-1.14.5-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:43e0b9d9e2c9e5d152946b9c5fe062c151614b262fda2e7b201204de0b99e482"},
- {file = "cffi-1.14.5-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:cbde590d4faaa07c72bf979734738f328d239913ba3e043b1e98fe9a39f8b2b6"},
- {file = "cffi-1.14.5-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:5de7970188bb46b7bf9858eb6890aad302577a5f6f75091fd7cdd3ef13ef3045"},
- {file = "cffi-1.14.5-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:a465da611f6fa124963b91bf432d960a555563efe4ed1cc403ba5077b15370aa"},
- {file = "cffi-1.14.5-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:d42b11d692e11b6634f7613ad8df5d6d5f8875f5d48939520d351007b3c13406"},
- {file = "cffi-1.14.5-cp35-cp35m-win32.whl", hash = "sha256:72d8d3ef52c208ee1c7b2e341f7d71c6fd3157138abf1a95166e6165dd5d4369"},
- {file = "cffi-1.14.5-cp35-cp35m-win_amd64.whl", hash = "sha256:29314480e958fd8aab22e4a58b355b629c59bf5f2ac2492b61e3dc06d8c7a315"},
- {file = "cffi-1.14.5-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:3d3dd4c9e559eb172ecf00a2a7517e97d1e96de2a5e610bd9b68cea3925b4892"},
- {file = "cffi-1.14.5-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:48e1c69bbacfc3d932221851b39d49e81567a4d4aac3b21258d9c24578280058"},
- {file = "cffi-1.14.5-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:69e395c24fc60aad6bb4fa7e583698ea6cc684648e1ffb7fe85e3c1ca131a7d5"},
- {file = "cffi-1.14.5-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:9e93e79c2551ff263400e1e4be085a1210e12073a31c2011dbbda14bda0c6132"},
- {file = "cffi-1.14.5-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:24ec4ff2c5c0c8f9c6b87d5bb53555bf267e1e6f70e52e5a9740d32861d36b6f"},
- {file = "cffi-1.14.5-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3c3f39fa737542161d8b0d680df2ec249334cd70a8f420f71c9304bd83c3cbed"},
- {file = "cffi-1.14.5-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:681d07b0d1e3c462dd15585ef5e33cb021321588bebd910124ef4f4fb71aef55"},
- {file = "cffi-1.14.5-cp36-cp36m-win32.whl", hash = "sha256:58e3f59d583d413809d60779492342801d6e82fefb89c86a38e040c16883be53"},
- {file = "cffi-1.14.5-cp36-cp36m-win_amd64.whl", hash = "sha256:005a36f41773e148deac64b08f233873a4d0c18b053d37da83f6af4d9087b813"},
- {file = "cffi-1.14.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:2894f2df484ff56d717bead0a5c2abb6b9d2bf26d6960c4604d5c48bbc30ee73"},
- {file = "cffi-1.14.5-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:0857f0ae312d855239a55c81ef453ee8fd24136eaba8e87a2eceba644c0d4c06"},
- {file = "cffi-1.14.5-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:cd2868886d547469123fadc46eac7ea5253ea7fcb139f12e1dfc2bbd406427d1"},
- {file = "cffi-1.14.5-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:35f27e6eb43380fa080dccf676dece30bef72e4a67617ffda586641cd4508d49"},
- {file = "cffi-1.14.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:06d7cd1abac2ffd92e65c0609661866709b4b2d82dd15f611e602b9b188b0b69"},
- {file = "cffi-1.14.5-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0f861a89e0043afec2a51fd177a567005847973be86f709bbb044d7f42fc4e05"},
- {file = "cffi-1.14.5-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cc5a8e069b9ebfa22e26d0e6b97d6f9781302fe7f4f2b8776c3e1daea35f1adc"},
- {file = "cffi-1.14.5-cp37-cp37m-win32.whl", hash = "sha256:9ff227395193126d82e60319a673a037d5de84633f11279e336f9c0f189ecc62"},
- {file = "cffi-1.14.5-cp37-cp37m-win_amd64.whl", hash = "sha256:9cf8022fb8d07a97c178b02327b284521c7708d7c71a9c9c355c178ac4bbd3d4"},
- {file = "cffi-1.14.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8b198cec6c72df5289c05b05b8b0969819783f9418e0409865dac47288d2a053"},
- {file = "cffi-1.14.5-cp38-cp38-manylinux1_i686.whl", hash = "sha256:ad17025d226ee5beec591b52800c11680fca3df50b8b29fe51d882576e039ee0"},
- {file = "cffi-1.14.5-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:6c97d7350133666fbb5cf4abdc1178c812cb205dc6f41d174a7b0f18fb93337e"},
- {file = "cffi-1.14.5-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:8ae6299f6c68de06f136f1f9e69458eae58f1dacf10af5c17353eae03aa0d827"},
- {file = "cffi-1.14.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:04c468b622ed31d408fea2346bec5bbffba2cc44226302a0de1ade9f5ea3d373"},
- {file = "cffi-1.14.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:06db6321b7a68b2bd6df96d08a5adadc1fa0e8f419226e25b2a5fbf6ccc7350f"},
- {file = "cffi-1.14.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:293e7ea41280cb28c6fcaaa0b1aa1f533b8ce060b9e701d78511e1e6c4a1de76"},
- {file = "cffi-1.14.5-cp38-cp38-win32.whl", hash = "sha256:b85eb46a81787c50650f2392b9b4ef23e1f126313b9e0e9013b35c15e4288e2e"},
- {file = "cffi-1.14.5-cp38-cp38-win_amd64.whl", hash = "sha256:1f436816fc868b098b0d63b8920de7d208c90a67212546d02f84fe78a9c26396"},
- {file = "cffi-1.14.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1071534bbbf8cbb31b498d5d9db0f274f2f7a865adca4ae429e147ba40f73dea"},
- {file = "cffi-1.14.5-cp39-cp39-manylinux1_i686.whl", hash = "sha256:9de2e279153a443c656f2defd67769e6d1e4163952b3c622dcea5b08a6405322"},
- {file = "cffi-1.14.5-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:6e4714cc64f474e4d6e37cfff31a814b509a35cb17de4fb1999907575684479c"},
- {file = "cffi-1.14.5-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:158d0d15119b4b7ff6b926536763dc0714313aa59e320ddf787502c70c4d4bee"},
- {file = "cffi-1.14.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1bf1ac1984eaa7675ca8d5745a8cb87ef7abecb5592178406e55858d411eadc0"},
- {file = "cffi-1.14.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:df5052c5d867c1ea0b311fb7c3cd28b19df469c056f7fdcfe88c7473aa63e333"},
- {file = "cffi-1.14.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:24a570cd11895b60829e941f2613a4f79df1a27344cbbb82164ef2e0116f09c7"},
- {file = "cffi-1.14.5-cp39-cp39-win32.whl", hash = "sha256:afb29c1ba2e5a3736f1c301d9d0abe3ec8b86957d04ddfa9d7a6a42b9367e396"},
- {file = "cffi-1.14.5-cp39-cp39-win_amd64.whl", hash = "sha256:f2d45f97ab6bb54753eab54fffe75aaf3de4ff2341c9daee1987ee1837636f1d"},
- {file = "cffi-1.14.5.tar.gz", hash = "sha256:fd78e5fee591709f32ef6edb9a015b4aa1a5022598e36227500c8f4e02328d9c"},
-]
-chardet = [
- {file = "chardet-4.0.0-py2.py3-none-any.whl", hash = "sha256:f864054d66fd9118f2e67044ac8981a54775ec5b67aed0441892edb553d21da5"},
- {file = "chardet-4.0.0.tar.gz", hash = "sha256:0d6f53a15db4120f2b08c94f11e7d93d2c911ee118b6b30a04ec3ee8310179fa"},
+ {file = "cffi-1.14.6-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:22b9c3c320171c108e903d61a3723b51e37aaa8c81255b5e7ce102775bd01e2c"},
+ {file = "cffi-1.14.6-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:f0c5d1acbfca6ebdd6b1e3eded8d261affb6ddcf2186205518f1428b8569bb99"},
+ {file = "cffi-1.14.6-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:99f27fefe34c37ba9875f224a8f36e31d744d8083e00f520f133cab79ad5e819"},
+ {file = "cffi-1.14.6-cp27-cp27m-win32.whl", hash = "sha256:55af55e32ae468e9946f741a5d51f9896da6b9bf0bbdd326843fec05c730eb20"},
+ {file = "cffi-1.14.6-cp27-cp27m-win_amd64.whl", hash = "sha256:7bcac9a2b4fdbed2c16fa5681356d7121ecabf041f18d97ed5b8e0dd38a80224"},
+ {file = "cffi-1.14.6-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:ed38b924ce794e505647f7c331b22a693bee1538fdf46b0222c4717b42f744e7"},
+ {file = "cffi-1.14.6-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:e22dcb48709fc51a7b58a927391b23ab37eb3737a98ac4338e2448bef8559b33"},
+ {file = "cffi-1.14.6-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:aedb15f0a5a5949ecb129a82b72b19df97bbbca024081ed2ef88bd5c0a610534"},
+ {file = "cffi-1.14.6-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:48916e459c54c4a70e52745639f1db524542140433599e13911b2f329834276a"},
+ {file = "cffi-1.14.6-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:f627688813d0a4140153ff532537fbe4afea5a3dffce1f9deb7f91f848a832b5"},
+ {file = "cffi-1.14.6-cp35-cp35m-win32.whl", hash = "sha256:f0010c6f9d1a4011e429109fda55a225921e3206e7f62a0c22a35344bfd13cca"},
+ {file = "cffi-1.14.6-cp35-cp35m-win_amd64.whl", hash = "sha256:57e555a9feb4a8460415f1aac331a2dc833b1115284f7ded7278b54afc5bd218"},
+ {file = "cffi-1.14.6-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:e8c6a99be100371dbb046880e7a282152aa5d6127ae01783e37662ef73850d8f"},
+ {file = "cffi-1.14.6-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:19ca0dbdeda3b2615421d54bef8985f72af6e0c47082a8d26122adac81a95872"},
+ {file = "cffi-1.14.6-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:d950695ae4381ecd856bcaf2b1e866720e4ab9a1498cba61c602e56630ca7195"},
+ {file = "cffi-1.14.6-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e9dc245e3ac69c92ee4c167fbdd7428ec1956d4e754223124991ef29eb57a09d"},
+ {file = "cffi-1.14.6-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a8661b2ce9694ca01c529bfa204dbb144b275a31685a075ce123f12331be790b"},
+ {file = "cffi-1.14.6-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b315d709717a99f4b27b59b021e6207c64620790ca3e0bde636a6c7f14618abb"},
+ {file = "cffi-1.14.6-cp36-cp36m-win32.whl", hash = "sha256:80b06212075346b5546b0417b9f2bf467fea3bfe7352f781ffc05a8ab24ba14a"},
+ {file = "cffi-1.14.6-cp36-cp36m-win_amd64.whl", hash = "sha256:a9da7010cec5a12193d1af9872a00888f396aba3dc79186604a09ea3ee7c029e"},
+ {file = "cffi-1.14.6-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:4373612d59c404baeb7cbd788a18b2b2a8331abcc84c3ba40051fcd18b17a4d5"},
+ {file = "cffi-1.14.6-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:f10afb1004f102c7868ebfe91c28f4a712227fe4cb24974350ace1f90e1febbf"},
+ {file = "cffi-1.14.6-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:fd4305f86f53dfd8cd3522269ed7fc34856a8ee3709a5e28b2836b2db9d4cd69"},
+ {file = "cffi-1.14.6-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6d6169cb3c6c2ad50db5b868db6491a790300ade1ed5d1da29289d73bbe40b56"},
+ {file = "cffi-1.14.6-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5d4b68e216fc65e9fe4f524c177b54964af043dde734807586cf5435af84045c"},
+ {file = "cffi-1.14.6-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33791e8a2dc2953f28b8d8d300dde42dd929ac28f974c4b4c6272cb2955cb762"},
+ {file = "cffi-1.14.6-cp37-cp37m-win32.whl", hash = "sha256:0c0591bee64e438883b0c92a7bed78f6290d40bf02e54c5bf0978eaf36061771"},
+ {file = "cffi-1.14.6-cp37-cp37m-win_amd64.whl", hash = "sha256:8eb687582ed7cd8c4bdbff3df6c0da443eb89c3c72e6e5dcdd9c81729712791a"},
+ {file = "cffi-1.14.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ba6f2b3f452e150945d58f4badd92310449876c4c954836cfb1803bdd7b422f0"},
+ {file = "cffi-1.14.6-cp38-cp38-manylinux1_i686.whl", hash = "sha256:64fda793737bc4037521d4899be780534b9aea552eb673b9833b01f945904c2e"},
+ {file = "cffi-1.14.6-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:9f3e33c28cd39d1b655ed1ba7247133b6f7fc16fa16887b120c0c670e35ce346"},
+ {file = "cffi-1.14.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:26bb2549b72708c833f5abe62b756176022a7b9a7f689b571e74c8478ead51dc"},
+ {file = "cffi-1.14.6-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eb687a11f0a7a1839719edd80f41e459cc5366857ecbed383ff376c4e3cc6afd"},
+ {file = "cffi-1.14.6-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d2ad4d668a5c0645d281dcd17aff2be3212bc109b33814bbb15c4939f44181cc"},
+ {file = "cffi-1.14.6-cp38-cp38-win32.whl", hash = "sha256:487d63e1454627c8e47dd230025780e91869cfba4c753a74fda196a1f6ad6548"},
+ {file = "cffi-1.14.6-cp38-cp38-win_amd64.whl", hash = "sha256:c33d18eb6e6bc36f09d793c0dc58b0211fccc6ae5149b808da4a62660678b156"},
+ {file = "cffi-1.14.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:06c54a68935738d206570b20da5ef2b6b6d92b38ef3ec45c5422c0ebaf338d4d"},
+ {file = "cffi-1.14.6-cp39-cp39-manylinux1_i686.whl", hash = "sha256:f174135f5609428cc6e1b9090f9268f5c8935fddb1b25ccb8255a2d50de6789e"},
+ {file = "cffi-1.14.6-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:f3ebe6e73c319340830a9b2825d32eb6d8475c1dac020b4f0aa774ee3b898d1c"},
+ {file = "cffi-1.14.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c8d896becff2fa653dc4438b54a5a25a971d1f4110b32bd3068db3722c80202"},
+ {file = "cffi-1.14.6-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4922cd707b25e623b902c86188aca466d3620892db76c0bdd7b99a3d5e61d35f"},
+ {file = "cffi-1.14.6-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c9e005e9bd57bc987764c32a1bee4364c44fdc11a3cc20a40b93b444984f2b87"},
+ {file = "cffi-1.14.6-cp39-cp39-win32.whl", hash = "sha256:eb9e2a346c5238a30a746893f23a9535e700f8192a68c07c0258e7ece6ff3728"},
+ {file = "cffi-1.14.6-cp39-cp39-win_amd64.whl", hash = "sha256:818014c754cd3dba7229c0f5884396264d51ffb87ec86e927ef0be140bfdb0d2"},
+ {file = "cffi-1.14.6.tar.gz", hash = "sha256:c9a875ce9d7fe32887784274dd533c57909b7b1dcadcc128a2ac21331a9765dd"},
+]
+charset-normalizer = [
+ {file = "charset-normalizer-2.0.4.tar.gz", hash = "sha256:f23667ebe1084be45f6ae0538e4a5a865206544097e4e8bbcacf42cd02a348f3"},
+ {file = "charset_normalizer-2.0.4-py3-none-any.whl", hash = "sha256:0c8911edd15d19223366a194a513099a302055a962bca2cec0f54b8b63175d8b"},
]
cryptography = [
{file = "cryptography-3.4.7-cp36-abi3-macosx_10_10_x86_64.whl", hash = "sha256:3d8427734c781ea5f1b41d6589c293089704d4759e34597dce91014ac125aad1"},
@@ -882,8 +926,10 @@ cryptography = [
{file = "cryptography-3.4.7-cp36-abi3-win_amd64.whl", hash = "sha256:de4e5f7f68220d92b7637fc99847475b59154b7a1b3868fb7385337af54ac9ca"},
{file = "cryptography-3.4.7-pp36-pypy36_pp73-manylinux2010_x86_64.whl", hash = "sha256:26965837447f9c82f1855e0bc8bc4fb910240b6e0d16a664bb722df3b5b06873"},
{file = "cryptography-3.4.7-pp36-pypy36_pp73-manylinux2014_x86_64.whl", hash = "sha256:eb8cc2afe8b05acbd84a43905832ec78e7b3873fb124ca190f574dca7389a87d"},
+ {file = "cryptography-3.4.7-pp37-pypy37_pp73-macosx_10_10_x86_64.whl", hash = "sha256:b01fd6f2737816cb1e08ed4807ae194404790eac7ad030b34f2ce72b332f5586"},
{file = "cryptography-3.4.7-pp37-pypy37_pp73-manylinux2010_x86_64.whl", hash = "sha256:7ec5d3b029f5fa2b179325908b9cd93db28ab7b85bb6c1db56b10e0b54235177"},
{file = "cryptography-3.4.7-pp37-pypy37_pp73-manylinux2014_x86_64.whl", hash = "sha256:ee77aa129f481be46f8d92a1a7db57269a2f23052d5f2433b4621bb457081cc9"},
+ {file = "cryptography-3.4.7-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:bf40af59ca2465b24e54f671b2de2c59257ddc4f7e5706dbd6930e26823668d3"},
{file = "cryptography-3.4.7.tar.gz", hash = "sha256:3d10de8116d25649631977cb37da6cbdd2d6fa0e0281d014a5b7d337255ca713"},
]
defusedxml = [
@@ -899,8 +945,8 @@ dj-database-url = [
{file = "dj_database_url-0.5.0-py2.py3-none-any.whl", hash = "sha256:851785365761ebe4994a921b433062309eb882fedd318e1b0fcecc607ed02da9"},
]
django = [
- {file = "Django-3.2.4-py3-none-any.whl", hash = "sha256:ea735cbbbb3b2fba6d4da4784a0043d84c67c92f1fdf15ad6db69900e792c10f"},
- {file = "Django-3.2.4.tar.gz", hash = "sha256:66c9d8db8cc6fe938a28b7887c1596e42d522e27618562517cc8929eb7e7f296"},
+ {file = "Django-3.2.6-py3-none-any.whl", hash = "sha256:7f92413529aa0e291f3be78ab19be31aefb1e1c9a52cd59e130f505f27a51f13"},
+ {file = "Django-3.2.6.tar.gz", hash = "sha256:f27f8544c9d4c383bbe007c57e3235918e258364577373d4920e9162837be022"},
]
django-active-link = [
{file = "django-active-link-0.1.8.tar.gz", hash = "sha256:87aac58cc89913ff3b017b91cb24cda0dbb05945aa46c6a1428d0744b56a3e1f"},
@@ -910,8 +956,8 @@ django-allauth = [
{file = "django-allauth-0.44.0.tar.gz", hash = "sha256:e51af457466022f52154d74c8523ac69375120fad2acce6e239635d85e610b25"},
]
django-anymail = [
- {file = "django-anymail-8.3.tar.gz", hash = "sha256:fde346365937de91feee4451cbbf416f4af841ccc5d136c5fdfcb983827703c1"},
- {file = "django_anymail-8.3-py3-none-any.whl", hash = "sha256:caba487937d14d7d6ff06551db4e4bfb3e45eff892f9911abd7a214716b65be5"},
+ {file = "django-anymail-8.4.tar.gz", hash = "sha256:671a338de43b8e414d48c6d16aac1df54d2f24f916e1073f9f60aef5acffaf89"},
+ {file = "django_anymail-8.4-py3-none-any.whl", hash = "sha256:2e8307e84f0a12f9283469017094a8246db9a0fc608ac17dd1027ee011ece986"},
]
django-appconf = [
{file = "django-appconf-1.0.4.tar.gz", hash = "sha256:be58deb54a43d77d2e1621fe59f787681376d3cd0b8bd8e4758ef6c3a6453380"},
@@ -931,6 +977,9 @@ django-common-helpers = [
django-cron = [
{file = "django-cron-0.5.1.tar.gz", hash = "sha256:08d22708c8b2ecab8cda989019a66c7e1e2424c59d822796fd45abf7731d261d"},
]
+django-crontab = [
+ {file = "django-crontab-0.7.1.tar.gz", hash = "sha256:1201810a212460aaaa48eb6a766738740daf42c1a4f6aafecfb1525036929236"},
+]
django-debug-toolbar = [
{file = "django-debug-toolbar-3.2.1.tar.gz", hash = "sha256:a5ff2a54f24bf88286f9872836081078f4baa843dc3735ee88524e89f8821e33"},
{file = "django_debug_toolbar-3.2.1-py3-none-any.whl", hash = "sha256:e759e63e3fe2d3110e0e519639c166816368701eab4a47fed75d7de7018467b9"},
@@ -985,8 +1034,8 @@ factory-boy = [
{file = "factory_boy-3.2.0.tar.gz", hash = "sha256:401cc00ff339a022f84d64a4339503d1689e8263a4478d876e58a3295b155c5b"},
]
faker = [
- {file = "Faker-8.8.0-py3-none-any.whl", hash = "sha256:0129599c0d35e79471d116460b1c51d8c183980f28e14517228be4601cf87192"},
- {file = "Faker-8.8.0.tar.gz", hash = "sha256:7be0d9309bde6624e1a6062d0dc37859f95ca883fa047a11db8e5e305b1446a1"},
+ {file = "Faker-8.11.0-py3-none-any.whl", hash = "sha256:3e737576ff50cd98dfed643d6b3fd63194eca9df00e7f595960fe7da5220723d"},
+ {file = "Faker-8.11.0.tar.gz", hash = "sha256:b9e81e9da3dda3ac54189e034cfb943de576a259caeb226ccab43fcbcf6a7891"},
]
gunicorn = [
{file = "gunicorn-20.1.0-py3-none-any.whl", hash = "sha256:9dcc4547dbb1cb284accfb15ab5667a0e5d1881cc443e0677b4882a4067a807e"},
@@ -997,13 +1046,13 @@ icalendar = [
{file = "icalendar-4.0.7.tar.gz", hash = "sha256:0fc18d87f66e0b5da84fa731389496cfe18e4c21304e8f6713556b2e8724a7a4"},
]
idna = [
- {file = "idna-2.10-py2.py3-none-any.whl", hash = "sha256:b97d804b1e9b523befed77c48dacec60e6dcb0b5391d57af6a65a312a90648c0"},
- {file = "idna-2.10.tar.gz", hash = "sha256:b307872f855b18632ce0c21c5e45be78c0ea7ae4c15c828c20788b26921eb3f6"},
+ {file = "idna-3.2-py3-none-any.whl", hash = "sha256:14475042e284991034cb48e06f6851428fb14c4dc953acd9be9a5e95c7b6dd7a"},
+ {file = "idna-3.2.tar.gz", hash = "sha256:467fbad99067910785144ce333826c71fb0e63a425657295239737f7ecd125f3"},
]
invoke = [
- {file = "invoke-1.5.0-py2-none-any.whl", hash = "sha256:da7c2d0be71be83ffd6337e078ef9643f41240024d6b2659e7b46e0b251e339f"},
- {file = "invoke-1.5.0-py3-none-any.whl", hash = "sha256:7e44d98a7dc00c91c79bac9e3007276965d2c96884b3c22077a9f04042bd6d90"},
- {file = "invoke-1.5.0.tar.gz", hash = "sha256:f0c560075b5fb29ba14dad44a7185514e94970d1b9d57dcd3723bec5fed92650"},
+ {file = "invoke-1.6.0-py2-none-any.whl", hash = "sha256:e6c9917a1e3e73e7ea91fdf82d5f151ccfe85bf30cc65cdb892444c02dbb5f74"},
+ {file = "invoke-1.6.0-py3-none-any.whl", hash = "sha256:769e90caeb1bd07d484821732f931f1ad8916a38e3f3e618644687fc09cb6317"},
+ {file = "invoke-1.6.0.tar.gz", hash = "sha256:374d1e2ecf78981da94bfaf95366216aaec27c2d6a7b7d5818d92da55aa258d3"},
]
jmespath = [
{file = "jmespath-0.10.0-py2.py3-none-any.whl", hash = "sha256:cdf6525904cc597730141d61b36f2e4b8ecc257c420fa2f4549bac2c2d0cb72f"},
@@ -1037,94 +1086,87 @@ openpyxl = [
{file = "openpyxl-3.0.7.tar.gz", hash = "sha256:6456a3b472e1ef0facb1129f3c6ef00713cebf62e736cd7a75bcc3247432f251"},
]
pillow = [
- {file = "Pillow-8.2.0-cp36-cp36m-macosx_10_10_x86_64.whl", hash = "sha256:dc38f57d8f20f06dd7c3161c59ca2c86893632623f33a42d592f097b00f720a9"},
- {file = "Pillow-8.2.0-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:a013cbe25d20c2e0c4e85a9daf438f85121a4d0344ddc76e33fd7e3965d9af4b"},
- {file = "Pillow-8.2.0-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:8bb1e155a74e1bfbacd84555ea62fa21c58e0b4e7e6b20e4447b8d07990ac78b"},
- {file = "Pillow-8.2.0-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:c5236606e8570542ed424849f7852a0ff0bce2c4c8d0ba05cc202a5a9c97dee9"},
- {file = "Pillow-8.2.0-cp36-cp36m-win32.whl", hash = "sha256:12e5e7471f9b637762453da74e390e56cc43e486a88289995c1f4c1dc0bfe727"},
- {file = "Pillow-8.2.0-cp36-cp36m-win_amd64.whl", hash = "sha256:5afe6b237a0b81bd54b53f835a153770802f164c5570bab5e005aad693dab87f"},
- {file = "Pillow-8.2.0-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:cb7a09e173903541fa888ba010c345893cd9fc1b5891aaf060f6ca77b6a3722d"},
- {file = "Pillow-8.2.0-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:0d19d70ee7c2ba97631bae1e7d4725cdb2ecf238178096e8c82ee481e189168a"},
- {file = "Pillow-8.2.0-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:083781abd261bdabf090ad07bb69f8f5599943ddb539d64497ed021b2a67e5a9"},
- {file = "Pillow-8.2.0-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:c6b39294464b03457f9064e98c124e09008b35a62e3189d3513e5148611c9388"},
- {file = "Pillow-8.2.0-cp37-cp37m-win32.whl", hash = "sha256:01425106e4e8cee195a411f729cff2a7d61813b0b11737c12bd5991f5f14bcd5"},
- {file = "Pillow-8.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:3b570f84a6161cf8865c4e08adf629441f56e32f180f7aa4ccbd2e0a5a02cba2"},
- {file = "Pillow-8.2.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:031a6c88c77d08aab84fecc05c3cde8414cd6f8406f4d2b16fed1e97634cc8a4"},
- {file = "Pillow-8.2.0-cp38-cp38-manylinux1_i686.whl", hash = "sha256:66cc56579fd91f517290ab02c51e3a80f581aba45fd924fcdee01fa06e635812"},
- {file = "Pillow-8.2.0-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:6c32cc3145928c4305d142ebec682419a6c0a8ce9e33db900027ddca1ec39178"},
- {file = "Pillow-8.2.0-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:624b977355cde8b065f6d51b98497d6cd5fbdd4f36405f7a8790e3376125e2bb"},
- {file = "Pillow-8.2.0-cp38-cp38-win32.whl", hash = "sha256:5cbf3e3b1014dddc45496e8cf38b9f099c95a326275885199f427825c6522232"},
- {file = "Pillow-8.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:463822e2f0d81459e113372a168f2ff59723e78528f91f0bd25680ac185cf797"},
- {file = "Pillow-8.2.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:95d5ef984eff897850f3a83883363da64aae1000e79cb3c321915468e8c6add5"},
- {file = "Pillow-8.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b91c36492a4bbb1ee855b7d16fe51379e5f96b85692dc8210831fbb24c43e484"},
- {file = "Pillow-8.2.0-cp39-cp39-manylinux1_i686.whl", hash = "sha256:d68cb92c408261f806b15923834203f024110a2e2872ecb0bd2a110f89d3c602"},
- {file = "Pillow-8.2.0-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:f217c3954ce5fd88303fc0c317af55d5e0204106d86dea17eb8205700d47dec2"},
- {file = "Pillow-8.2.0-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:5b70110acb39f3aff6b74cf09bb4169b167e2660dabc304c1e25b6555fa781ef"},
- {file = "Pillow-8.2.0-cp39-cp39-win32.whl", hash = "sha256:a7d5e9fad90eff8f6f6106d3b98b553a88b6f976e51fce287192a5d2d5363713"},
- {file = "Pillow-8.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:238c197fc275b475e87c1453b05b467d2d02c2915fdfdd4af126145ff2e4610c"},
- {file = "Pillow-8.2.0-pp36-pypy36_pp73-macosx_10_10_x86_64.whl", hash = "sha256:0e04d61f0064b545b989126197930807c86bcbd4534d39168f4aa5fda39bb8f9"},
- {file = "Pillow-8.2.0-pp36-pypy36_pp73-manylinux2010_i686.whl", hash = "sha256:63728564c1410d99e6d1ae8e3b810fe012bc440952168af0a2877e8ff5ab96b9"},
- {file = "Pillow-8.2.0-pp36-pypy36_pp73-manylinux2010_x86_64.whl", hash = "sha256:c03c07ed32c5324939b19e36ae5f75c660c81461e312a41aea30acdd46f93a7c"},
- {file = "Pillow-8.2.0-pp37-pypy37_pp73-macosx_10_10_x86_64.whl", hash = "sha256:4d98abdd6b1e3bf1a1cbb14c3895226816e666749ac040c4e2554231068c639b"},
- {file = "Pillow-8.2.0-pp37-pypy37_pp73-manylinux2010_i686.whl", hash = "sha256:aac00e4bc94d1b7813fe882c28990c1bc2f9d0e1aa765a5f2b516e8a6a16a9e4"},
- {file = "Pillow-8.2.0-pp37-pypy37_pp73-manylinux2010_x86_64.whl", hash = "sha256:22fd0f42ad15dfdde6c581347eaa4adb9a6fc4b865f90b23378aa7914895e120"},
- {file = "Pillow-8.2.0-pp37-pypy37_pp73-win32.whl", hash = "sha256:e98eca29a05913e82177b3ba3d198b1728e164869c613d76d0de4bde6768a50e"},
- {file = "Pillow-8.2.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:8b56553c0345ad6dcb2e9b433ae47d67f95fc23fe28a0bde15a120f25257e291"},
- {file = "Pillow-8.2.0.tar.gz", hash = "sha256:a787ab10d7bb5494e5f76536ac460741788f1fbce851068d73a87ca7c35fc3e1"},
+ {file = "Pillow-8.3.1-1-cp36-cp36m-win_amd64.whl", hash = "sha256:fd7eef578f5b2200d066db1b50c4aa66410786201669fb76d5238b007918fb24"},
+ {file = "Pillow-8.3.1-1-cp37-cp37m-win_amd64.whl", hash = "sha256:75e09042a3b39e0ea61ce37e941221313d51a9c26b8e54e12b3ececccb71718a"},
+ {file = "Pillow-8.3.1-1-cp38-cp38-win_amd64.whl", hash = "sha256:c0e0550a404c69aab1e04ae89cca3e2a042b56ab043f7f729d984bf73ed2a093"},
+ {file = "Pillow-8.3.1-1-cp39-cp39-win_amd64.whl", hash = "sha256:479ab11cbd69612acefa8286481f65c5dece2002ffaa4f9db62682379ca3bb77"},
+ {file = "Pillow-8.3.1-1-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:f156d6ecfc747ee111c167f8faf5f4953761b5e66e91a4e6767e548d0f80129c"},
+ {file = "Pillow-8.3.1-cp36-cp36m-macosx_10_10_x86_64.whl", hash = "sha256:196560dba4da7a72c5e7085fccc5938ab4075fd37fe8b5468869724109812edd"},
+ {file = "Pillow-8.3.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:29c9569049d04aaacd690573a0398dbd8e0bf0255684fee512b413c2142ab723"},
+ {file = "Pillow-8.3.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c088a000dfdd88c184cc7271bfac8c5b82d9efa8637cd2b68183771e3cf56f04"},
+ {file = "Pillow-8.3.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:fc214a6b75d2e0ea7745488da7da3c381f41790812988c7a92345978414fad37"},
+ {file = "Pillow-8.3.1-cp36-cp36m-win32.whl", hash = "sha256:a17ca41f45cf78c2216ebfab03add7cc350c305c38ff34ef4eef66b7d76c5229"},
+ {file = "Pillow-8.3.1-cp36-cp36m-win_amd64.whl", hash = "sha256:67b3666b544b953a2777cb3f5a922e991be73ab32635666ee72e05876b8a92de"},
+ {file = "Pillow-8.3.1-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:ff04c373477723430dce2e9d024c708a047d44cf17166bf16e604b379bf0ca14"},
+ {file = "Pillow-8.3.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9364c81b252d8348e9cc0cb63e856b8f7c1b340caba6ee7a7a65c968312f7dab"},
+ {file = "Pillow-8.3.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a2f381932dca2cf775811a008aa3027671ace723b7a38838045b1aee8669fdcf"},
+ {file = "Pillow-8.3.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:d0da39795049a9afcaadec532e7b669b5ebbb2a9134576ebcc15dd5bdae33cc0"},
+ {file = "Pillow-8.3.1-cp37-cp37m-win32.whl", hash = "sha256:2b6dfa068a8b6137da34a4936f5a816aba0ecc967af2feeb32c4393ddd671cba"},
+ {file = "Pillow-8.3.1-cp37-cp37m-win_amd64.whl", hash = "sha256:a4eef1ff2d62676deabf076f963eda4da34b51bc0517c70239fafed1d5b51500"},
+ {file = "Pillow-8.3.1-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:660a87085925c61a0dcc80efb967512ac34dbb256ff7dd2b9b4ee8dbdab58cf4"},
+ {file = "Pillow-8.3.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:15a2808e269a1cf2131930183dcc0419bc77bb73eb54285dde2706ac9939fa8e"},
+ {file = "Pillow-8.3.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:969cc558cca859cadf24f890fc009e1bce7d7d0386ba7c0478641a60199adf79"},
+ {file = "Pillow-8.3.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2ee77c14a0299d0541d26f3d8500bb57e081233e3fa915fa35abd02c51fa7fae"},
+ {file = "Pillow-8.3.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:c11003197f908878164f0e6da15fce22373ac3fc320cda8c9d16e6bba105b844"},
+ {file = "Pillow-8.3.1-cp38-cp38-win32.whl", hash = "sha256:3f08bd8d785204149b5b33e3b5f0ebbfe2190ea58d1a051c578e29e39bfd2367"},
+ {file = "Pillow-8.3.1-cp38-cp38-win_amd64.whl", hash = "sha256:70af7d222df0ff81a2da601fab42decb009dc721545ed78549cb96e3a1c5f0c8"},
+ {file = "Pillow-8.3.1-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:37730f6e68bdc6a3f02d2079c34c532330d206429f3cee651aab6b66839a9f0e"},
+ {file = "Pillow-8.3.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4bc3c7ef940eeb200ca65bd83005eb3aae8083d47e8fcbf5f0943baa50726856"},
+ {file = "Pillow-8.3.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c35d09db702f4185ba22bb33ef1751ad49c266534339a5cebeb5159d364f6f82"},
+ {file = "Pillow-8.3.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0b2efa07f69dc395d95bb9ef3299f4ca29bcb2157dc615bae0b42c3c20668ffc"},
+ {file = "Pillow-8.3.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:cc866706d56bd3a7dbf8bac8660c6f6462f2f2b8a49add2ba617bc0c54473d83"},
+ {file = "Pillow-8.3.1-cp39-cp39-win32.whl", hash = "sha256:9a211b663cf2314edbdb4cf897beeb5c9ee3810d1d53f0e423f06d6ebbf9cd5d"},
+ {file = "Pillow-8.3.1-cp39-cp39-win_amd64.whl", hash = "sha256:c2a5ff58751670292b406b9f06e07ed1446a4b13ffced6b6cab75b857485cbc8"},
+ {file = "Pillow-8.3.1-pp36-pypy36_pp73-macosx_10_10_x86_64.whl", hash = "sha256:c379425c2707078dfb6bfad2430728831d399dc95a7deeb92015eb4c92345eaf"},
+ {file = "Pillow-8.3.1-pp36-pypy36_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:114f816e4f73f9ec06997b2fde81a92cbf0777c9e8f462005550eed6bae57e63"},
+ {file = "Pillow-8.3.1-pp36-pypy36_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:8960a8a9f4598974e4c2aeb1bff9bdd5db03ee65fd1fce8adf3223721aa2a636"},
+ {file = "Pillow-8.3.1-pp37-pypy37_pp73-macosx_10_10_x86_64.whl", hash = "sha256:147bd9e71fb9dcf08357b4d530b5167941e222a6fd21f869c7911bac40b9994d"},
+ {file = "Pillow-8.3.1-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:1fd5066cd343b5db88c048d971994e56b296868766e461b82fa4e22498f34d77"},
+ {file = "Pillow-8.3.1-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f4ebde71785f8bceb39dcd1e7f06bcc5d5c3cf48b9f69ab52636309387b097c8"},
+ {file = "Pillow-8.3.1-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:1c03e24be975e2afe70dfc5da6f187eea0b49a68bb2b69db0f30a61b7031cee4"},
+ {file = "Pillow-8.3.1.tar.gz", hash = "sha256:2cac53839bfc5cece8fdbe7f084d5e3ee61e1303cccc86511d351adcb9e2c792"},
]
psycopg2 = [
- {file = "psycopg2-2.8.6-cp27-cp27m-win32.whl", hash = "sha256:068115e13c70dc5982dfc00c5d70437fe37c014c808acce119b5448361c03725"},
- {file = "psycopg2-2.8.6-cp27-cp27m-win_amd64.whl", hash = "sha256:d160744652e81c80627a909a0e808f3c6653a40af435744de037e3172cf277f5"},
- {file = "psycopg2-2.8.6-cp34-cp34m-win32.whl", hash = "sha256:b8cae8b2f022efa1f011cc753adb9cbadfa5a184431d09b273fb49b4167561ad"},
- {file = "psycopg2-2.8.6-cp34-cp34m-win_amd64.whl", hash = "sha256:f22ea9b67aea4f4a1718300908a2fb62b3e4276cf00bd829a97ab5894af42ea3"},
- {file = "psycopg2-2.8.6-cp35-cp35m-win32.whl", hash = "sha256:26e7fd115a6db75267b325de0fba089b911a4a12ebd3d0b5e7acb7028bc46821"},
- {file = "psycopg2-2.8.6-cp35-cp35m-win_amd64.whl", hash = "sha256:00195b5f6832dbf2876b8bf77f12bdce648224c89c880719c745b90515233301"},
- {file = "psycopg2-2.8.6-cp36-cp36m-win32.whl", hash = "sha256:a49833abfdede8985ba3f3ec641f771cca215479f41523e99dace96d5b8cce2a"},
- {file = "psycopg2-2.8.6-cp36-cp36m-win_amd64.whl", hash = "sha256:f974c96fca34ae9e4f49839ba6b78addf0346777b46c4da27a7bf54f48d3057d"},
- {file = "psycopg2-2.8.6-cp37-cp37m-win32.whl", hash = "sha256:6a3d9efb6f36f1fe6aa8dbb5af55e067db802502c55a9defa47c5a1dad41df84"},
- {file = "psycopg2-2.8.6-cp37-cp37m-win_amd64.whl", hash = "sha256:56fee7f818d032f802b8eed81ef0c1232b8b42390df189cab9cfa87573fe52c5"},
- {file = "psycopg2-2.8.6-cp38-cp38-win32.whl", hash = "sha256:ad2fe8a37be669082e61fb001c185ffb58867fdbb3e7a6b0b0d2ffe232353a3e"},
- {file = "psycopg2-2.8.6-cp38-cp38-win_amd64.whl", hash = "sha256:56007a226b8e95aa980ada7abdea6b40b75ce62a433bd27cec7a8178d57f4051"},
- {file = "psycopg2-2.8.6-cp39-cp39-win32.whl", hash = "sha256:2c93d4d16933fea5bbacbe1aaf8fa8c1348740b2e50b3735d1b0bf8154cbf0f3"},
- {file = "psycopg2-2.8.6-cp39-cp39-win_amd64.whl", hash = "sha256:d5062ae50b222da28253059880a871dc87e099c25cb68acf613d9d227413d6f7"},
- {file = "psycopg2-2.8.6.tar.gz", hash = "sha256:fb23f6c71107c37fd667cb4ea363ddeb936b348bbd6449278eb92c189699f543"},
+ {file = "psycopg2-2.9.1-cp36-cp36m-win32.whl", hash = "sha256:7f91312f065df517187134cce8e395ab37f5b601a42446bdc0f0d51773621854"},
+ {file = "psycopg2-2.9.1-cp36-cp36m-win_amd64.whl", hash = "sha256:830c8e8dddab6b6716a4bf73a09910c7954a92f40cf1d1e702fb93c8a919cc56"},
+ {file = "psycopg2-2.9.1-cp37-cp37m-win32.whl", hash = "sha256:89409d369f4882c47f7ea20c42c5046879ce22c1e4ea20ef3b00a4dfc0a7f188"},
+ {file = "psycopg2-2.9.1-cp37-cp37m-win_amd64.whl", hash = "sha256:7640e1e4d72444ef012e275e7b53204d7fab341fb22bc76057ede22fe6860b25"},
+ {file = "psycopg2-2.9.1-cp38-cp38-win32.whl", hash = "sha256:079d97fc22de90da1d370c90583659a9f9a6ee4007355f5825e5f1c70dffc1fa"},
+ {file = "psycopg2-2.9.1-cp38-cp38-win_amd64.whl", hash = "sha256:2c992196719fadda59f72d44603ee1a2fdcc67de097eea38d41c7ad9ad246e62"},
+ {file = "psycopg2-2.9.1-cp39-cp39-win32.whl", hash = "sha256:2087013c159a73e09713294a44d0c8008204d06326006b7f652bef5ace66eebb"},
+ {file = "psycopg2-2.9.1-cp39-cp39-win_amd64.whl", hash = "sha256:bf35a25f1aaa8a3781195595577fcbb59934856ee46b4f252f56ad12b8043bcf"},
+ {file = "psycopg2-2.9.1.tar.gz", hash = "sha256:de5303a6f1d0a7a34b9d40e4d3bef684ccc44a49bbe3eb85e3c0bffb4a131b7c"},
]
psycopg2-binary = [
- {file = "psycopg2-binary-2.8.6.tar.gz", hash = "sha256:11b9c0ebce097180129e422379b824ae21c8f2a6596b159c7659e2e5a00e1aa0"},
- {file = "psycopg2_binary-2.8.6-cp27-cp27m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:d14b140a4439d816e3b1229a4a525df917d6ea22a0771a2a78332273fd9528a4"},
- {file = "psycopg2_binary-2.8.6-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:1fabed9ea2acc4efe4671b92c669a213db744d2af8a9fc5d69a8e9bc14b7a9db"},
- {file = "psycopg2_binary-2.8.6-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:f5ab93a2cb2d8338b1674be43b442a7f544a0971da062a5da774ed40587f18f5"},
- {file = "psycopg2_binary-2.8.6-cp27-cp27m-win32.whl", hash = "sha256:b4afc542c0ac0db720cf516dd20c0846f71c248d2b3d21013aa0d4ef9c71ca25"},
- {file = "psycopg2_binary-2.8.6-cp27-cp27m-win_amd64.whl", hash = "sha256:e74a55f6bad0e7d3968399deb50f61f4db1926acf4a6d83beaaa7df986f48b1c"},
- {file = "psycopg2_binary-2.8.6-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:0deac2af1a587ae12836aa07970f5cb91964f05a7c6cdb69d8425ff4c15d4e2c"},
- {file = "psycopg2_binary-2.8.6-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:ad20d2eb875aaa1ea6d0f2916949f5c08a19c74d05b16ce6ebf6d24f2c9f75d1"},
- {file = "psycopg2_binary-2.8.6-cp34-cp34m-win32.whl", hash = "sha256:950bc22bb56ee6ff142a2cb9ee980b571dd0912b0334aa3fe0fe3788d860bea2"},
- {file = "psycopg2_binary-2.8.6-cp34-cp34m-win_amd64.whl", hash = "sha256:b8a3715b3c4e604bcc94c90a825cd7f5635417453b253499664f784fc4da0152"},
- {file = "psycopg2_binary-2.8.6-cp35-cp35m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:d1b4ab59e02d9008efe10ceabd0b31e79519da6fb67f7d8e8977118832d0f449"},
- {file = "psycopg2_binary-2.8.6-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:ac0c682111fbf404525dfc0f18a8b5f11be52657d4f96e9fcb75daf4f3984859"},
- {file = "psycopg2_binary-2.8.6-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:7d92a09b788cbb1aec325af5fcba9fed7203897bbd9269d5691bb1e3bce29550"},
- {file = "psycopg2_binary-2.8.6-cp35-cp35m-win32.whl", hash = "sha256:aaa4213c862f0ef00022751161df35804127b78adf4a2755b9f991a507e425fd"},
- {file = "psycopg2_binary-2.8.6-cp35-cp35m-win_amd64.whl", hash = "sha256:c2507d796fca339c8fb03216364cca68d87e037c1f774977c8fc377627d01c71"},
- {file = "psycopg2_binary-2.8.6-cp36-cp36m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:ee69dad2c7155756ad114c02db06002f4cded41132cc51378e57aad79cc8e4f4"},
- {file = "psycopg2_binary-2.8.6-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:e82aba2188b9ba309fd8e271702bd0d0fc9148ae3150532bbb474f4590039ffb"},
- {file = "psycopg2_binary-2.8.6-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:d5227b229005a696cc67676e24c214740efd90b148de5733419ac9aaba3773da"},
- {file = "psycopg2_binary-2.8.6-cp36-cp36m-win32.whl", hash = "sha256:a0eb43a07386c3f1f1ebb4dc7aafb13f67188eab896e7397aa1ee95a9c884eb2"},
- {file = "psycopg2_binary-2.8.6-cp36-cp36m-win_amd64.whl", hash = "sha256:e1f57aa70d3f7cc6947fd88636a481638263ba04a742b4a37dd25c373e41491a"},
- {file = "psycopg2_binary-2.8.6-cp37-cp37m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:833709a5c66ca52f1d21d41865a637223b368c0ee76ea54ca5bad6f2526c7679"},
- {file = "psycopg2_binary-2.8.6-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:ba28584e6bca48c59eecbf7efb1576ca214b47f05194646b081717fa628dfddf"},
- {file = "psycopg2_binary-2.8.6-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:6a32f3a4cb2f6e1a0b15215f448e8ce2da192fd4ff35084d80d5e39da683e79b"},
- {file = "psycopg2_binary-2.8.6-cp37-cp37m-win32.whl", hash = "sha256:0e4dc3d5996760104746e6cfcdb519d9d2cd27c738296525d5867ea695774e67"},
- {file = "psycopg2_binary-2.8.6-cp37-cp37m-win_amd64.whl", hash = "sha256:cec7e622ebc545dbb4564e483dd20e4e404da17ae07e06f3e780b2dacd5cee66"},
- {file = "psycopg2_binary-2.8.6-cp38-cp38-macosx_10_9_x86_64.macosx_10_9_intel.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:ba381aec3a5dc29634f20692349d73f2d21f17653bda1decf0b52b11d694541f"},
- {file = "psycopg2_binary-2.8.6-cp38-cp38-manylinux1_i686.whl", hash = "sha256:a0c50db33c32594305b0ef9abc0cb7db13de7621d2cadf8392a1d9b3c437ef77"},
- {file = "psycopg2_binary-2.8.6-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:2dac98e85565d5688e8ab7bdea5446674a83a3945a8f416ad0110018d1501b94"},
- {file = "psycopg2_binary-2.8.6-cp38-cp38-win32.whl", hash = "sha256:bd1be66dde2b82f80afb9459fc618216753f67109b859a361cf7def5c7968729"},
- {file = "psycopg2_binary-2.8.6-cp38-cp38-win_amd64.whl", hash = "sha256:8cd0fb36c7412996859cb4606a35969dd01f4ea34d9812a141cd920c3b18be77"},
- {file = "psycopg2_binary-2.8.6-cp39-cp39-macosx_10_9_x86_64.macosx_10_9_intel.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:89705f45ce07b2dfa806ee84439ec67c5d9a0ef20154e0e475e2b2ed392a5b83"},
- {file = "psycopg2_binary-2.8.6-cp39-cp39-manylinux1_i686.whl", hash = "sha256:42ec1035841b389e8cc3692277a0bd81cdfe0b65d575a2c8862cec7a80e62e52"},
- {file = "psycopg2_binary-2.8.6-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:7312e931b90fe14f925729cde58022f5d034241918a5c4f9797cac62f6b3a9dd"},
- {file = "psycopg2_binary-2.8.6-cp39-cp39-win32.whl", hash = "sha256:6422f2ff0919fd720195f64ffd8f924c1395d30f9a495f31e2392c2efafb5056"},
- {file = "psycopg2_binary-2.8.6-cp39-cp39-win_amd64.whl", hash = "sha256:15978a1fbd225583dd8cdaf37e67ccc278b5abecb4caf6b2d6b8e2b948e953f6"},
+ {file = "psycopg2-binary-2.9.1.tar.gz", hash = "sha256:b0221ca5a9837e040ebf61f48899926b5783668b7807419e4adae8175a31f773"},
+ {file = "psycopg2_binary-2.9.1-cp36-cp36m-macosx_10_14_x86_64.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:c250a7ec489b652c892e4f0a5d122cc14c3780f9f643e1a326754aedf82d9a76"},
+ {file = "psycopg2_binary-2.9.1-cp36-cp36m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aef9aee84ec78af51107181d02fe8773b100b01c5dfde351184ad9223eab3698"},
+ {file = "psycopg2_binary-2.9.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:123c3fb684e9abfc47218d3784c7b4c47c8587951ea4dd5bc38b6636ac57f616"},
+ {file = "psycopg2_binary-2.9.1-cp36-cp36m-manylinux_2_24_aarch64.whl", hash = "sha256:995fc41ebda5a7a663a254a1dcac52638c3e847f48307b5416ee373da15075d7"},
+ {file = "psycopg2_binary-2.9.1-cp36-cp36m-manylinux_2_24_ppc64le.whl", hash = "sha256:fbb42a541b1093385a2d8c7eec94d26d30437d0e77c1d25dae1dcc46741a385e"},
+ {file = "psycopg2_binary-2.9.1-cp36-cp36m-win32.whl", hash = "sha256:20f1ab44d8c352074e2d7ca67dc00843067788791be373e67a0911998787ce7d"},
+ {file = "psycopg2_binary-2.9.1-cp36-cp36m-win_amd64.whl", hash = "sha256:f6fac64a38f6768e7bc7b035b9e10d8a538a9fadce06b983fb3e6fa55ac5f5ce"},
+ {file = "psycopg2_binary-2.9.1-cp37-cp37m-macosx_10_14_x86_64.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:1e3a362790edc0a365385b1ac4cc0acc429a0c0d662d829a50b6ce743ae61b5a"},
+ {file = "psycopg2_binary-2.9.1-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f8559617b1fcf59a9aedba2c9838b5b6aa211ffedecabca412b92a1ff75aac1a"},
+ {file = "psycopg2_binary-2.9.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a36c7eb6152ba5467fb264d73844877be8b0847874d4822b7cf2d3c0cb8cdcb0"},
+ {file = "psycopg2_binary-2.9.1-cp37-cp37m-manylinux_2_24_aarch64.whl", hash = "sha256:2f62c207d1740b0bde5c4e949f857b044818f734a3d57f1d0d0edc65050532ed"},
+ {file = "psycopg2_binary-2.9.1-cp37-cp37m-manylinux_2_24_ppc64le.whl", hash = "sha256:cfc523edecddaef56f6740d7de1ce24a2fdf94fd5e704091856a201872e37f9f"},
+ {file = "psycopg2_binary-2.9.1-cp37-cp37m-win32.whl", hash = "sha256:1e85b74cbbb3056e3656f1cc4781294df03383127a8114cbc6531e8b8367bf1e"},
+ {file = "psycopg2_binary-2.9.1-cp37-cp37m-win_amd64.whl", hash = "sha256:1473c0215b0613dd938db54a653f68251a45a78b05f6fc21af4326f40e8360a2"},
+ {file = "psycopg2_binary-2.9.1-cp38-cp38-macosx_10_14_x86_64.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:35c4310f8febe41f442d3c65066ca93cccefd75013df3d8c736c5b93ec288140"},
+ {file = "psycopg2_binary-2.9.1-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8c13d72ed6af7fd2c8acbd95661cf9477f94e381fce0792c04981a8283b52917"},
+ {file = "psycopg2_binary-2.9.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:14db1752acdd2187d99cb2ca0a1a6dfe57fc65c3281e0f20e597aac8d2a5bd90"},
+ {file = "psycopg2_binary-2.9.1-cp38-cp38-manylinux_2_24_aarch64.whl", hash = "sha256:aed4a9a7e3221b3e252c39d0bf794c438dc5453bc2963e8befe9d4cd324dff72"},
+ {file = "psycopg2_binary-2.9.1-cp38-cp38-manylinux_2_24_ppc64le.whl", hash = "sha256:da113b70f6ec40e7d81b43d1b139b9db6a05727ab8be1ee559f3a69854a69d34"},
+ {file = "psycopg2_binary-2.9.1-cp38-cp38-win32.whl", hash = "sha256:4235f9d5ddcab0b8dbd723dca56ea2922b485ea00e1dafacf33b0c7e840b3d32"},
+ {file = "psycopg2_binary-2.9.1-cp38-cp38-win_amd64.whl", hash = "sha256:988b47ac70d204aed01589ed342303da7c4d84b56c2f4c4b8b00deda123372bf"},
+ {file = "psycopg2_binary-2.9.1-cp39-cp39-macosx_10_14_x86_64.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:7360647ea04db2e7dff1648d1da825c8cf68dc5fbd80b8fb5b3ee9f068dcd21a"},
+ {file = "psycopg2_binary-2.9.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca86db5b561b894f9e5f115d6a159fff2a2570a652e07889d8a383b5fae66eb4"},
+ {file = "psycopg2_binary-2.9.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5ced67f1e34e1a450cdb48eb53ca73b60aa0af21c46b9b35ac3e581cf9f00e31"},
+ {file = "psycopg2_binary-2.9.1-cp39-cp39-manylinux_2_24_aarch64.whl", hash = "sha256:0f2e04bd2a2ab54fa44ee67fe2d002bb90cee1c0f1cc0ebc3148af7b02034cbd"},
+ {file = "psycopg2_binary-2.9.1-cp39-cp39-manylinux_2_24_ppc64le.whl", hash = "sha256:3242b9619de955ab44581a03a64bdd7d5e470cc4183e8fcadd85ab9d3756ce7a"},
+ {file = "psycopg2_binary-2.9.1-cp39-cp39-win32.whl", hash = "sha256:0b7dae87f0b729922e06f85f667de7bf16455d411971b2043bbd9577af9d1975"},
+ {file = "psycopg2_binary-2.9.1-cp39-cp39-win_amd64.whl", hash = "sha256:b4d7679a08fea64573c969f6994a2631908bb2c0e69a7235648642f3d2e39a68"},
]
pycparser = [
{file = "pycparser-2.20-py2.py3-none-any.whl", hash = "sha256:7582ad22678f0fcd81102833f60ef8d0e57288b6b5fb00323d101be910e35705"},
@@ -1135,8 +1177,8 @@ pyjwt = [
{file = "PyJWT-2.1.0.tar.gz", hash = "sha256:fba44e7898bbca160a2b2b501f492824fc8382485d3a6f11ba5d0c1937ce6130"},
]
python-dateutil = [
- {file = "python-dateutil-2.8.1.tar.gz", hash = "sha256:73ebfe9dbf22e832286dafa60473e4cd239f8592f699aa5adaf10050e6e1823c"},
- {file = "python_dateutil-2.8.1-py2.py3-none-any.whl", hash = "sha256:75bb3f31ea686f1197762692a9ee6a7550b59fc6ca3a1f4b5d7e32fb98e2da2a"},
+ {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"},
+ {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"},
]
python3-openid = [
{file = "python3-openid-3.2.0.tar.gz", hash = "sha256:33fbf6928f401e0b790151ed2b5290b02545e8775f982485205a066f874aaeaf"},
@@ -1178,8 +1220,8 @@ pyyaml = [
{file = "PyYAML-5.4.1.tar.gz", hash = "sha256:607774cbba28732bfa802b54baa7484215f530991055bb562efbed5b2f20a45e"},
]
requests = [
- {file = "requests-2.25.1-py2.py3-none-any.whl", hash = "sha256:c210084e36a42ae6b9219e00e48287def368a26d03a048ddad7bfee44f75871e"},
- {file = "requests-2.25.1.tar.gz", hash = "sha256:27973dd4a904a4f13b263a19c866c13b92a39ed1c964655f025f3f8d3d75b804"},
+ {file = "requests-2.26.0-py2.py3-none-any.whl", hash = "sha256:6c1246513ecd5ecd4528a0906f910e8f0f9c6b8ec72030dc9fd154dc1a6efd24"},
+ {file = "requests-2.26.0.tar.gz", hash = "sha256:b8aa58f8cf793ffd8782d3d8cb19e66ef36f7aba4353eec859e74678b01b07a7"},
]
requests-oauthlib = [
{file = "requests-oauthlib-1.3.0.tar.gz", hash = "sha256:b4261601a71fd721a8bd6d7aa1cc1d6a8a93b4a9f5e96626f8e4d91e8beeaa6a"},
@@ -1187,12 +1229,16 @@ requests-oauthlib = [
{file = "requests_oauthlib-1.3.0-py3.7.egg", hash = "sha256:fa6c47b933f01060936d87ae9327fead68768b69c6c9ea2109c48be30f2d4dbc"},
]
s3transfer = [
- {file = "s3transfer-0.4.2-py2.py3-none-any.whl", hash = "sha256:9b3752887a2880690ce628bc263d6d13a3864083aeacff4890c1c9839a5eb0bc"},
- {file = "s3transfer-0.4.2.tar.gz", hash = "sha256:cb022f4b16551edebbb31a377d3f09600dbada7363d8c5db7976e7f47732e1b2"},
+ {file = "s3transfer-0.5.0-py3-none-any.whl", hash = "sha256:9c1dc369814391a6bda20ebbf4b70a0f34630592c9aa520856bf384916af2803"},
+ {file = "s3transfer-0.5.0.tar.gz", hash = "sha256:50ed823e1dc5868ad40c8dc92072f757aa0e653a192845c94a3b676f4a62da4c"},
]
sentry-sdk = [
- {file = "sentry-sdk-1.1.0.tar.gz", hash = "sha256:c1227d38dca315ba35182373f129c3e2722e8ed999e52584e6aca7d287870739"},
- {file = "sentry_sdk-1.1.0-py2.py3-none-any.whl", hash = "sha256:c7d380a21281e15be3d9f67a3c4fbb4f800c481d88ff8d8931f39486dd7b4ada"},
+ {file = "sentry-sdk-1.3.1.tar.gz", hash = "sha256:ebe99144fa9618d4b0e7617e7929b75acd905d258c3c779edcd34c0adfffe26c"},
+ {file = "sentry_sdk-1.3.1-py2.py3-none-any.whl", hash = "sha256:f33d34c886d0ba24c75ea8885a8b3a172358853c7cbde05979fc99c29ef7bc52"},
+]
+simple-salesforce = [
+ {file = "simple-salesforce-1.11.3.tar.gz", hash = "sha256:cc1d3ec6ae25e89484aa8e0c02f6005ec20647b24b3b269b1005847d2cd365c8"},
+ {file = "simple_salesforce-1.11.3-py2.py3-none-any.whl", hash = "sha256:34000991e3aa981a589ce9492a0b27e49eac60a56225eb0dee080069d7a01193"},
]
six = [
{file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"},
@@ -1211,12 +1257,12 @@ text-unidecode = [
{file = "text_unidecode-1.3-py2.py3-none-any.whl", hash = "sha256:1311f10e8b895935241623731c2ba64f4c455287888b18189350b67134a822e8"},
]
urllib3 = [
- {file = "urllib3-1.26.5-py2.py3-none-any.whl", hash = "sha256:753a0374df26658f99d826cfe40394a686d05985786d946fbe4165b5148f5a7c"},
- {file = "urllib3-1.26.5.tar.gz", hash = "sha256:a7acd0977125325f516bda9735fa7142b909a8d01e8b2e4c8108d0984e6e0098"},
+ {file = "urllib3-1.26.6-py2.py3-none-any.whl", hash = "sha256:39fb8672126159acb139a7718dd10806104dec1e2f0f6c88aab05d17df10c8d4"},
+ {file = "urllib3-1.26.6.tar.gz", hash = "sha256:f57b4c16c62fa2760b7e3d97c35b255512fb6b59a259730f36ba32ce9f8e342f"},
]
whitenoise = [
- {file = "whitenoise-5.2.0-py2.py3-none-any.whl", hash = "sha256:05d00198c777028d72d8b0bbd234db605ef6d60e9410125124002518a48e515d"},
- {file = "whitenoise-5.2.0.tar.gz", hash = "sha256:05ce0be39ad85740a78750c86a93485c40f08ad8c62a6006de0233765996e5c7"},
+ {file = "whitenoise-5.3.0-py2.py3-none-any.whl", hash = "sha256:d963ef25639d1417e8a247be36e6aedd8c7c6f0a08adcb5a89146980a96b577c"},
+ {file = "whitenoise-5.3.0.tar.gz", hash = "sha256:d234b871b52271ae7ed6d9da47ffe857c76568f11dd30e28e18c5869dbd11e12"},
]
xlrd = [
{file = "xlrd-2.0.1-py2.py3-none-any.whl", hash = "sha256:6a33ee89877bd9abc1158129f6e94be74e2679636b8a205b43b85206c3f0bbdd"},
diff --git a/pyproject.toml b/pyproject.toml
index 9f1c5007..36b94a84 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -54,6 +54,7 @@ django-bootstrap3 = "^14.2.0"
django-cleanup = "^5.1.0"
django-common-helpers = "^0.9.2"
django-cron = "^0.5.1"
+django-crontab = "^0.7.1"
django-debug-toolbar = "^3.2"
django-environ = "^0.4.5"
django-fullurl = "^1.1"
@@ -76,3 +77,4 @@ Pillow = "^8.1.0"
psycopg2-binary = "^2.8.6"
sentry-sdk = "^1.1.0"
django-active-link = "^0.1.7"
+simple-salesforce = "^1.11.2"
\ No newline at end of file
diff --git a/test/cypress/integration/we-all-code/class-signup.spec.js b/test/cypress/integration/we-all-code/class-signup.spec.js
index c5881d58..eed44e8f 100644
--- a/test/cypress/integration/we-all-code/class-signup.spec.js
+++ b/test/cypress/integration/we-all-code/class-signup.spec.js
@@ -30,7 +30,7 @@ describe("Signup for Classes", () => {
cy.get(".margin-vertical-3 > .grid-container > .margin-top-3 > h2").eq(1).should("have.text","Students")
cy.contains("Programs").click()
cy.get(':nth-child(2) > .medium-4 > .button').click();
- cy.get(':nth-child(3) > .text-right > .button').click();
+ cy.get(':nth-child(2) > .text-right > .button').click();
cy.get("body").then(($body) => {
if($body.text().includes("Enroll Kelly Doe for the")) {
cy.get(".margin-vertical-3 > .grid-container > .container > .title").should("have.text",'Enroll Kelly Doe for the "Choose Your Own Adventure" class on Jan. 1, 2022 from 10 a.m. to 1 p.m..')
@@ -51,7 +51,7 @@ describe("Signup for Classes", () => {
cy.get(".margin-vertical-3 > .grid-container > .margin-top-3 > h2").eq(1).should("have.text","Students")
cy.contains("Programs").click()
cy.get(':nth-child(2) > .medium-4 > .button').click();
- cy.get(':nth-child(3) > .text-right > .button').click();
+ cy.get(':nth-child(2) > .text-right > .button').click();
cy.contains("Nevermind").click();
cy.get(".padding-vertical-1 > .callout > strong").should("not.exist");
})
diff --git a/test/cypress/integration/we-all-code/course-creation.spec.js b/test/cypress/integration/we-all-code/course-creation.spec.js
new file mode 100644
index 00000000..c66770c8
--- /dev/null
+++ b/test/cypress/integration/we-all-code/course-creation.spec.js
@@ -0,0 +1,64 @@
+import faker from "faker";
+
+const title = faker.lorem.word(9);
+const code = `${title}${faker.datatype.number(1000)}`;
+const duration = `0${faker.datatype.number({ min: 1, max: 4 })}:00:00`;
+const description = faker.lorem.words(10);
+const minAge = faker.datatype.number({ min: 7, max: 10 });
+const maxAge = minAge + 8;
+
+describe("Create a course through admin: required fields", () => {
+ it("Log into admin", () => {
+ cy.visit("/dj-admin");
+ cy.get("#id_username").type("gregoriofs+admin@uchicago.edu");
+ cy.get("#id_password").type("admin");
+ cy.contains("Log in").click();
+ cy.get("#user-tools > strong").should("have.text", "Ali");
+ });
+
+ it("Adds a course with required fields", () => {
+ cy.get("tbody > .model-course > td:first").click();
+ cy.get("#id_username").type("gregoriofs+admin@uchicago.edu");
+ cy.get("#id_password").type("admin");
+ cy.contains("Log in").click();
+
+ cy.get("#id_code").type(code);
+ cy.get("#id_title").type(`${title}`);
+ cy.get("#id_duration").clear().type(duration);
+ cy.get("#id_minimum_age").clear().type(minAge);
+ cy.get("#id_maximum_age").clear().type(maxAge);
+
+ cy.contains("Save").click();
+
+ cy.get(".success").should("exist");
+ });
+});
+
+describe("Create a course through admin: complete", () => {
+ it("Log into admin", () => {
+ cy.visit("/dj-admin");
+ cy.get("#id_username").type("gregoriofs+admin@uchicago.edu");
+ cy.get("#id_password").type("admin");
+ cy.contains("Log in").click();
+ cy.get("#user-tools > strong").should("have.text", "Ali");
+ });
+
+ it("Adds a course with all fields", () => {
+ cy.get("tbody > .model-course > td:first").click();
+ cy.get("#id_username").type("gregoriofs+admin@uchicago.edu");
+ cy.get("#id_password").type("admin");
+ cy.contains("Log in").click();
+
+ cy.get("#id_code").type(code);
+ cy.get("#id_title").type(`${title}`);
+ cy.get("#id_slug").type(code);
+ cy.get("#id_description").type(description);
+ cy.get("#id_duration").clear().type(duration);
+ cy.get("#id_minimum_age").clear().type(minAge);
+ cy.get("#id_maximum_age").clear().type(maxAge);
+
+ cy.contains("Save").click();
+
+ cy.get(".success").should("exist");
+ });
+ });
\ No newline at end of file
diff --git a/test/cypress/integration/we-all-code/create-account.spec.js b/test/cypress/integration/we-all-code/create-account.spec.js
index d969c299..efa0b095 100644
--- a/test/cypress/integration/we-all-code/create-account.spec.js
+++ b/test/cypress/integration/we-all-code/create-account.spec.js
@@ -1,113 +1,123 @@
///
-const faker = require("faker");
-
-describe("Signup User", () => {
+// const faker = require("faker");
+import faker from "faker";
+
+import { format } from "date-fns";
+
+const race = ["White","Black","Asian","American Indian", "Native Hawaiin", "Middle Eastern"]
+const ethnicity = ["Hispanic", "Not Hispanic"]
+
+function randomPerson(
+ birthday_min = "1950-01-01",
+ birthday_max = "2000-01-01"
+) {
+ const person = {
+ first_name: faker.name.firstName(),
+ last_name: faker.name.lastName(),
+ gender: faker.name.gender(),
+ phone: faker.phone.phoneNumber(),
+ zip: faker.address.zipCode(),
+ ethnicity: faker.datatype.number({ min: 0, max: 1 }),
+ password: faker.internet.password(),
+ school:`${faker.lorem.word(7)} School`,
+ birthday: format(
+ faker.date.between(birthday_min, birthday_max),
+ "yyyy-MM-dd"
+ ),
+ address: faker.address.streetAddress(true),
+ race: faker.datatype.number({ min: 0, max: 4}),
+ };
+
+ person.email = faker.internet.exampleEmail(
+ person.first_name,
+ person.last_name
+ );
+
+ return person;
+}
+
+describe("Create Parent Account", () => {
beforeEach(() => {
- const first_name = faker.name.firstName();
- const last_name = faker.name.lastName();
- const email = faker.internet.exampleEmail(first_name,last_name);
- const password = faker.internet.password();
+ const user = randomPerson();
cy.visit("/account/signup/");
- cy.get("#id_email").type(email);
- cy.get("#id_first_name").type(first_name);
- cy.get("#id_last_name").type(last_name);
- cy.get("#id_password1").type(password);
- cy.get("#id_password2").type(password);
+ cy.get("#id_email").type(user.email);
+ cy.get("#id_first_name").type(user.first_name);
+ cy.get("#id_last_name").type(user.last_name);
+ cy.get("#id_password1").type(user.password);
+ cy.get("#id_password2").type(user.password);
cy.get("main form").submit();
});
- it("signup invalid user with error", () => {
- cy.get("#main .title").contains("Thanks for registering");
+ it("fill out parent information", function () {
+ const student = randomPerson("2005-01-01", "2013-01-01");
+ const parent = randomPerson();
+
+ cy.get(".medium-offset-2 > p > .button").click();
+
+ // Parents
+ cy.get("#id_phone").type(parent.phone);
+ cy.get("#id_zip").type(parent.zip);
+ cy.get("#id_gender").type("Male");
+ cy.get("#id_race_ethnicity").select([`${parent.ethnicity + 1}`]);
+ cy.get("#id_birthday").type(parent.birthday);
+ cy.contains("Continue").click();
+ // TODO: Check for success message
+ cy.get("#main > .grid-container > .medium-padding-horizontal-3 > h2").should("have.text","Register your first student now")
+ // Student
+ cy.get("#id_first_name").type(student.first_name);
+ cy.get("#id_last_name").type(student.last_name);
+ cy.get("#id_birthday").type(student.birthday);
+ cy.get("#id_gender").type(student.gender);
+ cy.get('#id_race').select(race[student.race]);
+ cy.get('#id_ethnicity').select(ethnicity[student.ethnicity]);
+ cy.get('#id_school_name').type(student.school);
+ cy.get('#id_school_type_0').check();
+ cy.get(':nth-child(8) > .control-label').click();
+ cy.get('#id_medical_conditions').click();
+ cy.get('#id_medications').click();
+ cy.get(':nth-child(11) > .checkbox > label').click();
+ cy.get('#id_photo_release').check();
+ cy.get(':nth-child(12) > .checkbox > label').click();
+ cy.get('#id_consent').check();
+ cy.get('.submit').click();
+ // TODO: Check for success message
+ cy.get("#main > .grid-container > .medium-padding-horizontal-3 > h4").should("have.text","1 Student Registered ")
});
+});
- it("Parent Signup", function () {
-
- const student_first_name = faker.name.firstName();
- const student_last_name = faker.name.lastName();
- const phone = faker.phone.phoneNumber();
- const birthday = isParent => {
- const max = isParent ? 2000 : 2005
- const min = isParent ? 1950 : 2013
- const year = Math.floor(Math.random() * (max - min + 1)) + min
- const month = Math.floor((Math.random() * 12)) + 1
- const formattedMonth = month < 10 ? `0${month}` : `${month}`
- const day = Math.floor((Math.random() * 27)) + 1
- const formattedDay = day < 10 ? `0${day}` : `${day}`
- return `${year}-${formattedMonth}-${formattedDay}`
- };
- const gender = faker.name.gender();
- const zip = faker.address.zipCode();
- const ethnicity = Math.floor(Math.random() * 5) + 1;
+describe("Signup Volunteer", () => {
- cy.get(".medium-offset-2 > p > .button").click();
+ it("Volunteer Signup", () => {
- cy.get("#id_phone").type(phone);
+ const volunteer = randomPerson();
+ volunteer.workplace = faker.company.companyName();
- cy.get("#id_zip").type(zip);
+ cy.visit("/account/signup/");
+ cy.get("#id_email").type(volunteer.email);
+ cy.get("#id_first_name").type(volunteer.first_name);
+ cy.get("#id_last_name").type(volunteer.last_name);
+ cy.get("#id_password1").type(volunteer.password);
+ cy.get("#id_password2").type(volunteer.password);
+ cy.get("main form").submit();
- cy.get("#id_gender").type("Male");
- cy.get("#id_race_ethnicity").select([`${ethnicity}`]);
- cy.get("#id_birthday").type(birthday(true))
- cy.contains("Continue").click();
+ cy.contains("Volunteer").click();
+
+ cy.get("#id_bio").type("Lorem ipsum");
- cy.get("#id_first_name").type(student_first_name);
+ cy.get("#id_birthday").type(volunteer.birthday);
- cy.get("#id_last_name").type(student_last_name);
+ cy.get("#id_gender").type(volunteer.gender);
- cy.get("#id_birthday").type(birthday(false));
- cy.get(":nth-child(5) > .control-label").click();
+ cy.get("#id_work_place").type(volunteer.workplace);
- cy.get("#id_gender").type(gender);
- cy.get(`#id_race_ethnicity > :nth-child(${ethnicity}) > label`).click();
+ cy.get("#id_phone").type(volunteer.phone);
- cy.get("#id_school_name").type("Example School");
- cy.get("#id_school_type > :nth-child(1) > label").click();
- cy.get("#id_school_type_0").check();
- cy.get("#id_medical_conditions").type('None');
- cy.get("#id_medications").type('None')
- cy.get("#id_photo_release").check();
- cy.get(":nth-child(11) > .checkbox > label").click();
- cy.get("#id_consent").check();
+ cy.get("#id_home_address").type(volunteer.address);
+
+ cy.get("#id_race_ethnicity").select([`${volunteer.ethnicity + 1}`]);
+
cy.get(".submit").click();
- /* ==== End Cypress Studio ==== */
});
-
- it("Volunteer Signup", () => {
- const volunteer_birthday = () => {
- const max = 2000
- const min = 1980
- const year = Math.floor(Math.random() * (max - min + 1)) + min
- const month = Math.floor((Math.random() * 12)) + 1
- const formattedMonth = month < 10 ? `0${month}` : `${month}`
- const day = Math.floor((Math.random() * 27)) + 1
- const formattedDay = day < 10 ? `0${day}` : `${day}`
- return `${year}-${formattedMonth}-${formattedDay}`
- };
- const gender = faker.name.gender();
- const workplace = faker.company.companyName();
- const phone = faker.phone.phoneNumber();
- const address = faker.address.streetAddress(true);
- const ethnicity = Math.floor(Math.random() * 5) + 1;
-
- cy.contains("Volunteer").click()
-
- /* ==== Generated with Cypress Studio ==== */
- cy.get('#id_bio').type("Lorem ipsum");
-
- cy.get('#id_birthday').type(volunteer_birthday());
-
- cy.get('#id_gender').type(gender);
-
- cy.get('#id_work_place').type(workplace);
-
- cy.get('#id_phone').type(phone);
-
- cy.get('#id_home_address').type(address);
-
- cy.get('#id_race_ethnicity').select([`${ethnicity}`]);
- cy.get('.submit').click();
- /* ==== End Cypress Studio ==== */
- })
});
diff --git a/test/cypress/integration/we-all-code/donation-addition.spec.js b/test/cypress/integration/we-all-code/donation-addition.spec.js
new file mode 100644
index 00000000..95f13875
--- /dev/null
+++ b/test/cypress/integration/we-all-code/donation-addition.spec.js
@@ -0,0 +1,68 @@
+import faker from "faker";
+
+const first_name = faker.name.firstName();
+const last_name = faker.name.lastName();
+const email = faker.internet.exampleEmail(first_name, last_name);
+const referral_code = `e${faker.datatype.number({
+ min: 1000,
+ max: 99999,
+})}`;
+const donation = faker.datatype.number(10000);
+
+// describe("Add a donation: required only", () => {
+// it("Creates donation", () => {
+// cy.visit("/dj-admin");
+// cy.get("#id_username").type("gregoriofs+admin@uchicago.edu");
+// cy.get("#id_password").type("admin");
+// cy.contains("Log in").click();
+// cy.get("#user-tools > strong").should("have.text", "Ali");
+
+// cy.get(".model-donation > :nth-child(2) > .addlink").click();
+// cy.get("#id_amount").type(donation);
+// cy.contains('Save').click();
+// cy.get('.success').should('exist');
+// });
+// });
+
+describe("Add a donation: complete", () => {
+ it("Creates donation with all fields", () => {
+ cy.visit("/dj-admin");
+ cy.get("#id_username").type("gregoriofs+admin@uchicago.edu");
+ cy.get("#id_password").type("admin");
+ cy.contains("Log in").click();
+ cy.get("#user-tools > strong").should("have.text", "Ali");
+
+ cy.get(".model-donation > :nth-child(2) > .addlink").click();
+ cy.get(
+ ".field-user > :nth-child(1) > .related-widget-wrapper > .select2 > .selection > .select2-selection"
+ )
+ .click()
+ .wait(3000);
+ cy.get(
+ ".select2-container > .select2-dropdown > .select2-results > ul:first-child"
+ ).click();
+ cy.get(
+ ".field-session > :nth-child(1) > .related-widget-wrapper > .select2 > .selection > .select2-selection"
+ )
+ .click()
+ .wait(5000);
+ cy.get(
+ ".select2-container > .select2-dropdown > .select2-results > ul:first-child"
+ )
+ .click();
+
+ cy.get("#id_first_name").clear();
+ cy.get("#id_first_name").type(first_name);
+ cy.get(".field-first_name").click();
+ cy.get("#id_last_name").type(last_name);
+ cy.get("#id_referral_code").type(referral_code);
+ cy.get("#id_email").type(email);
+ cy.get("#id_amount").type(donation);
+ cy.get(".field-is_verified").click();
+ cy.get(".field-is_verified > .checkbox-row > .vCheckboxLabel").click();
+ cy.get("#id_is_verified").check();
+ cy.get(".field-receipt_sent > .checkbox-row > .vCheckboxLabel").click();
+ cy.get("#id_receipt_sent").check();
+ cy.get(".default").click();
+ });
+});
diff --git a/test/cypress/integration/we-all-code/equipment-creation.spec.js b/test/cypress/integration/we-all-code/equipment-creation.spec.js
new file mode 100644
index 00000000..31f3be70
--- /dev/null
+++ b/test/cypress/integration/we-all-code/equipment-creation.spec.js
@@ -0,0 +1,74 @@
+import faker from "faker";
+
+const uuid = `${faker.datatype.number(9)}${faker.datatype.number(
+ 9
+)}${faker.datatype.number(9)}-${faker.datatype.number(
+ 9
+)}${faker.datatype.number(9)}${faker.datatype.number(
+ 9
+)}-${faker.datatype.number(9)}${faker.datatype.number(
+ 9
+)}${faker.datatype.number(9)}-${faker.datatype.number(
+ 9
+)}${faker.datatype.number(9)}${faker.datatype.number(9)}`;
+const equipment_type = faker.datatype.number({ min: 1, max: 2 });
+const make = faker.commerce.productName();
+const model = faker.datatype.number(20);
+const tag = `${make}${model}`;
+const notes = faker.lorem.words(5);
+const acquisition_datetime = faker.date.between("2021-01-01", "2023-12-31");
+const acquisition_date = acquisition_datetime.toLocaleDateString();
+const acquisition_time = acquisition_datetime.toLocaleTimeString();
+
+describe("Add an equipmentL required fields", () => {
+ it("Creates equipment", () => {
+ cy.visit("/dj-admin");
+ cy.get("#id_username").type("gregoriofs+admin@uchicago.edu");
+ cy.get("#id_password").type("admin");
+ cy.contains("Log in").click();
+ cy.get("#user-tools > strong").should("have.text", "Ali");
+
+ cy.get(".model-equipment > :nth-child(2) > .addlink").click();
+ cy.get("#id_uuid").clear();
+ cy.get("#id_uuid").type(uuid);
+ cy.get("#id_equipment_type").select(`${equipment_type}`);
+ cy.get("#id_make").clear();
+ cy.get("#id_make").type(make);
+ cy.get("#id_model").clear();
+ cy.get("#id_model").type(model);
+ cy.get("#id_asset_tag").clear();
+ cy.get("#id_asset_tag").type(tag);
+ cy.get("#id_condition").select("working");
+ cy.get(".default").click();
+ cy.get(".success").should("exist");
+ });
+});
+
+describe("Add an equipment: complete", () => {
+ it("Creates equipment with all fields", () => {
+ cy.visit("/dj-admin");
+ cy.get("#id_username").type("gregoriofs+admin@uchicago.edu");
+ cy.get("#id_password").type("admin");
+ cy.contains("Log in").click();
+ cy.get("#user-tools > strong").should("have.text", "Ali");
+
+ cy.get(".model-equipment > :nth-child(2) > .addlink").click();
+ cy.get("#id_uuid").clear();
+ cy.get("#id_uuid").type(uuid);
+ cy.get("#id_equipment_type").select(`${equipment_type}`);
+ cy.get("#id_make").clear();
+ cy.get("#id_make").type(make);
+ cy.get("#id_model").clear();
+ cy.get("#id_model").type(model);
+ cy.get("#id_asset_tag").clear();
+ cy.get("#id_asset_tag").type(tag);
+ cy.get("#id_acquisition_date_0").type(acquisition_date);
+ cy.get("#id_acquisition_date_1").type(acquisition_time.substring(0, acquisition_time.length - 3));
+ cy.get("#id_condition").select("working");
+ cy.get("#id_notes").type(notes);
+ cy.get(".vCheckboxLabel").click();
+ cy.get("#id_force_update_on_next_boot").check();
+ cy.get(".default").click();
+ cy.get(".success").should("exist");
+ });
+});
diff --git a/test/cypress/integration/we-all-code/equipment-type.spec.js b/test/cypress/integration/we-all-code/equipment-type.spec.js
new file mode 100644
index 00000000..29e84191
--- /dev/null
+++ b/test/cypress/integration/we-all-code/equipment-type.spec.js
@@ -0,0 +1,16 @@
+import faker from "faker";
+
+it("Creates equipment type", () => {
+ cy.visit("/dj-admin");
+ cy.get("#id_username").type("gregoriofs+admin@uchicago.edu");
+ cy.get("#id_password").type("admin");
+ cy.contains("Log in").click();
+ cy.get("#user-tools > strong").should("have.text", "Ali");
+
+ const type = faker.commerce.product()
+
+ cy.get('.model-equipmenttype > :nth-child(2) > .addlink').click();
+ cy.get('#id_name').type(type);
+ cy.get('.default').click();
+ cy.get('.success').should('exist');
+})
\ No newline at end of file
diff --git a/test/cypress/integration/we-all-code/location-creation.spec.js b/test/cypress/integration/we-all-code/location-creation.spec.js
new file mode 100644
index 00000000..f9b177b4
--- /dev/null
+++ b/test/cypress/integration/we-all-code/location-creation.spec.js
@@ -0,0 +1,27 @@
+import faker from "faker";
+
+describe("Add a location", () => {
+ it("Creates a location", () => {
+ cy.visit("/dj-admin");
+ cy.get("#id_username").type("gregoriofs+admin@uchicago.edu");
+ cy.get("#id_password").type("admin");
+ cy.contains("Log in").click();
+ cy.get("#user-tools > strong").should("have.text", "Ali");
+
+ const name = faker.lorem.word(6);
+ const address = faker.address.streetAddress();
+ const city = faker.address.cityName();
+ const state = faker.address.stateAbbr();
+ const zip_code = faker.address.zipCode();
+
+ cy.get('.model-location > :nth-child(2) > .addlink').click();
+ cy.get('#id_name').type(name);
+ cy.get('#id_address').type(address);
+ cy.get('#id_city').type(city);
+ cy.get('.field-state').click();
+ cy.get('#id_state').type(state);
+ cy.get('#id_zip').type(zip_code);
+ cy.get('.default').click();
+ cy.get('.success').should('exist');
+ });
+});
\ No newline at end of file
diff --git a/test/cypress/integration/we-all-code/meeting-creation.spec.js b/test/cypress/integration/we-all-code/meeting-creation.spec.js
new file mode 100644
index 00000000..dbe80a56
--- /dev/null
+++ b/test/cypress/integration/we-all-code/meeting-creation.spec.js
@@ -0,0 +1,85 @@
+import faker from "faker";
+
+const additional_info = faker.lorem.words(5);
+const start_datetime = faker.date.between("2021-01-01", "2023-12-31");
+const end_datetime = new Date(start_datetime.getTime() + (60 * 60 * 1000));
+
+console.log(start_datetime)
+
+console.log(end_datetime)
+
+const start_date = start_datetime.toLocaleDateString();
+const start_time = start_datetime.toLocaleTimeString();
+const end_date = end_datetime.toLocaleDateString();
+const end_time = end_datetime.toLocaleTimeString();
+const announced_datetime = new Date (start_datetime.getDate() - 6)
+const announced_date = announced_datetime.toLocaleDateString();
+const announced_time = announced_datetime.toLocaleTimeString();
+const ext_enroll = `${faker.internet.url()}.example`;
+
+it("Creates meeting: required fields", () => {
+ cy.visit("/dj-admin");
+ cy.get("#id_username").type("gregoriofs+admin@uchicago.edu");
+ cy.get("#id_password").type("admin");
+ cy.contains("Log in").click();
+ cy.get("#user-tools > strong").should("have.text", "Ali");
+
+ cy.get(".model-meeting > :nth-child(2) > .addlink").click();
+ cy.get(
+ ".field-meeting_type > :nth-child(1) > .related-widget-wrapper > .select2"
+ )
+ .click()
+ .wait(3000)
+ .get(".select2-container > .select2-dropdown > .select2-results > ul > li")
+ .last()
+ .click();
+ cy.get(".field-location > :nth-child(1) > .related-widget-wrapper > .select2")
+ .click()
+ .wait(3000)
+ .get(
+ ".select2-container > .select2-dropdown > .select2-results > ul:first-child"
+ )
+ .click();
+ cy.contains("Save").click();
+ cy.get(".success").should("exist");
+});
+
+it("Creates meeting:complete", () => {
+ cy.visit("/dj-admin");
+ cy.get("#id_username").type("gregoriofs+admin@uchicago.edu");
+ cy.get("#id_password").type("admin");
+ cy.contains("Log in").click();
+ cy.get("#user-tools > strong").should("have.text", "Ali");
+
+ cy.get(".model-meeting > :nth-child(2) > .addlink").click();
+ cy.get(
+ ".field-meeting_type > :nth-child(1) > .related-widget-wrapper > .select2"
+ )
+ .click()
+ .wait(3000)
+ .get(".select2-container > .select2-dropdown > .select2-results > ul > li")
+ .last()
+ .click();
+ cy.get("#id_additional_info").type(additional_info);
+ cy.get("#id_start_date_0").type(start_date);
+ cy.get("#id_start_date_1").type(start_time.substring(0,start_time.length-3));
+ cy.get("#id_end_date_0").type(end_date);
+ cy.get("#id_end_date_1").type(end_time.substring(0,start_time.length-3));
+ cy.get(".field-location > :nth-child(1) > .related-widget-wrapper > .select2")
+ .click()
+ .wait(3000)
+ .get(
+ ".select2-container > .select2-dropdown > .select2-results > ul:first-child"
+ )
+ .click();
+ cy.get("#id_external_enrollment_url").type(ext_enroll);
+ cy.get(".field-is_public > .checkbox-row > .vCheckboxLabel").click();
+ cy.get("#id_is_public").check();
+ cy.get(".field-is_active > .checkbox-row > .vCheckboxLabel").click();
+ cy.get("#id_is_active").check();
+ cy.get('#id_announced_date_0').type(announced_date);
+ cy.get('#id_announced_date_1').type(announced_time.substring(0,start_time.length-3))
+ cy.contains("Save").click();
+
+ cy.get(".success").should("exist");
+});
diff --git a/test/cypress/integration/we-all-code/order-creation.spec.js b/test/cypress/integration/we-all-code/order-creation.spec.js
new file mode 100644
index 00000000..372b2e7f
--- /dev/null
+++ b/test/cypress/integration/we-all-code/order-creation.spec.js
@@ -0,0 +1,162 @@
+import faker from "faker";
+
+const datetime = faker.date.between("2021-01-01", "2023-12-31");
+const date = datetime.toLocaleDateString();
+const time = datetime.toLocaleTimeString();
+
+describe("Creates order for a session: required fields", () => {
+ beforeEach(() => {
+ cy.visit("/dj-admin");
+ cy.get("#id_username").type("gregoriofs+admin@uchicago.edu");
+ cy.get("#id_password").type("admin");
+ cy.contains("Log in").click();
+ cy.get("#user-tools > strong").should("have.text", "Ali");
+ });
+
+ it("Creates Student Order", () => {
+ cy.get(".model-order > :nth-child(2) > .addlink").click();
+
+ cy.get(
+ ".field-guardian > :nth-child(1) > .related-widget-wrapper > .select2"
+ )
+ .click()
+ .wait(5000)
+ .get(
+ ".select2-container > .select2-dropdown > .select2-results > ul > li"
+ )
+ .last()
+ .click();
+ cy.get(".breadcrumbs").click();
+ cy.get(
+ ".field-session > :nth-child(1) > .related-widget-wrapper > .select2"
+ )
+ .click()
+ .wait(5000)
+ .get(
+ ".select2-container > .select2-dropdown > .select2-results > ul:first-child"
+ )
+ .click();
+ cy.get(
+ ".field-student > :nth-child(1) > .related-widget-wrapper > .select2"
+ )
+ .click()
+ .wait(5000)
+ .get(
+ ".select2-container > .select2-dropdown > .select2-results > ul > li"
+ )
+ .last()
+ .click();
+ cy.get('.submit-row > input[name="_save"]').click();
+ cy.get(".success").should("exist");
+ });
+
+ it("Creates Mentor Order", () => {
+ cy.get(".model-mentororder > :nth-child(2) > .addlink").click();
+ cy.get(".field-mentor > :nth-child(1) > .related-widget-wrapper > .select2")
+ .click()
+ .wait(5000)
+ .get(
+ ".select2-container > .select2-dropdown > .select2-results > ul:first-child"
+ )
+ .click();
+ cy.get(".breadcrumbs").click();
+ cy.get(
+ ".field-session > :nth-child(1) > .related-widget-wrapper > .select2"
+ )
+ .click()
+ .wait(5000)
+ .get(
+ ".select2-container > .select2-dropdown > .select2-results > ul:first-child"
+ )
+ .click();
+ cy.get(".default").click();
+ cy.get(".success").should("exist");
+ });
+});
+
+describe("Creates orders for a session: complete", () => {
+ beforeEach(() => {
+ cy.visit("/dj-admin");
+ cy.get("#id_username").type("gregoriofs+admin@uchicago.edu");
+ cy.get("#id_password").type("admin");
+ cy.contains("Log in").click();
+ cy.get("#user-tools > strong").should("have.text", "Ali");
+ });
+
+ it("Creates Student Order", () => {
+ cy.get(".model-order > :nth-child(2) > .addlink").click();
+
+ cy.get(
+ ".field-guardian > :nth-child(1) > .related-widget-wrapper > .select2"
+ )
+ .click()
+ .wait(5000)
+ .get(
+ ".select2-container > .select2-dropdown > .select2-results > ul > li"
+ )
+ .last()
+ .click();
+ cy.get(".breadcrumbs").click();
+ cy.get(
+ ".field-session > :nth-child(1) > .related-widget-wrapper > .select2"
+ )
+ .click()
+ .wait(5000)
+ .get(
+ ".select2-container > .select2-dropdown > .select2-results > ul:first-child"
+ )
+ .click();
+ cy.get(
+ ".field-student > :nth-child(1) > .related-widget-wrapper > .select2"
+ )
+ .click()
+ .wait(5000)
+ .get(
+ ".select2-container > .select2-dropdown > .select2-results > ul > li"
+ )
+ .last()
+ .click();
+ cy.get('#id_ip').type("192.0.2.1");
+ cy.get(".vDateField").type(date);
+ cy.get(".vTimeField").type(time.substring(0, time.length - 3));
+ cy.get('#id_alternate_guardian').type('None');
+ cy.get("#id_affiliate").type("Affiliate");
+ cy.get("#id_order_number").type(`${Math.random() * 100}`);
+ cy.get("#id_week_reminder_sent").click();
+ cy.get("#id_day_reminder_sent").click();
+
+ cy.get('.submit-row > input[name="_save"]').click();
+
+ cy.get(".success").should("exist");
+ });
+
+ it("Creates Mentor Order", () => {
+ cy.get(".model-mentororder > :nth-child(2) > .addlink").click();
+ cy.get(".field-mentor > :nth-child(1) > .related-widget-wrapper > .select2")
+ .click()
+ .wait(5000)
+ .get(
+ ".select2-container > .select2-dropdown > .select2-results > ul:first-child"
+ )
+ .click();
+ cy.get(".breadcrumbs").click();
+ cy.get(
+ ".field-session > :nth-child(1) > .related-widget-wrapper > .select2"
+ )
+ .click()
+ .wait(5000)
+ .get(
+ ".select2-container > .select2-dropdown > .select2-results > ul:first-child"
+ )
+ .click();
+ cy.get(".vDateField").type(date);
+ cy.get(".vTimeField").type(time.substring(0, time.length - 3));
+ cy.get("#id_affiliate").type("Affiliate");
+ cy.get("#id_order_number").type(`${Math.floor(Math.random() * 100)}`);
+ cy.get("#id_week_reminder_sent").click();
+ cy.get("#id_day_reminder_sent").click();
+ cy.get(".default").click();
+
+ cy.get(".success").should("exist");
+ });
+});
diff --git a/test/cypress/integration/we-all-code/session-creation.spec.js b/test/cypress/integration/we-all-code/session-creation.spec.js
new file mode 100644
index 00000000..b2577ff5
--- /dev/null
+++ b/test/cypress/integration/we-all-code/session-creation.spec.js
@@ -0,0 +1,97 @@
+import faker from "faker";
+
+import { format } from "date-fns";
+
+
+const location = faker.datatype.number({ min: 1, max: 3 });
+const start_datetime = faker.date.between("2021-01-01","2023-12-31")
+const course = faker.datatype.number({min: 20, max: 21})
+const date = start_datetime.toLocaleDateString();
+const time = start_datetime.toLocaleTimeString();
+
+const capacity = faker.datatype.number({ min: 10, max: 50 });
+const mentor_cap = faker.datatype.number({ min: 5, max: 25 });
+const min_cost = faker.datatype.number(1000)
+const max_cost = faker.datatype.number({min: min_cost, max: min_cost+1000})
+const cost = faker.datatype.number({min:min_cost, max:max_cost})
+
+const link = "zoom.example"
+const id = faker.datatype.number({min:10000, max:99999})
+const password = "weallcode"
+
+describe("Creates sessions for a course: required fields", () => {
+ it("Logs in", () => {
+ cy.visit("/dj-admin");
+ cy.get("#id_username").type("gregoriofs+admin@uchicago.edu");
+ cy.get("#id_password").type("admin");
+ cy.contains("Log in").click();
+ cy.get("#user-tools > strong").should("have.text", "Ali");
+ });
+
+ it("Creates Session: required fields", () => {
+ cy.visit("/dj-admin");
+ cy.get("#id_username").type("gregoriofs+admin@uchicago.edu");
+ cy.get("#id_password").type("admin");
+ cy.contains("Log in").click();
+
+
+ cy.get(".model-session > :nth-child(2) > .addlink").click();
+ cy.get("#id_course").select(`${course}`);
+ cy.get("#id_location").select(`${location}`);
+ cy.get("#id_start_date_0").clear();
+ cy.get("#id_start_date_0").type(date);
+ cy.get("#id_start_date_1").clear();
+ cy.get("#id_start_date_1").type(time.substring(0, time.length - 3));
+ cy.get("#id_capacity").clear();
+ cy.get("#id_capacity").type(capacity);
+ cy.get("#id_mentor_capacity").clear();
+ cy.get("#id_mentor_capacity").type(mentor_cap);
+ cy.get("#id_instructor").select("1");
+
+ cy.get(".default").click();
+ cy.get('.success').click();
+ });
+});
+
+describe("Creates sessions for a course: complete", () => {
+ it("Logs in", () => {
+ cy.visit("/dj-admin");
+ cy.get("#id_username").type("gregoriofs+admin@uchicago.edu");
+ cy.get("#id_password").type("admin");
+ cy.contains("Log in").click();
+ cy.get("#user-tools > strong").should("have.text", "Ali");
+ });
+
+ it("Creates Session", () => {
+ cy.visit("/dj-admin");
+ cy.get("#id_username").type("gregoriofs+admin@uchicago.edu");
+ cy.get("#id_password").type("admin");
+ cy.contains("Log in").click();
+
+ cy.get(".model-session > :nth-child(2) > .addlink").click();
+ cy.get("#id_course").select(`${course}`);
+ cy.get("#id_location").select(`${location}`);
+ cy.get("#id_start_date_0").clear();
+ cy.get("#id_start_date_0").type(date);
+ cy.get("#id_start_date_1").clear();
+ cy.get("#id_start_date_1").type(time.substring(0, time.length - 3));
+ cy.get("#id_capacity").clear();
+ cy.get("#id_capacity").type(capacity);
+ cy.get("#id_mentor_capacity").clear();
+ cy.get("#id_mentor_capacity").type(mentor_cap);
+ cy.get("#id_instructor").select("1");
+ cy.get("#id_assistant_from").select(["94"]);
+ cy.get("#id_assistant_add_link").click();
+ cy.get("#id_is_active").check();
+ cy.get("#id_is_public").check();
+ cy.get('#id_online_video_link').type(link);
+ cy.get('#id_online_video_meeting_id').type(id);
+ cy.get('#id_online_video_meeting_password').type(password);
+ cy.get('#id_cost').type(cost);
+ cy.get('#id_minimum_cost').type(min_cost);
+ cy.get('#id_maximum_cost').type(max_cost);
+ cy.get(".default").click();
+ cy.get('.success').click();
+
+ });
+});
\ No newline at end of file
diff --git a/test/package-lock.json b/test/package-lock.json
index c6b27da1..7689cbbc 100644
--- a/test/package-lock.json
+++ b/test/package-lock.json
@@ -8,7 +8,8 @@
"version": "1.0.0",
"license": "MIT",
"devDependencies": {
- "cypress": "^7.7.0",
+ "cypress": "^8.0.0",
+ "date-fns": "^2.23.0",
"faker": "^5.5.3"
}
},
@@ -498,9 +499,9 @@
}
},
"node_modules/cypress": {
- "version": "7.7.0",
- "resolved": "https://registry.npmjs.org/cypress/-/cypress-7.7.0.tgz",
- "integrity": "sha512-uYBYXNoI5ym0UxROwhQXWTi8JbUEjpC6l/bzoGZNxoKGsLrC1SDPgIDJMgLX/MeEdPL0UInXLDUWN/rSyZUCjQ==",
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/cypress/-/cypress-8.0.0.tgz",
+ "integrity": "sha512-Hhbc7FtbeCSg5Ui2zxXQLynk7IYGIygG8NqTauS4EtCWyp2k6s4g8P4KUZXwRbhuryN/+/dCd1kPtFbhBx8MuQ==",
"dev": true,
"hasInstallScript": true,
"dependencies": {
@@ -565,6 +566,19 @@
"node": ">=0.10"
}
},
+ "node_modules/date-fns": {
+ "version": "2.23.0",
+ "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.23.0.tgz",
+ "integrity": "sha512-5ycpauovVyAk0kXNZz6ZoB9AYMZB4DObse7P3BPWmyEjXNORTI8EJ6X0uaSAq4sCHzM1uajzrkr6HnsLQpxGXA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.11"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/date-fns"
+ }
+ },
"node_modules/dayjs": {
"version": "1.10.6",
"resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.10.6.tgz",
@@ -2212,9 +2226,9 @@
}
},
"cypress": {
- "version": "7.7.0",
- "resolved": "https://registry.npmjs.org/cypress/-/cypress-7.7.0.tgz",
- "integrity": "sha512-uYBYXNoI5ym0UxROwhQXWTi8JbUEjpC6l/bzoGZNxoKGsLrC1SDPgIDJMgLX/MeEdPL0UInXLDUWN/rSyZUCjQ==",
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/cypress/-/cypress-8.0.0.tgz",
+ "integrity": "sha512-Hhbc7FtbeCSg5Ui2zxXQLynk7IYGIygG8NqTauS4EtCWyp2k6s4g8P4KUZXwRbhuryN/+/dCd1kPtFbhBx8MuQ==",
"dev": true,
"requires": {
"@cypress/request": "^2.88.5",
@@ -2269,6 +2283,12 @@
"assert-plus": "^1.0.0"
}
},
+ "date-fns": {
+ "version": "2.23.0",
+ "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.23.0.tgz",
+ "integrity": "sha512-5ycpauovVyAk0kXNZz6ZoB9AYMZB4DObse7P3BPWmyEjXNORTI8EJ6X0uaSAq4sCHzM1uajzrkr6HnsLQpxGXA==",
+ "dev": true
+ },
"dayjs": {
"version": "1.10.6",
"resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.10.6.tgz",
diff --git a/test/package.json b/test/package.json
index 4269ea18..0475b9c8 100644
--- a/test/package.json
+++ b/test/package.json
@@ -11,7 +11,8 @@
"author": "Ali Karbassi ",
"license": "MIT",
"devDependencies": {
- "cypress": "^7.7.0",
+ "cypress": "^8.0.0",
+ "date-fns": "^2.23.0",
"faker": "^5.5.3"
}
}
diff --git a/test/yarn.lock b/test/yarn.lock
index 90d333d5..8ce30bf5 100644
--- a/test/yarn.lock
+++ b/test/yarn.lock
@@ -3,1146 +3,1151 @@
"@cypress/request@^2.88.5":
- version "2.88.5"
- resolved "https://registry.npmjs.org/@cypress/request/-/request-2.88.5.tgz"
- integrity sha512-TzEC1XMi1hJkywWpRfD2clreTa/Z+lOrXDCxxBTBPEcY5azdPi56A6Xw+O4tWJnaJH3iIE7G5aDXZC6JgRZLcA==
- dependencies:
- aws-sign2 "~0.7.0"
- aws4 "^1.8.0"
- caseless "~0.12.0"
- combined-stream "~1.0.6"
- extend "~3.0.2"
- forever-agent "~0.6.1"
- form-data "~2.3.2"
- har-validator "~5.1.3"
- http-signature "~1.2.0"
- is-typedarray "~1.0.0"
- isstream "~0.1.2"
- json-stringify-safe "~5.0.1"
- mime-types "~2.1.19"
- oauth-sign "~0.9.0"
- performance-now "^2.1.0"
- qs "~6.5.2"
- safe-buffer "^5.1.2"
- tough-cookie "~2.5.0"
- tunnel-agent "^0.6.0"
- uuid "^3.3.2"
+ "integrity" "sha512-TzEC1XMi1hJkywWpRfD2clreTa/Z+lOrXDCxxBTBPEcY5azdPi56A6Xw+O4tWJnaJH3iIE7G5aDXZC6JgRZLcA=="
+ "resolved" "https://registry.npmjs.org/@cypress/request/-/request-2.88.5.tgz"
+ "version" "2.88.5"
+ dependencies:
+ "aws-sign2" "~0.7.0"
+ "aws4" "^1.8.0"
+ "caseless" "~0.12.0"
+ "combined-stream" "~1.0.6"
+ "extend" "~3.0.2"
+ "forever-agent" "~0.6.1"
+ "form-data" "~2.3.2"
+ "har-validator" "~5.1.3"
+ "http-signature" "~1.2.0"
+ "is-typedarray" "~1.0.0"
+ "isstream" "~0.1.2"
+ "json-stringify-safe" "~5.0.1"
+ "mime-types" "~2.1.19"
+ "oauth-sign" "~0.9.0"
+ "performance-now" "^2.1.0"
+ "qs" "~6.5.2"
+ "safe-buffer" "^5.1.2"
+ "tough-cookie" "~2.5.0"
+ "tunnel-agent" "^0.6.0"
+ "uuid" "^3.3.2"
"@cypress/xvfb@^1.2.4":
- version "1.2.4"
- resolved "https://registry.npmjs.org/@cypress/xvfb/-/xvfb-1.2.4.tgz"
- integrity sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q==
+ "integrity" "sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q=="
+ "resolved" "https://registry.npmjs.org/@cypress/xvfb/-/xvfb-1.2.4.tgz"
+ "version" "1.2.4"
dependencies:
- debug "^3.1.0"
- lodash.once "^4.1.1"
+ "debug" "^3.1.0"
+ "lodash.once" "^4.1.1"
"@types/node@*", "@types/node@^14.14.31":
- version "14.17.5"
- resolved "https://registry.npmjs.org/@types/node/-/node-14.17.5.tgz"
- integrity sha512-bjqH2cX/O33jXT/UmReo2pM7DIJREPMnarixbQ57DOOzzFaI6D2+IcwaJQaJpv0M1E9TIhPCYVxrkcityLjlqA==
+ "integrity" "sha512-bjqH2cX/O33jXT/UmReo2pM7DIJREPMnarixbQ57DOOzzFaI6D2+IcwaJQaJpv0M1E9TIhPCYVxrkcityLjlqA=="
+ "resolved" "https://registry.npmjs.org/@types/node/-/node-14.17.5.tgz"
+ "version" "14.17.5"
"@types/sinonjs__fake-timers@^6.0.2":
- version "6.0.3"
- resolved "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-6.0.3.tgz"
- integrity sha512-E1dU4fzC9wN2QK2Cr1MLCfyHM8BoNnRFvuf45LYMPNDA+WqbNzC45S4UzPxvp1fFJ1rvSGU0bPvdd35VLmXG8g==
+ "integrity" "sha512-E1dU4fzC9wN2QK2Cr1MLCfyHM8BoNnRFvuf45LYMPNDA+WqbNzC45S4UzPxvp1fFJ1rvSGU0bPvdd35VLmXG8g=="
+ "resolved" "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-6.0.3.tgz"
+ "version" "6.0.3"
"@types/sizzle@^2.3.2":
- version "2.3.3"
- resolved "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.3.tgz"
- integrity sha512-JYM8x9EGF163bEyhdJBpR2QX1R5naCJHC8ucJylJ3w9/CVBaskdQ8WqBf8MmQrd1kRvp/a4TS8HJ+bxzR7ZJYQ==
+ "integrity" "sha512-JYM8x9EGF163bEyhdJBpR2QX1R5naCJHC8ucJylJ3w9/CVBaskdQ8WqBf8MmQrd1kRvp/a4TS8HJ+bxzR7ZJYQ=="
+ "resolved" "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.3.tgz"
+ "version" "2.3.3"
"@types/yauzl@^2.9.1":
- version "2.9.2"
- resolved "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.9.2.tgz"
- integrity sha512-8uALY5LTvSuHgloDVUvWP3pIauILm+8/0pDMokuDYIoNsOkSwd5AiHBTSEJjKTDcZr5z8UpgOWZkxBF4iJftoA==
+ "integrity" "sha512-8uALY5LTvSuHgloDVUvWP3pIauILm+8/0pDMokuDYIoNsOkSwd5AiHBTSEJjKTDcZr5z8UpgOWZkxBF4iJftoA=="
+ "resolved" "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.9.2.tgz"
+ "version" "2.9.2"
dependencies:
"@types/node" "*"
-aggregate-error@^3.0.0:
- version "3.1.0"
- resolved "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz"
- integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==
- dependencies:
- clean-stack "^2.0.0"
- indent-string "^4.0.0"
-
-ajv@^6.12.3:
- version "6.12.6"
- resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz"
- integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==
- dependencies:
- fast-deep-equal "^3.1.1"
- fast-json-stable-stringify "^2.0.0"
- json-schema-traverse "^0.4.1"
- uri-js "^4.2.2"
-
-ansi-colors@^4.1.1:
- version "4.1.1"
- resolved "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz"
- integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==
-
-ansi-escapes@^4.3.0:
- version "4.3.2"
- resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz"
- integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==
- dependencies:
- type-fest "^0.21.3"
-
-ansi-regex@^5.0.0:
- version "5.0.0"
- resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz"
- integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==
-
-ansi-styles@^4.0.0, ansi-styles@^4.1.0:
- version "4.3.0"
- resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz"
- integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==
- dependencies:
- color-convert "^2.0.1"
-
-arch@^2.2.0:
- version "2.2.0"
- resolved "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz"
- integrity sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==
-
-asn1@~0.2.3:
- version "0.2.4"
- resolved "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz"
- integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==
- dependencies:
- safer-buffer "~2.1.0"
-
-assert-plus@1.0.0, assert-plus@^1.0.0:
- version "1.0.0"
- resolved "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz"
- integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=
-
-astral-regex@^2.0.0:
- version "2.0.0"
- resolved "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz"
- integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==
-
-async@^3.2.0:
- version "3.2.0"
- resolved "https://registry.npmjs.org/async/-/async-3.2.0.tgz"
- integrity sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==
-
-asynckit@^0.4.0:
- version "0.4.0"
- resolved "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz"
- integrity sha1-x57Zf380y48robyXkLzDZkdLS3k=
-
-at-least-node@^1.0.0:
- version "1.0.0"
- resolved "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz"
- integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==
-
-aws-sign2@~0.7.0:
- version "0.7.0"
- resolved "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz"
- integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=
-
-aws4@^1.8.0:
- version "1.11.0"
- resolved "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz"
- integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==
-
-balanced-match@^1.0.0:
- version "1.0.2"
- resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz"
- integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==
-
-bcrypt-pbkdf@^1.0.0:
- version "1.0.2"
- resolved "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz"
- integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=
- dependencies:
- tweetnacl "^0.14.3"
-
-blob-util@^2.0.2:
- version "2.0.2"
- resolved "https://registry.npmjs.org/blob-util/-/blob-util-2.0.2.tgz"
- integrity sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ==
-
-bluebird@^3.7.2:
- version "3.7.2"
- resolved "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz"
- integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==
-
-brace-expansion@^1.1.7:
- version "1.1.11"
- resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz"
- integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==
- dependencies:
- balanced-match "^1.0.0"
- concat-map "0.0.1"
-
-buffer-crc32@~0.2.3:
- version "0.2.13"
- resolved "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz"
- integrity sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=
-
-cachedir@^2.3.0:
- version "2.3.0"
- resolved "https://registry.npmjs.org/cachedir/-/cachedir-2.3.0.tgz"
- integrity sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw==
-
-caseless@~0.12.0:
- version "0.12.0"
- resolved "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz"
- integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=
-
-chalk@^4.1.0:
- version "4.1.1"
- resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz"
- integrity sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==
- dependencies:
- ansi-styles "^4.1.0"
- supports-color "^7.1.0"
-
-check-more-types@^2.24.0:
- version "2.24.0"
- resolved "https://registry.npmjs.org/check-more-types/-/check-more-types-2.24.0.tgz"
- integrity sha1-FCD/sQ/URNz8ebQ4kbv//TKoRgA=
-
-ci-info@^3.1.1:
- version "3.2.0"
- resolved "https://registry.npmjs.org/ci-info/-/ci-info-3.2.0.tgz"
- integrity sha512-dVqRX7fLUm8J6FgHJ418XuIgDLZDkYcDFTeL6TA2gt5WlIZUQrrH6EZrNClwT/H0FateUsZkGIOPRrLbP+PR9A==
-
-clean-stack@^2.0.0:
- version "2.2.0"
- resolved "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz"
- integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==
-
-cli-cursor@^3.1.0:
- version "3.1.0"
- resolved "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz"
- integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==
- dependencies:
- restore-cursor "^3.1.0"
-
-cli-table3@~0.6.0:
- version "0.6.0"
- resolved "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.0.tgz"
- integrity sha512-gnB85c3MGC7Nm9I/FkiasNBOKjOiO1RNuXXarQms37q4QMpWdlbBgD/VnOStA2faG1dpXMv31RFApjX1/QdgWQ==
- dependencies:
- object-assign "^4.1.0"
- string-width "^4.2.0"
+"aggregate-error@^3.0.0":
+ "integrity" "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA=="
+ "resolved" "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz"
+ "version" "3.1.0"
+ dependencies:
+ "clean-stack" "^2.0.0"
+ "indent-string" "^4.0.0"
+
+"ajv@^6.12.3":
+ "integrity" "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g=="
+ "resolved" "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz"
+ "version" "6.12.6"
+ dependencies:
+ "fast-deep-equal" "^3.1.1"
+ "fast-json-stable-stringify" "^2.0.0"
+ "json-schema-traverse" "^0.4.1"
+ "uri-js" "^4.2.2"
+
+"ansi-colors@^4.1.1":
+ "integrity" "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA=="
+ "resolved" "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz"
+ "version" "4.1.1"
+
+"ansi-escapes@^4.3.0":
+ "integrity" "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ=="
+ "resolved" "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz"
+ "version" "4.3.2"
+ dependencies:
+ "type-fest" "^0.21.3"
+
+"ansi-regex@^5.0.0":
+ "integrity" "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg=="
+ "resolved" "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz"
+ "version" "5.0.0"
+
+"ansi-styles@^4.0.0", "ansi-styles@^4.1.0":
+ "integrity" "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="
+ "resolved" "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz"
+ "version" "4.3.0"
+ dependencies:
+ "color-convert" "^2.0.1"
+
+"arch@^2.2.0":
+ "integrity" "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ=="
+ "resolved" "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz"
+ "version" "2.2.0"
+
+"asn1@~0.2.3":
+ "integrity" "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg=="
+ "resolved" "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz"
+ "version" "0.2.4"
+ dependencies:
+ "safer-buffer" "~2.1.0"
+
+"assert-plus@^1.0.0", "assert-plus@1.0.0":
+ "integrity" "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU="
+ "resolved" "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz"
+ "version" "1.0.0"
+
+"astral-regex@^2.0.0":
+ "integrity" "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ=="
+ "resolved" "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz"
+ "version" "2.0.0"
+
+"async@^3.2.0":
+ "integrity" "sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw=="
+ "resolved" "https://registry.npmjs.org/async/-/async-3.2.0.tgz"
+ "version" "3.2.0"
+
+"asynckit@^0.4.0":
+ "integrity" "sha1-x57Zf380y48robyXkLzDZkdLS3k="
+ "resolved" "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz"
+ "version" "0.4.0"
+
+"at-least-node@^1.0.0":
+ "integrity" "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg=="
+ "resolved" "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz"
+ "version" "1.0.0"
+
+"aws-sign2@~0.7.0":
+ "integrity" "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg="
+ "resolved" "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz"
+ "version" "0.7.0"
+
+"aws4@^1.8.0":
+ "integrity" "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA=="
+ "resolved" "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz"
+ "version" "1.11.0"
+
+"balanced-match@^1.0.0":
+ "integrity" "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
+ "resolved" "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz"
+ "version" "1.0.2"
+
+"bcrypt-pbkdf@^1.0.0":
+ "integrity" "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4="
+ "resolved" "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz"
+ "version" "1.0.2"
+ dependencies:
+ "tweetnacl" "^0.14.3"
+
+"blob-util@^2.0.2":
+ "integrity" "sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ=="
+ "resolved" "https://registry.npmjs.org/blob-util/-/blob-util-2.0.2.tgz"
+ "version" "2.0.2"
+
+"bluebird@^3.7.2":
+ "integrity" "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg=="
+ "resolved" "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz"
+ "version" "3.7.2"
+
+"brace-expansion@^1.1.7":
+ "integrity" "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA=="
+ "resolved" "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz"
+ "version" "1.1.11"
+ dependencies:
+ "balanced-match" "^1.0.0"
+ "concat-map" "0.0.1"
+
+"buffer-crc32@~0.2.3":
+ "integrity" "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI="
+ "resolved" "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz"
+ "version" "0.2.13"
+
+"cachedir@^2.3.0":
+ "integrity" "sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw=="
+ "resolved" "https://registry.npmjs.org/cachedir/-/cachedir-2.3.0.tgz"
+ "version" "2.3.0"
+
+"caseless@~0.12.0":
+ "integrity" "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw="
+ "resolved" "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz"
+ "version" "0.12.0"
+
+"chalk@^4.1.0":
+ "integrity" "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg=="
+ "resolved" "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz"
+ "version" "4.1.1"
+ dependencies:
+ "ansi-styles" "^4.1.0"
+ "supports-color" "^7.1.0"
+
+"check-more-types@^2.24.0":
+ "integrity" "sha1-FCD/sQ/URNz8ebQ4kbv//TKoRgA="
+ "resolved" "https://registry.npmjs.org/check-more-types/-/check-more-types-2.24.0.tgz"
+ "version" "2.24.0"
+
+"ci-info@^3.1.1":
+ "integrity" "sha512-dVqRX7fLUm8J6FgHJ418XuIgDLZDkYcDFTeL6TA2gt5WlIZUQrrH6EZrNClwT/H0FateUsZkGIOPRrLbP+PR9A=="
+ "resolved" "https://registry.npmjs.org/ci-info/-/ci-info-3.2.0.tgz"
+ "version" "3.2.0"
+
+"clean-stack@^2.0.0":
+ "integrity" "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A=="
+ "resolved" "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz"
+ "version" "2.2.0"
+
+"cli-cursor@^3.1.0":
+ "integrity" "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw=="
+ "resolved" "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz"
+ "version" "3.1.0"
+ dependencies:
+ "restore-cursor" "^3.1.0"
+
+"cli-table3@~0.6.0":
+ "integrity" "sha512-gnB85c3MGC7Nm9I/FkiasNBOKjOiO1RNuXXarQms37q4QMpWdlbBgD/VnOStA2faG1dpXMv31RFApjX1/QdgWQ=="
+ "resolved" "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.0.tgz"
+ "version" "0.6.0"
+ dependencies:
+ "object-assign" "^4.1.0"
+ "string-width" "^4.2.0"
optionalDependencies:
- colors "^1.1.2"
-
-cli-truncate@^2.1.0:
- version "2.1.0"
- resolved "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz"
- integrity sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==
- dependencies:
- slice-ansi "^3.0.0"
- string-width "^4.2.0"
-
-color-convert@^2.0.1:
- version "2.0.1"
- resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz"
- integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==
- dependencies:
- color-name "~1.1.4"
-
-color-name@~1.1.4:
- version "1.1.4"
- resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz"
- integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
-
-colorette@^1.2.2:
- version "1.2.2"
- resolved "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz"
- integrity sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==
-
-colors@^1.1.2:
- version "1.4.0"
- resolved "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz"
- integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==
-
-combined-stream@^1.0.6, combined-stream@~1.0.6:
- version "1.0.8"
- resolved "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz"
- integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==
- dependencies:
- delayed-stream "~1.0.0"
-
-commander@^5.1.0:
- version "5.1.0"
- resolved "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz"
- integrity sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==
-
-common-tags@^1.8.0:
- version "1.8.0"
- resolved "https://registry.npmjs.org/common-tags/-/common-tags-1.8.0.tgz"
- integrity sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw==
-
-concat-map@0.0.1:
- version "0.0.1"
- resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz"
- integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=
-
-core-util-is@1.0.2:
- version "1.0.2"
- resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz"
- integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=
-
-cross-spawn@^7.0.0:
- version "7.0.3"
- resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz"
- integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==
- dependencies:
- path-key "^3.1.0"
- shebang-command "^2.0.0"
- which "^2.0.1"
-
-cypress@^7.7.0:
- version "7.7.0"
- resolved "https://registry.npmjs.org/cypress/-/cypress-7.7.0.tgz"
- integrity sha512-uYBYXNoI5ym0UxROwhQXWTi8JbUEjpC6l/bzoGZNxoKGsLrC1SDPgIDJMgLX/MeEdPL0UInXLDUWN/rSyZUCjQ==
+ "colors" "^1.1.2"
+
+"cli-truncate@^2.1.0":
+ "integrity" "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg=="
+ "resolved" "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz"
+ "version" "2.1.0"
+ dependencies:
+ "slice-ansi" "^3.0.0"
+ "string-width" "^4.2.0"
+
+"color-convert@^2.0.1":
+ "integrity" "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="
+ "resolved" "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz"
+ "version" "2.0.1"
+ dependencies:
+ "color-name" "~1.1.4"
+
+"color-name@~1.1.4":
+ "integrity" "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+ "resolved" "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz"
+ "version" "1.1.4"
+
+"colorette@^1.2.2":
+ "integrity" "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w=="
+ "resolved" "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz"
+ "version" "1.2.2"
+
+"colors@^1.1.2":
+ "integrity" "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA=="
+ "resolved" "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz"
+ "version" "1.4.0"
+
+"combined-stream@^1.0.6", "combined-stream@~1.0.6":
+ "integrity" "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg=="
+ "resolved" "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz"
+ "version" "1.0.8"
+ dependencies:
+ "delayed-stream" "~1.0.0"
+
+"commander@^5.1.0":
+ "integrity" "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg=="
+ "resolved" "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz"
+ "version" "5.1.0"
+
+"common-tags@^1.8.0":
+ "integrity" "sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw=="
+ "resolved" "https://registry.npmjs.org/common-tags/-/common-tags-1.8.0.tgz"
+ "version" "1.8.0"
+
+"concat-map@0.0.1":
+ "integrity" "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
+ "resolved" "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz"
+ "version" "0.0.1"
+
+"core-util-is@1.0.2":
+ "integrity" "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
+ "resolved" "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz"
+ "version" "1.0.2"
+
+"cross-spawn@^7.0.0":
+ "integrity" "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w=="
+ "resolved" "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz"
+ "version" "7.0.3"
+ dependencies:
+ "path-key" "^3.1.0"
+ "shebang-command" "^2.0.0"
+ "which" "^2.0.1"
+
+"cypress@^8.0.0":
+ "integrity" "sha512-Hhbc7FtbeCSg5Ui2zxXQLynk7IYGIygG8NqTauS4EtCWyp2k6s4g8P4KUZXwRbhuryN/+/dCd1kPtFbhBx8MuQ=="
+ "resolved" "https://registry.npmjs.org/cypress/-/cypress-8.0.0.tgz"
+ "version" "8.0.0"
dependencies:
"@cypress/request" "^2.88.5"
"@cypress/xvfb" "^1.2.4"
"@types/node" "^14.14.31"
"@types/sinonjs__fake-timers" "^6.0.2"
"@types/sizzle" "^2.3.2"
- arch "^2.2.0"
- blob-util "^2.0.2"
- bluebird "^3.7.2"
- cachedir "^2.3.0"
- chalk "^4.1.0"
- check-more-types "^2.24.0"
- cli-cursor "^3.1.0"
- cli-table3 "~0.6.0"
- commander "^5.1.0"
- common-tags "^1.8.0"
- dayjs "^1.10.4"
- debug "^4.3.2"
- enquirer "^2.3.6"
- eventemitter2 "^6.4.3"
- execa "4.1.0"
- executable "^4.1.1"
- extract-zip "2.0.1"
- figures "^3.2.0"
- fs-extra "^9.1.0"
- getos "^3.2.1"
- is-ci "^3.0.0"
- is-installed-globally "~0.4.0"
- lazy-ass "^1.6.0"
- listr2 "^3.8.3"
- lodash "^4.17.21"
- log-symbols "^4.0.0"
- minimist "^1.2.5"
- ospath "^1.2.2"
- pretty-bytes "^5.6.0"
- ramda "~0.27.1"
- request-progress "^3.0.0"
- supports-color "^8.1.1"
- tmp "~0.2.1"
- untildify "^4.0.0"
- url "^0.11.0"
- yauzl "^2.10.0"
-
-dashdash@^1.12.0:
- version "1.14.1"
- resolved "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz"
- integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=
- dependencies:
- assert-plus "^1.0.0"
-
-dayjs@^1.10.4:
- version "1.10.6"
- resolved "https://registry.npmjs.org/dayjs/-/dayjs-1.10.6.tgz"
- integrity sha512-AztC/IOW4L1Q41A86phW5Thhcrco3xuAA+YX/BLpLWWjRcTj5TOt/QImBLmCKlrF7u7k47arTnOyL6GnbG8Hvw==
-
-debug@^3.1.0:
- version "3.2.7"
- resolved "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz"
- integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==
- dependencies:
- ms "^2.1.1"
-
-debug@^4.1.1, debug@^4.3.2:
- version "4.3.2"
- resolved "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz"
- integrity sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==
- dependencies:
- ms "2.1.2"
-
-delayed-stream@~1.0.0:
- version "1.0.0"
- resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz"
- integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk=
-
-ecc-jsbn@~0.1.1:
- version "0.1.2"
- resolved "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz"
- integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=
- dependencies:
- jsbn "~0.1.0"
- safer-buffer "^2.1.0"
-
-emoji-regex@^8.0.0:
- version "8.0.0"
- resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz"
- integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==
-
-end-of-stream@^1.1.0:
- version "1.4.4"
- resolved "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz"
- integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==
- dependencies:
- once "^1.4.0"
-
-enquirer@^2.3.6:
- version "2.3.6"
- resolved "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz"
- integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==
- dependencies:
- ansi-colors "^4.1.1"
-
-escape-string-regexp@^1.0.5:
- version "1.0.5"
- resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz"
- integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=
-
-eventemitter2@^6.4.3:
- version "6.4.4"
- resolved "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.4.tgz"
- integrity sha512-HLU3NDY6wARrLCEwyGKRBvuWYyvW6mHYv72SJJAH3iJN3a6eVUvkjFkcxah1bcTgGVBBrFdIopBJPhCQFMLyXw==
-
-execa@4.1.0:
- version "4.1.0"
- resolved "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz"
- integrity sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==
- dependencies:
- cross-spawn "^7.0.0"
- get-stream "^5.0.0"
- human-signals "^1.1.1"
- is-stream "^2.0.0"
- merge-stream "^2.0.0"
- npm-run-path "^4.0.0"
- onetime "^5.1.0"
- signal-exit "^3.0.2"
- strip-final-newline "^2.0.0"
-
-executable@^4.1.1:
- version "4.1.1"
- resolved "https://registry.npmjs.org/executable/-/executable-4.1.1.tgz"
- integrity sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==
- dependencies:
- pify "^2.2.0"
-
-extend@~3.0.2:
- version "3.0.2"
- resolved "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz"
- integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==
-
-extract-zip@2.0.1:
- version "2.0.1"
- resolved "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz"
- integrity sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==
- dependencies:
- debug "^4.1.1"
- get-stream "^5.1.0"
- yauzl "^2.10.0"
+ "arch" "^2.2.0"
+ "blob-util" "^2.0.2"
+ "bluebird" "^3.7.2"
+ "cachedir" "^2.3.0"
+ "chalk" "^4.1.0"
+ "check-more-types" "^2.24.0"
+ "cli-cursor" "^3.1.0"
+ "cli-table3" "~0.6.0"
+ "commander" "^5.1.0"
+ "common-tags" "^1.8.0"
+ "dayjs" "^1.10.4"
+ "debug" "^4.3.2"
+ "enquirer" "^2.3.6"
+ "eventemitter2" "^6.4.3"
+ "execa" "4.1.0"
+ "executable" "^4.1.1"
+ "extract-zip" "2.0.1"
+ "figures" "^3.2.0"
+ "fs-extra" "^9.1.0"
+ "getos" "^3.2.1"
+ "is-ci" "^3.0.0"
+ "is-installed-globally" "~0.4.0"
+ "lazy-ass" "^1.6.0"
+ "listr2" "^3.8.3"
+ "lodash" "^4.17.21"
+ "log-symbols" "^4.0.0"
+ "minimist" "^1.2.5"
+ "ospath" "^1.2.2"
+ "pretty-bytes" "^5.6.0"
+ "ramda" "~0.27.1"
+ "request-progress" "^3.0.0"
+ "supports-color" "^8.1.1"
+ "tmp" "~0.2.1"
+ "untildify" "^4.0.0"
+ "url" "^0.11.0"
+ "yauzl" "^2.10.0"
+
+"dashdash@^1.12.0":
+ "integrity" "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA="
+ "resolved" "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz"
+ "version" "1.14.1"
+ dependencies:
+ "assert-plus" "^1.0.0"
+
+"date-fns@^2.23.0":
+ "integrity" "sha512-5ycpauovVyAk0kXNZz6ZoB9AYMZB4DObse7P3BPWmyEjXNORTI8EJ6X0uaSAq4sCHzM1uajzrkr6HnsLQpxGXA=="
+ "resolved" "https://registry.npmjs.org/date-fns/-/date-fns-2.23.0.tgz"
+ "version" "2.23.0"
+
+"dayjs@^1.10.4":
+ "integrity" "sha512-AztC/IOW4L1Q41A86phW5Thhcrco3xuAA+YX/BLpLWWjRcTj5TOt/QImBLmCKlrF7u7k47arTnOyL6GnbG8Hvw=="
+ "resolved" "https://registry.npmjs.org/dayjs/-/dayjs-1.10.6.tgz"
+ "version" "1.10.6"
+
+"debug@^3.1.0":
+ "integrity" "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="
+ "resolved" "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz"
+ "version" "3.2.7"
+ dependencies:
+ "ms" "^2.1.1"
+
+"debug@^4.1.1", "debug@^4.3.2":
+ "integrity" "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw=="
+ "resolved" "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz"
+ "version" "4.3.2"
+ dependencies:
+ "ms" "2.1.2"
+
+"delayed-stream@~1.0.0":
+ "integrity" "sha1-3zrhmayt+31ECqrgsp4icrJOxhk="
+ "resolved" "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz"
+ "version" "1.0.0"
+
+"ecc-jsbn@~0.1.1":
+ "integrity" "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk="
+ "resolved" "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz"
+ "version" "0.1.2"
+ dependencies:
+ "jsbn" "~0.1.0"
+ "safer-buffer" "^2.1.0"
+
+"emoji-regex@^8.0.0":
+ "integrity" "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
+ "resolved" "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz"
+ "version" "8.0.0"
+
+"end-of-stream@^1.1.0":
+ "integrity" "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q=="
+ "resolved" "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz"
+ "version" "1.4.4"
+ dependencies:
+ "once" "^1.4.0"
+
+"enquirer@^2.3.6", "enquirer@>= 2.3.0 < 3":
+ "integrity" "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg=="
+ "resolved" "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz"
+ "version" "2.3.6"
+ dependencies:
+ "ansi-colors" "^4.1.1"
+
+"escape-string-regexp@^1.0.5":
+ "integrity" "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
+ "resolved" "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz"
+ "version" "1.0.5"
+
+"eventemitter2@^6.4.3":
+ "integrity" "sha512-HLU3NDY6wARrLCEwyGKRBvuWYyvW6mHYv72SJJAH3iJN3a6eVUvkjFkcxah1bcTgGVBBrFdIopBJPhCQFMLyXw=="
+ "resolved" "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.4.tgz"
+ "version" "6.4.4"
+
+"execa@4.1.0":
+ "integrity" "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA=="
+ "resolved" "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz"
+ "version" "4.1.0"
+ dependencies:
+ "cross-spawn" "^7.0.0"
+ "get-stream" "^5.0.0"
+ "human-signals" "^1.1.1"
+ "is-stream" "^2.0.0"
+ "merge-stream" "^2.0.0"
+ "npm-run-path" "^4.0.0"
+ "onetime" "^5.1.0"
+ "signal-exit" "^3.0.2"
+ "strip-final-newline" "^2.0.0"
+
+"executable@^4.1.1":
+ "integrity" "sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg=="
+ "resolved" "https://registry.npmjs.org/executable/-/executable-4.1.1.tgz"
+ "version" "4.1.1"
+ dependencies:
+ "pify" "^2.2.0"
+
+"extend@~3.0.2":
+ "integrity" "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="
+ "resolved" "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz"
+ "version" "3.0.2"
+
+"extract-zip@2.0.1":
+ "integrity" "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg=="
+ "resolved" "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz"
+ "version" "2.0.1"
+ dependencies:
+ "debug" "^4.1.1"
+ "get-stream" "^5.1.0"
+ "yauzl" "^2.10.0"
optionalDependencies:
"@types/yauzl" "^2.9.1"
-extsprintf@1.3.0, extsprintf@^1.2.0:
- version "1.3.0"
- resolved "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz"
- integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=
-
-faker@^5.5.3:
- version "5.5.3"
- resolved "https://registry.npmjs.org/faker/-/faker-5.5.3.tgz"
- integrity sha512-wLTv2a28wjUyWkbnX7u/ABZBkUkIF2fCd73V6P2oFqEGEktDfzWx4UxrSqtPRw0xPRAcjeAOIiJWqZm3pP4u3g==
-
-fast-deep-equal@^3.1.1:
- version "3.1.3"
- resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz"
- integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==
-
-fast-json-stable-stringify@^2.0.0:
- version "2.1.0"
- resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz"
- integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==
-
-fd-slicer@~1.1.0:
- version "1.1.0"
- resolved "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz"
- integrity sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=
- dependencies:
- pend "~1.2.0"
-
-figures@^3.2.0:
- version "3.2.0"
- resolved "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz"
- integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==
- dependencies:
- escape-string-regexp "^1.0.5"
-
-forever-agent@~0.6.1:
- version "0.6.1"
- resolved "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz"
- integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=
-
-form-data@~2.3.2:
- version "2.3.3"
- resolved "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz"
- integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==
- dependencies:
- asynckit "^0.4.0"
- combined-stream "^1.0.6"
- mime-types "^2.1.12"
-
-fs-extra@^9.1.0:
- version "9.1.0"
- resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz"
- integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==
- dependencies:
- at-least-node "^1.0.0"
- graceful-fs "^4.2.0"
- jsonfile "^6.0.1"
- universalify "^2.0.0"
-
-fs.realpath@^1.0.0:
- version "1.0.0"
- resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz"
- integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8=
-
-get-stream@^5.0.0, get-stream@^5.1.0:
- version "5.2.0"
- resolved "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz"
- integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==
- dependencies:
- pump "^3.0.0"
-
-getos@^3.2.1:
- version "3.2.1"
- resolved "https://registry.npmjs.org/getos/-/getos-3.2.1.tgz"
- integrity sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q==
- dependencies:
- async "^3.2.0"
-
-getpass@^0.1.1:
- version "0.1.7"
- resolved "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz"
- integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=
- dependencies:
- assert-plus "^1.0.0"
-
-glob@^7.1.3:
- version "7.1.7"
- resolved "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz"
- integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==
- dependencies:
- fs.realpath "^1.0.0"
- inflight "^1.0.4"
- inherits "2"
- minimatch "^3.0.4"
- once "^1.3.0"
- path-is-absolute "^1.0.0"
-
-global-dirs@^3.0.0:
- version "3.0.0"
- resolved "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz"
- integrity sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA==
- dependencies:
- ini "2.0.0"
-
-graceful-fs@^4.1.6, graceful-fs@^4.2.0:
- version "4.2.6"
- resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz"
- integrity sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==
-
-har-schema@^2.0.0:
- version "2.0.0"
- resolved "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz"
- integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=
-
-har-validator@~5.1.3:
- version "5.1.5"
- resolved "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz"
- integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==
- dependencies:
- ajv "^6.12.3"
- har-schema "^2.0.0"
-
-has-flag@^4.0.0:
- version "4.0.0"
- resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz"
- integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
-
-http-signature@~1.2.0:
- version "1.2.0"
- resolved "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz"
- integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=
- dependencies:
- assert-plus "^1.0.0"
- jsprim "^1.2.2"
- sshpk "^1.7.0"
-
-human-signals@^1.1.1:
- version "1.1.1"
- resolved "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz"
- integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==
-
-indent-string@^4.0.0:
- version "4.0.0"
- resolved "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz"
- integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==
-
-inflight@^1.0.4:
- version "1.0.6"
- resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz"
- integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=
- dependencies:
- once "^1.3.0"
- wrappy "1"
-
-inherits@2:
- version "2.0.4"
- resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz"
- integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
-
-ini@2.0.0:
- version "2.0.0"
- resolved "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz"
- integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==
-
-is-ci@^3.0.0:
- version "3.0.0"
- resolved "https://registry.npmjs.org/is-ci/-/is-ci-3.0.0.tgz"
- integrity sha512-kDXyttuLeslKAHYL/K28F2YkM3x5jvFPEw3yXbRptXydjD9rpLEz+C5K5iutY9ZiUu6AP41JdvRQwF4Iqs4ZCQ==
- dependencies:
- ci-info "^3.1.1"
-
-is-fullwidth-code-point@^3.0.0:
- version "3.0.0"
- resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz"
- integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==
-
-is-installed-globally@~0.4.0:
- version "0.4.0"
- resolved "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz"
- integrity sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==
- dependencies:
- global-dirs "^3.0.0"
- is-path-inside "^3.0.2"
-
-is-path-inside@^3.0.2:
- version "3.0.3"
- resolved "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz"
- integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==
-
-is-stream@^2.0.0:
- version "2.0.0"
- resolved "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz"
- integrity sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==
-
-is-typedarray@~1.0.0:
- version "1.0.0"
- resolved "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz"
- integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=
-
-is-unicode-supported@^0.1.0:
- version "0.1.0"
- resolved "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz"
- integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==
-
-isexe@^2.0.0:
- version "2.0.0"
- resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz"
- integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=
-
-isstream@~0.1.2:
- version "0.1.2"
- resolved "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz"
- integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=
-
-jsbn@~0.1.0:
- version "0.1.1"
- resolved "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz"
- integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM=
-
-json-schema-traverse@^0.4.1:
- version "0.4.1"
- resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz"
- integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==
-
-json-schema@0.2.3:
- version "0.2.3"
- resolved "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz"
- integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=
-
-json-stringify-safe@~5.0.1:
- version "5.0.1"
- resolved "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz"
- integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=
-
-jsonfile@^6.0.1:
- version "6.1.0"
- resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz"
- integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==
- dependencies:
- universalify "^2.0.0"
+"extsprintf@^1.2.0", "extsprintf@1.3.0":
+ "integrity" "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU="
+ "resolved" "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz"
+ "version" "1.3.0"
+
+"faker@^5.5.3":
+ "integrity" "sha512-wLTv2a28wjUyWkbnX7u/ABZBkUkIF2fCd73V6P2oFqEGEktDfzWx4UxrSqtPRw0xPRAcjeAOIiJWqZm3pP4u3g=="
+ "resolved" "https://registry.npmjs.org/faker/-/faker-5.5.3.tgz"
+ "version" "5.5.3"
+
+"fast-deep-equal@^3.1.1":
+ "integrity" "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
+ "resolved" "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz"
+ "version" "3.1.3"
+
+"fast-json-stable-stringify@^2.0.0":
+ "integrity" "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="
+ "resolved" "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz"
+ "version" "2.1.0"
+
+"fd-slicer@~1.1.0":
+ "integrity" "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4="
+ "resolved" "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz"
+ "version" "1.1.0"
+ dependencies:
+ "pend" "~1.2.0"
+
+"figures@^3.2.0":
+ "integrity" "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg=="
+ "resolved" "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz"
+ "version" "3.2.0"
+ dependencies:
+ "escape-string-regexp" "^1.0.5"
+
+"forever-agent@~0.6.1":
+ "integrity" "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE="
+ "resolved" "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz"
+ "version" "0.6.1"
+
+"form-data@~2.3.2":
+ "integrity" "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ=="
+ "resolved" "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz"
+ "version" "2.3.3"
+ dependencies:
+ "asynckit" "^0.4.0"
+ "combined-stream" "^1.0.6"
+ "mime-types" "^2.1.12"
+
+"fs-extra@^9.1.0":
+ "integrity" "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ=="
+ "resolved" "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz"
+ "version" "9.1.0"
+ dependencies:
+ "at-least-node" "^1.0.0"
+ "graceful-fs" "^4.2.0"
+ "jsonfile" "^6.0.1"
+ "universalify" "^2.0.0"
+
+"fs.realpath@^1.0.0":
+ "integrity" "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
+ "resolved" "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz"
+ "version" "1.0.0"
+
+"get-stream@^5.0.0", "get-stream@^5.1.0":
+ "integrity" "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA=="
+ "resolved" "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz"
+ "version" "5.2.0"
+ dependencies:
+ "pump" "^3.0.0"
+
+"getos@^3.2.1":
+ "integrity" "sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q=="
+ "resolved" "https://registry.npmjs.org/getos/-/getos-3.2.1.tgz"
+ "version" "3.2.1"
+ dependencies:
+ "async" "^3.2.0"
+
+"getpass@^0.1.1":
+ "integrity" "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo="
+ "resolved" "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz"
+ "version" "0.1.7"
+ dependencies:
+ "assert-plus" "^1.0.0"
+
+"glob@^7.1.3":
+ "integrity" "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ=="
+ "resolved" "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz"
+ "version" "7.1.7"
+ dependencies:
+ "fs.realpath" "^1.0.0"
+ "inflight" "^1.0.4"
+ "inherits" "2"
+ "minimatch" "^3.0.4"
+ "once" "^1.3.0"
+ "path-is-absolute" "^1.0.0"
+
+"global-dirs@^3.0.0":
+ "integrity" "sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA=="
+ "resolved" "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz"
+ "version" "3.0.0"
+ dependencies:
+ "ini" "2.0.0"
+
+"graceful-fs@^4.1.6", "graceful-fs@^4.2.0":
+ "integrity" "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ=="
+ "resolved" "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz"
+ "version" "4.2.6"
+
+"har-schema@^2.0.0":
+ "integrity" "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI="
+ "resolved" "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz"
+ "version" "2.0.0"
+
+"har-validator@~5.1.3":
+ "integrity" "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w=="
+ "resolved" "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz"
+ "version" "5.1.5"
+ dependencies:
+ "ajv" "^6.12.3"
+ "har-schema" "^2.0.0"
+
+"has-flag@^4.0.0":
+ "integrity" "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
+ "resolved" "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz"
+ "version" "4.0.0"
+
+"http-signature@~1.2.0":
+ "integrity" "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE="
+ "resolved" "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz"
+ "version" "1.2.0"
+ dependencies:
+ "assert-plus" "^1.0.0"
+ "jsprim" "^1.2.2"
+ "sshpk" "^1.7.0"
+
+"human-signals@^1.1.1":
+ "integrity" "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw=="
+ "resolved" "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz"
+ "version" "1.1.1"
+
+"indent-string@^4.0.0":
+ "integrity" "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg=="
+ "resolved" "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz"
+ "version" "4.0.0"
+
+"inflight@^1.0.4":
+ "integrity" "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk="
+ "resolved" "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz"
+ "version" "1.0.6"
+ dependencies:
+ "once" "^1.3.0"
+ "wrappy" "1"
+
+"inherits@2":
+ "integrity" "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
+ "resolved" "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz"
+ "version" "2.0.4"
+
+"ini@2.0.0":
+ "integrity" "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA=="
+ "resolved" "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz"
+ "version" "2.0.0"
+
+"is-ci@^3.0.0":
+ "integrity" "sha512-kDXyttuLeslKAHYL/K28F2YkM3x5jvFPEw3yXbRptXydjD9rpLEz+C5K5iutY9ZiUu6AP41JdvRQwF4Iqs4ZCQ=="
+ "resolved" "https://registry.npmjs.org/is-ci/-/is-ci-3.0.0.tgz"
+ "version" "3.0.0"
+ dependencies:
+ "ci-info" "^3.1.1"
+
+"is-fullwidth-code-point@^3.0.0":
+ "integrity" "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="
+ "resolved" "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz"
+ "version" "3.0.0"
+
+"is-installed-globally@~0.4.0":
+ "integrity" "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ=="
+ "resolved" "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz"
+ "version" "0.4.0"
+ dependencies:
+ "global-dirs" "^3.0.0"
+ "is-path-inside" "^3.0.2"
+
+"is-path-inside@^3.0.2":
+ "integrity" "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ=="
+ "resolved" "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz"
+ "version" "3.0.3"
+
+"is-stream@^2.0.0":
+ "integrity" "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw=="
+ "resolved" "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz"
+ "version" "2.0.0"
+
+"is-typedarray@~1.0.0":
+ "integrity" "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo="
+ "resolved" "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz"
+ "version" "1.0.0"
+
+"is-unicode-supported@^0.1.0":
+ "integrity" "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw=="
+ "resolved" "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz"
+ "version" "0.1.0"
+
+"isexe@^2.0.0":
+ "integrity" "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA="
+ "resolved" "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz"
+ "version" "2.0.0"
+
+"isstream@~0.1.2":
+ "integrity" "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo="
+ "resolved" "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz"
+ "version" "0.1.2"
+
+"jsbn@~0.1.0":
+ "integrity" "sha1-peZUwuWi3rXyAdls77yoDA7y9RM="
+ "resolved" "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz"
+ "version" "0.1.1"
+
+"json-schema-traverse@^0.4.1":
+ "integrity" "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
+ "resolved" "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz"
+ "version" "0.4.1"
+
+"json-schema@0.2.3":
+ "integrity" "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM="
+ "resolved" "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz"
+ "version" "0.2.3"
+
+"json-stringify-safe@~5.0.1":
+ "integrity" "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus="
+ "resolved" "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz"
+ "version" "5.0.1"
+
+"jsonfile@^6.0.1":
+ "integrity" "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ=="
+ "resolved" "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz"
+ "version" "6.1.0"
+ dependencies:
+ "universalify" "^2.0.0"
optionalDependencies:
- graceful-fs "^4.1.6"
-
-jsprim@^1.2.2:
- version "1.4.1"
- resolved "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz"
- integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=
- dependencies:
- assert-plus "1.0.0"
- extsprintf "1.3.0"
- json-schema "0.2.3"
- verror "1.10.0"
-
-lazy-ass@^1.6.0:
- version "1.6.0"
- resolved "https://registry.npmjs.org/lazy-ass/-/lazy-ass-1.6.0.tgz"
- integrity sha1-eZllXoZGwX8In90YfRUNMyTVRRM=
-
-listr2@^3.8.3:
- version "3.10.0"
- resolved "https://registry.npmjs.org/listr2/-/listr2-3.10.0.tgz"
- integrity sha512-eP40ZHihu70sSmqFNbNy2NL1YwImmlMmPh9WO5sLmPDleurMHt3n+SwEWNu2kzKScexZnkyFtc1VI0z/TGlmpw==
- dependencies:
- cli-truncate "^2.1.0"
- colorette "^1.2.2"
- log-update "^4.0.0"
- p-map "^4.0.0"
- rxjs "^6.6.7"
- through "^2.3.8"
- wrap-ansi "^7.0.0"
-
-lodash.once@^4.1.1:
- version "4.1.1"
- resolved "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz"
- integrity sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=
-
-lodash@^4.17.21:
- version "4.17.21"
- resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz"
- integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
-
-log-symbols@^4.0.0:
- version "4.1.0"
- resolved "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz"
- integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==
- dependencies:
- chalk "^4.1.0"
- is-unicode-supported "^0.1.0"
-
-log-update@^4.0.0:
- version "4.0.0"
- resolved "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz"
- integrity sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==
- dependencies:
- ansi-escapes "^4.3.0"
- cli-cursor "^3.1.0"
- slice-ansi "^4.0.0"
- wrap-ansi "^6.2.0"
-
-merge-stream@^2.0.0:
- version "2.0.0"
- resolved "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz"
- integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==
-
-mime-db@1.48.0:
- version "1.48.0"
- resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.48.0.tgz"
- integrity sha512-FM3QwxV+TnZYQ2aRqhlKBMHxk10lTbMt3bBkMAp54ddrNeVSfcQYOOKuGuy3Ddrm38I04If834fOUSq1yzslJQ==
-
-mime-types@^2.1.12, mime-types@~2.1.19:
- version "2.1.31"
- resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.31.tgz"
- integrity sha512-XGZnNzm3QvgKxa8dpzyhFTHmpP3l5YNusmne07VUOXxou9CqUqYa/HBy124RqtVh/O2pECas/MOcsDgpilPOPg==
- dependencies:
- mime-db "1.48.0"
-
-mimic-fn@^2.1.0:
- version "2.1.0"
- resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz"
- integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==
-
-minimatch@^3.0.4:
- version "3.0.4"
- resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz"
- integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==
- dependencies:
- brace-expansion "^1.1.7"
-
-minimist@^1.2.5:
- version "1.2.5"
- resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz"
- integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==
-
-ms@2.1.2, ms@^2.1.1:
- version "2.1.2"
- resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz"
- integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
-
-npm-run-path@^4.0.0:
- version "4.0.1"
- resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz"
- integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==
- dependencies:
- path-key "^3.0.0"
-
-oauth-sign@~0.9.0:
- version "0.9.0"
- resolved "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz"
- integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==
-
-object-assign@^4.1.0:
- version "4.1.1"
- resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz"
- integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=
-
-once@^1.3.0, once@^1.3.1, once@^1.4.0:
- version "1.4.0"
- resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz"
- integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E=
- dependencies:
- wrappy "1"
-
-onetime@^5.1.0:
- version "5.1.2"
- resolved "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz"
- integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==
- dependencies:
- mimic-fn "^2.1.0"
-
-ospath@^1.2.2:
- version "1.2.2"
- resolved "https://registry.npmjs.org/ospath/-/ospath-1.2.2.tgz"
- integrity sha1-EnZjl3Sj+O8lcvf+QoDg6kVQwHs=
-
-p-map@^4.0.0:
- version "4.0.0"
- resolved "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz"
- integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==
- dependencies:
- aggregate-error "^3.0.0"
-
-path-is-absolute@^1.0.0:
- version "1.0.1"
- resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz"
- integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18=
-
-path-key@^3.0.0, path-key@^3.1.0:
- version "3.1.1"
- resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz"
- integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==
-
-pend@~1.2.0:
- version "1.2.0"
- resolved "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz"
- integrity sha1-elfrVQpng/kRUzH89GY9XI4AelA=
-
-performance-now@^2.1.0:
- version "2.1.0"
- resolved "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz"
- integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=
-
-pify@^2.2.0:
- version "2.3.0"
- resolved "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz"
- integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw=
-
-pretty-bytes@^5.6.0:
- version "5.6.0"
- resolved "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz"
- integrity sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==
-
-psl@^1.1.28:
- version "1.8.0"
- resolved "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz"
- integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==
-
-pump@^3.0.0:
- version "3.0.0"
- resolved "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz"
- integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==
- dependencies:
- end-of-stream "^1.1.0"
- once "^1.3.1"
-
-punycode@1.3.2:
- version "1.3.2"
- resolved "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz"
- integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=
-
-punycode@^2.1.0, punycode@^2.1.1:
- version "2.1.1"
- resolved "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz"
- integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==
-
-qs@~6.5.2:
- version "6.5.2"
- resolved "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz"
- integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==
-
-querystring@0.2.0:
- version "0.2.0"
- resolved "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz"
- integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=
-
-ramda@~0.27.1:
- version "0.27.1"
- resolved "https://registry.npmjs.org/ramda/-/ramda-0.27.1.tgz"
- integrity sha512-PgIdVpn5y5Yns8vqb8FzBUEYn98V3xcPgawAkkgj0YJ0qDsnHCiNmZYfOGMgOvoB0eWFLpYbhxUR3mxfDIMvpw==
-
-request-progress@^3.0.0:
- version "3.0.0"
- resolved "https://registry.npmjs.org/request-progress/-/request-progress-3.0.0.tgz"
- integrity sha1-TKdUCBx/7GP1BeT6qCWqBs1mnb4=
- dependencies:
- throttleit "^1.0.0"
-
-restore-cursor@^3.1.0:
- version "3.1.0"
- resolved "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz"
- integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==
- dependencies:
- onetime "^5.1.0"
- signal-exit "^3.0.2"
-
-rimraf@^3.0.0:
- version "3.0.2"
- resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz"
- integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==
- dependencies:
- glob "^7.1.3"
-
-rxjs@^6.6.7:
- version "6.6.7"
- resolved "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz"
- integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==
- dependencies:
- tslib "^1.9.0"
-
-safe-buffer@^5.0.1, safe-buffer@^5.1.2:
- version "5.2.1"
- resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz"
- integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
-
-safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0:
- version "2.1.2"
- resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz"
- integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
-
-shebang-command@^2.0.0:
- version "2.0.0"
- resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz"
- integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==
- dependencies:
- shebang-regex "^3.0.0"
-
-shebang-regex@^3.0.0:
- version "3.0.0"
- resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz"
- integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==
-
-signal-exit@^3.0.2:
- version "3.0.3"
- resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz"
- integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==
-
-slice-ansi@^3.0.0:
- version "3.0.0"
- resolved "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz"
- integrity sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==
- dependencies:
- ansi-styles "^4.0.0"
- astral-regex "^2.0.0"
- is-fullwidth-code-point "^3.0.0"
-
-slice-ansi@^4.0.0:
- version "4.0.0"
- resolved "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz"
- integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==
- dependencies:
- ansi-styles "^4.0.0"
- astral-regex "^2.0.0"
- is-fullwidth-code-point "^3.0.0"
-
-sshpk@^1.7.0:
- version "1.16.1"
- resolved "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz"
- integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==
- dependencies:
- asn1 "~0.2.3"
- assert-plus "^1.0.0"
- bcrypt-pbkdf "^1.0.0"
- dashdash "^1.12.0"
- ecc-jsbn "~0.1.1"
- getpass "^0.1.1"
- jsbn "~0.1.0"
- safer-buffer "^2.0.2"
- tweetnacl "~0.14.0"
-
-string-width@^4.1.0, string-width@^4.2.0:
- version "4.2.2"
- resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz"
- integrity sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==
- dependencies:
- emoji-regex "^8.0.0"
- is-fullwidth-code-point "^3.0.0"
- strip-ansi "^6.0.0"
-
-strip-ansi@^6.0.0:
- version "6.0.0"
- resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz"
- integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==
- dependencies:
- ansi-regex "^5.0.0"
-
-strip-final-newline@^2.0.0:
- version "2.0.0"
- resolved "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz"
- integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==
-
-supports-color@^7.1.0:
- version "7.2.0"
- resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz"
- integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==
- dependencies:
- has-flag "^4.0.0"
-
-supports-color@^8.1.1:
- version "8.1.1"
- resolved "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz"
- integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==
- dependencies:
- has-flag "^4.0.0"
-
-throttleit@^1.0.0:
- version "1.0.0"
- resolved "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz"
- integrity sha1-nnhYNtr0Z0MUWlmEtiaNgoUorGw=
-
-through@^2.3.8:
- version "2.3.8"
- resolved "https://registry.npmjs.org/through/-/through-2.3.8.tgz"
- integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=
-
-tmp@~0.2.1:
- version "0.2.1"
- resolved "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz"
- integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==
- dependencies:
- rimraf "^3.0.0"
-
-tough-cookie@~2.5.0:
- version "2.5.0"
- resolved "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz"
- integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==
- dependencies:
- psl "^1.1.28"
- punycode "^2.1.1"
-
-tslib@^1.9.0:
- version "1.14.1"
- resolved "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz"
- integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==
-
-tunnel-agent@^0.6.0:
- version "0.6.0"
- resolved "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz"
- integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=
- dependencies:
- safe-buffer "^5.0.1"
-
-tweetnacl@^0.14.3, tweetnacl@~0.14.0:
- version "0.14.5"
- resolved "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz"
- integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=
-
-type-fest@^0.21.3:
- version "0.21.3"
- resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz"
- integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==
-
-universalify@^2.0.0:
- version "2.0.0"
- resolved "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz"
- integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==
-
-untildify@^4.0.0:
- version "4.0.0"
- resolved "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz"
- integrity sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==
-
-uri-js@^4.2.2:
- version "4.4.1"
- resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz"
- integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==
- dependencies:
- punycode "^2.1.0"
-
-url@^0.11.0:
- version "0.11.0"
- resolved "https://registry.npmjs.org/url/-/url-0.11.0.tgz"
- integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=
- dependencies:
- punycode "1.3.2"
- querystring "0.2.0"
-
-uuid@^3.3.2:
- version "3.4.0"
- resolved "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz"
- integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==
-
-verror@1.10.0:
- version "1.10.0"
- resolved "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz"
- integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=
- dependencies:
- assert-plus "^1.0.0"
- core-util-is "1.0.2"
- extsprintf "^1.2.0"
-
-which@^2.0.1:
- version "2.0.2"
- resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz"
- integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==
- dependencies:
- isexe "^2.0.0"
-
-wrap-ansi@^6.2.0:
- version "6.2.0"
- resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz"
- integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==
- dependencies:
- ansi-styles "^4.0.0"
- string-width "^4.1.0"
- strip-ansi "^6.0.0"
-
-wrap-ansi@^7.0.0:
- version "7.0.0"
- resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz"
- integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==
- dependencies:
- ansi-styles "^4.0.0"
- string-width "^4.1.0"
- strip-ansi "^6.0.0"
-
-wrappy@1:
- version "1.0.2"
- resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz"
- integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=
-
-yauzl@^2.10.0:
- version "2.10.0"
- resolved "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz"
- integrity sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=
- dependencies:
- buffer-crc32 "~0.2.3"
- fd-slicer "~1.1.0"
+ "graceful-fs" "^4.1.6"
+
+"jsprim@^1.2.2":
+ "integrity" "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI="
+ "resolved" "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz"
+ "version" "1.4.1"
+ dependencies:
+ "assert-plus" "1.0.0"
+ "extsprintf" "1.3.0"
+ "json-schema" "0.2.3"
+ "verror" "1.10.0"
+
+"lazy-ass@^1.6.0":
+ "integrity" "sha1-eZllXoZGwX8In90YfRUNMyTVRRM="
+ "resolved" "https://registry.npmjs.org/lazy-ass/-/lazy-ass-1.6.0.tgz"
+ "version" "1.6.0"
+
+"listr2@^3.8.3":
+ "integrity" "sha512-eP40ZHihu70sSmqFNbNy2NL1YwImmlMmPh9WO5sLmPDleurMHt3n+SwEWNu2kzKScexZnkyFtc1VI0z/TGlmpw=="
+ "resolved" "https://registry.npmjs.org/listr2/-/listr2-3.10.0.tgz"
+ "version" "3.10.0"
+ dependencies:
+ "cli-truncate" "^2.1.0"
+ "colorette" "^1.2.2"
+ "log-update" "^4.0.0"
+ "p-map" "^4.0.0"
+ "rxjs" "^6.6.7"
+ "through" "^2.3.8"
+ "wrap-ansi" "^7.0.0"
+
+"lodash.once@^4.1.1":
+ "integrity" "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w="
+ "resolved" "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz"
+ "version" "4.1.1"
+
+"lodash@^4.17.21":
+ "integrity" "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
+ "resolved" "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz"
+ "version" "4.17.21"
+
+"log-symbols@^4.0.0":
+ "integrity" "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg=="
+ "resolved" "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz"
+ "version" "4.1.0"
+ dependencies:
+ "chalk" "^4.1.0"
+ "is-unicode-supported" "^0.1.0"
+
+"log-update@^4.0.0":
+ "integrity" "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg=="
+ "resolved" "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz"
+ "version" "4.0.0"
+ dependencies:
+ "ansi-escapes" "^4.3.0"
+ "cli-cursor" "^3.1.0"
+ "slice-ansi" "^4.0.0"
+ "wrap-ansi" "^6.2.0"
+
+"merge-stream@^2.0.0":
+ "integrity" "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w=="
+ "resolved" "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz"
+ "version" "2.0.0"
+
+"mime-db@1.48.0":
+ "integrity" "sha512-FM3QwxV+TnZYQ2aRqhlKBMHxk10lTbMt3bBkMAp54ddrNeVSfcQYOOKuGuy3Ddrm38I04If834fOUSq1yzslJQ=="
+ "resolved" "https://registry.npmjs.org/mime-db/-/mime-db-1.48.0.tgz"
+ "version" "1.48.0"
+
+"mime-types@^2.1.12", "mime-types@~2.1.19":
+ "integrity" "sha512-XGZnNzm3QvgKxa8dpzyhFTHmpP3l5YNusmne07VUOXxou9CqUqYa/HBy124RqtVh/O2pECas/MOcsDgpilPOPg=="
+ "resolved" "https://registry.npmjs.org/mime-types/-/mime-types-2.1.31.tgz"
+ "version" "2.1.31"
+ dependencies:
+ "mime-db" "1.48.0"
+
+"mimic-fn@^2.1.0":
+ "integrity" "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg=="
+ "resolved" "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz"
+ "version" "2.1.0"
+
+"minimatch@^3.0.4":
+ "integrity" "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA=="
+ "resolved" "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz"
+ "version" "3.0.4"
+ dependencies:
+ "brace-expansion" "^1.1.7"
+
+"minimist@^1.2.5":
+ "integrity" "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw=="
+ "resolved" "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz"
+ "version" "1.2.5"
+
+"ms@^2.1.1", "ms@2.1.2":
+ "integrity" "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+ "resolved" "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz"
+ "version" "2.1.2"
+
+"npm-run-path@^4.0.0":
+ "integrity" "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw=="
+ "resolved" "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz"
+ "version" "4.0.1"
+ dependencies:
+ "path-key" "^3.0.0"
+
+"oauth-sign@~0.9.0":
+ "integrity" "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ=="
+ "resolved" "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz"
+ "version" "0.9.0"
+
+"object-assign@^4.1.0":
+ "integrity" "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
+ "resolved" "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz"
+ "version" "4.1.1"
+
+"once@^1.3.0", "once@^1.3.1", "once@^1.4.0":
+ "integrity" "sha1-WDsap3WWHUsROsF9nFC6753Xa9E="
+ "resolved" "https://registry.npmjs.org/once/-/once-1.4.0.tgz"
+ "version" "1.4.0"
+ dependencies:
+ "wrappy" "1"
+
+"onetime@^5.1.0":
+ "integrity" "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg=="
+ "resolved" "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz"
+ "version" "5.1.2"
+ dependencies:
+ "mimic-fn" "^2.1.0"
+
+"ospath@^1.2.2":
+ "integrity" "sha1-EnZjl3Sj+O8lcvf+QoDg6kVQwHs="
+ "resolved" "https://registry.npmjs.org/ospath/-/ospath-1.2.2.tgz"
+ "version" "1.2.2"
+
+"p-map@^4.0.0":
+ "integrity" "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ=="
+ "resolved" "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz"
+ "version" "4.0.0"
+ dependencies:
+ "aggregate-error" "^3.0.0"
+
+"path-is-absolute@^1.0.0":
+ "integrity" "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
+ "resolved" "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz"
+ "version" "1.0.1"
+
+"path-key@^3.0.0", "path-key@^3.1.0":
+ "integrity" "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="
+ "resolved" "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz"
+ "version" "3.1.1"
+
+"pend@~1.2.0":
+ "integrity" "sha1-elfrVQpng/kRUzH89GY9XI4AelA="
+ "resolved" "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz"
+ "version" "1.2.0"
+
+"performance-now@^2.1.0":
+ "integrity" "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns="
+ "resolved" "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz"
+ "version" "2.1.0"
+
+"pify@^2.2.0":
+ "integrity" "sha1-7RQaasBDqEnqWISY59yosVMw6Qw="
+ "resolved" "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz"
+ "version" "2.3.0"
+
+"pretty-bytes@^5.6.0":
+ "integrity" "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg=="
+ "resolved" "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz"
+ "version" "5.6.0"
+
+"psl@^1.1.28":
+ "integrity" "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ=="
+ "resolved" "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz"
+ "version" "1.8.0"
+
+"pump@^3.0.0":
+ "integrity" "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww=="
+ "resolved" "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz"
+ "version" "3.0.0"
+ dependencies:
+ "end-of-stream" "^1.1.0"
+ "once" "^1.3.1"
+
+"punycode@^2.1.0", "punycode@^2.1.1":
+ "integrity" "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A=="
+ "resolved" "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz"
+ "version" "2.1.1"
+
+"punycode@1.3.2":
+ "integrity" "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0="
+ "resolved" "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz"
+ "version" "1.3.2"
+
+"qs@~6.5.2":
+ "integrity" "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA=="
+ "resolved" "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz"
+ "version" "6.5.2"
+
+"querystring@0.2.0":
+ "integrity" "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA="
+ "resolved" "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz"
+ "version" "0.2.0"
+
+"ramda@~0.27.1":
+ "integrity" "sha512-PgIdVpn5y5Yns8vqb8FzBUEYn98V3xcPgawAkkgj0YJ0qDsnHCiNmZYfOGMgOvoB0eWFLpYbhxUR3mxfDIMvpw=="
+ "resolved" "https://registry.npmjs.org/ramda/-/ramda-0.27.1.tgz"
+ "version" "0.27.1"
+
+"request-progress@^3.0.0":
+ "integrity" "sha1-TKdUCBx/7GP1BeT6qCWqBs1mnb4="
+ "resolved" "https://registry.npmjs.org/request-progress/-/request-progress-3.0.0.tgz"
+ "version" "3.0.0"
+ dependencies:
+ "throttleit" "^1.0.0"
+
+"restore-cursor@^3.1.0":
+ "integrity" "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA=="
+ "resolved" "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz"
+ "version" "3.1.0"
+ dependencies:
+ "onetime" "^5.1.0"
+ "signal-exit" "^3.0.2"
+
+"rimraf@^3.0.0":
+ "integrity" "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA=="
+ "resolved" "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz"
+ "version" "3.0.2"
+ dependencies:
+ "glob" "^7.1.3"
+
+"rxjs@^6.6.7":
+ "integrity" "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ=="
+ "resolved" "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz"
+ "version" "6.6.7"
+ dependencies:
+ "tslib" "^1.9.0"
+
+"safe-buffer@^5.0.1", "safe-buffer@^5.1.2":
+ "integrity" "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
+ "resolved" "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz"
+ "version" "5.2.1"
+
+"safer-buffer@^2.0.2", "safer-buffer@^2.1.0", "safer-buffer@~2.1.0":
+ "integrity" "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
+ "resolved" "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz"
+ "version" "2.1.2"
+
+"shebang-command@^2.0.0":
+ "integrity" "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="
+ "resolved" "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz"
+ "version" "2.0.0"
+ dependencies:
+ "shebang-regex" "^3.0.0"
+
+"shebang-regex@^3.0.0":
+ "integrity" "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="
+ "resolved" "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz"
+ "version" "3.0.0"
+
+"signal-exit@^3.0.2":
+ "integrity" "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA=="
+ "resolved" "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz"
+ "version" "3.0.3"
+
+"slice-ansi@^3.0.0":
+ "integrity" "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ=="
+ "resolved" "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz"
+ "version" "3.0.0"
+ dependencies:
+ "ansi-styles" "^4.0.0"
+ "astral-regex" "^2.0.0"
+ "is-fullwidth-code-point" "^3.0.0"
+
+"slice-ansi@^4.0.0":
+ "integrity" "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ=="
+ "resolved" "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz"
+ "version" "4.0.0"
+ dependencies:
+ "ansi-styles" "^4.0.0"
+ "astral-regex" "^2.0.0"
+ "is-fullwidth-code-point" "^3.0.0"
+
+"sshpk@^1.7.0":
+ "integrity" "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg=="
+ "resolved" "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz"
+ "version" "1.16.1"
+ dependencies:
+ "asn1" "~0.2.3"
+ "assert-plus" "^1.0.0"
+ "bcrypt-pbkdf" "^1.0.0"
+ "dashdash" "^1.12.0"
+ "ecc-jsbn" "~0.1.1"
+ "getpass" "^0.1.1"
+ "jsbn" "~0.1.0"
+ "safer-buffer" "^2.0.2"
+ "tweetnacl" "~0.14.0"
+
+"string-width@^4.1.0", "string-width@^4.2.0":
+ "integrity" "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA=="
+ "resolved" "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz"
+ "version" "4.2.2"
+ dependencies:
+ "emoji-regex" "^8.0.0"
+ "is-fullwidth-code-point" "^3.0.0"
+ "strip-ansi" "^6.0.0"
+
+"strip-ansi@^6.0.0":
+ "integrity" "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w=="
+ "resolved" "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz"
+ "version" "6.0.0"
+ dependencies:
+ "ansi-regex" "^5.0.0"
+
+"strip-final-newline@^2.0.0":
+ "integrity" "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA=="
+ "resolved" "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz"
+ "version" "2.0.0"
+
+"supports-color@^7.1.0":
+ "integrity" "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="
+ "resolved" "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz"
+ "version" "7.2.0"
+ dependencies:
+ "has-flag" "^4.0.0"
+
+"supports-color@^8.1.1":
+ "integrity" "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q=="
+ "resolved" "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz"
+ "version" "8.1.1"
+ dependencies:
+ "has-flag" "^4.0.0"
+
+"throttleit@^1.0.0":
+ "integrity" "sha1-nnhYNtr0Z0MUWlmEtiaNgoUorGw="
+ "resolved" "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz"
+ "version" "1.0.0"
+
+"through@^2.3.8":
+ "integrity" "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU="
+ "resolved" "https://registry.npmjs.org/through/-/through-2.3.8.tgz"
+ "version" "2.3.8"
+
+"tmp@~0.2.1":
+ "integrity" "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ=="
+ "resolved" "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz"
+ "version" "0.2.1"
+ dependencies:
+ "rimraf" "^3.0.0"
+
+"tough-cookie@~2.5.0":
+ "integrity" "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g=="
+ "resolved" "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz"
+ "version" "2.5.0"
+ dependencies:
+ "psl" "^1.1.28"
+ "punycode" "^2.1.1"
+
+"tslib@^1.9.0":
+ "integrity" "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
+ "resolved" "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz"
+ "version" "1.14.1"
+
+"tunnel-agent@^0.6.0":
+ "integrity" "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0="
+ "resolved" "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz"
+ "version" "0.6.0"
+ dependencies:
+ "safe-buffer" "^5.0.1"
+
+"tweetnacl@^0.14.3", "tweetnacl@~0.14.0":
+ "integrity" "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q="
+ "resolved" "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz"
+ "version" "0.14.5"
+
+"type-fest@^0.21.3":
+ "integrity" "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w=="
+ "resolved" "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz"
+ "version" "0.21.3"
+
+"universalify@^2.0.0":
+ "integrity" "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ=="
+ "resolved" "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz"
+ "version" "2.0.0"
+
+"untildify@^4.0.0":
+ "integrity" "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw=="
+ "resolved" "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz"
+ "version" "4.0.0"
+
+"uri-js@^4.2.2":
+ "integrity" "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg=="
+ "resolved" "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz"
+ "version" "4.4.1"
+ dependencies:
+ "punycode" "^2.1.0"
+
+"url@^0.11.0":
+ "integrity" "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE="
+ "resolved" "https://registry.npmjs.org/url/-/url-0.11.0.tgz"
+ "version" "0.11.0"
+ dependencies:
+ "punycode" "1.3.2"
+ "querystring" "0.2.0"
+
+"uuid@^3.3.2":
+ "integrity" "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A=="
+ "resolved" "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz"
+ "version" "3.4.0"
+
+"verror@1.10.0":
+ "integrity" "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA="
+ "resolved" "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz"
+ "version" "1.10.0"
+ dependencies:
+ "assert-plus" "^1.0.0"
+ "core-util-is" "1.0.2"
+ "extsprintf" "^1.2.0"
+
+"which@^2.0.1":
+ "integrity" "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="
+ "resolved" "https://registry.npmjs.org/which/-/which-2.0.2.tgz"
+ "version" "2.0.2"
+ dependencies:
+ "isexe" "^2.0.0"
+
+"wrap-ansi@^6.2.0":
+ "integrity" "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA=="
+ "resolved" "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz"
+ "version" "6.2.0"
+ dependencies:
+ "ansi-styles" "^4.0.0"
+ "string-width" "^4.1.0"
+ "strip-ansi" "^6.0.0"
+
+"wrap-ansi@^7.0.0":
+ "integrity" "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="
+ "resolved" "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz"
+ "version" "7.0.0"
+ dependencies:
+ "ansi-styles" "^4.0.0"
+ "string-width" "^4.1.0"
+ "strip-ansi" "^6.0.0"
+
+"wrappy@1":
+ "integrity" "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
+ "resolved" "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz"
+ "version" "1.0.2"
+
+"yauzl@^2.10.0":
+ "integrity" "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk="
+ "resolved" "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz"
+ "version" "2.10.0"
+ dependencies:
+ "buffer-crc32" "~0.2.3"
+ "fd-slicer" "~1.1.0"
diff --git a/weallcode/templates/weallcode/_base.html b/weallcode/templates/weallcode/_base.html
index e5f6e42b..e6976ec9 100644
--- a/weallcode/templates/weallcode/_base.html
+++ b/weallcode/templates/weallcode/_base.html
@@ -79,7 +79,7 @@
{% block extra_script %}{% endblock %}
{% block extra_body %}{% endblock %}
-
+ {% comment %} {% endcomment %}