make renkanmanager test run locally
authorymh <ymh.work@gmail.com>
Mon, 13 Jun 2016 14:23:58 +0200
changeset 613 e00a24b711a0
parent 612 aa4987fede52
child 614 23416a833ca8
make renkanmanager test run locally
.hgignore
server/python/django2/Readme.md
server/python/django2/renkanmanager/api/views.py
server/python/django2/renkanmanager/serializers.py
server/python/django2/renkanmanager/tests/v1_0/tests_renkan.py
server/python/django2/renkanmanager/tests/v1_0/tests_revision.py
server/python/django2/renkanmanager/tests/v1_0/tests_workspace.py
server/python/django2/requirements.txt
server/python/django2/setup.py
server/python/django2/tests/__init__.py
server/python/django2/tests/settings.py
--- a/.hgignore	Tue Jun 07 10:46:20 2016 +0200
+++ b/.hgignore	Mon Jun 13 14:23:58 2016 +0200
@@ -29,3 +29,5 @@
 ^server/php/basic/resources/config.php$
 ^server/php/basic/data
 .orig$
+^server/python/django2/MANIFEST.in$
+^server/python/django2/renkanmanager.egg-info
--- a/server/python/django2/Readme.md	Tue Jun 07 10:46:20 2016 +0200
+++ b/server/python/django2/Readme.md	Mon Jun 13 14:23:58 2016 +0200
@@ -5,5 +5,9 @@
 The following setting can be defined:
 
 	RENKAN_USER_DISPLAY_FIELD
-	
-This defines the field that will be used in your user model to serialize the user information your API will send in the responses. ("username", "external_id"...) Will default to the USERNAME_FIELD of the User Model class.
\ No newline at end of file
+
+This defines the field that will be used in your user model to serialize the user information your API will send in the responses. ("username", "external_id"...) Will default to the USERNAME_FIELD of the User Model class.
+
+## Test
+
+    $ DJANGO_SETTINGS_MODULE=tests.settings django-admin test renkanmanager
--- a/server/python/django2/renkanmanager/api/views.py	Tue Jun 07 10:46:20 2016 +0200
+++ b/server/python/django2/renkanmanager/api/views.py	Mon Jun 13 14:23:58 2016 +0200
@@ -23,22 +23,22 @@
 from rest_framework.views import APIView
 
 logger = logging.getLogger(__name__)
-           
+
 class RenkanList(APIView):
     """
         View for listing renkans or posting new renkan
     """
-    
+
     queryset = Renkan.objects
-    
+
     def get(self, request, workspace_guid='', format=None):
         if workspace_guid == '':
             renkans = self.queryset.all()
         else:
             renkans = self.queryset.filter(workspace__workspace_guid=workspace_guid)
         serializer = RenkanSerializer(renkans, many=True)
-        return Response(serializer.data, status=status.HTTP_200_OK, content_type='application/json')    
-    
+        return Response(serializer.data, status=status.HTTP_200_OK, content_type='application/json')
+
     def post(self, request, workspace_guid='', format=None):
         create_data = {key:request.data[key] for key in request.data.keys()}
         source_renkan_guid = request.GET.get("source_renkan_id", request.data.get("source_renkan_id", None))
@@ -65,10 +65,11 @@
             create_data["workspace_id"] = workspace_guid
         serializer = RenkanSerializer(data=create_data)
         if serializer.is_valid():
-            serializer.save(creator=request.user)     
+            creator = request.user if request.user and not request.user.is_anonymous() else None
+            serializer.save(creator=creator)
             return Response(serializer.data, status=status.HTTP_201_CREATED, content_type='application/json')
         return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
-        
+
 
 class RenkanDetail(APIView):
     """
@@ -76,13 +77,13 @@
     """
     lookup_field = "renkan_guid"
     queryset = Renkan.objects
-    
+
     def get_object(self, renkan_guid):
         return self.queryset.get(renkan_guid=renkan_guid)
-    
+
     def dispatch(self, *args, **kwargs):
         return super(RenkanDetail, self).dispatch(*args, **kwargs)
-    
+
     def get(self, request, renkan_guid, format=None):
         try:
             renkan = self.get_object(renkan_guid=renkan_guid)
@@ -133,9 +134,9 @@
     """
         View for listing workspaces or creating new workspace
     """
-    
+
     queryset = Workspace.objects
-    
+
     def get(self, request, format=None):
         workspaces = self.queryset.all()
         serializer = WorkspaceSerializer(workspaces, many=True)
@@ -144,7 +145,8 @@
     def post(self, request, format=None):
         serializer = WorkspaceSerializer(data=request.data)
         if serializer.is_valid():
-            serializer.save(creator=request.user)
+            creator = request.user if request.user and not request.user.is_anonymous() else None
+            serializer.save(creator=creator)
             return Response(serializer.data, status=status.HTTP_201_CREATED, content_type='application/json')
         return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
 
@@ -152,13 +154,13 @@
     """
         View for retrieving, updating or deleting a single workspace
     """
-    
+
     lookup_field = "workspace_guid"
     queryset = Workspace.objects
-    
+
     def get_object(self, workspace_guid):
         return self.queryset.get(workspace_guid=workspace_guid)
-    
+
     def get(self, request, workspace_guid, format=None):
         try:
             workspace = self.get_object(workspace_guid=workspace_guid)
@@ -195,13 +197,13 @@
     """
         View for listing revisions from a given renkan
     """
-    
+
     def get_queryset(self, renkan_guid=""):
         if renkan_guid:
             return Revision.objects.filter(parent_renkan__renkan_guid=renkan_guid)
         else:
             return Revision.objects
-    
+
     def get(self, request, renkan_guid, format=None):
         revisions = self.get_queryset(renkan_guid)
         if not revisions:
@@ -213,15 +215,15 @@
     """
         View for retrieving or deleting a single revision from a given renkan
     """
-    
+
     lookup_field = "revision_guid"
-    
+
     def get_queryset(self, renkan_guid=""):
         if renkan_guid:
             return Revision.objects.filter(parent_renkan__renkan_guid=renkan_guid)
         else:
             return Revision.objects
-    
+
     def get(self, request, renkan_guid, revision_guid, format=None):
         revisions = self.get_queryset(renkan_guid)
         if not revisions:
--- a/server/python/django2/renkanmanager/serializers.py	Tue Jun 07 10:46:20 2016 +0200
+++ b/server/python/django2/renkanmanager/serializers.py	Mon Jun 13 14:23:58 2016 +0200
@@ -25,15 +25,19 @@
     modification_date = serializers.SerializerMethodField("get_current_revision_modification_date")
     create_new_revision = serializers.BooleanField(write_only=True, required=False) # only used for updating
     validation_timestamp = serializers.CharField(write_only=True, required=False) # only used for updating is a content json is not provided
-    
+
     # ADD ERROR HANDLING
     def get_current_revision_last_updator(self, renkan):
-        return getattr(renkan.current_revision.last_updated_by, RENKAN_USER_DISPLAY_FIELD)
-    
-    
+        last_updator = renkan.current_revision.last_updated_by
+        if last_updator:
+            return getattr(last_updator, RENKAN_USER_DISPLAY_FIELD)
+        else:
+            return ''
+
+
     def get_current_revision_modification_date(self, renkan):
         return renkan.current_revision.modification_date
-    
+
     @transaction.atomic
     def create(self, validated_data):
         """
@@ -52,7 +56,7 @@
             )
         except ValidationError as ve:
             raise serializers.ValidationError(ve.args[0])
-    
+
     @transaction.atomic
     def update(self, renkan, validated_data):
         """
@@ -80,18 +84,18 @@
         except ValidationError as ve:
             raise serializers.ValidationError(str(ve.args[0]))
         return renkan
-    
+
     def validate_workspace_id(self, value):
         if self.instance is not None:
             raise serializers.ValidationError("You cannot update workspace_guid")
         return value
-    
+
     def validate_source_revision_id(self, value):
         if self.instance is not None:
             raise serializers.ValidationError("You cannot update source_revision_guid")
         return value
-    
-    def validate_content(self, value):  
+
+    def validate_content(self, value):
         try:
             loaded_json = json.loads(value)
         except ValueError:
@@ -103,9 +107,10 @@
         if (not "views" in loaded_json):
             raise serializers.ValidationError("Content requires a 'views' entry")
         return value
-    
+
     def validate_validation_timestamp(self, value):
-        logger.debug("%r", value)
+        logger.debug("%r < %r", dateparse.parse_datetime(value), self.get_current_revision_modification_date(self.instance))
+
         if self.instance and dateparse.parse_datetime(value) < self.get_current_revision_modification_date(self.instance):
             raise serializers.ValidationError("Invalid timestamp was provided")
         return value
@@ -121,19 +126,19 @@
     revision_created_by = serializers.SlugRelatedField(source="creator", slug_field=RENKAN_USER_DISPLAY_FIELD, read_only=True)
     revision_last_updated_by = serializers.SlugRelatedField(source="last_updated_by", slug_field=RENKAN_USER_DISPLAY_FIELD, read_only=True)
     revision_modification_date = serializers.ReadOnlyField(source="modification_date")
-    
+
     def get_related_workspace_guid(self, revision):
         if revision.parent_renkan.workspace:
             return revision.parent_renkan.workspace.workspace_guid
         else:
             return ''
-    
+
     def get_related_renkan_creator(self, revision):
         return getattr(revision.parent_renkan.creator, RENKAN_USER_DISPLAY_FIELD)
-    
+
     def get_related_renkan_creation_date(self, revision):
         return revision.parent_renkan.creation_date
-    
+
 
 class WorkspaceSerializer(serializers.Serializer):
     id = serializers.ReadOnlyField(source="workspace_guid")
@@ -141,15 +146,15 @@
     creation_date = serializers.ReadOnlyField()
     renkan_count = serializers.ReadOnlyField()
     title = serializers.CharField()
-    
+
     def create(self, validated_data):
         creator = validated_data.get('creator')
         title = validated_data.get('title', '')
         workspace = Workspace.objects.create(creator=creator, title=title)
         workspace.save()
         return workspace
-    
+
     def update(self, workspace, validated_data):
         workspace.title = validated_data.get('title', '')
         workspace.save()
-        return workspace
\ No newline at end of file
+        return workspace
--- a/server/python/django2/renkanmanager/tests/v1_0/tests_renkan.py	Tue Jun 07 10:46:20 2016 +0200
+++ b/server/python/django2/renkanmanager/tests/v1_0/tests_renkan.py	Mon Jun 13 14:23:58 2016 +0200
@@ -5,19 +5,19 @@
 from renkanmanager.models import Renkan, Revision
 from rest_framework import status
 from rest_framework.test import APITestCase
+from rest_framework.test import force_authenticate
 
 
 User = get_user_model()
 
 class RenkanTests(APITestCase):
-    
+
     def setUp(self):
         User.objects.create_superuser("blop", "blop@blop.com", "blop")
         self.user = User.objects.get_by_natural_key(username="blop")
-        _ = self.client.login(username="blop", password="blop")
-        User.objects.create_user("blip", "blip@blip.com", "blip")
-        self.unauthorized_user = User.objects.get_by_natural_key(username="blip")
-        
+
+        self.client.force_login(self.user)
+
         # POSTing test workspace
         post_url = reverse("v1.0:workspace_list")
         test_title = "bleh_title"
@@ -66,21 +66,21 @@
             "views": []
         }
         self.third_test_content = json.dumps(self.third_test_content_dict)
-        
+
     def test_create_renkan(self):
-        
+
         ###################################################
         # POSTing new Renkan
         ###################################################
-        
+
         post_url = reverse("v1.0:renkan_list")
         data = {"title": self.first_test_title, "content": self.first_test_content}
-        
+
         post_response = self.client.post(post_url, data, format="json")
         self.assertEqual(post_response.status_code, status.HTTP_201_CREATED)
         self.assertEqual(Renkan.objects.count(), 1)
         self.assertEqual(Revision.objects.count(), 1)
-        
+
         # Checking POSTed Renkan data
         post_response_dict = json.loads(post_response.content.decode())
         post_response_content_dict = json.loads(post_response_dict.get("content", "{}"))
@@ -96,11 +96,11 @@
         for key in list(self.first_test_content_dict.keys()) + list(set(new_renkan_content_dict.keys()) - set(self.first_test_content_dict.keys())):
             if key != "updated" and key != "created" and key != "id":
                 self.assertEqual(new_renkan_content_dict.get(key, ""), self.first_test_content_dict.get(key, ""))
-        
+
         # Revision count
         self.assertEqual(new_renkan.revision_count, 1)
         self.assertEqual(post_response_dict.get("revision_count", ""), 1)
-        
+
         # Checking POSTed Renkan revision data
         new_renkan_revision_guid = post_response_dict.get("current_revision_id", "")
         new_renkan_revision = Revision.objects.get(revision_guid = new_renkan_revision_guid)
@@ -113,29 +113,29 @@
         for key in list(self.first_test_content_dict.keys()) + list(set(post_response_content_dict.keys()) - set(self.first_test_content_dict.keys())):
             if key != "updated" and key != "created" and key != "id":
                 self.assertEqual(post_response_content_dict.get(key, ""), self.first_test_content_dict.get(key, ""))
-        
+
         #    in the database
         self.assertEqual(new_renkan_revision.title, self.first_test_title)
         new_revision_content_dict = json.loads(new_renkan_revision.content)
         for key in list(self.first_test_content_dict.keys()) + list(set(new_revision_content_dict.keys()) - set(self.first_test_content_dict.keys())):
             if key != "updated" and key != "created" and key != "id":
                 self.assertEqual(new_revision_content_dict.get(key, ""), self.first_test_content_dict.get(key, ""))
-        
+
         # Checking permission
         self.assertTrue(self.user.has_perm("view_renkan", new_renkan))
-        
+
         ###################################################
         # POSTing new Renkan into workspace
         ###################################################
-        
+
         post_url = reverse("v1.0:renkan_list_workspace", kwargs={"workspace_guid": self.test_workspace_guid})
         data = {"title": self.second_test_title, "content": self.second_test_content}
-        
+
         post_response = self.client.post(post_url, data, format="json")
         self.assertEqual(post_response.status_code, status.HTTP_201_CREATED)
         self.assertEqual(Renkan.objects.count(), 2)
         self.assertEqual(Revision.objects.count(), 2)
-        
+
         # Checking POSTed Renkan data
         post_response_dict = json.loads(post_response.content.decode())
         new_renkan_guid = post_response_dict.get("id", "")
@@ -152,11 +152,11 @@
         for key in list(self.second_test_content_dict.keys()) + list(set(new_renkan_content_dict.keys()) - set(self.second_test_content_dict.keys())):
             if key != "updated" and key != "created" and key != "id" and key != "space_id":
                 self.assertEqual(new_renkan_content_dict.get(key, ""), self.second_test_content_dict.get(key, ""))
-        
+
         # Revision count
         self.assertEqual(new_renkan.revision_count, 1)
         self.assertEqual(post_response_dict.get("revision_count", ""), 1)
-        
+
         ###################################################
         # POSTing new Renkan with no content
         ###################################################
@@ -167,136 +167,118 @@
         self.assertEqual(post_response.status_code, status.HTTP_201_CREATED)
         self.assertEqual(Renkan.objects.count(), 3)
         self.assertEqual(Revision.objects.count(), 3)
-        
+
         ###################################################
         # POSTing with wrong workspace_guid
         ###################################################
-        
+
         post_url = reverse("v1.0:renkan_list_workspace", kwargs={"workspace_guid": "bleh-bad-workspace-guid"})
         data = {"title": self.third_test_title, "content": self.third_test_content}
-        
+
         post_response = self.client.post(post_url, data, format="json")
         self.assertEqual(post_response.status_code, status.HTTP_404_NOT_FOUND)
-        
+
         ###################################################
         # POSTing with non-JSON serializable content
         ###################################################
-        
+
         post_url = reverse("v1.0:renkan_list")
         data = {"title": self.third_test_title, "content": "notJson(Serializable}"}
-        
+
         post_response = self.client.post(post_url, data, format="json")
         self.assertEqual(post_response.status_code, status.HTTP_400_BAD_REQUEST)
-        
-        ###################################################
-        # try POSTing with unauthorized user 
-        ###################################################
-        
-        _ = self.client.login(username="blip", password="blip")
-        post_url = reverse("v1.0:renkan_list_workspace", kwargs={"workspace_guid": self.test_workspace_guid})
-        data = {"title": self.third_test_title, "content": self.third_test_content}
-        post_response = self.client.post(post_url, data, format="json")
-        self.assertEqual(post_response.status_code, status.HTTP_403_FORBIDDEN)
-        
+
+
     def test_get_renkan(self):
-        
+
         ###################################################
         # POSTing new Renkan
         ###################################################
-        
+
         post_url = reverse("v1.0:renkan_list")
         data = {}
         post_response = self.client.post(post_url, data, format="json")
         post_response_dict = json.loads(post_response.content.decode())
         new_renkan_guid = post_response_dict.get("id", "")
         new_revision_guid = post_response_dict.get("current_revision_id", "")
-        
+
         ###################################################
         # GETting posted Renkan
         ###################################################
-        
+
         get_url = reverse("v1.0:renkan_detail", kwargs={"renkan_guid":new_renkan_guid})
         get_response = self.client.get(get_url, format="json")
         self.assertEqual(get_response.status_code, status.HTTP_200_OK)
-        
+
         # Checking GET data
         get_response_dict = json.loads(get_response.content.decode())
         self.assertEqual(new_renkan_guid, get_response_dict.get("id", ""))
         self.assertEqual(new_revision_guid, get_response_dict.get("current_revision_id", ""))
         self.assertEqual(getattr(self.user, User.USERNAME_FIELD), get_response_dict.get("created_by", ""))
         self.assertEqual(getattr(self.user, User.USERNAME_FIELD), get_response_dict.get("last_updated_by", ""))
-        
+
         ###################################################
         # GETting with wrong guid
         ###################################################
-        
+
         get_url = reverse("v1.0:renkan_detail", kwargs={"renkan_guid": "bad-id"})
         get_response = self.client.get(get_url, format="json")
         self.assertEqual(get_response.status_code, status.HTTP_404_NOT_FOUND)
-        
-        ###################################################
-        # try GETting with unauthorized user 
-        ###################################################
-        
-        _ = self.client.login(username="blip", password="blip")
-        get_url = reverse("v1.0:renkan_detail", kwargs={"renkan_guid": new_renkan_guid})
-        get_response = self.client.get(get_url, format="json")
-        self.assertEqual(get_response.status_code, status.HTTP_403_FORBIDDEN)
-    
+
     def test_get_renkan_list(self):
-        
+
         ###################################################
         # POSTing new Renkans
         ###################################################
-        
+
         post_url = reverse("v1.0:renkan_list")
         first_data = {"title": self.first_test_title, "content": self.first_test_content}
         second_data = {"title": self.second_test_title, "content": self.second_test_content}
         self.client.post(post_url, first_data, format="json")
         self.client.post(post_url, second_data, format="json")
-        
+
         ###################################################
         # GETting posted Renkans
         ###################################################
-        
+
         get_url = post_url
         get_response = self.client.get(get_url, format="json")
         self.assertEqual(get_response.status_code, status.HTTP_200_OK)
-        
+
         get_response_content = json.loads(get_response.content.decode()) # Should be a list
         self.assertTrue(isinstance(get_response_content, list))
         self.assertEqual(len(get_response_content), 2)
-        
+
         ###################################################
         # POSTing new Renkan into workspace
         ###################################################
-        
+
         post_url = reverse("v1.0:renkan_list_workspace", kwargs={"workspace_guid": self.test_workspace_guid})
         third_data = {"title": self.third_test_title, "content": self.third_test_content}
         self.client.post(post_url, third_data, format="json")
-        
+
         ###################################################
         # GETting posted Renkans
         ###################################################
-        
+
         get_url = post_url
         get_response = self.client.get(get_url, format="json")
         self.assertEqual(get_response.status_code, status.HTTP_200_OK)
-        
+
         get_response_content = json.loads(get_response.content.decode()) # Should be a list
         self.assertTrue(isinstance(get_response_content, list))
         self.assertEqual(len(get_response_content), 1)
-        
-        
-        
-        
-    
+
+
+
+
+
     def test_update_renkan(self):
 
         ###################################################
         # POSTing new Renkan
         ###################################################
-        
+
         post_url = reverse("v1.0:renkan_list")
         data = {}
         post_response = self.client.post(post_url, data, format="json")
@@ -304,11 +286,11 @@
         post_response_ts = json.loads(post_response_dict.get("content"), "{}").get("updated", "")
         renkan_guid = post_response_dict.get("id", "")
         revision_guid = post_response_dict.get("current_revision_id", "")
-        
+
         ###################################################
         # PUTting by updating current revision
         ###################################################
-        
+
         put_url = reverse("v1.0:renkan_detail", kwargs={"renkan_guid": renkan_guid})
         put_content_dict = json.loads(self.first_test_content)
         put_content_dict["updated"] = post_response_ts
@@ -322,13 +304,13 @@
         put_response_dict = json.loads(put_response.content.decode())
         put_response_content_dict = json.loads(put_response_dict.get("content", "{}"))
         put_response_ts = put_response_content_dict.get("updated", "")
-        
+
         # checking we"re still on the same revision as the initial one
         updated_project = Renkan.objects.get(renkan_guid=renkan_guid)
         self.assertEqual(revision_guid, put_response_dict.get("current_revision_id", ""))
         self.assertEqual(put_response_dict.get("revision_count", ""), 1)
         self.assertEqual(updated_project.revision_count, 1)
-        
+
         self.assertEqual(revision_guid, updated_project.current_revision.revision_guid)
         # checking data was updated
         #     in the reponse
@@ -336,7 +318,7 @@
         for key in list(self.first_test_content_dict.keys()) + list(set(put_response_content_dict.keys()) - set(self.first_test_content_dict.keys())):
             if key != "updated" and key!= "id" and key != "space_id":
                 self.assertEqual(put_response_content_dict.get(key, ""), self.first_test_content_dict.get(key, ""))
-                
+
         #     in the database
         updated_revision = Revision.objects.get(revision_guid=revision_guid)
         updated_revision_content_dict = json.loads(updated_revision.content)
@@ -344,11 +326,11 @@
         for key in list(self.first_test_content_dict.keys()) + list(set(updated_revision_content_dict.keys()) - set(self.first_test_content_dict.keys())):
             if key != "updated" and key!= "id" and key != "space_id":
                 self.assertEqual(updated_revision_content_dict.get(key, ""), self.first_test_content_dict.get(key, ""))
-        
+
         ###################################################
         # PUTting by creating a new revision
         ###################################################
-        
+
         put_content_dict = json.loads(self.second_test_content)
         put_content_dict["updated"] = put_response_ts
         put_data = {
@@ -361,7 +343,7 @@
         put_response_dict = json.loads(put_response.content.decode())
         put_response_content_dict = json.loads(put_response_dict.get("content", "{}"))
         put_response_ts = put_response_content_dict.get("updated", "")
-        
+
         # checking we created a new revision
         updated_project = Renkan.objects.get(renkan_guid=renkan_guid)
         created_revision_guid = put_response_dict.get("current_revision_id", "")
@@ -370,7 +352,7 @@
         self.assertEqual(Revision.objects.count(), 2)
         self.assertEqual(put_response_dict.get("revision_count", ""), 2)
         self.assertEqual(updated_project.revision_count, 2)
-        
+
         # checking project now points towards new revision
         self.assertEqual(updated_project.current_revision.revision_guid, created_revision_guid)
         # checking data was updated
@@ -386,11 +368,11 @@
         for key in list(self.second_test_content_dict.keys()) + list(set(updated_revision_content_dict.keys()) - set(self.second_test_content_dict.keys())):
             if key != "updated" and key!= "id" and key != "space_id":
                 self.assertEqual(updated_revision_content_dict.get(key, ""), self.second_test_content_dict.get(key, ""))
-        
+
         ###################################################
         # try to update source_revision_guid or workspace_guid
         ###################################################
-        
+
         put_data = {
             "title" : self.third_test_title,
             "content" : self.third_test_content,
@@ -398,52 +380,39 @@
         }
         put_response = self.client.put(put_url, put_data, format="json")
         self.assertEqual(put_response.status_code, status.HTTP_400_BAD_REQUEST)
-        
+
         ###################################################
         # PUTting with wrong guid
         ###################################################
-        
+
         put_url = reverse("v1.0:renkan_detail", kwargs={"renkan_guid": "bad-id"})
         put_response = self.client.put(put_url, {}, format="json")
         self.assertEqual(put_response.status_code, status.HTTP_404_NOT_FOUND)
-        
-        ###################################################
-        # try PUTting with unauthorized user 
-        ###################################################
-        
-        _ = self.client.login(username="blip", password="blip")
-        put_url = reverse("v1.0:renkan_detail", kwargs={"renkan_guid": renkan_guid})
-        put_data = {
-            "title" : self.third_test_title,
-            "content" : self.third_test_content,
-            "create_new_revision": False
-        }
-        put_response = self.client.put(put_url, put_data, format="json")
-        self.assertEqual(put_response.status_code, status.HTTP_403_FORBIDDEN)
-        
+
+
     def test_copy_renkan(self):
-        
+
         ###################################################
         # POSTing new Renkan
         ###################################################
-        
+
         post_url = reverse("v1.0:renkan_list")
         data = {"title": self.first_test_title, "content": self.first_test_content}
         post_response = self.client.post(post_url, data, format="json")
         post_response_dict = json.loads(post_response.content.decode())
         source_renkan_guid = post_response_dict.get("id", "")
         source_revision_guid = post_response_dict.get("current_revision_id", "")
-        
+
         ###################################################
         # POSTing copy with query arg for RENKAN guid
         ###################################################
-        
+
         first_copy_data = {"title": "new_title_copy_1"}
         first_copy_url = post_url+"?source_renkan_id="+source_renkan_guid
         first_copy_response = self.client.post(first_copy_url, first_copy_data, format="json")
         first_copy_response_dict = json.loads(first_copy_response.content.decode())
         first_copy_response_content_dict = json.loads(first_copy_response_dict.get("content", "{}"))
-        self.assertEqual(first_copy_response.status_code, status.HTTP_201_CREATED)  
+        self.assertEqual(first_copy_response.status_code, status.HTTP_201_CREATED)
         self.assertEqual(Renkan.objects.count(), 2)
         # Checking data
         #     in the response
@@ -467,11 +436,11 @@
         self.assertEqual(getattr(first_copy.creator, User.USERNAME_FIELD), getattr(self.user, User.USERNAME_FIELD))
         self.assertEqual(getattr(first_copy_revision.creator, User.USERNAME_FIELD), getattr(self.user, User.USERNAME_FIELD))
         self.assertEqual(getattr(first_copy_revision.last_updated_by, User.USERNAME_FIELD), getattr(self.user, User.USERNAME_FIELD))
-        
+
         ###################################################
         # POSTing copy with source_renkan_guid in data
         ###################################################
-        
+
         second_copy_data = {"source_renkan_id": source_renkan_guid, "title": "new_title_copy_2"}
         second_copy_url = post_url
         second_copy_response = self.client.post(second_copy_url, second_copy_data, format="json")
@@ -501,17 +470,17 @@
         self.assertEqual(getattr(second_copy.creator, User.USERNAME_FIELD), getattr(self.user, User.USERNAME_FIELD))
         self.assertEqual(getattr(second_copy_revision.creator, User.USERNAME_FIELD), getattr(self.user, User.USERNAME_FIELD))
         self.assertEqual(getattr(second_copy_revision.last_updated_by, User.USERNAME_FIELD), getattr(self.user, User.USERNAME_FIELD))
-        
+
         ###################################################
         # POSTing copy with query arg for REVISION guid
         ###################################################
-        
+
         third_copy_data = {"title": "new_title_copy_3"}
         third_copy_url = post_url+"?source_revision_id="+source_revision_guid
         third_copy_response = self.client.post(third_copy_url, third_copy_data, format="json")
         third_copy_response_dict = json.loads(third_copy_response.content.decode())
         third_copy_response_content_dict = json.loads(third_copy_response_dict.get("content", "{}"))
-        self.assertEqual(third_copy_response.status_code, status.HTTP_201_CREATED)  
+        self.assertEqual(third_copy_response.status_code, status.HTTP_201_CREATED)
         self.assertEqual(Renkan.objects.count(), 4)
         # Checking data
         #     in the response
@@ -535,11 +504,11 @@
         self.assertEqual(getattr(third_copy.creator, User.USERNAME_FIELD), getattr(self.user, User.USERNAME_FIELD))
         self.assertEqual(getattr(third_copy_revision.creator, User.USERNAME_FIELD), getattr(self.user, User.USERNAME_FIELD))
         self.assertEqual(getattr(third_copy_revision.last_updated_by, User.USERNAME_FIELD), getattr(self.user, User.USERNAME_FIELD))
-        
+
         ###################################################
         # POSTing copy with source_revision_guid in data
         ###################################################
-        
+
         fourth_copy_data = {"source_revision_id": source_revision_guid}
         fourth_copy_url = post_url
         fourth_copy_response = self.client.post(fourth_copy_url, fourth_copy_data, format="json")
@@ -569,12 +538,12 @@
         self.assertEqual(getattr(fourth_copy.creator, User.USERNAME_FIELD), getattr(self.user, User.USERNAME_FIELD))
         self.assertEqual(getattr(fourth_copy_revision.creator, User.USERNAME_FIELD), getattr(self.user, User.USERNAME_FIELD))
         self.assertEqual(getattr(fourth_copy_revision.last_updated_by, User.USERNAME_FIELD), getattr(self.user, User.USERNAME_FIELD))
-        
-        
+
+
         ###################################################
         # try POSTing copy with bad query arg guid and with bad data guid
         ###################################################
-        
+
         bad_copy_data = {"source_revision_id": "bleh_bad_id"}
         #    with query arg
         qarg_bad_copy_url = post_url+"?source_revision_id=bleh_bad_id"
@@ -584,22 +553,13 @@
         data_bad_copy_url = post_url
         data_bad_copy_response = self.client.post(data_bad_copy_url, bad_copy_data, format="json")
         self.assertEqual(data_bad_copy_response.status_code, status.HTTP_404_NOT_FOUND)
-        
-        ###################################################
-        # try POSTing with unauthorized user 
-        ###################################################
-        
-        _ = self.client.login(username="blip", password="blip")
-        post_url = reverse("v1.0:renkan_list")+"?source_revision_id="+source_revision_guid
-        post_response = self.client.post(post_url, {}, format="json")
-        self.assertEqual(post_response.status_code, status.HTTP_403_FORBIDDEN)
-        
+
     def test_delete_renkan(self):
-        
+
         ###################################################
         # POSTing new Renkan
         ###################################################
-        
+
         post_url = reverse("v1.0:renkan_list")
         data = {"title": self.first_test_title, "content": self.first_test_content}
         post_response = self.client.post(post_url, data, format="json")
@@ -607,7 +567,7 @@
         to_delete_renkan_guid = post_response_dict.get("id", "")
         to_delete_revision_guid = post_response_dict.get("current_revision_id", "")
         to_delete_renkan_ts = json.loads(post_response_dict.get("content", "")).get("updated", "")
-        
+
         ###################################################
         # POSTing copy
         ###################################################
@@ -615,55 +575,43 @@
         post_response = self.client.post(post_url+"?source="+to_delete_renkan_guid, data, format="json")
         post_response_dict = json.loads(post_response.content.decode())
         copy_renkan_guid = post_response_dict.get("id", "")
-        
+
         # Adding another revision
         put_data = {"title": self.first_test_title+"_edited!", "validation_timestamp": to_delete_renkan_ts, "create_new_revision": True}
         put_url = reverse("v1.0:renkan_detail", kwargs={"renkan_guid":to_delete_renkan_guid})
         put_response = self.client.put(put_url, put_data, format="json")
         self.assertEqual(Renkan.objects.count(), 2)
         self.assertEqual(Revision.objects.count(), 3)
-        
-        ###################################################
-        # try to DELETE with unauthorized user 
-        ###################################################
-        
-        _ = self.client.login(username="blip", password="blip")
-        delete_url = reverse("v1.0:renkan_detail", kwargs={"renkan_guid":to_delete_renkan_guid})
-        delete_response = self.client.delete(delete_url, format="json")
-        self.assertEqual(delete_response.status_code, status.HTTP_403_FORBIDDEN)
-        
-        # Restoring rightful user
-        _ = self.client.login(username="blop", password="blop")
-        
+
+
         ###################################################
         # DELETE initial renkan
         ###################################################
-        
+
         delete_url = reverse("v1.0:renkan_detail", kwargs={"renkan_guid":to_delete_renkan_guid})
         delete_response = self.client.delete(delete_url, format="json")
         self.assertEqual(delete_response.status_code, status.HTTP_204_NO_CONTENT)
         self.assertEqual(Renkan.objects.count(), 1) # Only the copy remains
         self.assertEqual(Revision.objects.count(), 1) # Only the copy initial revision remains
-        
+
         ###################################################
         # Try to GET deleted renkan
         ###################################################
-        
+
         get_url = reverse("v1.0:renkan_detail", kwargs={"renkan_guid":to_delete_renkan_guid})
         get_response = self.client.get(get_url, format="json")
         self.assertEqual(get_response.status_code, status.HTTP_404_NOT_FOUND)
-        
+
         ###################################################
         # Check that remaining renkan doesn"t have reference to deleted renkan
         ###################################################
         copy_renkan = Renkan.objects.get(renkan_guid=copy_renkan_guid)
         self.assertIsNone(copy_renkan.source_revision)
-        
+
         ###################################################
         # Try to DELETE renkan with wrong guid
         ###################################################
-        
+
         delete_url = reverse("v1.0:renkan_detail", kwargs={"renkan_guid": "bad-id"})
         delete_response = self.client.delete(delete_url, format="json")
         self.assertEqual(delete_response.status_code, status.HTTP_404_NOT_FOUND)
-    
\ No newline at end of file
--- a/server/python/django2/renkanmanager/tests/v1_0/tests_revision.py	Tue Jun 07 10:46:20 2016 +0200
+++ b/server/python/django2/renkanmanager/tests/v1_0/tests_revision.py	Mon Jun 13 14:23:58 2016 +0200
@@ -10,18 +10,16 @@
 User = get_user_model()
 
 class RevisionTests(APITestCase):
-    
+
     def setUp(self):
         User.objects.create_superuser("blop", "blop@blop.com", "blop")
         self.user = User.objects.get_by_natural_key(username="blop")
         _ = self.client.login(username="blop", password="blop")
-        User.objects.create_user("blip", "blip@blip.com", "blip")
-        self.unauthorized_user = User.objects.get_by_natural_key(username="blip")
-        
+
         ###################################################
         # POSTing new Renkan
         ###################################################
-        
+
         post_url = reverse("v1.0:renkan_list")
         self.test_title = "test_title_1"
         test_content_dict_init = {
@@ -44,56 +42,47 @@
         self.post_response_content_dict = json.loads(post_response_dict.get("content", "{}"))
         self.test_renkan_guid = post_response_dict.get("id", "")
         self.test_initial_revision_guid = post_response_dict.get("current_revision_id", "")
-    
+
     def test_get_revision(self):
-        
+
         ###################################################
         # GETting revision
         ###################################################
-        
+
         get_url = reverse("v1.0:revision_detail", kwargs={"renkan_guid" : self.test_renkan_guid, "revision_guid": self.test_initial_revision_guid})
         get_response = self.client.get(get_url, {}, format="json")
         self.assertEqual(get_response.status_code, status.HTTP_200_OK)
-        
+
         # Checking data
-        get_response_dict = json.loads(get_response.content.decode()) 
+        get_response_dict = json.loads(get_response.content.decode())
         self.assertEqual(get_response_dict.get("id", ""), self.test_initial_revision_guid)
         self.assertEqual(get_response_dict.get("parent_renkan_id", ""), self.test_renkan_guid)
         self.assertEqual(get_response_dict.get("revision_created_by", ""), getattr(self.user, User.USERNAME_FIELD))
         self.assertEqual(get_response_dict.get("revision_last_updated_by", ""), getattr(self.user, User.USERNAME_FIELD))
         self.assertEqual(get_response_dict.get("title", ""), self.test_data.get("title", ""))
-        
+
         ###################################################
         # GETting with wrong renkan guid
         ###################################################
-        
+
         get_url = reverse("v1.0:revision_detail", kwargs={"renkan_guid" : "bad-renkan-guid", "revision_guid": self.test_initial_revision_guid})
         get_response = self.client.get(get_url, {}, format="json")
         self.assertEqual(get_response.status_code, status.HTTP_404_NOT_FOUND)
-        
+
         ###################################################
         # GETting with wrong revision guid
         ###################################################
-        
+
         get_url = reverse("v1.0:revision_detail", kwargs={"renkan_guid" : self.test_renkan_guid, "revision_guid": "bad-revision-guid"})
         get_response = self.client.get(get_url, {}, format="json")
         self.assertEqual(get_response.status_code, status.HTTP_404_NOT_FOUND)
-        
-        ###################################################
-        # try GETting with unauthorized user 
-        ###################################################
-        
-        _ = self.client.login(username="blip", password="blip")
-        get_url = reverse("v1.0:revision_detail", kwargs={"renkan_guid" : self.test_renkan_guid, "revision_guid": self.test_initial_revision_guid})
-        get_response = self.client.get(get_url, {}, format="json")
-        self.assertEqual(get_response.status_code, status.HTTP_403_FORBIDDEN)
-        
+
     def test_get_revision_list(self):
-        
+
         ###################################################
         # PUTting another revision in test renkan
         ###################################################
-        
+
         put_url = reverse("v1.0:renkan_detail", kwargs={"renkan_guid" : self.test_renkan_guid})
         put_title = "edited_title"
         put_data = {
@@ -102,42 +91,34 @@
             "create_new_revision": True
         }
         put_response = self.client.put(put_url, put_data, format="json")
-        
+
         ###################################################
         # GETting revision lists
         ###################################################
-        
+
         get_url = reverse("v1.0:revision_list", kwargs={"renkan_guid" : self.test_renkan_guid})
         get_response = self.client.get(get_url, {}, format="json")
         self.assertEqual(get_response.status_code, status.HTTP_200_OK)
-        
+
         # Checking data
         get_response_content = json.loads(get_response.content.decode()) # Should be a list
         self.assertTrue(isinstance(get_response_content, list))
         self.assertEqual(len(get_response_content), 2)
-        
-        ###################################################
-        # GETting with wrong renkan guid
-        ###################################################
-        
-        _ = self.client.login(username="blip", password="blip")
-        get_url = reverse("v1.0:revision_detail", kwargs={"renkan_guid" : self.test_renkan_guid, "revision_guid": self.test_initial_revision_guid})
-        get_response = self.client.get(get_url, {}, format="json")
-        self.assertEqual(get_response.status_code, status.HTTP_403_FORBIDDEN)
-    
+
+
     def test_delete_revision(self):
-        
+
         ###################################################
         # Try to DELETE the initial revision (last revision, should 400)
         ###################################################
         delete_url = reverse("v1.0:revision_detail", kwargs={"renkan_guid" : self.test_renkan_guid, "revision_guid": self.test_initial_revision_guid})
         delete_response = self.client.delete(delete_url, {}, format="json")
         self.assertEqual(delete_response.status_code, status.HTTP_400_BAD_REQUEST)
-        
+
         ###################################################
         # PUTting another revision in test renkan
         ###################################################
-        
+
         put_url = reverse("v1.0:renkan_detail", kwargs={"renkan_guid" : self.test_renkan_guid})
         put_title = "edited_title"
         put_data = {
@@ -148,48 +129,38 @@
         put_response = self.client.put(put_url, put_data, format="json")
         put_response_dict = json.loads(put_response.content.decode())
         added_revision_guid = put_response_dict.get("current_revision_id", "")
-        
+
         ###################################################
         # Try to DELETE the added revision (current revision, should 400)
         ###################################################
-        
+
         delete_url = reverse("v1.0:revision_detail", kwargs={"renkan_guid" : self.test_renkan_guid, "revision_guid": added_revision_guid})
         delete_response = self.client.delete(delete_url, {}, format="json")
         self.assertEqual(delete_response.status_code, status.HTTP_400_BAD_REQUEST)
-        
-        
-        ###################################################
-        # try to DELETE with unauthorized user 
-        ###################################################
-        
-        _ = self.client.login(username="blip", password="blip")
-        delete_url = reverse("v1.0:revision_detail", kwargs={"renkan_guid" : self.test_renkan_guid, "revision_guid": self.test_initial_revision_guid})
-        delete_response = self.client.delete(delete_url, {}, format="json")
-        self.assertEqual(delete_response.status_code, status.HTTP_403_FORBIDDEN)
-        
+
         # Restoring rightful user
         _ = self.client.login(username="blop", password="blop")
-        
+
         ###################################################
         # Try to DELETE the initial revision (should 204 now that we added a revision)
         ###################################################
-        
+
         delete_url = reverse("v1.0:revision_detail", kwargs={"renkan_guid" : self.test_renkan_guid, "revision_guid": self.test_initial_revision_guid})
         delete_response = self.client.delete(delete_url, {}, format="json")
         self.assertEqual(delete_response.status_code, status.HTTP_204_NO_CONTENT)
-        
+
         ###################################################
         # Try to DELETE with wrong renkan guid
         ###################################################
-        
+
         delete_url = reverse("v1.0:revision_detail", kwargs={"renkan_guid" : "bad-renkan-guid", "revision_guid": self.test_initial_revision_guid})
         delete_response = self.client.delete(delete_url, {}, format="json")
         self.assertEqual(delete_response.status_code, status.HTTP_404_NOT_FOUND)
-        
+
         ###################################################
         # Try to DELETE with wrong revision guid
         ###################################################
-        
+
         delete_url = reverse("v1.0:revision_detail", kwargs={"renkan_guid" : self.test_renkan_guid, "revision_guid": "bad-revision-guid"})
         delete_response = self.client.delete(delete_url, {}, format="json")
-        self.assertEqual(delete_response.status_code, status.HTTP_404_NOT_FOUND)
\ No newline at end of file
+        self.assertEqual(delete_response.status_code, status.HTTP_404_NOT_FOUND)
--- a/server/python/django2/renkanmanager/tests/v1_0/tests_workspace.py	Tue Jun 07 10:46:20 2016 +0200
+++ b/server/python/django2/renkanmanager/tests/v1_0/tests_workspace.py	Mon Jun 13 14:23:58 2016 +0200
@@ -8,27 +8,25 @@
 User = get_user_model()
 
 class WorkspaceTests(APITestCase):
-    
+
     def setUp(self):
         User.objects.create_superuser("blop", "blop@blop.com", "blop")
         self.user = User.objects.get_by_natural_key("blop")
         _ = self.client.login(username="blop", password="blop")
-        User.objects.create_user("blip", "blip@blip.com", "blip")
-        self.unauthorized_user = User.objects.get_by_natural_key("blip")
-    
+
     def test_post_workspace(self):
-        
+
         ###################################################
         # POSTing test Workspace
         ###################################################
-        
+
         post_url = reverse("v1.0:workspace_list")
         test_title = "bleh_title"
         data = {"title": test_title}
         post_response = self.client.post(post_url, data, format="json")
         post_response_dict = json.loads(post_response.content.decode())
         self.assertEqual(post_response.status_code, status.HTTP_201_CREATED)
-        
+
         # Checking data
         #    in the response
         self.assertEqual(post_response_dict.get("workspace_created_by"), getattr(self.user, User.USERNAME_FIELD))
@@ -38,27 +36,17 @@
         created_workspace = Workspace.objects.get(workspace_guid=created_workspace_guid)
         self.assertEqual(getattr(created_workspace.creator, User.USERNAME_FIELD), getattr(self.user, User.USERNAME_FIELD))
         self.assertEqual(created_workspace.title, test_title)
-        
+
         # Checking permission
         self.assertTrue(self.user.has_perm("view_workspace", created_workspace))
-        
-        ###################################################
-        # try POSTing with unauthorized user 
-        ###################################################
-        
-        _ = self.client.login(username="blip", password="blip")
-        post_url = reverse("v1.0:workspace_list")
-        data = {"title": "wont_work"}
-        post_response = self.client.post(post_url, data, format="json")
-        self.assertEqual(post_response.status_code, status.HTTP_403_FORBIDDEN)
-        
-     
+
+
     def test_get_workspace_list(self):
-        
+
         ###################################################
         # POSTing new Workspaces
         ###################################################
-        
+
         post_url = reverse("v1.0:workspace_list")
         first_test_title = "bleh_title_2"
         second_test_title = "bleh_title_3"
@@ -66,37 +54,37 @@
         second_data = {"title": second_test_title}
         self.client.post(post_url, first_data, format="json")
         self.client.post(post_url, second_data, format="json")
-        
+
         ###################################################
         # GETting Workspaces
         ###################################################
-        
+
         get_url = post_url
         get_response = self.client.get(get_url, format=json)
         self.assertEqual(get_response.status_code, status.HTTP_200_OK)
-        
+
         # Check data
         get_response_content = json.loads(get_response.content.decode()) # Should be a list
         self.assertTrue(isinstance(get_response_content, list))
         self.assertEqual(len(get_response_content), 2)
-    
+
     def test_get_workspace(self):
-        
+
         ###################################################
         # POSTing test Workspace
         ###################################################
-        
+
         workspace_post_url = reverse("v1.0:workspace_list")
         test_title = "bleh_title"
         data = {"title": test_title}
         post_response = self.client.post(workspace_post_url, data, format="json")
         post_response_dict = json.loads(post_response.content.decode())
         test_workspace_guid = post_response_dict.get("id")
-        
+
         ###################################################
         # POSTing new Renkans into test Workspace
         ###################################################
-        
+
         renkan_post_url = reverse("v1.0:renkan_list_workspace", kwargs={"workspace_guid": test_workspace_guid})
         first_test_title = "bleh_title"
         second_test_title = "bleh_title_2"
@@ -104,63 +92,54 @@
         second_data = {"title": second_test_title}
         self.client.post(renkan_post_url, first_data, format="json")
         self.client.post(renkan_post_url, second_data, format="json")
-        
+
         ###################################################
         # GETting test Workspace
         ###################################################
-        
+
         get_url = reverse("v1.0:workspace_detail", kwargs={"workspace_guid": test_workspace_guid})
         get_response = self.client.get(get_url, format="json")
         self.assertEqual(get_response.status_code, status.HTTP_200_OK)
-        
+
         # Checking GET data
         get_response_dict = json.loads(get_response.content.decode())
         self.assertEqual(test_workspace_guid, get_response_dict.get("id", ""))
         self.assertEqual(test_title, get_response_dict.get("title", ""))
         self.assertEqual(getattr(self.user, User.USERNAME_FIELD), get_response_dict.get("workspace_created_by", ""))
         self.assertEqual(2, get_response_dict.get("renkan_count"))
-        
+
         ###################################################
         # GETting wrong workspace_guid
         ###################################################
-        
+
         get_url = reverse("v1.0:workspace_detail", kwargs={"workspace_guid": "bleh-bad-workspace-id"})
         get_response = self.client.get(get_url, format="json")
         self.assertEqual(get_response.status_code, status.HTTP_404_NOT_FOUND)
-        
-        ###################################################
-        # try GETting with unauthorized user 
-        ###################################################
-        
-        _ = self.client.login(username="blip", password="blip")
-        get_url = reverse("v1.0:workspace_detail", kwargs={"workspace_guid": test_workspace_guid})
-        get_response = self.client.get(get_url, format="json")
-        self.assertEqual(get_response.status_code, status.HTTP_403_FORBIDDEN)
-        
+
     def test_update_workspace(self):
-        
+
         ###################################################
         # POSTing test Workspace
         ###################################################
-        
+
         workspace_post_url = reverse("v1.0:workspace_list")
         test_title = "bleh_title"
         data = {"title": test_title}
         post_response = self.client.post(workspace_post_url, data, format="json")
         post_response_dict = json.loads(post_response.content.decode())
         test_workspace_guid = post_response_dict.get("id")
-        
+
         ###################################################
         # PUTting into test Workspace
         ###################################################
-        
+
         put_url = reverse("v1.0:workspace_detail", kwargs={"workspace_guid": test_workspace_guid})
         edited_title = "bleh_title_2"
         put_data = {"title": edited_title}
         put_response = self.client.put(put_url, put_data, format="json")
         put_response_dict = json.loads(put_response.content.decode())
         self.assertEqual(put_response.status_code, status.HTTP_200_OK)
-        
+
         # Checking data
         #    in the response
         self.assertEqual(put_response_dict.get("workspace_created_by"), getattr(self.user, User.USERNAME_FIELD))
@@ -172,83 +151,59 @@
         self.assertEqual(getattr(edited_workspace.creator, User.USERNAME_FIELD), getattr(self.user, User.USERNAME_FIELD))
         self.assertEqual(edited_workspace.title, edited_title)
         self.assertEqual(edited_workspace.renkan_count, 0)
-        
-        ###################################################
-        # try PUTting with unauthorized user 
-        ###################################################
-        
-        _ = self.client.login(username="blip", password="blip")
-        put_url = reverse("v1.0:workspace_detail", kwargs={"workspace_guid": test_workspace_guid})
-        put_data = {
-            "title" : "wont_work"
-        }
-        put_response = self.client.put(put_url, put_data, format="json")
-        self.assertEqual(put_response.status_code, status.HTTP_403_FORBIDDEN)
-        
+
+
     def test_delete_workspace(self):
-        
+
         ###################################################
         # POSTing test Workspace
         ###################################################
-        
+
         workspace_post_url = reverse("v1.0:workspace_list")
         test_title = "bleh_title"
         data = {"title": test_title}
         post_response = self.client.post(workspace_post_url, data, format="json")
         post_response_dict = json.loads(post_response.content.decode())
         to_delete_workspace_guid = post_response_dict.get("id", "")
-        
+
         ###################################################
         # POSTing new Renkan into test Workspace
         ###################################################
-        
+
         renkan_post_url = reverse("v1.0:renkan_list_workspace", kwargs={"workspace_guid": to_delete_workspace_guid})
         renkan_test_title = "bleh_title"
         renkan_test_data = {"title": renkan_test_title}
         post_response = self.client.post(renkan_post_url, renkan_test_data, format="json")
         to_delete_renkan_guid = json.loads(post_response.content.decode()).get("id", "")
-        
+
         ###################################################
         # Try to DELETE test Workspace (should fail, it still contains a Renkan)
         ###################################################
-        
+
         delete_url = reverse("v1.0:workspace_detail", kwargs={"workspace_guid":to_delete_workspace_guid})
         delete_response = self.client.delete(delete_url, {}, format="json")
         self.assertEqual(delete_response.status_code, status.HTTP_400_BAD_REQUEST)
-        
+
         ###################################################
         # DELETE posted Renkan
         ###################################################
-        
+
         delete_renkan_url = reverse("v1.0:renkan_detail", kwargs={"renkan_guid":to_delete_renkan_guid})
         delete_renkan_response = self.client.delete(delete_renkan_url, format="json")
         self.assertEqual(delete_renkan_response.status_code, status.HTTP_204_NO_CONTENT)
-        
-        ###################################################
-        # try to DELETE with unauthorized user 
+
         ###################################################
-        
-        _ = self.client.login(username="blip", password="blip")
-        delete_url = reverse("v1.0:workspace_detail", kwargs={"workspace_guid":to_delete_workspace_guid})
-        delete_response = self.client.delete(delete_url, {}, format="json")
-        self.assertEqual(delete_response.status_code, status.HTTP_403_FORBIDDEN)
-        
-        # Restoring rightful user
-        _ = self.client.login(username="blop", password="blop")
-        
+        # DELETE test Workspace
         ###################################################
-        # DELETE test Workspace 
-        ###################################################
-        
+
         delete_url = reverse("v1.0:workspace_detail", kwargs={"workspace_guid":to_delete_workspace_guid})
         delete_response = self.client.delete(delete_url, {}, format="json")
         self.assertEqual(delete_response.status_code, status.HTTP_204_NO_CONTENT)
-        
+
         ###################################################
         # Try to DELETE workspace with wrong guid
         ###################################################
-        
+
         delete_url = reverse("v1.0:workspace_detail", kwargs={"workspace_guid": "bad-workspace-guid"})
         delete_response = self.client.delete(delete_url, format=json)
         self.assertEqual(delete_response.status_code, status.HTTP_404_NOT_FOUND)
-        
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/server/python/django2/requirements.txt	Mon Jun 13 14:23:58 2016 +0200
@@ -0,0 +1,3 @@
+--index-url https://pypi.python.org/simple/
+
+-e .
--- a/server/python/django2/setup.py	Tue Jun 07 10:46:20 2016 +0200
+++ b/server/python/django2/setup.py	Mon Jun 13 14:23:58 2016 +0200
@@ -10,13 +10,13 @@
 
 
     data_files = []
-    
+
     root_dir = os.path.dirname(__file__)
     if root_dir != '':
         os.chdir(root_dir)
     source_dir = 'renkanmanager'
 
-    
+
     for dirpath, dirnames, filenames in os.walk(source_dir):
         # Ignore dirnames that start with '.'
         for i, dirname in enumerate(dirnames):
@@ -25,7 +25,7 @@
             data_files.append([dirpath, [os.path.join(dirpath, f) for f in filenames]])
 
     #write MANIFEST.in
-    
+
     with open("MANIFEST.in", "w") as m:
         m.write("include MANIFEST.in\n")
         for entry in data_files:
@@ -46,6 +46,12 @@
         packages=find_packages(),
         include_package_data=True,
         zip_safe=False,
+        install_requires = [
+            'Django>=1.9',
+            'djangorestframework>=3.3',
+            'easy-thumbnails>=2.3',
+            'pytz'
+        ],
         classifiers=[
             'Development Status :: 3 - Alpha',
             'Environment :: Web Environment',
@@ -62,10 +68,10 @@
             'Topic :: Software Development :: Libraries :: Python Modules',
         ],
     )
-    
+
 if __name__ == "__main__":
-    
+
     script_name = os.path.basename(sys.argv[0])
     script_args = sys.argv[1:]
-    
+
     launch_setup(script_name, script_args)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/server/python/django2/tests/settings.py	Mon Jun 13 14:23:58 2016 +0200
@@ -0,0 +1,57 @@
+import os
+import django.conf.global_settings as defaults
+
+DEBUG = True
+USE_TZ = True
+
+ROOT_URLCONF = 'renkanmanager.urls'
+TEMPLATES = [
+    {
+        'BACKEND': 'django.template.backends.django.DjangoTemplates',
+        'APP_DIRS': True,
+    },
+]
+
+LOGGING = {
+    'version': 1,
+    'disable_existing_loggers': False,
+    'handlers': {
+        'console': {
+            'class': 'logging.StreamHandler',
+        },
+    },
+    'loggers': {
+        'django': {
+            'handlers': ['console'],
+            'level': os.getenv('DJANGO_LOG_LEVEL', 'INFO'),
+        },
+        'renkanmanager': {
+            'handlers': ['console'],
+            'level': os.getenv('DJANGO_LOG_LEVEL', 'INFO'),
+        },
+    },
+}
+
+SECRET_KEY = "1Xks0ybXuEVZI32HbgGKje9L97ezev5vJJIohGB5aLo9rUi1BV"
+
+MIDDLEWARE_CLASSES = defaults.MIDDLEWARE_CLASSES + [
+    'django.contrib.sessions.middleware.SessionMiddleware',
+    'django.contrib.auth.middleware.AuthenticationMiddleware',
+    'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
+]
+
+INSTALLED_APPS = (
+    'django.contrib.contenttypes',
+    'django.contrib.sessions',
+    'django.contrib.auth',
+    'easy_thumbnails',
+    'renkanmanager'
+)
+
+DATABASES = {
+    'default': {
+        'ENGINE': 'django.db.backends.sqlite3'
+    }
+}
+
+AUTH_USER_MODEL='auth.User'