# HG changeset patch # User ymh # Date 1465820638 -7200 # Node ID e00a24b711a0066472f915bc7311fd3cea0140ec # Parent aa4987fede52e070d805e8561f6b31998ca9b0a6 make renkanmanager test run locally diff -r aa4987fede52 -r e00a24b711a0 .hgignore --- 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 diff -r aa4987fede52 -r e00a24b711a0 server/python/django2/Readme.md --- 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 diff -r aa4987fede52 -r e00a24b711a0 server/python/django2/renkanmanager/api/views.py --- 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: diff -r aa4987fede52 -r e00a24b711a0 server/python/django2/renkanmanager/serializers.py --- 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 diff -r aa4987fede52 -r e00a24b711a0 server/python/django2/renkanmanager/tests/v1_0/tests_renkan.py --- 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 diff -r aa4987fede52 -r e00a24b711a0 server/python/django2/renkanmanager/tests/v1_0/tests_revision.py --- 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) diff -r aa4987fede52 -r e00a24b711a0 server/python/django2/renkanmanager/tests/v1_0/tests_workspace.py --- 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 diff -r aa4987fede52 -r e00a24b711a0 server/python/django2/requirements.txt --- /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 . diff -r aa4987fede52 -r e00a24b711a0 server/python/django2/setup.py --- 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) diff -r aa4987fede52 -r e00a24b711a0 server/python/django2/tests/__init__.py diff -r aa4987fede52 -r e00a24b711a0 server/python/django2/tests/settings.py --- /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'