From a55695b12060210fc3da6b40098cea16578b7c86 Mon Sep 17 00:00:00 2001 From: littlewolf Date: Tue, 24 Sep 2019 20:12:09 +0300 Subject: [PATCH] Switch to decorator Add update test --- apps/establishment/serializers/back.py | 9 ++++++- apps/utils/decorators.py | 35 ++++++++++++++++++++++++++ apps/utils/models.py | 20 --------------- apps/utils/tests.py | 23 +++++++++++++++++ 4 files changed, 66 insertions(+), 21 deletions(-) create mode 100644 apps/utils/decorators.py diff --git a/apps/establishment/serializers/back.py b/apps/establishment/serializers/back.py index 7199eb54..b4269c5f 100644 --- a/apps/establishment/serializers/back.py +++ b/apps/establishment/serializers/back.py @@ -7,6 +7,9 @@ from establishment.serializers import ( EstablishmentBaseSerializer, PlateSerializer, ContactEmailsSerializer, ContactPhonesSerializer, SocialNetworkRelatedSerializers, EstablishmentDetailSerializer ) + +from utils.decorators import with_base_attributes + from main.models import Currency @@ -121,7 +124,10 @@ class ContactEmailBackSerializers(PlateSerializer): ] +# TODO: test decorator +@with_base_attributes class EmployeeBackSerializers(serializers.ModelSerializer): + """Social network serializers.""" class Meta: model = models.Employee @@ -129,4 +135,5 @@ class EmployeeBackSerializers(serializers.ModelSerializer): 'id', 'user', 'name' - ] \ No newline at end of file + ] + diff --git a/apps/utils/decorators.py b/apps/utils/decorators.py new file mode 100644 index 00000000..12233021 --- /dev/null +++ b/apps/utils/decorators.py @@ -0,0 +1,35 @@ +from functools import wraps + +def with_base_attributes(cls): + + def create(self, validated_data): + user = None + request = self.context.get("request") + + if request and hasattr(request, "user"): + user = request.user + + if user is not None: + validated_data['created_by'] = user + validated_data['modified_by'] = user + + obj = self.Meta.model.objects.create(**validated_data) + return obj + + def update(self, validated_data): + user = None + request = self.context.get("request") + + if request and hasattr(request, "user"): + user = request.user + + if user is not None: + validated_data['modified_by'] = user + + obj = self.Meta.model.objects.create(**validated_data) + return obj + + setattr(cls, "create", create) + setattr(cls, "update", update) + + return cls diff --git a/apps/utils/models.py b/apps/utils/models.py index 929b5e5b..632cf4a2 100644 --- a/apps/utils/models.py +++ b/apps/utils/models.py @@ -11,9 +11,6 @@ from easy_thumbnails.fields import ThumbnailerImageField from utils.methods import image_path, svg_image_path from utils.validators import svg_image_validator -from django.db.models.signals import pre_save -from django.dispatch import receiver - class ProjectBaseMixin(models.Model): """Base mixin model.""" @@ -126,23 +123,6 @@ class BaseAttributes(ProjectBaseMixin): null=True, related_name='%(class)s_records_modified' ) - @receiver(pre_save) - def _pre_save(sender, instance, **kwargs): - if not issubclass(sender, BaseAttributes): - return - - # debug - from establishment.models import Employee - if not isinstance(instance, Employee): - return - - user = False - - instance.modified_by = user - - if instance._state.adding: - instance.created_by = user - class Meta: """Meta class.""" diff --git a/apps/utils/tests.py b/apps/utils/tests.py index 786ed940..dafe0fee 100644 --- a/apps/utils/tests.py +++ b/apps/utils/tests.py @@ -91,5 +91,28 @@ class BaseAttributeTests(BaseTestCase): self.assertIn("id", response_data) employee = Employee.objects.get(id=response_data['id']) + self.assertEqual(self.user, employee.created_by) self.assertEqual(self.user, employee.modified_by) + + modify_user = User.objects.create_user( + username='sedragurda', + password='sedragurdaredips19', + email='sedragurda@desoz.com', + ) + + modify_tokkens = User.create_jwt_tokens(modify_user) + self.client.cookies = SimpleCookie( + {'access_token': modify_tokkens.get('access_token'), + 'refresh_token': modify_tokkens.get('refresh_token'), + 'locale': "en" + }) + + update_data = { + 'name': 'Test new name' + } + + response = self.client.patch('/api/back/establishments/employees/1/', data=update_data) + self.assertEqual(response.status_code, status.HTTP_200_OK) + + self.assertEqual(modify_user, employee.modified_by)