fix merge

This commit is contained in:
pablogg
2021-03-16 13:09:26 +01:00
37 changed files with 4192 additions and 361 deletions

View File

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

View File

@@ -24,7 +24,7 @@ class Company(models.Model):
cif = models.CharField('CIF', max_length=15, null=True, blank=True)
company_name = models.CharField('Razón Social Cooperativa', max_length=1000, null=True, blank=True)
short_name = models.CharField('Apócope', max_length=100, null=True, blank=True) # autogenerar si blank
short_name = models.CharField('Nombre', max_length=100, null=True, blank=True) # autogenerar si blank
web_link = models.URLField('Enlace a la web', null=True, blank=True)
shop = models.BooleanField('Tienda Online', null=True, default=False)
shop_link = models.URLField('Enlace a la tienda', null=True, blank=True)
@@ -52,8 +52,21 @@ class Company(models.Model):
created = models.DateTimeField('date of creation', auto_now_add=True)
updated = models.DateTimeField('date last update', auto_now=True)
creator = models.ForeignKey('core.CustomUser', on_delete=models.DO_NOTHING, null=True, blank=True, related_name='creator')
# history = models.ForeignKey(HistorySync, null=True, on_delete=models.DO_NOTHING, related_name='company')
history = models.ForeignKey(HistorySync, null=True, blank=True, on_delete=models.DO_NOTHING, related_name='comp_hist')
class Meta:
verbose_name = "Compañía"
verbose_name_plural = "Compañías"
def __str__(self):
if self.short_name:
return self.short_name
elif self.company_name:
return self.company_name
else:
return f"Compañía #{self.id}"
def link(self):
return self.shop_link is not None
link.boolean = True

View File

@@ -7,7 +7,7 @@ from django.test import TestCase
from rest_framework.test import APITestCase
from rest_framework import status
from companies.factories import ValidatedCompanyFactory
from companies.factories import ValidatedCompanyFactory, CompanyFactory
from companies.models import Company
from core.factories import CustomUserFactory
@@ -146,7 +146,7 @@ class CompanyViewSetTest(APITestCase):
'logo': None,
'city': None,
'address': 'qwer qewr 5',
'geo': None,
'geo': {'longitude': 1.0, 'latitude': 1.0},
'phone': '1234',
'mobile': '4321',
'other_phone': '41423',
@@ -293,6 +293,7 @@ class CompanyViewSetTest(APITestCase):
# check order
self.assertTrue(response.data[0]['id'] > response.data[1]['id'])
# TODO: test email_manager action
class MyCompanyViewTest(APITestCase):
"""CompanyViewset tests
@@ -313,7 +314,9 @@ class MyCompanyViewTest(APITestCase):
def test_auth_user_gets_data(self):
# create instance
user_instances = [self.factory(creator=self.user) for i in range(5)]
company = CompanyFactory()
self.user.company = company
self.user.save()
# Authenticate
token = get_tokens_for_user(self.user)
@@ -321,32 +324,10 @@ class MyCompanyViewTest(APITestCase):
# Query endpoint
response = self.client.get(self.endpoint)
payload = response.json()
# Assert forbidden code
self.assertEqual(response.status_code, status.HTTP_200_OK)
self.assertEquals(len(user_instances), len(payload))
def test_auth_user_can_paginate_instances(self):
"""authenticated user can paginate instances
"""
# Authenticate
token = get_tokens_for_user(self.user)
self.client.credentials(HTTP_AUTHORIZATION=f"Bearer {token['access']}")
# create instances
instances = [self.factory(creator=self.user) for n in range(12)]
# Request list
url = f"{self.endpoint}?limit=5&offset=10"
response = self.client.get(url)
# Assert access is allowed
self.assertEqual(response.status_code, status.HTTP_200_OK)
# assert only 2 instances in response
payload = response.json()
self.assertEquals(2, len(payload))
self.assertEquals(payload['company']['id'], company.id)
def test_anon_user_cannot_access(self):
# send in request
@@ -404,3 +385,168 @@ class RandomCompanySampleTest(APITestCase):
self.assertEquals(size, len(payload))
# test IDs not correlative (eventually it could be, because it's random)
self.assertTrue(payload[0]['id'] != (payload[1]['id'] + 1))
class AdminCompanyViewSetTest(APITestCase):
def setUp(self):
"""Tests setup
"""
self.endpoint = '/api/v1/admin_companies/'
self.factory = CompanyFactory
self.model = Company
# create user
self.email = f"user@mail.com"
self.password = ''.join(random.choices(string.ascii_uppercase, k = 10))
self.user = CustomUserFactory(email=self.email, is_active=True)
self.user.set_password(self.password)
self.user.save()
def test_anon_user_cannot_access(self):
instance = self.factory()
url = f"{self.endpoint}{instance.id}/"
# GET
response = self.client.get(self.endpoint)
# check response
self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED)
# POST
response = self.client.post(self.endpoint, data={})
# check response
self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED)
# PUT
response = self.client.get(url, data={})
# check response
self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED)
# delete
response = self.client.get(url)
# check response
self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED)
def test_auth_user_cannot_access(self):
# Authenticate
token = get_tokens_for_user(self.user)
self.client.credentials(HTTP_AUTHORIZATION=f"Bearer {token['access']}")
instance = self.factory()
url = f"{self.endpoint}{instance.id}/"
# GET
response = self.client.get(self.endpoint)
# check response
self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)
# POST
response = self.client.post(self.endpoint, data={})
# check response
self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)
# PUT
response = self.client.get(url, data={})
# check response
self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)
# delete
response = self.client.get(url)
# check response
self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)
def test_admin_user_can_list(self):
# make user site amdin
self.user.role = 'SITE_ADMIN'
self.user.save()
# Authenticate
token = get_tokens_for_user(self.user)
self.client.credentials(HTTP_AUTHORIZATION=f"Bearer {token['access']}")
# create instances
instance = [self.factory() for i in range(random.randint(1,5))]
# query endpoint
response = self.client.get(self.endpoint)
# assertions
self.assertEquals(response.status_code, 200)
payload = response.json()
self.assertEquals(len(instance), len(payload))
def test_admin_user_can_get_details(self):
# make user site amdin
self.user.role = 'SITE_ADMIN'
self.user.save()
# Authenticate
token = get_tokens_for_user(self.user)
self.client.credentials(HTTP_AUTHORIZATION=f"Bearer {token['access']}")
# create instances
instance = self.factory()
url = f"{self.endpoint}{instance.id}/"
# query endpoint
response = self.client.get(url)
# assertions
self.assertEquals(response.status_code, 200)
payload = response.json()
self.assertEquals(instance.id, payload['id'])
def test_admin_can_create_instance(self):
# make user site amdin
self.user.role = 'SITE_ADMIN'
self.user.save()
# Authenticate
token = get_tokens_for_user(self.user)
self.client.credentials(HTTP_AUTHORIZATION=f"Bearer {token['access']}")
# create instances
data = {
'short_name': 'test_compnay short _name',
}
# query endpoint
response = self.client.post(self.endpoint, data=data)
# assertions
self.assertEquals(response.status_code, 201)
payload = response.json()
self.assertEquals(data['short_name'], payload['short_name'])
def test_admin_can_update_instance(self):
# make user site amdin
self.user.role = 'SITE_ADMIN'
self.user.save()
# Authenticate
token = get_tokens_for_user(self.user)
self.client.credentials(HTTP_AUTHORIZATION=f"Bearer {token['access']}")
# create instance
instance = self.factory()
url = f"{self.endpoint}{instance.id}/"
# data
data = {
'short_name': 'test_compnay short _name',
}
# query endpoint
response = self.client.put(url, data=data)
# assertions
self.assertEquals(response.status_code, 200)
payload = response.json()
self.assertEquals(data['short_name'], payload['short_name'])
def test_admin_can_delete_instance(self):
# make user site amdin
self.user.role = 'SITE_ADMIN'
self.user.save()
# Authenticate
token = get_tokens_for_user(self.user)
self.client.credentials(HTTP_AUTHORIZATION=f"Bearer {token['access']}")
# create instance
instance = self.factory()
url = f"{self.endpoint}{instance.id}/"
# query endpoint
response = self.client.delete(url)
# assertions
self.assertEquals(response.status_code, 204)

View File

@@ -18,8 +18,8 @@ from stats.models import StatsLog
from companies.models import Company
from companies.serializers import CompanySerializer
from utils.tag_filters import CompanyTagFilter
from back_latienda.permissions import IsCreator
from rest_framework import filters
from back_latienda.permissions import IsCreator, IsSiteAdmin
from utils import woocommerce
@@ -69,11 +69,13 @@ class CompanyViewSet(viewsets.ModelViewSet):
# send email to company
subject = "Contacto de usuario"
email = EmailMessage(subject, company_message, to=[instance.creator.email])
email.content_subtype = "html"
email.send()
logging.info(f"Email sent to {instance.creator.email} as manager of {instance.name}")
# send confirmation email to user
subject = 'Confirmación de contacto'
email = EmailMessage(subject, message, to=[request.user.email])
email.content_subtype = "html"
email.send()
logging.info(f"Contact confirmation email sent to {request.user.email}")
stats_data = {
@@ -102,10 +104,12 @@ class CompanyViewSet(viewsets.ModelViewSet):
})
# send email to company
email = EmailMessage(subject, company_message, to=[instance.creator.email])
email.content_subtype = "html"
email.send()
logging.info(f"Email sent to {instance.creator.email} as manager of {instance.name}")
# send confirmation email to user
email = EmailMessage(subject, user_message, to=[data['email']])
email.content_subtype = "html"
email.send()
logging.info(f"Contact confirmation email sent to anonymous user {data['email']}")
# statslog data to register interaction
@@ -159,23 +163,37 @@ class CompanyViewSet(viewsets.ModelViewSet):
return Response(message)
@api_view(['GET',])
@permission_classes([IsAuthenticated,])
@api_view(['GET'])
@permission_classes([IsAuthenticated])
def my_company(request):
limit = request.GET.get('limit')
offset = request.GET.get('offset')
qs = Company.objects.filter(creator=request.user)
company_serializer = CompanySerializer(qs, many=True)
data = company_serializer.data
# RESULTS PAGINATION
if limit is not None and offset is not None:
limit = int(limit)
offset = int(offset)
data = data[offset:(limit+offset)]
elif limit is not None:
limit = int(limit)
data = data[:limit]
return Response(data=data)
if request.user.company:
serializer = CompanySerializer(request.user.company)
return Response({'company': serializer.data})
else:
return Response(status=status.HTTP_406_NOT_ACCEPTABLE)
'''
class MyCompanyViewSet(viewsets.ModelViewSet):
model = Company
serializer_class = CompanySerializer
permission_classes = [IsAuthenticated]
def get_queryset(self):
return self.model.objects.filter(company=self.request.user.company)
def perform_create(self, serializer):
serializer.save(creator=self.request.user)
'''
class AdminCompanyViewSet(viewsets.ModelViewSet):
""" Allows user with role 'SITE_ADMIN' to access all company instances
"""
queryset = Company.objects.all()
serializer_class = CompanySerializer
permission_classes = [IsSiteAdmin]
def perform_create(self, serializer):
serializer.save(creator=self.request.user)
@api_view(['GET',])