fixed create_company_user endoint, tests working

This commit is contained in:
Sam
2021-03-10 13:24:02 +00:00
parent a033fa3606
commit 0eaaf2bc49
3 changed files with 98 additions and 42 deletions

View File

@@ -580,3 +580,61 @@ class ActivateUserTest(APITestCase):
# assertions # assertions
self.assertEquals(response.status_code, 406) self.assertEquals(response.status_code, 406)
self.assertTrue('error' in response.json()) 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)

View File

@@ -20,6 +20,7 @@ from rest_framework.generics import UpdateAPIView
from rest_framework.decorators import api_view, permission_classes from rest_framework.decorators import api_view, permission_classes
from companies.models import Company from companies.models import Company
from companies.serializers import CompanySerializer
from geo.models import City from geo.models import City
from . import models from . import models
@@ -112,51 +113,47 @@ class UpdateUserView(UpdateAPIView):
@permission_classes([CustomUserPermissions,]) @permission_classes([CustomUserPermissions,])
def create_company_user(request): def create_company_user(request):
""" """
Create non-validated company and manager user associated Create non-validated company and associated managing user
""" """
user_data = { if 'user' not in request.data:
'full_name': request.data['user']['full_name'], return Response({"error": "Missing parameter: user"}, status=406)
'email': request.data['user']['email'], if 'company' not in request.data:
'password': request.data['user']['password'] return Response({"error": "Missing parameter: company"}, status=406)
}
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)
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') geo = company_data.pop('geo')
geo = Point(geo['latitude'],geo['longitude']) 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)
company = Company.objects.create(**company_data, city=city, geo=geo) # create user
except Exception as e: user_data = request.data['user']
user.delete() user_data['role'] = 'COOP_MANAGER'
return Response({"errors": {"details": str(e)}}, status=status.HTTP_500_INTERNAL_SERVER_ERROR) 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)
user.set_password(user_data['password']) return Response(status=status.HTTP_201_CREATED)
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)
@api_view(['GET',]) @api_view(['GET',])

View File

@@ -6,6 +6,7 @@ from django.db.models import Q
from django.contrib.postgres.search import SearchQuery, SearchRank, SearchVector, TrigramSimilarity from django.contrib.postgres.search import SearchQuery, SearchRank, SearchVector, TrigramSimilarity
from django.db.models import Max, Min from django.db.models import Max, Min
from django.conf import settings from django.conf import settings
from django.utils import timezone
import requests import requests
@@ -203,7 +204,7 @@ def product_loader(csv_reader, user, company=None):
return None return None
# create historysync instance # 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: for row in csv_reader:
# trim strings # trim strings
for key in row: for key in row: