From 0e4a141e0fe0cf138b7b5cf4c9bb5a3135546429 Mon Sep 17 00:00:00 2001 From: Jeremiah Date: Tue, 28 Jul 2020 00:59:17 -0500 Subject: [PATCH 1/9] added option to unsubscribe --- api/tests.py | 29 +++++++++++++++++++++++- api/urls.py | 1 + api/views.py | 11 ++++++++++ website/templates/base_generic.html | 1 + website/templates/index.html | 34 ++++++++++++++++++++++++----- website/urls.py | 3 ++- website/views.py | 13 +++++++++++ 7 files changed, 84 insertions(+), 8 deletions(-) diff --git a/api/tests.py b/api/tests.py index c845e683..085ffd4b 100644 --- a/api/tests.py +++ b/api/tests.py @@ -3,7 +3,7 @@ from django.test import RequestFactory, TestCase -from .views import reminders, eligible_jurisdiction +from .views import reminders, eligible_jurisdiction, unsubscribe from alerts.models import Alert @@ -17,6 +17,9 @@ def _post(self, url, params): def _get(self, url, params): return self.factory.get(url, params) + def _delete(self, url): + return self.factory.delete(url) + def testReminderWithArraignmentIn8Days(self): arraignment_datetime = (datetime.today() + timedelta(days=8)).strftime('%Y-%m-%dT%H:%M:%S') request = self._post('/api/reminders', { @@ -94,3 +97,27 @@ def testEligibleJurisdictions(self): 'seminole', 'sequoyah', 'stephens', 'texas', 'tillman', 'tulsa', 'wagoner', 'washington', 'washita', 'woods', 'woodward']}) + + def testUnsubscribe(self): + alert = Alert( + when='2020-07-27', + to="+1-000-001-0002", + what="test reminder" + ) + alert.save() + self.assertEqual(Alert.objects.filter(to='+1-000-001-0002').all().count(), 1) + + request = self._delete('api/unsubscribe/000-001-0002') + response = unsubscribe(request, '000-001-0002') + resp_json = json.loads(response.content) + message = resp_json.get('message', None) + self.assertEqual(message, 'Reminders for 000-001-0002 deleted.') + self.assertEqual(Alert.objects.filter(to='+1-000-001-0002').count(), 0) + + def testUnsubsribeNotExists(self): + request = self._delete('api/unsubscribe/000-001-0003') + response = unsubscribe(request, '000-001-0003') + resp_json = json.loads(response.content) + message = resp_json.get('message', None) + self.assertEqual(message, 'There are no reminders set for 000-001-0003.') + self.assertEqual(Alert.objects.filter(to='+1-000-001-0003').count(), 0) diff --git a/api/urls.py b/api/urls.py index ced310fd..31dc5d52 100644 --- a/api/urls.py +++ b/api/urls.py @@ -8,4 +8,5 @@ path('case', views.case, name='case'), path('reminders', views.reminders, name='reminders'), path('eligible-jurisdiction', views.eligible_jurisdiction, name='eligible_jurisdiction'), + path('unsubscribe/', views.unsubscribe, name='unsubscribe'), ] diff --git a/api/views.py b/api/views.py index 9052c0e9..c704db06 100644 --- a/api/views.py +++ b/api/views.py @@ -104,6 +104,17 @@ def eligible_jurisdiction(request): return HttpResponse(status=405) +@csrf_exempt +def unsubscribe(request, phone): + formatted_phone = "+1-" + phone + alerts = Alert.objects.filter(to=formatted_phone) + message = '' + if not alerts: + message = f"There are no reminders set for {phone}." + else: + alerts.delete() + message = f"Reminders for {phone} deleted." + return JsonResponse({'message': message}) def find_arraignment_or_return_False(events): for event in events: diff --git a/website/templates/base_generic.html b/website/templates/base_generic.html index f5a6d854..413a6dae 100644 --- a/website/templates/base_generic.html +++ b/website/templates/base_generic.html @@ -14,6 +14,7 @@ {% load static %} + diff --git a/website/templates/index.html b/website/templates/index.html index 9d4a5261..5a7b901b 100644 --- a/website/templates/index.html +++ b/website/templates/index.html @@ -4,6 +4,13 @@
+ {% if messages %} + {% for message in messages %} + {% if message.extra_tags and message.extra_tags == 'unsubscribe' %} +

{{ message }}

+ {% endif %} + {% endfor %} + {% endif %}

Get Court Date Reminders

Text your OSCN Case Number:

@@ -66,8 +73,10 @@

FEWER FINES

{% if messages %} - {% for message in messages %} - {{ message }}

+ {% for message in messages %} + {% if not message.extra_tags %} + {{ message }}

+ {% endif %} {% endfor %} {% endif %}

Fill Out Reminder Form:

@@ -131,12 +140,25 @@

6. How often will I be reminded?

Currently, you will only be reminded once.

-

7. How do I unsubscribe?

-

+

7. How do I contact the people behind CourtBot?

+

You can contact us at courtbotmuskogee@gmail.com.

-

8. How do I contact the people behind CourtBot?

-

You can contact us at courtbotmuskogee@gmail.com.

+

8. How do I unsubscribe?

+

Click unsubscribe to remove reminders.

+ + +
diff --git a/website/urls.py b/website/urls.py index 83cb4ac7..4f2af567 100644 --- a/website/urls.py +++ b/website/urls.py @@ -3,5 +3,6 @@ urlpatterns = [ path('', views.index, name='index'), - path('schedule_reminders', views.schedule_reminders, name='schedule_reminders') + path('schedule_reminders', views.schedule_reminders, name='schedule_reminders'), + path('unsubscribe_reminders', views.unsubscribe_reminders, name='unsubscribe_reminders') ] \ No newline at end of file diff --git a/website/views.py b/website/views.py index 2e08e048..475aff36 100644 --- a/website/views.py +++ b/website/views.py @@ -19,6 +19,9 @@ def index(request): # Render the HTML template index.html with the data in the context variable return render(request, 'index.html') +def unsubscribe(request): + return render(request, ) + def check_valid_case(request): # Process form data and requests arraignment data form api/case case_num = request.POST['case_num'] @@ -42,6 +45,7 @@ def set_case_reminder(arraignment_datetime, case_num, phone_num): "phone_num": f"+1-{phone_num}" }) resp = json.loads(reminder_request.content) + if resp.get('error', None): return False, resp['error'] message = f'Text reminder for case {case_num} occuring on {arraignment_datetime} was scheduled under {phone_num}.' @@ -72,5 +76,14 @@ def schedule_reminders(request): if add_num: _, another_reminder_message = set_case_reminder(arraignment_datetime, case_num, add_num) messages.info(request, another_reminder_message) + return redirect('/#form') +@csrf_exempt +def unsubscribe_reminders(request): + # Remove reminders associated with phone number + phone = request.POST['remove_phone_num'] + remove_request = requests.delete(f"http://localhost:8000/api/unsubscribe/{phone}") + resp = json.loads(remove_request.content) + messages.info(request, resp.get('message', None), extra_tags='unsubscribe') + return redirect('/') \ No newline at end of file From d65702c4a535072144aae95608690cb3754380bc Mon Sep 17 00:00:00 2001 From: Jeremiah Brem Date: Tue, 28 Jul 2020 01:08:25 -0500 Subject: [PATCH 2/9] Update views.py --- website/views.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/website/views.py b/website/views.py index 475aff36..08b017a9 100644 --- a/website/views.py +++ b/website/views.py @@ -83,7 +83,7 @@ def schedule_reminders(request): def unsubscribe_reminders(request): # Remove reminders associated with phone number phone = request.POST['remove_phone_num'] - remove_request = requests.delete(f"http://localhost:8000/api/unsubscribe/{phone}") + remove_request = requests.delete(f"https://courtbot-python.herokuapp.com/api/unsubscribe/{phone}") resp = json.loads(remove_request.content) messages.info(request, resp.get('message', None), extra_tags='unsubscribe') - return redirect('/') \ No newline at end of file + return redirect('/') From 964d86d573a8851c71adfe7f98cae3ec38ebd63e Mon Sep 17 00:00:00 2001 From: Jeremiah Brem Date: Tue, 28 Jul 2020 06:14:33 -0500 Subject: [PATCH 3/9] Update tests.py --- api/tests.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/tests.py b/api/tests.py index 085ffd4b..84c9db51 100644 --- a/api/tests.py +++ b/api/tests.py @@ -29,7 +29,7 @@ def testReminderWithArraignmentIn8Days(self): }) response = reminders(request) resp_json = json.loads(response.content) - self.assertEqual(Alert.objects.all().count(), 2) + self.assertEqual(Alert.objects.count(), 2) self.assertEqual(resp_json['status'], '201 Created') def testReminderWithArraignmentIn2Days(self): From 6eac2db0eec203b37264f51acef4bac8ee781e22 Mon Sep 17 00:00:00 2001 From: Jeremiah Brem Date: Tue, 28 Jul 2020 06:15:50 -0500 Subject: [PATCH 4/9] Update tests.py --- api/tests.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/api/tests.py b/api/tests.py index 84c9db51..b36bdf3e 100644 --- a/api/tests.py +++ b/api/tests.py @@ -29,7 +29,7 @@ def testReminderWithArraignmentIn8Days(self): }) response = reminders(request) resp_json = json.loads(response.content) - self.assertEqual(Alert.objects.count(), 2) + self.assertEqual(Alert.objects.all().count(), 2) self.assertEqual(resp_json['status'], '201 Created') def testReminderWithArraignmentIn2Days(self): @@ -105,7 +105,7 @@ def testUnsubscribe(self): what="test reminder" ) alert.save() - self.assertEqual(Alert.objects.filter(to='+1-000-001-0002').all().count(), 1) + self.assertEqual(Alert.objects.filter(to='+1-000-001-0002').count(), 1) request = self._delete('api/unsubscribe/000-001-0002') response = unsubscribe(request, '000-001-0002') From ad8c9dbaa91b62fd6605c06aab74594aaf44c8fc Mon Sep 17 00:00:00 2001 From: Jeremiah Date: Tue, 28 Jul 2020 09:38:25 -0500 Subject: [PATCH 5/9] update index.html --- website/templates/index.html | 1 + 1 file changed, 1 insertion(+) diff --git a/website/templates/index.html b/website/templates/index.html index 5a7b901b..fb562732 100644 --- a/website/templates/index.html +++ b/website/templates/index.html @@ -152,6 +152,7 @@

8. How do I unsubscribe?