From 81c65acab9dc3ad688542d818291ba569b70c1d0 Mon Sep 17 00:00:00 2001
From: Piotr Gawron <piotr.gawron@uni.lu>
Date: Tue, 24 Nov 2020 12:23:43 +0100
Subject: [PATCH] for nont obligatory privacy notice just show the notification
 that can be dismissed

---
 smash/web/api_urls.py          |  1 +
 smash/web/api_views/worker.py  |  9 ++++++++
 smash/web/templates/_base.html | 40 ++++++++++++++++++++++++++++++----
 smash/web/views/__init__.py    |  9 +++++++-
 4 files changed, 54 insertions(+), 5 deletions(-)

diff --git a/smash/web/api_urls.py b/smash/web/api_urls.py
index 11a02b7b..a3baf735 100644
--- a/smash/web/api_urls.py
+++ b/smash/web/api_urls.py
@@ -64,6 +64,7 @@ urlpatterns = [
 
     url(r'^workers/add_extra_availability/(?P<worker_id>\d+)/(?P<start_str_date>\d{4}-\d{2}-\d{2}-\d{2}-\d{2})/(?P<end_str_date>\d{4}-\d{2}-\d{2}-\d{2}-\d{2})/$', 
         worker.add_worker_extra_availability, name='web.api.workers.add_extra_availability'),
+    url(r'^worker/accept_privacy_notice/$', worker.accept_privacy_notice, name='web.api.workers.accept_privacy_notice'),
 
     # daily planning data
     url(r'^daily_planning/workers/$', worker.workers_for_daily_planning, name='web.api.workers.daily_planning'),
diff --git a/smash/web/api_views/worker.py b/smash/web/api_views/worker.py
index c956782d..2ecf1a00 100644
--- a/smash/web/api_views/worker.py
+++ b/smash/web/api_views/worker.py
@@ -26,6 +26,15 @@ def units(request):
         "units": [x[0] for x in workers]
     })
 
+
+def accept_privacy_notice(request):
+    worker = Worker.get_by_user(request.user)
+    worker.privacy_notice_accepted = True
+    worker.save()
+    return JsonResponse({
+        "status": 'ok'
+    })
+
 def workers_for_daily_planning(request):
     start_date = request.GET.get('start_date')
     workers = get_workers_for_daily_planning(request)
diff --git a/smash/web/templates/_base.html b/smash/web/templates/_base.html
index b5ec2ee0..688db99e 100644
--- a/smash/web/templates/_base.html
+++ b/smash/web/templates/_base.html
@@ -32,6 +32,8 @@
         <script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script>
         <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
         <![endif]-->
+        <script src="https://cdn.jsdelivr.net/npm/cookieconsent@3/build/cookieconsent.min.js"></script>
+        <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/cookieconsent@3/build/cookieconsent.min.css">
     {% endblock styles %}
 </head>
 <!--
@@ -73,7 +75,7 @@ desired effect
             <a href="#" class="sidebar-toggle" data-toggle="offcanvas" role="button">
                 <span class="sr-only">Toggle navigation</span>
             </a>
-            
+
               <div class="col-xs-7 navbar-text" style="margin-left: 0px">
                 <div class="warning_ticker">
                   <div class="ticker_list">
@@ -388,7 +390,7 @@ desired effect
               mousePause: 1
             });
         }else if($('.ticker_list').children().length == 1){
-          
+
         }else{
           $('.warning_ticker').css('display', 'none');
         }
@@ -397,12 +399,42 @@ desired effect
             var $e = $(".sidebar-menu li[data-desc='" + page_to_activate + "']");
             $e.addClass("active");
             if($($e).parents('li[data-desc]').length > 0){ //if there is a parent, it should also be active
-              $($e).parents('li[data-desc]').addClass("active");  
+              $($e).parents('li[data-desc]').addClass("active");
             }
-            
+
         };
 
         activate({% block ui_active_tab %}{% endblock ui_active_tab %});
+        if ("{{ show_notice }}".toLowerCase() === "true") {
+            window.cookieconsent.initialise({
+                container: document.getElementById("content"),
+                content: {
+                    header: 'Privacy notice!',
+                    message: '{{ study.study_privacy_notice.summary}}',
+                    href: '{{ study.study_privacy_notice.document.url }}',
+                    dismiss: 'Got it!',
+                },
+                palette: {
+                    popup: {background: "#fff"},
+                    button: {background: "#aa0000"},
+                },
+                revokable: true,
+                onStatusChange: function (status) {
+                    if (this.hasConsented()) {
+                        $.ajax({
+                            url: "{% url 'web.api.workers.accept_privacy_notice' %}",
+                            success: function (result) {
+                                if (result.isOk === false) console.log(result.message);
+                            },
+                            async: false
+                        });
+                    }
+                },
+                law: {
+                    regionalLaw: false,
+                }
+            });
+        }
     </script>
 
     {% comment "TODO: Check, and add if works %}
diff --git a/smash/web/views/__init__.py b/smash/web/views/__init__.py
index a7dcf170..779ba855 100644
--- a/smash/web/views/__init__.py
+++ b/smash/web/views/__init__.py
@@ -1,5 +1,6 @@
 # coding=utf-8
 from django.conf import settings
+from django.http import HttpRequest
 from django.shortcuts import redirect, render
 from django.views.generic.base import ContextMixin
 
@@ -41,13 +42,16 @@ def wrap_response(request, template, params):
     return render(request, template, final_params)
 
 
-def extend_context(params, request):
+def extend_context(params, request: HttpRequest):
     study = Study.get_by_id(GLOBAL_STUDY_ID)
     person = Worker.get_by_user(request.user) # None if AnonymousUser or no Worker associated
     permissions = set()
+    show_notice = True
     if person is not None:
         role = person.role
         permissions = person.get_permissions(study)
+        show_notice = study.study_privacy_notice \
+                      and not person.privacy_notice_accepted
         person = str(person)
     else:
         #use full name if available, username otherwise
@@ -56,6 +60,8 @@ def extend_context(params, request):
         else:
             person = request.user.get_username()
         role   = '<No worker information>'
+    if request.resolver_match is not None and request.resolver_match.url_name == 'web.views.accept_privacy_notice':
+        show_notice = False
     notifications = get_notifications(request.user)
     final_params = params.copy()
     final_params.update({
@@ -65,6 +71,7 @@ def extend_context(params, request):
         'person': person,
         'role': role,
         'notifications': notifications,
+        'show_notice' : show_notice,
         'study_id': GLOBAL_STUDY_ID,
         'study' : study
     })
-- 
GitLab