diff --git a/core/tests.py b/core/tests.py index 70b9941..22d637e 100644 --- a/core/tests.py +++ b/core/tests.py @@ -580,3 +580,61 @@ class ActivateUserTest(APITestCase): # assertions self.assertEquals(response.status_code, 406) self.assertTrue('error' in response.json()) + + +class CreateCompanyUserTest(APITestCase): + + def setUp(self): + self.endpoint = '/api/v1/create_company_user/' + self.factory = factories.CustomUserFactory + self.model = models.CustomUser + # create user + self.email = f"user@mail.com" + self.password = ''.join(random.choices(string.ascii_uppercase, k = 10)) + self.user = self.factory(email=self.email, is_active=False) + self.user.set_password(self.password) + self.user.save() + + def test_succesful_creation(self): + data = { + 'user': { + 'email': 'test@email.com', + 'full_name': 'TEST NAME', + 'password': 'VENTILADORES1234499.89', + }, + 'company': { + 'cif': 'qwerewq', + 'company_name': 'qwerewq', + 'short_name': 'qwerewq', + 'web_link': 'http://qwerewq.com', + 'shop': True, + 'shop_link': 'http://qwerewq.com', + 'platform': 'PRESTASHOP', + 'email': 'test@email.com', + 'logo': None, + 'city': None, + 'address': 'qwer qewr 5', + 'geo': None, + 'phone': '1234', + 'mobile': '4321', + 'other_phone': '41423', + 'description': 'dfgfdgdfg', + 'shop_rss_feed': 'http://qwerewq.com', + 'sale_terms': 'tewrnmfew f ewfrfew ewewew f', + 'shipping_cost': '12.25', + 'sync': False + } + } + + response = self.client.post(self.endpoint, data=data, format='json') + + self.assertEquals(response.status_code, 201) + self.assertEquals(len(mail.outbox), 1) + + def test_creation_error(self): + + response = self.client.post(self.endpoint, data={}, format='json') + + self.assertEquals(response.status_code, 406) + self.assertEquals(len(mail.outbox), 0) + diff --git a/core/views.py b/core/views.py index 1bb70e4..63ec0b8 100644 --- a/core/views.py +++ b/core/views.py @@ -20,6 +20,7 @@ from rest_framework.generics import UpdateAPIView from rest_framework.decorators import api_view, permission_classes from companies.models import Company +from companies.serializers import CompanySerializer from geo.models import City from . import models @@ -112,51 +113,47 @@ class UpdateUserView(UpdateAPIView): @permission_classes([CustomUserPermissions,]) def create_company_user(request): """ - Create non-validated company and manager user associated + Create non-validated company and associated managing user """ - user_data = { - 'full_name': request.data['user']['full_name'], - 'email': request.data['user']['email'], - 'password': request.data['user']['password'] - } - company_data = { - 'cif': request.data['company']['cif'], - 'company_name': request.data['company']['company_name'], - 'short_name': request.data['company']['short_name'], - 'web_link': request.data['company']['web_link'], - 'shop': request.data['company']['shop'], - 'city': request.data['company']['city'], - 'geo': request.data['company']['geo'], - 'address': request.data['company']['address'] - } - try: - user = models.CustomUser.objects.create(email=user_data['email'], full_name=user_data['full_name']) - except IntegrityError as e: - return Response({"errors": {"details": str(e)}}, status=status.HTTP_409_CONFLICT) + if 'user' not in request.data: + return Response({"error": "Missing parameter: user"}, status=406) + if 'company' not in request.data: + return Response({"error": "Missing parameter: company"}, status=406) - try: - city = company_data.pop('city') - #city = City.objects.get(name=city) + # create company + company_data = request.data['company'] + # substitute coordinates for Point + geo = company_data.pop('geo') + if geo: + company_data['geo'] = Point(geo['latitude'],geo['longitude']) + company_serializer = CompanySerializer( + data=company_data, + ) + if company_serializer.is_valid(): + # save model instance data + new_company = Company.objects.create(**company_serializer.validated_data) + else: + return Response({"error": "Company data is not valid"}, status=406) - geo = company_data.pop('geo') - geo = Point(geo['latitude'],geo['longitude']) + # create user + user_data = request.data['user'] + user_data['role'] = 'COOP_MANAGER' + user_data['company'] = new_company.id + user_serializer = core_serializers.CustomUserWriteSerializer( + data=user_data, + ) + if user_serializer.is_valid(): + # save model instance data + password = user_serializer.validated_data.pop('password') + new_user = User(**user_serializer.validated_data) + new_user.set_password(password) + new_user.save() + # send verification email + utils.send_verification_email(request, new_user) + else: + return Response({"error": "User data is not valid"}, status=406) - company = Company.objects.create(**company_data, city=city, geo=geo) - except Exception as e: - user.delete() - return Response({"errors": {"details": str(e)}}, status=status.HTTP_500_INTERNAL_SERVER_ERROR) - - user.set_password(user_data['password']) - user.company = company - user.role = 'COOP_MANAGER' - user.save() - - company.creator = user - company.save() - - serializer = core_serializers.CustomUserSerializer(user) - - return Response(data=serializer.data,status=status.HTTP_201_CREATED) + return Response(status=status.HTTP_201_CREATED) @api_view(['GET',]) diff --git a/products/utils.py b/products/utils.py index 8c938dc..18cb189 100644 --- a/products/utils.py +++ b/products/utils.py @@ -6,6 +6,7 @@ from django.db.models import Q from django.contrib.postgres.search import SearchQuery, SearchRank, SearchVector, TrigramSimilarity from django.db.models import Max, Min from django.conf import settings +from django.utils import timezone import requests @@ -203,7 +204,7 @@ def product_loader(csv_reader, user, company=None): return None # create historysync instance - history = HistorySync.objects.create(company=company, sync_date=datetime.datetime.now()) + history = HistorySync.objects.create(company=company, sync_date=timezone.now()) for row in csv_reader: # trim strings for key in row: