Use proper Status code in tests| ADD Logfile upload
diff --git a/crashreports/models.py b/crashreports/models.py
index be44b57..0a06a6f 100644
--- a/crashreports/models.py
+++ b/crashreports/models.py
@@ -42,8 +42,8 @@
 def crashreport_file_name(instance, filename):
     return '/'.join([
         "crashreport_uploads",
-        instance.device.uuid,
-        instance.crashreport.id,
+        instance.crashreport.device.uuid,
+        str(instance.crashreport.id),
         str(instance.crashreport.date),
         filename])
 
@@ -60,7 +60,7 @@
     date = models.DateTimeField()
     tags = TaggableManager(blank=True)
     device_local_id = models.PositiveIntegerField(blank=True)
-    next_crashreport_key = models.PositiveIntegerField(default=1)
+    next_logfile_key = models.PositiveIntegerField(default=1)
 
     @transaction.atomic
     def get_logfile_key(self):
@@ -87,8 +87,8 @@
     crashreport_local_id = models.PositiveIntegerField(blank=True)
 
     def save(self, *args, **kwargs):
-        if not self.device_local_id:
-            self.device_local_id = self.crashreport.next_logfile_key()
+        if not self.crashreport_local_id:
+            self.crashreport_local_id = self.crashreport.get_logfile_key()
         super(LogFile, self).save(*args, **kwargs)
 
 
diff --git a/crashreports/rest_api_crashreports.py b/crashreports/rest_api_crashreports.py
index 606e2b7..93eabb7 100644
--- a/crashreports/rest_api_crashreports.py
+++ b/crashreports/rest_api_crashreports.py
@@ -3,8 +3,6 @@
 from django.shortcuts import get_object_or_404
 from crashreports.permissions import HasRightsOrIsDeviceOwnerDeviceCreation
 from crashreports.serializers import CrashReportSerializer
-from rest_framework import exceptions
-import traceback 
 
 
 class ListCreateView(generics.ListCreateAPIView):
diff --git a/crashreports/rest_api_logfiles.py b/crashreports/rest_api_logfiles.py
index 7033c55..c37685b 100644
--- a/crashreports/rest_api_logfiles.py
+++ b/crashreports/rest_api_logfiles.py
@@ -7,7 +7,6 @@
 from rest_framework.exceptions import PermissionDenied
 from rest_framework.exceptions import NotFound
 
-
 from rest_framework.response import Response
 from crashreports.models import LogFile
 from crashreports.models import Crashreport
@@ -16,16 +15,19 @@
 
 
 @api_view(http_method_names=['POST'], )
-@parser_classes(FileUploadParser)
-@permission_classes(IsAuthenticated,)
-def logfile_put(request):
+@parser_classes([FileUploadParser, ])
+@permission_classes([IsAuthenticated, ])
+def logfile_put(request, uuid, device_local_id, filename):
     try:
-        crashreport = Crashreport.objects.get(crashreport_pk)
+        crashreport = Crashreport.objects.get(device__uuid=uuid,
+                                              device_local_id=device_local_id)
     except:
-        raise NotFound(detail="crashreport does not exist")
+        raise NotFound(detail="Crashreport does not exist.")
+
     if (not (user_owns_uuid(request.user, crashreport.device.uuid)
              or user_is_hiccup_staff(request.user))):
         raise PermissionDenied(detail="Not allowed.")
-    logfile = LogFile(crashreport=crashreport, logfile=request.data["file"])
+    f = request.data["file"]
+    logfile = LogFile(crashreport=crashreport, logfile=f)
     logfile.save()
-    return Response(201, data={'result': 'ok'})
+    return Response(status=201)
diff --git a/crashreports/serializers.py b/crashreports/serializers.py
index d04c384..3fb9aac 100644
--- a/crashreports/serializers.py
+++ b/crashreports/serializers.py
@@ -42,7 +42,7 @@
 
 
 class HeartBeatSerializer(serializers.ModelSerializer):
-    permission_classes = (permissions.AllowAny,)
+    permission_classes = (permissions.IsAuthenticated,)
     uuid = serializers.CharField(max_length=64)
     id = PrivateField()
     device_local_id = serializers.IntegerField(required=False)
diff --git a/crashreports/tests.py b/crashreports/tests.py
index aee66d2..c18e482 100644
--- a/crashreports/tests.py
+++ b/crashreports/tests.py
@@ -1,7 +1,9 @@
 from django.contrib.auth.models import User
 from rest_framework.test import APITestCase
 from rest_framework.test import APIClient
+from rest_framework import status
 import datetime
+import tempfile
 
 # Create your tests here.
 
@@ -15,7 +17,7 @@
         request = self.client.post("/hiccup/api/v1/devices/register/", {})
         self.assertTrue("token" in request.data)
         self.assertTrue("uuid" in request.data)
-        self.assertEqual(request.status_code, 200)
+        self.assertEqual(request.status_code, status.HTTP_200_OK)
 
 # Create your tests here.
 
@@ -40,20 +42,20 @@
         request = client.get("/hiccup/api/v1/devices/", {})
         self.assertTrue("uuid" in request.data[1])
         self.assertTrue(len(request.data) >= 3)
-        self.assertEqual(request.status_code, 200)
+        self.assertEqual(request.status_code, status.HTTP_200_OK)
         client.logout()
 
     def test_device_list_unauth(self):
         client = APIClient()
         request = client.get("/hiccup/api/v1/devices/", {})
-        self.assertEqual(request.status_code, 401)
+        self.assertEqual(request.status_code, status.HTTP_401_UNAUTHORIZED)
 
     def test_retrieve_device_auth(self):
         client = APIClient()
         client.login(username='myuser', password='test')
         request = client.get(
             "/hiccup/api/v1/devices/{}/".format(self.uuid_to_retrieve), {})
-        self.assertEqual(request.status_code, 200)
+        self.assertEqual(request.status_code, status.HTTP_200_OK)
         self.assertEqual(request.data['uuid'],  str(self.uuid_to_retrieve))
         self.assertEqual(request.data['token'],  self.token_to_retrieve)
         client.logout()
@@ -62,7 +64,7 @@
         client = APIClient()
         request = client.get(
             "/hiccup/api/v1/devices/{}/".format(self.uuid_to_retrieve), {})
-        self.assertEqual(request.status_code, 401)
+        self.assertEqual(request.status_code, status.HTTP_401_UNAUTHORIZED)
 
     def test_delete_device_auth(self):
         client = APIClient()
@@ -70,10 +72,10 @@
         url = "/hiccup/api/v1/devices/{}/".format(self.uuid_to_delete)
         request = client.delete(
             url.format(self.uuid_to_delete), {})
-        self.assertEqual(request.status_code, 204)
+        self.assertEqual(request.status_code, status.HTTP_204_NO_CONTENT)
         request = client.delete(
             url.format(self.uuid_to_delete), {})
-        self.assertEqual(request.status_code, 404)
+        self.assertEqual(request.status_code, status.HTTP_404_NOT_FOUND)
         client.logout()
 
 
@@ -115,28 +117,28 @@
 
     def test_create_no_auth(self):
         request = self.noauth_client.post(self.url, self.data)
-        self.assertEqual(request.status_code, 401)
+        self.assertEqual(request.status_code, status.HTTP_401_UNAUTHORIZED)
 
     def test_create_as_admin(self):
         request = self.admin.post(self.url, self.data)
-        self.assertEqual(request.status_code, 201)
+        self.assertEqual(request.status_code, status.HTTP_201_CREATED)
         self.assertTrue(request.data['id'] > 0)
 
     def test_create_as_admin_not_existing_device(self):
         request = self.admin.post(self.url,
                                   self.create_dummy_data())
-        self.assertEqual(request.status_code, 404)
+        self.assertEqual(request.status_code, status.HTTP_404_NOT_FOUND)
 
     def test_create_as_uuid_owner(self):
         request = self.user.post(self.url,
                                  self.create_dummy_data(self.uuid))
-        self.assertEqual(request.status_code, 201)
+        self.assertEqual(request.status_code, status.HTTP_201_CREATED)
         self.assertTrue(request.data['id'] == -1)
 
     def test_create_as_uuid_not_owner(self):
         request = self.user.post(self.url,
                                  self.create_dummy_data(self.other_uuid))
-        self.assertEqual(request.status_code, 403)
+        self.assertEqual(request.status_code, status.HTTP_403_FORBIDDEN)
 
     def post_multiple(self, client, data, count=5):
         for i in range(count):
@@ -146,10 +148,11 @@
         count = 5
         self.post_multiple(self.user, self.data, count)
         request = self.admin.get(self.url)
-        self.assertEqual(request.status_code, 200)
+        self.assertEqual(request.status_code, status.HTTP_200_OK)
         self.assertTrue(len(request.data) == count)
 
-    def test_retrieve_single(self, user=None, expected_result=200):
+    def test_retrieve_single(self, user=None,
+                             expected_result=status.HTTP_200_OK):
         count = 5
         if user is None:
             user = self.admin
@@ -159,27 +162,31 @@
         self.assertEqual(request.status_code, expected_result)
 
     def test_retrieve_single_noauth(self):
-        self.test_retrieve_single(user=self.user, expected_result=403)
+        self.test_retrieve_single(user=self.user,
+                                  expected_result=status.HTTP_403_FORBIDDEN)
 
     def test_retrieve_single_device_owner(self):
-        self.test_retrieve_single(self.noauth_client, 401)
+        self.test_retrieve_single(self.noauth_client,
+                                  status.HTTP_401_UNAUTHORIZED)
 
-    def test_retrieve_single_by_device(self, user=None, expected_result=200):
+    def test_retrieve_single_by_device(self, user=None,
+                                       expected_result=status.HTTP_200_OK):
         count = 5
         if user is None:
             user = self.admin
         self.post_multiple(self.user, self.data, count)
         url = "{}1/".format(self.url_by_uuid.format(self.uuid))
-        print(url)
         request = user.get(url)
         self.assertEqual(request.status_code, expected_result)
 
     def test_retrieve_single_by_device_noauth(self):
-        self.test_retrieve_single_by_device(user=self.user,
-                                            expected_result=403)
+        self.test_retrieve_single_by_device(
+            user=self.user,
+            expected_result=status.HTTP_403_FORBIDDEN)
 
     def test_retrieve_single_by_device_device_owner(self):
-        self.test_retrieve_single_by_device(self.noauth_client, 401)
+        self.test_retrieve_single_by_device(
+            self.noauth_client, status.HTTP_401_UNAUTHORIZED)
 
     def test_list_by_uuid(self):
         count = 5
@@ -188,20 +195,20 @@
                            count)
         url = self.url_by_uuid.format(self.uuid)
         request = self.admin.get(url)
-        self.assertEqual(request.status_code, 200)
+        self.assertEqual(request.status_code, status.HTTP_200_OK)
         self.assertTrue(len(request.data) == count)
 
     def test_list_noauth(self):
         count = 5
         self.post_multiple(self.user, self.data, count)
         request = self.noauth_client.get(self.url)
-        self.assertEqual(request.status_code, 401)
+        self.assertEqual(request.status_code, status.HTTP_401_UNAUTHORIZED)
 
     def test_list_device_owner(self):
         count = 5
         self.post_multiple(self.user, self.data, count)
         request = self.user.get(self.url)
-        self.assertEqual(request.status_code, 403)
+        self.assertEqual(request.status_code, status.HTTP_403_FORBIDDEN)
 
 
 def create_crashreport(uuid="not set"):
@@ -253,13 +260,21 @@
         self.other_token = request.data['token']
         self.admin = User.objects.create_superuser(
             'myuser', 'myemail@test.com', self.password)
-        self.admin = APIClient()
-        self.admin.login(username='myuser', password='test')
         self.user = APIClient()
         self.other_user = APIClient()
         self.user.credentials(HTTP_AUTHORIZATION='Token ' + self.token)
         self.other_user.credentials(HTTP_AUTHORIZATION='Token '
                                     + self.other_token)
 
+    def get_url(self, uuid, report_id, filename):
+        return ("/hiccup/api/v1/devices/{}/crashreports/{}/logfile_put/{}/".
+                format(uuid, report_id, "test.log"))
+
     def test_Logfile_upload_as_admin(self):
-        pass
+        self.client.force_authenticate(self.admin)
+        f = tempfile.NamedTemporaryFile('w+', suffix=".log", delete=True)
+        f.write(u"blihblahblub")
+        request = self.client.post(
+            self.get_url(self.uuid, 1, f.name),
+            {'file': f}, format="multipart")
+        self.assertEqual(status.HTTP_201_CREATED, request.status_code)
diff --git a/crashreports/urls.py b/crashreports/urls.py
index 55a8b38..dd9999c 100644
--- a/crashreports/urls.py
+++ b/crashreports/urls.py
@@ -6,6 +6,7 @@
 
 
 urlpatterns = [
+    # crashreports
     url(r'^api/v1/crashreports/$',
         rest_api_crashreports.ListCreateView.as_view(),
         name='api_v1_crashreports'),
@@ -20,10 +21,18 @@
         rest_api_crashreports.RetrieveUpdateDestroyView.as_view(),
         name='api_v1_crashreports_by_uuid'),
 
+    # logfiles
+
+    url(r'^api/v1/devices/(?P<uuid>[a-f0-9-]+)/crashreports/' +
+        '(?P<device_local_id>[0-9]+)/logfile_put/(?P<filename>[^/]+)/$',
+        rest_api_logfiles.logfile_put,
+        name='api_v1_putlogfile_for_device_id'),
+
     # url(r'^api/v1/logfile_put$',
     #     rest_api_logfiles.logfile_put,
     #     name='api_v1_crashreports_put_logfile'),
 
+    # heartbeats
     url(r'^api/v1/heartbeats/$',
         rest_api_heartbeats.ListCreateView.as_view(),
         name='api_v1_heartbeats'),
@@ -33,11 +42,13 @@
     url(r'^api/v1/heartbeats/(?P<id>[0-9]+)/$',
         rest_api_heartbeats.RetrieveUpdateDestroyView.as_view(),
         name='api_v1_heatbeat'),
-    url(r'^api/v1/devices/(?P<device__uuid>[a-f0-9-]+)/heartbeats/' +
+    url(r'^api/v1/devices/(?P<uuid>[a-f0-9-]+)/heartbeats/' +
         '(?P<device_local_id>[0-9]+)/$',
         rest_api_heartbeats.RetrieveUpdateDestroyView.as_view(),
         name='api_v1_heartbeat_by_uuid'),
 
+    # devices
+
     url(r'^api/v1/devices/$', rest_api_devices.ListCreateDevices.as_view(),
         name='api_v1_list_devices'),
     url(r'^api/v1/devices/(?P<uuid>[a-f0-9-]+)/$',