Merge branch 'sam' into development

This commit is contained in:
Sam
2021-03-11 10:00:59 +00:00
4 changed files with 101 additions and 45 deletions

View File

@@ -1,7 +1,7 @@
from django.contrib import admin from django.contrib import admin
from django.contrib.gis.db.models import PointField from django.contrib.gis.db.models import PointField
from django_admin_listfilter_dropdown.filters import DropdownFilter, RelatedDropdownFilter from django_admin_listfilter_dropdown.filters import DropdownFilter
from mapwidgets.widgets import GooglePointFieldWidget from mapwidgets.widgets import GooglePointFieldWidget
from . import models from . import models
@@ -10,8 +10,8 @@ from . import models
class CompanyAdmin(admin.ModelAdmin): class CompanyAdmin(admin.ModelAdmin):
list_display = ('short_name', 'city', 'email', 'shop', 'platform', 'sync', 'is_validated', 'is_active', 'link') list_display = ('short_name', 'city', 'email', 'shop', 'platform', 'sync', 'is_validated', 'is_active', 'link')
list_filter = ('platform', 'sync', 'is_validated', 'is_active', 'city') list_filter = ('platform', 'sync', 'is_validated', 'is_active', ('city', DropdownFilter))
search_fields = ('short_name', 'company_name', 'email', 'web_link', ('city', RelatedDropdownFilter)) search_fields = ('short_name', 'company_name', 'email', 'web_link', 'city')
formfield_overrides = { formfield_overrides = {
PointField: {"widget": GooglePointFieldWidget} PointField: {"widget": GooglePointFieldWidget}

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: # create company
city = company_data.pop('city') company_data = request.data['company']
#city = City.objects.get(name=city) # 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') # create user
geo = Point(geo['latitude'],geo['longitude']) 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) return Response(status=status.HTTP_201_CREATED)
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)
@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: