Make it possible to view reports on anonymized data
authorMagnus Hagander <magnus@hagander.net>
Thu, 26 Apr 2018 19:33:39 +0000 (21:33 +0200)
committerMagnus Hagander <magnus@hagander.net>
Fri, 27 Apr 2018 13:59:08 +0000 (15:59 +0200)
In particular, make it possible to view tshirt size distributions even
after we have anonymized the data, since we keep aggregates on it.

postgresqleu/confreg/reports.py
postgresqleu/confreg/views.py

index d28e5d2bc9019209f69a8c865beb00e385889b6a..885844054a20512b84241eb6a0eac228b7f9fbfa 100644 (file)
@@ -259,6 +259,7 @@ simple_reports = {
        'unconfirmspeaker': 'SELECT fullname AS "Name", u.email AS "E-mail", title AS "Title" FROM confreg_speaker spk INNER JOIN confreg_conferencesession_speaker css ON spk.id=css.speaker_id INNER JOIN confreg_conferencesession s ON css.conferencesession_id=s.id INNER JOIN auth_user u ON u.id=spk.user_id WHERE s.conference_id=%(confid)s AND s.status=3 ORDER BY fullname',
        'sessionstatus': 'SELECT ss.id AS _id, statustext AS "Status",count(*) AS "Count", NULL as "Sum" FROM confreg_conferencesession s INNER JOIN confreg_status_strings ss ON ss.id=s.status WHERE conference_id=%(confid)s GROUP BY ss.id UNION ALL SELECT 10000, statusgroup, NULL, count(*) FROM confreg_conferencesession s INNER JOIN confreg_status_strings ss ON ss.id=s.status WHERE conference_id=%(confid)s AND statusgroup IS NOT NULL GROUP BY statusgroup ORDER BY 1',
        'tshirtsizes': 'SELECT shirtsize AS "Size", count(*) AS "Num", round(count(*)*100/sum(count(*)) over ()) AS "Percent" FROM confreg_conferenceregistration r INNER JOIN confreg_shirtsize s ON s.id=r.shirtsize_id WHERE r.conference_id=%(confid)s AND payconfirmedat IS NOT NULL GROUP BY shirtsize_id, shirtsize ORDER BY shirtsize_id',
+       'tshirtsizes__anon': 'SELECT shirtsize AS "Size", num as "Num", round(num*100/sum(num) over (), 0) AS "Percent" FROM confreg_aggregatedtshirtsizes t INNER JOIN confreg_shirtsize s ON s.id=t.size_id WHERE t.conference_id=%(confid)s ORDER BY size_id',
        'countries': 'SELECT printable_name AS "Country", count(*) AS "Registrations" FROM confreg_conferenceregistration INNER JOIN country ON country.iso=country_id WHERE payconfirmedat IS NOT NULL AND conference_id=%(confid)s GROUP BY printable_name ORDER BY 2 DESC',
        'regdays': 'SELECT day,count(*) FROM confreg_registrationday d INNER JOIN confreg_registrationtype_days rd ON rd.registrationday_id=d.id INNER JOIN confreg_registrationtype rt ON rt.id=rd.registrationtype_id INNER JOIN confreg_conferenceregistration r ON r.regtype_id=rt.id WHERE r.conference_id=%(confid)s AND payconfirmedat IS NOT NULL GROUP BY day ORDER BY day',
        'sessnoroom': "SELECT title AS \"Title\", trackname AS \"Track\", starttime || ' - ' || endtime AS \"Timeslot\" FROM confreg_conferencesession s LEFT JOIN confreg_track t ON t.id=s.track_id WHERE s.conference_id=%(confid)s AND status=1 AND room_id IS NULL",
index ba56c8919166eb70c586af8df6b6b78371c85ea0..81c469c5721e7ef418f9ef787b95a0226354eb16 100644 (file)
@@ -2334,11 +2334,19 @@ def simple_report(request, confname):
 
        from reports import simple_reports
 
+       if "__" in request.GET['report']:
+               raise Http404("Invalid character in report name")
+
        if not simple_reports.has_key(request.GET['report']):
                raise Http404("Report not found")
 
+       if conference.personal_data_purged and simple_reports.has_key('{0}__anon'.format(request.GET['report'])):
+               query = simple_reports['{0}__anon'.format(request.GET['report'])]
+       else:
+               query = simple_reports[request.GET['report']]
+
        curs = connection.cursor()
-       curs.execute(simple_reports[request.GET['report']], {
+       curs.execute(query, {
                'confid': conference.id,
                })
        d = curs.fetchall()