blob: 54a09f0f021592be06b63130ce0d67d305f10ee2 [file] [log] [blame]
Dirk Vogtf130c752016-08-23 14:45:01 +02001# -*- coding: utf-8 -*-
2from django.shortcuts import render_to_response
3from django.shortcuts import render
4from django.http import HttpResponseRedirect
5from django.http import HttpResponse
6from django.core.urlresolvers import reverse
7
8from crashreports.models import Crashreport
9from crashreports.forms import CrashreportForm
10from django.views.decorators.csrf import csrf_exempt
11from django.http import Http404
12
13from django.contrib.auth.decorators import login_required
14from django.db.models import Count
Dirk Vogtd1345212016-09-14 14:31:45 +020015from rest_framework import viewsets
16from serializers import CrashReportSerializer
17from rest_framework.permissions import BasePermission
18from rest_framework import filters
19from rest_framework import generics
20import django_filters
21from django.template import loader
22
Dirk Vogtf130c752016-08-23 14:45:01 +020023
24import datetime
25import time
26
Dirk Vogtd1345212016-09-14 14:31:45 +020027from ratelimit.decorators import ratelimit
28
29@ratelimit( key='ip', rate='100/h')
Dirk Vogtf130c752016-08-23 14:45:01 +020030@csrf_exempt
31def 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 Vogtd1345212016-09-14 14:31:45 +020054 return HttpResponse(status=400)
55
56class 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
66class 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 Vogtf130c752016-08-23 14:45:01 +020070
71
Dirk Vogtd1345212016-09-14 14:31:45 +020072class 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 Vogtf130c752016-08-23 14:45:01 +020079
Dirk Vogtd1345212016-09-14 14:31:45 +020080
81class 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