fix merge
This commit is contained in:
@@ -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}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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',])
|
||||
|
||||
Reference in New Issue
Block a user