Dirk Vogt | f130c75 | 2016-08-23 14:45:01 +0200 | [diff] [blame] | 1 | # -*- coding: utf-8 -*- |
| 2 | from django.shortcuts import render_to_response |
| 3 | from django.shortcuts import render |
| 4 | from django.http import HttpResponseRedirect |
| 5 | from django.http import HttpResponse |
| 6 | from django.core.urlresolvers import reverse |
| 7 | |
| 8 | from crashreports.models import Crashreport |
| 9 | from crashreports.forms import CrashreportForm |
| 10 | from django.views.decorators.csrf import csrf_exempt |
| 11 | from django.http import Http404 |
| 12 | |
| 13 | from django.contrib.auth.decorators import login_required |
| 14 | from django.db.models import Count |
Dirk Vogt | d134521 | 2016-09-14 14:31:45 +0200 | [diff] [blame^] | 15 | from rest_framework import viewsets |
| 16 | from serializers import CrashReportSerializer |
| 17 | from rest_framework.permissions import BasePermission |
| 18 | from rest_framework import filters |
| 19 | from rest_framework import generics |
| 20 | import django_filters |
| 21 | from django.template import loader |
| 22 | |
Dirk Vogt | f130c75 | 2016-08-23 14:45:01 +0200 | [diff] [blame] | 23 | |
| 24 | import datetime |
| 25 | import time |
| 26 | |
Dirk Vogt | d134521 | 2016-09-14 14:31:45 +0200 | [diff] [blame^] | 27 | from ratelimit.decorators import ratelimit |
| 28 | |
| 29 | @ratelimit( key='ip', rate='100/h') |
Dirk Vogt | f130c75 | 2016-08-23 14:45:01 +0200 | [diff] [blame] | 30 | @csrf_exempt |
| 31 | def index(request): |
| 32 | # Handle file upload` |
| 33 | if request.method == 'POST': |
| 34 | form = CrashreportForm(request.POST, request.FILES) |
| 35 | if form.is_valid(): |
| 36 | new_cr = Crashreport(uuid=form.cleaned_data['uuid'], |
| 37 | aux_data=form.cleaned_data['aux_data'], |
| 38 | uptime=form.cleaned_data['uptime'], |
| 39 | boot_reason=form.cleaned_data['boot_reason'], |
| 40 | power_on_reason=form.cleaned_data['power_on_reason'], |
| 41 | power_off_reason=form.cleaned_data['power_off_reason'], |
| 42 | build_fingerprint=form.cleaned_data['build_fingerprint'], |
| 43 | date=form.cleaned_data['date']) |
| 44 | try: |
| 45 | new_cr.crashreport_file = request.FILES['crashreport'] |
| 46 | except: |
| 47 | new_cr.crashreport_file = None |
| 48 | new_cr.save() |
| 49 | # Redirect to the document list after POST |
| 50 | return HttpResponse(status=204) |
| 51 | else: |
| 52 | return HttpResponse(status=400) |
| 53 | else: |
Dirk Vogt | d134521 | 2016-09-14 14:31:45 +0200 | [diff] [blame^] | 54 | return HttpResponse(status=400) |
| 55 | |
| 56 | class IsCreationOrIsAuthenticated(BasePermission): |
| 57 | def has_permission(self, request, view): |
| 58 | if not request.user.is_authenticated(): |
| 59 | if view.action == 'create': |
| 60 | return True |
| 61 | else: |
| 62 | return False |
| 63 | else: |
| 64 | return True |
| 65 | |
| 66 | class ListFilter(django_filters.Filter): |
| 67 | def filter(self, qs, value): |
| 68 | value_list = value.split(u',') |
| 69 | return super(ListFilter, self).filter(qs, django_filters.fields.Lookup(value_list, 'in')) |
Dirk Vogt | f130c75 | 2016-08-23 14:45:01 +0200 | [diff] [blame] | 70 | |
| 71 | |
Dirk Vogt | d134521 | 2016-09-14 14:31:45 +0200 | [diff] [blame^] | 72 | class CrashreportFilter(filters.FilterSet): |
| 73 | start_date = django_filters.DateTimeFilter(name="date", lookup_expr='gte') |
| 74 | end_date = django_filters.DateTimeFilter(name="date", lookup_expr='lte') |
| 75 | boot_reason = ListFilter(name='boot_reason') |
| 76 | class Meta: |
| 77 | model = Crashreport |
| 78 | fields = ['build_fingerprint','boot_reason', 'power_on_reason', 'power_off_reason'] |
Dirk Vogt | f130c75 | 2016-08-23 14:45:01 +0200 | [diff] [blame] | 79 | |
Dirk Vogt | d134521 | 2016-09-14 14:31:45 +0200 | [diff] [blame^] | 80 | |
| 81 | class CrashreportViewSet(viewsets.ModelViewSet): |
| 82 | queryset = Crashreport.objects.all() |
| 83 | serializer_class = CrashReportSerializer |
| 84 | permission_classes = [IsCreationOrIsAuthenticated] |
| 85 | filter_backends = (filters.DjangoFilterBackend,) |
| 86 | filter_class = CrashreportFilter |