Skip to content

Commit d6f1bfe

Browse files
author
Alejandro Zamora Fonseca
committed
Merge branch 'release-1.5.0'
2 parents 7818f77 + 16551d5 commit d6f1bfe

File tree

426 files changed

+11909
-13529
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

426 files changed

+11909
-13529
lines changed

.gitlab-ci.yml

Lines changed: 14 additions & 99 deletions
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,12 @@ stages:
2424

2525
test:
2626
stage: test
27-
image: alejandrozf/docker-stuff:python-flake8
27+
image: freetechsolutions/python-flake8:3.6
2828
# Pick zero or more services to be used on all builds.
2929
# Only needed when using a docker container to run your tests in.
3030
# Check out: http://docs.gitlab.com/ce/ci/docker/using_docker_images.html#what-is-a-service
3131
services:
32-
- name: alejandrozf/docker-stuff:postgres-plperl-template1
32+
- name: freetechsolutions/postgresql:11
3333
alias: plpython
3434
- redis
3535
# This folder is cached between builds
@@ -44,9 +44,9 @@ test:
4444
- mkdir -p /opt/omnileads/media_root
4545
# FIXME: what follows is a hack to simulate we have the 'sox' program, we should have the real program
4646
# as a docker image or installed by this script
47-
- touch sox
48-
- chmod +x sox
49-
- mv sox /usr/bin/
47+
#- touch sox
48+
#- chmod +x sox
49+
#- mv sox /usr/bin/
5050
- pip install -r requirements/tests.txt
5151
variables:
5252
POSTGRES_DB: omnileads
@@ -83,6 +83,8 @@ docker-prodenv-build-push:
8383
- /^release-.*$/
8484
- schedules
8585
- web
86+
except:
87+
- merge_requests
8688

8789
staging-centos:
8890
stage: build
@@ -106,54 +108,9 @@ staging-centos:
106108
- /^pre-release-.*$/
107109
- schedules
108110
- web
109-
110-
111-
staging-ubuntu:
112-
stage: build
113-
script:
114-
- export CI_COMMIT_REF_NAME=$CI_COMMIT_REF_NAME
115-
- bash /home/ftsinfra/git_cleanup.sh
116-
- cd /home/ftsinfra/ominicontacto/deploy/vagrant/host_node/
117-
- vagrant halt ubuntu
118-
- vagrant destroy ubuntu -f
119-
- ./vagrantup.sh ubuntu
120-
- python ../edit_ansible.py --internal_ip=$STAGING_IP_UBUNTU --self_hosted=no --admin_pass=$DJANGO_PASS --databases_pass=$DATABASES_PASS
121-
- cd ../../ansible
122-
- echo "$FTSINFRA_PASS" | sudo -S IS_CICD=$IS_CICD ./deploy.sh -i
123-
- TESTS_INTEGRACION=True TESTS_INTEGRACION_HOSTNAME=$STAGING_HOST_UBUNTU ADMIN_USERNAME=admin ADMIN_PASSWORD=$DJANGO_PASS LOGIN_FAILURE_LIMIT=$LOGIN_FAILURE_LIMIT python /home/ftsinfra/ominicontacto/ominicontacto_app/tests/tests.py
124-
- cd /home/ftsinfra/ominicontacto/deploy/vagrant/host_node/
125-
- vagrant halt ubuntu
126-
tags:
127-
- build-aio
128-
only:
129-
- /.*ansible-hostnode.*$/
130-
- /^pre-release-.*$/
131-
- schedules
132-
- web
133-
134-
staging-debian:
135-
stage: build
136-
script:
137-
- export CI_COMMIT_REF_NAME=$CI_COMMIT_REF_NAME
138-
- bash /home/ftsinfra/git_cleanup.sh
139-
- cd /home/ftsinfra/ominicontacto/deploy/vagrant/host_node/
140-
- vagrant halt debian
141-
- vagrant destroy debian -f
142-
- ./vagrantup.sh debian
143-
- python ../edit_ansible.py --internal_ip=$STAGING_IP_DEBIAN --self_hosted=no --admin_pass=$DJANGO_PASS --databases_pass=$DATABASES_PASS
144-
- cd ../../ansible
145-
- echo "$FTSINFRA_PASS" | sudo -S IS_CICD=$IS_CICD ./deploy.sh -i
146-
- TESTS_INTEGRACION=True TESTS_INTEGRACION_HOSTNAME=$STAGING_HOST_DEBIAN ADMIN_USERNAME=admin ADMIN_PASSWORD=$DJANGO_PASS LOGIN_FAILURE_LIMIT=$LOGIN_FAILURE_LIMIT python /home/ftsinfra/ominicontacto/ominicontacto_app/tests/tests.py
147-
- cd /home/ftsinfra/ominicontacto/deploy/vagrant/host_node/
148-
- vagrant halt debian
149-
tags:
150-
- build-aio
151-
only:
152-
- /.*ansible-hostnode.*$/
153-
- /^pre-release-.*$/
154-
- schedules
155-
- web
156-
111+
except:
112+
- merge_requests
113+
157114
staging-self-hosted:
158115
stage: build
159116
script:
@@ -173,6 +130,8 @@ staging-self-hosted:
173130
- /^pre-release-.*$/
174131
- schedules
175132
- web
133+
except:
134+
- merge_requests
176135

177136
#TODO: dejo template de lo que sería el job de upgrade, a probar luego de que salga release-1.3.1
178137
#upgrade-centos:
@@ -221,49 +180,5 @@ prod-centos:
221180
- deploy-aio
222181
only:
223182
- /^release-.*$/
224-
225-
prod-ubuntu:
226-
stage: deploy
227-
environment: FTS-UBUNTU_BIONIC
228-
script:
229-
- export CI_COMMIT_REF_NAME=$CI_COMMIT_REF_NAME
230-
- bash /home/ftsinfra/git_cleanup.sh
231-
- cd /home/ftsinfra/ominicontacto/deploy/vagrant/host_node/
232-
- vagrant halt ubuntu
233-
- vagrant destroy ubuntu -f
234-
- ./vagrantup.sh ubuntu
235-
- python ../edit_ansible.py --internal_ip=$STAGING_IP_UBUNTU --self_hosted=no --admin_pass=$DJANGO_PASS --databases_pass=$DATABASES_PASS
236-
- cd ../../ansible
237-
- echo "$FTSINFRA_PASS" | sudo -S IS_CICD=$IS_CICD ./deploy.sh -i
238-
- cd /home/ftsinfra/ominicontacto/deploy/vagrant/host_node/
239-
- vagrant package --base Ubuntu-Staging --output ubuntu-$CI_COMMIT_REF_NAME.box
240-
- cp ubuntu-$CI_COMMIT_REF_NAME.box /home/ftsinfra/oml-boxes
241-
- cp -a .vagrant/machines/ubuntu/virtualbox/private_key /home/ftsinfra/oml-boxes/ubuntu_private_key_$CI_COMMIT_REF_NAME
242-
- rm -rf ubuntu-$CI_COMMIT_REF_NAME.box
243-
tags:
244-
- deploy-aio
245-
only:
246-
- /^release-.*$/
247-
248-
prod-debian:
249-
stage: deploy
250-
environment: FTS-DEBIAN
251-
script:
252-
- export CI_COMMIT_REF_NAME=$CI_COMMIT_REF_NAME
253-
- bash /home/ftsinfra/git_cleanup.sh
254-
- cd /home/ftsinfra/ominicontacto/deploy/vagrant/host_node/
255-
- vagrant halt debian
256-
- vagrant destroy debian -f
257-
- ./vagrantup.sh debian
258-
- python ../edit_ansible.py --internal_ip=$STAGING_IP_DEBIAN --self_hosted=no --admin_pass=$DJANGO_PASS --databases_pass=$DATABASES_PASS
259-
- cd ../../ansible
260-
- echo "$FTSINFRA_PASS" | sudo -S IS_CICD=$IS_CICD ./deploy.sh -i
261-
- cd /home/ftsinfra/ominicontacto/deploy/vagrant/host_node/
262-
- vagrant package --base Debian-Staging --output debian-$CI_COMMIT_REF_NAME.box
263-
- cp debian-$CI_COMMIT_REF_NAME.box /home/ftsinfra/oml-boxes
264-
- cp -a .vagrant/machines/debian/virtualbox/private_key /home/ftsinfra/oml-boxes/debian_private_key_$CI_COMMIT_REF_NAME
265-
- rm -rf debian-$CI_COMMIT_REF_NAME.box
266-
tags:
267-
- deploy-aio
268-
only:
269-
- /^release-.*$/
183+
except:
184+
- merge_requests

api_app/serializers.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -189,12 +189,13 @@ def to_internal_value(self, data):
189189
campo = data.get(FormularioNuevoContacto.get_nombre_input(nombre))
190190
datos.append(campo)
191191
datos_contacto_json = json.dumps(datos)
192-
data['datos'] = datos_contacto_json
193-
data['telefono'] = telefono
194-
data['bd_contacto'] = bd_contacto.pk
195-
data['id_externo'] = id_externo
192+
tmp_data = data.copy()
193+
tmp_data['datos'] = datos_contacto_json
194+
tmp_data['telefono'] = telefono
195+
tmp_data['bd_contacto'] = bd_contacto.pk
196+
tmp_data['id_externo'] = id_externo
196197

197-
contacto_serializer = ContactoSerializer(data=data)
198+
contacto_serializer = ContactoSerializer(data=tmp_data)
198199
if contacto_serializer.is_valid():
199200
contacto = contacto_serializer.save()
200201
else:

api_app/tests/tests.py

Lines changed: 107 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
from mock import patch
2323

2424
from django.conf import settings
25-
from django.core.urlresolvers import reverse
25+
from django.urls import reverse
2626
from django.test import TestCase, RequestFactory
2727

2828
from rest_framework.authtoken.models import Token
@@ -215,6 +215,111 @@ def test_servicio_agentes_activos_muestra_activos_no_offline(self, _ami_manager,
215215
else:
216216
self.assertEqual(datos_agente['status'], 'PAUSE')
217217

218+
@patch('ominicontacto_app.services.asterisk.asterisk_ami.AMIManagerConnector')
219+
@patch.object(AMIManagerConnector, "_ami_manager")
220+
def test_servicio_agentes_activos_detecta_grupos_menos_lineas_previstas(
221+
self, _ami_manager, manager):
222+
self.client.login(username=self.supervisor_admin.user.username, password=self.PWD)
223+
_ami_manager.return_value = (
224+
"/OML/AGENT/1/NAME : John Perkins\r\n"
225+
"/OML/AGENT/2/NAME : Silvia Pensive\r\n"
226+
"/OML/AGENT/2/SIP : 1001\r\n"
227+
"/OML/AGENT/2/STATUS : READY:1582309000\r\n"
228+
"2 results found."), None
229+
url = reverse('api_agentes_activos')
230+
response = self.client.get(url)
231+
self.assertEqual(len(response.json()), 1)
232+
datos_agente = response.json()[0]
233+
self.assertEqual(datos_agente['id'], '2')
234+
self.assertEqual(datos_agente['status'], 'READY')
235+
236+
@patch('ominicontacto_app.services.asterisk.asterisk_ami.AMIManagerConnector')
237+
@patch.object(AMIManagerConnector, "_ami_manager")
238+
def test_servicio_agentes_no_adiciona_grupo_headers_desconocidos(self, _ami_manager, manager):
239+
self.client.login(username=self.supervisor_admin.user.username, password=self.PWD)
240+
_ami_manager.return_value = (
241+
"/OML/AGENT/1/NAME : John Perkins\r\n"
242+
"/OML/AGENT/1/SIP : 1001\r\n"
243+
"/OML/AGENT/1/STATUS : READY:1582309000\r\n"
244+
"/OML/AGENT/1/STRANGE-HEADER : strange-value\r\n"
245+
"/OML/AGENT/2/NAME : Silvia Pensive\r\n"
246+
"/OML/AGENT/2/SIP : 1002\r\n"
247+
"/OML/AGENT/2/STATUS : PAUSE:1582309000\r\n"
248+
"2 results found."), None
249+
url = reverse('api_agentes_activos')
250+
response = self.client.get(url)
251+
self.assertEqual(len(response.json()), 2)
252+
datos_agente_1 = response.json()[0]
253+
datos_agente_2 = response.json()[1]
254+
self.assertEqual(datos_agente_2['id'], '2')
255+
self.assertEqual(datos_agente_2['status'], 'PAUSE')
256+
self.assertEqual([i for i in datos_agente_1.keys()],
257+
['id', 'nombre', 'sip', 'status', 'tiempo'])
258+
259+
@patch('ominicontacto_app.services.asterisk.asterisk_ami.AMIManagerConnector')
260+
@patch.object(AMIManagerConnector, "_ami_manager")
261+
@patch('api_app.utiles.logger')
262+
def test_servicio_agentes_activos_detecta_grupos_headers_incompletos(
263+
self, logger, _ami_manager, manager):
264+
self.client.login(username=self.supervisor_admin.user.username, password=self.PWD)
265+
_ami_manager.return_value = (
266+
"/OML/AGENT/1/NAME : John Perkins\r\n"
267+
"/OML/AGENT/1/SIP : \r\n"
268+
"/OML/AGENT/1/STATUS : READY:1582309000\r\n"
269+
"/OML/AGENT/2/NAME : Silvia Pensive\r\n"
270+
"/OML/AGENT/2/SIP : 1002\r\n"
271+
"/OML/AGENT/2/STATUS : PAUSE:1582309000\r\n"
272+
"2 results found."), None
273+
url = reverse('api_agentes_activos')
274+
response = self.client.get(url)
275+
self.assertEqual(len(response.json()), 2)
276+
self.assertEqual(logger.warning.call_count, 1)
277+
278+
@patch('ominicontacto_app.services.asterisk.asterisk_ami.AMIManagerConnector')
279+
@patch.object(AMIManagerConnector, "_ami_manager")
280+
@patch('api_app.utiles.logger')
281+
def test_servicio_agentes_activos_entradas_menos_lineas_son_detectadas_y_excluidas(
282+
self, logger, _ami_manager, manager):
283+
self.client.login(username=self.supervisor_admin.user.username, password=self.PWD)
284+
_ami_manager.return_value = (
285+
"/OML/AGENT/1/NAME : John Perkins\r\n"
286+
"/OML/AGENT/1/SIP : 1001\r\n"
287+
"/OML/AGENT/1/STATUS : READY:1582309100\r\n"
288+
"/OML/AGENT/2/NAME : Silvia Pensive\r\n"
289+
"/OML/AGENT/2/SIP : 1002\r\n"
290+
"/OML/AGENT/2/STATUS : PAUSE:1582309000\r\n"
291+
"/OML/AGENT/3/NAME : Homero Simpson\r\n"
292+
"/OML/AGENT/4/NAME : Marge Simpson\r\n"
293+
"/OML/AGENT/4/SIP : 1003\r\n"
294+
"/OML/AGENT/4/STATUS : PAUSE:1582309500\r\n"
295+
"/OML/AGENT/5/SIP : 1004\r\n"
296+
"2 results found."), None
297+
url = reverse('api_agentes_activos')
298+
response = self.client.get(url)
299+
self.assertEqual(len(response.json()), 3)
300+
self.assertEqual(logger.warning.call_count, 2)
301+
302+
@patch('ominicontacto_app.services.asterisk.asterisk_ami.AMIManagerConnector')
303+
@patch.object(AMIManagerConnector, "_ami_manager")
304+
@patch('api_app.utiles.logger')
305+
def test_servicio_agentes_activos_no_incluye_entradas_lineas_status_vacio(
306+
self, logger, _ami_manager, manager):
307+
self.client.login(username=self.supervisor_admin.user.username, password=self.PWD)
308+
_ami_manager.return_value = (
309+
"/OML/AGENT/1/NAME : Agente 01\r\n"
310+
"/OML/AGENT/1/SIP : 1004 \r\n"
311+
"/OML/AGENT/1/STATUS : \r\n"
312+
"/OML/AGENT/10/NAME : Agente10 \n"
313+
"/OML/AGENT/10/SIP : 1013\r\n"
314+
"/OML/AGENT/10/STATUS : \r\n"
315+
"/OML/AGENT/11/NAME : Agente11\r\n"
316+
"/OML/AGENT/11/SIP : 1014\r\n"
317+
"/OML/AGENT/11/STATUS : READY:1582309100\r\n"
318+
"3 results found."), None
319+
url = reverse('api_agentes_activos')
320+
response = self.client.get(url)
321+
self.assertEqual(len(response.json()), 1)
322+
218323
def test_api_login_devuelve_token_asociado_al_usuario_password(self):
219324
url = 'https://{0}{1}'.format(settings.OML_OMNILEADS_IP, reverse('api_login'))
220325
user = self.supervisor_admin.user
@@ -375,7 +480,7 @@ def test_api_modificar_calificacion_impide_calificar_mas_de_una_vez_contacto_cam
375480
url = reverse('disposition-detail', args=(self.calificacion_cliente.pk,))
376481
response = client.put(url, post_data)
377482
self.assertEqual(response.status_code, 400)
378-
self.assertEqual(response.data['status'], 'ERROR')
483+
self.assertEqual(str(response.data['status']), 'ERROR')
379484

380485
def test_api_muestra_solo_las_calificaciones_que_ha_hecho_el_agente_que_accede(self):
381486
contacto_nuevo = ContactoFactory(bd_contacto=self.campana_activa.bd_contacto)

0 commit comments

Comments
 (0)