Mitja Nikolaus | 6a67913 | 2018-08-30 14:35:29 +0200 | [diff] [blame] | 1 | """Views for the Hiccup statistics.""" |
| 2 | |
Mitja Nikolaus | cb50f2c | 2018-08-24 13:54:48 +0200 | [diff] [blame] | 3 | from django.http import HttpResponse, Http404, HttpResponseRedirect |
Dirk Vogt | 62ff7f2 | 2017-05-04 16:07:21 +0200 | [diff] [blame] | 4 | from django.template import loader |
Dirk Vogt | 62ff7f2 | 2017-05-04 16:07:21 +0200 | [diff] [blame] | 5 | from django.contrib.auth.decorators import user_passes_test |
Dirk Vogt | 57a615d | 2017-05-04 22:29:54 +0200 | [diff] [blame] | 6 | from django import forms |
| 7 | from django.contrib import messages |
| 8 | from django.urls import reverse |
Dirk Vogt | 62ff7f2 | 2017-05-04 16:07:21 +0200 | [diff] [blame] | 9 | |
Mitja Nikolaus | bcaf502 | 2018-08-30 16:40:38 +0200 | [diff] [blame] | 10 | from crashreports.models import Device |
Mitja Nikolaus | 0b1aa8c | 2018-09-14 15:33:29 +0200 | [diff] [blame] | 11 | from crashreports.permissions import user_is_hiccup_staff |
Dirk Vogt | 62ff7f2 | 2017-05-04 16:07:21 +0200 | [diff] [blame] | 12 | |
Dirk Vogt | 57a615d | 2017-05-04 22:29:54 +0200 | [diff] [blame] | 13 | |
| 14 | class DeviceUUIDForm(forms.Form): |
Mitja Nikolaus | 6a67913 | 2018-08-30 14:35:29 +0200 | [diff] [blame] | 15 | """Form for searching devices by UUID.""" |
| 16 | |
Mitja Nikolaus | cb50f2c | 2018-08-24 13:54:48 +0200 | [diff] [blame] | 17 | uuid = forms.CharField(label="Device UUID:", max_length=100) |
| 18 | |
Dirk Vogt | 57a615d | 2017-05-04 22:29:54 +0200 | [diff] [blame] | 19 | |
Mitja Nikolaus | 0b1aa8c | 2018-09-14 15:33:29 +0200 | [diff] [blame] | 20 | @user_passes_test(user_is_hiccup_staff) |
Dirk Vogt | 62ff7f2 | 2017-05-04 16:07:21 +0200 | [diff] [blame] | 21 | def device_stats(request): |
Mitja Nikolaus | 6a67913 | 2018-08-30 14:35:29 +0200 | [diff] [blame] | 22 | """Respond with statistics for a specific device.""" |
Mitja Nikolaus | cb50f2c | 2018-08-24 13:54:48 +0200 | [diff] [blame] | 23 | template = loader.get_template("crashreport_stats/device.html") |
| 24 | uuid = request.GET.get("uuid", "NO_UUID") |
Dirk Vogt | 57a615d | 2017-05-04 22:29:54 +0200 | [diff] [blame] | 25 | if not Device.objects.filter(uuid=uuid).exists(): |
| 26 | raise Http404("Device doesn't exist.") |
Mitja Nikolaus | cb50f2c | 2018-08-24 13:54:48 +0200 | [diff] [blame] | 27 | return HttpResponse(template.render({"uuid": uuid}, request)) |
| 28 | |
Dirk Vogt | 1accb67 | 2017-05-10 14:07:42 +0200 | [diff] [blame] | 29 | |
Mitja Nikolaus | 0b1aa8c | 2018-09-14 15:33:29 +0200 | [diff] [blame] | 30 | @user_passes_test(user_is_hiccup_staff) |
Dirk Vogt | 1accb67 | 2017-05-10 14:07:42 +0200 | [diff] [blame] | 31 | def versions_all_overview(request): |
Mitja Nikolaus | 6a67913 | 2018-08-30 14:35:29 +0200 | [diff] [blame] | 32 | """Respond with the distribution of official release versions.""" |
Mitja Nikolaus | cb50f2c | 2018-08-24 13:54:48 +0200 | [diff] [blame] | 33 | template = loader.get_template("crashreport_stats/versions.html") |
| 34 | return HttpResponse(template.render({"is_official_release": "1"}, request)) |
| 35 | |
Dirk Vogt | 1accb67 | 2017-05-10 14:07:42 +0200 | [diff] [blame] | 36 | |
Mitja Nikolaus | 0b1aa8c | 2018-09-14 15:33:29 +0200 | [diff] [blame] | 37 | @user_passes_test(user_is_hiccup_staff) |
Dirk Vogt | 1accb67 | 2017-05-10 14:07:42 +0200 | [diff] [blame] | 38 | def versions_overview(request): |
Mitja Nikolaus | 6a67913 | 2018-08-30 14:35:29 +0200 | [diff] [blame] | 39 | """Respond with the distribution of non-official release versions.""" |
Mitja Nikolaus | cb50f2c | 2018-08-24 13:54:48 +0200 | [diff] [blame] | 40 | template = loader.get_template("crashreport_stats/versions.html") |
| 41 | return HttpResponse(template.render({"is_official_release": "2"}, request)) |
| 42 | |
Dirk Vogt | 1accb67 | 2017-05-10 14:07:42 +0200 | [diff] [blame] | 43 | |
Mitja Nikolaus | 0b1aa8c | 2018-09-14 15:33:29 +0200 | [diff] [blame] | 44 | @user_passes_test(user_is_hiccup_staff) |
Dirk Vogt | 57a615d | 2017-05-04 22:29:54 +0200 | [diff] [blame] | 45 | def home(request): |
Mitja Nikolaus | 6a67913 | 2018-08-30 14:35:29 +0200 | [diff] [blame] | 46 | """Respond with a form for searching devices by UUID. |
| 47 | |
| 48 | When using a HTTP GET method, the search device form view is returned. |
| 49 | The response additionally includes possible results if a HTTP POST message |
| 50 | was sent. If a single device was found, a redirect to the device |
| 51 | statistics of that device is sent. |
| 52 | """ |
Dirk Vogt | b0b8b51 | 2017-12-05 14:46:03 +0100 | [diff] [blame] | 53 | devices = None |
Mitja Nikolaus | cb50f2c | 2018-08-24 13:54:48 +0200 | [diff] [blame] | 54 | if request.method == "POST": |
Dirk Vogt | 57a615d | 2017-05-04 22:29:54 +0200 | [diff] [blame] | 55 | # create a form instance and populate it with data from the request: |
| 56 | form = DeviceUUIDForm(request.POST) |
| 57 | if form.is_valid(): |
Mitja Nikolaus | cb50f2c | 2018-08-24 13:54:48 +0200 | [diff] [blame] | 58 | uuid = form.cleaned_data["uuid"] |
Dirk Vogt | 57a615d | 2017-05-04 22:29:54 +0200 | [diff] [blame] | 59 | if not Device.objects.filter(uuid=uuid).exists(): |
Dirk Vogt | b0b8b51 | 2017-12-05 14:46:03 +0100 | [diff] [blame] | 60 | devices = Device.objects.filter(uuid__startswith=uuid) |
Mitja Nikolaus | cb50f2c | 2018-08-24 13:54:48 +0200 | [diff] [blame] | 61 | if len(devices) == 1: |
Dirk Vogt | b0b8b51 | 2017-12-05 14:46:03 +0100 | [diff] [blame] | 62 | return HttpResponseRedirect( |
Mitja Nikolaus | cb50f2c | 2018-08-24 13:54:48 +0200 | [diff] [blame] | 63 | reverse("hiccup_stats_device") |
| 64 | + "?uuid=" |
| 65 | + devices[0].uuid |
| 66 | ) |
Mitja Nikolaus | d9fbfd6 | 2018-08-30 17:38:51 +0200 | [diff] [blame] | 67 | if not devices: |
Mitja Nikolaus | cb50f2c | 2018-08-24 13:54:48 +0200 | [diff] [blame] | 68 | messages.warning(request, "No devices found.") |
Dirk Vogt | 57a615d | 2017-05-04 22:29:54 +0200 | [diff] [blame] | 69 | else: |
Dirk Vogt | b0b8b51 | 2017-12-05 14:46:03 +0100 | [diff] [blame] | 70 | return HttpResponseRedirect( |
Mitja Nikolaus | cb50f2c | 2018-08-24 13:54:48 +0200 | [diff] [blame] | 71 | reverse("hiccup_stats_device") + "?uuid=" + uuid |
| 72 | ) |
Dirk Vogt | 57a615d | 2017-05-04 22:29:54 +0200 | [diff] [blame] | 73 | else: |
| 74 | form = DeviceUUIDForm() |
Mitja Nikolaus | cb50f2c | 2018-08-24 13:54:48 +0200 | [diff] [blame] | 75 | template = loader.get_template("crashreport_stats/home.html") |
| 76 | return HttpResponse( |
| 77 | template.render({"form": form, "devices": devices}, request) |
| 78 | ) |