From: Magnus Hagander Date: Thu, 26 Apr 2018 19:33:39 +0000 (+0200) Subject: Make it possible to view reports on anonymized data X-Git-Tag: FINAL_PY2~338 X-Git-Url: http://git.postgresql.org/gitweb/static/benefitdownload/file?a=commitdiff_plain;h=b24ddca64198522cbcc82c1589456508f6e0dfdd;p=pgeu-web.git Make it possible to view reports on anonymized data In particular, make it possible to view tshirt size distributions even after we have anonymized the data, since we keep aggregates on it. --- diff --git a/postgresqleu/confreg/reports.py b/postgresqleu/confreg/reports.py index d28e5d2..8858440 100644 --- a/postgresqleu/confreg/reports.py +++ b/postgresqleu/confreg/reports.py @@ -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", diff --git a/postgresqleu/confreg/views.py b/postgresqleu/confreg/views.py index ba56c89..81c469c 100644 --- a/postgresqleu/confreg/views.py +++ b/postgresqleu/confreg/views.py @@ -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()