Commit 8b7266f3 authored by Cristian Mauricio Diaz Canales's avatar Cristian Mauricio Diaz Canales 💬

Merge branch 'disenoNuevo' of...

Merge branch 'disenoNuevo' of http://gitlab.gearlabs.cl/cdiaz/musica_listas_umusic into pruebaSuscripcion

merge entre disenoNuevo y rama de pruebas
parents cbebe391 65c7f4f4
......@@ -23,4 +23,4 @@ services:
# as action arguments even if you don't extend any base controller class
App\FrontendBundle\Controller\:
resource: '../src/FrontendBundle/Controller'
tags: ['controller.service_arguments']
\ No newline at end of file
tags: ['controller.service_arguments']
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 23.0.4, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 48 48" style="enable-background:new 0 0 48 48;" xml:space="preserve">
<style type="text/css">
.st0{fill:#FFFFFF;}
</style>
<g>
<path class="st0" d="M24,5.9c-10,0-18.1,8.1-18.1,18.1c0,9.6,7.7,18,18.1,18c10.2,0,18.1-8.2,18.1-18.1C42,13.8,33.9,5.9,24,5.9z
M33.2,20c-4,4-8,8-12,12c-0.4,0.4-0.7,0.4-1.1,0c-2.4-2.4-4.8-4.8-7.2-7.2c-0.4-0.4-0.5-0.7,0-1.1c0.8-0.7,1.6-1.5,2.3-2.3
c0.4-0.5,0.7-0.4,1.1,0c1.2,1.2,2.4,2.4,3.6,3.6c0.2,0.2,0.5,0.4,0.8,0.7c0.4-0.3,0.7-0.6,1-0.9c2.7-2.7,5.4-5.4,8-8.1
c0.5-0.5,0.9-0.6,1.4,0c0.7,0.8,1.5,1.5,2.2,2.2C33.6,19.3,33.6,19.6,33.2,20z"/>
</g>
</svg>
......@@ -8,6 +8,8 @@ use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Doctrine\ORM\EntityManagerInterface;
use App\Entity\PluRelacionesListas;
use App\Entity\PluLista;
use App\Entity\PluImagen;
use App\Entity\PluCancion;
......@@ -29,11 +31,16 @@ class CuentaController extends AbstractController
$msisdnEntrante = $request->get("msisdn");
$log->debug("entrando...HOST : $host |IP : $ip |MSISDN ENTRANTE: $msisdnEntrante| MSISDN SESION : $msisdnSesion");
/*Busca listas vigentes*/
$listas = $em->getRepository(PluLista::class)->getListasVigentes($msisdnSesion);
/**/
if ($msisdnEntrante != $msisdnSesion || !Utiles::isMsisdn($msisdnEntrante)) {
$log->debug("el msisdn entrante no cumple con el formato o es distinto al obtenido de la sesion...");
//$url = $this->generateUrl('front_index', array('msisdn' => $msisdnSesion));
$url = $this->container->get('router')->generate('front_index', array('msisdn' => $msisdnSesion));
$url = $this->container->get('router')->generate('front_index', array('msisdn' => $msisdnSesion, "listas" => $listas));
$statusCode = 302;
return new RedirectResponse($url, $statusCode);
......@@ -47,7 +54,9 @@ class CuentaController extends AbstractController
//$session->clear();//prueba
return $this->render('frontend/paginas/mi_cuenta.html.twig', [
"suscripciones" => $suscripciones,
"usuario" => $usuario
"usuario" => $usuario,
"listas"=>$listas,
"msisdn" => $msisdnSesion
]);
}
......@@ -93,12 +102,13 @@ class CuentaController extends AbstractController
}
public function logout(Request $request): Response {
$log = Utiles::setLog('App\FrontendBundle\Controller::CuentaController::presentacion', 'app/frontend/logout');
$em = $this->getDoctrine()->getManager('default');
$session = $this->get("session");
$session->clear();
$url = $this->container->get('router')->generate('front_index');
return new RedirectResponse($url, 302);
......
......@@ -8,6 +8,7 @@ use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Session\Session;
use App\Entity\PluLista;
use App\Entity\PluSesion;
use App\Entity\PluSuscripcion;
......@@ -51,7 +52,7 @@ class IndexController extends AbstractController {
$log->debug("generando registro de sesion en BD para el msisdn $msisdn....");
$this->generarRegistroSession($em, $msisdn);
}
} else if (!$session->get('msisdn') && $msisdn == "" && $modal == 0) {
} /*else if (!$session->get('msisdn') && $msisdn == "" && $modal == 0) {
$log->debug("3-No se pudo obtener el msisdn....");
$code = Utiles::generarCodiogUnico($ip);
//redirect a php que esta en otro servidor
......@@ -60,7 +61,7 @@ class IndexController extends AbstractController {
));
$statusCode = 302;
return new RedirectResponse($url, $statusCode);
}
}*/
if ($session->get('msisdn')=="") {
......@@ -99,7 +100,7 @@ class IndexController extends AbstractController {
$listasFiltradas = array_merge($listasFiltradas,$arrayHijos);
endforeach;
$cantidadListas = count($listasFiltradas);
$cantidadListas = count($listas);
$cantidadListasContratadas = count($listasFiltradasContratadas);
$log->debug("Cantdad listas vigentes usuario $msisdn : $cantidadListas | Cantidad listas Contratadas usuario $msisdn : $cantidadListasContratadas");
......@@ -134,8 +135,9 @@ class IndexController extends AbstractController {
$log->debug("OPCIONES FRONT error $error | MSISDN SALIENTE : $msisdn | modal? : $modal | isChrome : ".Utiles::isWindowsChrome($ua));
return $this->render('frontend/index.html.twig', [
"listas" => $listasFiltradas,
"listas" => $listas,
"listasContratadas" => $listasFiltradasContratadas,
"cantidadListas" => $cantidadListas,
"cantidadListasContratadas" => $cantidadListasContratadas,
......@@ -163,6 +165,9 @@ class IndexController extends AbstractController {
$em = $this->getDoctrine()->getManager('default');
$json = new JsonResponse();
$log->debug("$ua | $msisdn | $ip...");
$listas = $em->getRepository(PluLista::class)->getListasVigentes($msisdn);
/*if (!Utiles::checkIP($ip)) {
$log->debug("Acceso prohibido $ip...");
......@@ -177,7 +182,7 @@ class IndexController extends AbstractController {
//$json->setData(array('errors' => 'El número ingresado no es válido.'));
$error = "El número ingresado no es válido";
return $this->render('frontend/paginas/ingresar_numero.html.twig', ["error"=>$error]);
return $this->render('frontend/paginas/ingresar_numero.html.twig', ["error"=>$error, "listas"=>$listas]);
//return $json;
}
......@@ -196,7 +201,7 @@ class IndexController extends AbstractController {
// $json->setStatusCode(JsonResponse::HTTP_OK, 'Hemos enviado un sms con el c&oacute;digo de validaci&oacute;n');
//$json->setData(array('msg' => 'Hemos enviado un sms con el c&oacute;digo de validaci&oacute;n'));
$msj = "Hemos enviado un sms con el código de validación";
return $this->render('frontend/paginas/validar_pin.html.twig', ["msj"=>$msj, "msisdn"=>$msisdn]);
return $this->render('frontend/paginas/validar_pin.html.twig', ["msj"=>$msj, "msisdn"=>$msisdn, "listas"=>$listas]);
//return $json;
} else {
$log->debug('Ocurrio un problema al intentar enviar el sms, intenta de nuevo m&aacute;s tarde por favor.');
......@@ -212,6 +217,10 @@ class IndexController extends AbstractController {
$pin = $request->get("pin");
$em = $this->getDoctrine()->getManager('default');
$json = new JsonResponse();
/*Busca listas vigentes*/
$listas = $em->getRepository(PluLista::class)->getListasVigentes($msisdn);
/**/
$log->debug(" $msisdn | $pin...");
......@@ -221,7 +230,7 @@ class IndexController extends AbstractController {
// $json->setData(array('errors' => "Numero $msisdn invalido."));
//return $json;
$error = "Numero $msisdn inválido.";
return $this->render('frontend/paginas/validar_pin.html.twig', ["error"=>$error, "msisdn"=>$msisdn]);
return $this->render('frontend/paginas/validar_pin.html.twig', ["error"=>$error, "msisdn"=>$msisdn,"listas"=>$listas]);
}
if (!$pin || !is_numeric($pin)) {
......@@ -230,7 +239,7 @@ class IndexController extends AbstractController {
//$json->setData(array('errors' => 'Codigo pin invalido.'));
//return $json;
$error='Codigo pin invalido.';
return $this->render('frontend/paginas/validar_pin.html.twig', ["error"=>$error, "msisdn"=>$msisdn]);
return $this->render('frontend/paginas/validar_pin.html.twig', ["error"=>$error, "msisdn"=>$msisdn,"listas"=>$listas]);
}
$codigoPin = $em->getRepository(PluCodigoPin::class)->getPin($pin, $msisdn);
......@@ -245,7 +254,7 @@ class IndexController extends AbstractController {
//$json->setStatusCode(JsonResponse::HTTP_OK, 'CODIGO VALIDADO');
//return $this->redirect($this->generateUrl("front_index , array('msisdn' => $msisdn)), 302);
$url = $this->container->get('router')->generate('front_index', array('msisdn' => $msisdn));
$url = $this->container->get('router')->generate('front_index', array('msisdn' => $msisdn,"listas"=>$listas));
return new RedirectResponse($url, 302);
......@@ -255,7 +264,7 @@ class IndexController extends AbstractController {
// $json->setData(array('errors' => 'Estimado cliente, el c&oacute;digo es inv&aacute;lido.'));
// return $json;
$error='Estimado cliente, el código es inválido.';
return $this->render('frontend/paginas/validar_pin.html.twig', ["error"=>$error, "msisdn"=>$msisdn]);
return $this->render('frontend/paginas/validar_pin.html.twig', ["error"=>$error, "msisdn"=>$msisdn,"listas"=>$listas]);
}
}
......
......@@ -6,6 +6,8 @@ use Symfony\Bundle\FrameworkBundle\Controller\AbstractController ;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use App\Entity\PluRelacionesListas;
use Doctrine\ORM\EntityManagerInterface;
use App\Entity\PluImagen;
use App\Entity\PluLista;
......@@ -21,11 +23,20 @@ class ListadoController extends AbstractController
$id = $request->get("lisId");
$ua = $request->headers->get('User-Agent');
$log->debug("Mostrando canciones de la lista $id...");
$session = $this->get("session");
$msisdn = $session->get('msisdn');
//$cancionesLista = $this->getDoctrine()->getRepository(PluCancion::class)->getCancionesLista($id);
$em = $this->getDoctrine()->getManager('default');
$lista = $em->getRepository(PluLista::class)->find($id);
$cancionesLista = $this->getDoctrine()->getRepository(PluLista::class)->getCancionesLista($id);
return $this->render('frontend/paginas/listado.html.twig', array("cancionesLista"=>$cancionesLista, "IdentificadorListaCanciones"=>$id, "lista" => $lista, "isChrome" => Utiles::isWindowsChrome($ua)));
/*Busca listas vigentes*/
$listas = $em->getRepository(PluLista::class)->getListasVigentes($msisdn);
/**/
return $this->render('frontend/paginas/listado.html.twig', array("cancionesLista"=>$cancionesLista, "IdentificadorListaCanciones"=>$id, "msisdn"=>$msisdn,"listas"=>$listas, "lista" => $lista, "isChrome" => Utiles::isWindowsChrome($ua)));
}
......@@ -35,7 +46,11 @@ class ListadoController extends AbstractController
$log->debug("Mostrando canciones de la lista $id...");
//$cancionesLista = $this->getDoctrine()->getRepository(PluCancion::class)->getCancionesLista($id);
$cancionesLista = $this->getDoctrine()->getRepository(PluLista::class)->getCancionesLista($id);
return $this->render('frontend/paginas/canciones_no_contratadas.html.twig', array("cancionesLista"=>$cancionesLista, "IdentificadorListaCanciones"=>$id));
/*Busca listas vigentes*/
$listas = $em->getRepository(PluLista::class)->getListasVigentes($msisdn);
/**/
return $this->render('frontend/paginas/canciones_no_contratadas.html.twig', array("cancionesLista"=>$cancionesLista, "listas"=>$listas, "IdentificadorListaCanciones"=>$id));
}
......@@ -53,9 +68,29 @@ class ListadoController extends AbstractController
$log->debug("listas contratadas ".print_r($listasFiltradas,true));
/*Busca listas vigentes*/
$listas = $em->getRepository(PluLista::class)->getListasVigentes($msisdn);
$log->debug("Cargando listas vigentes...." . count($listas));
$listasFiltradas = array();
foreach ($listas as $lista):
if ($em->getRepository(PluLista::class)->getCantCancionesAgregadas($lista->getLisId()) >= 1 && !$em->getRepository(PluRelacionesListas::class)->checkIsHija($lista->getLisId())) {
$listasFiltradas[] = $lista;
}
endforeach;
$log->debug("Verificando listas hijas de listas contratadas vigentes: " . count($listasFiltradas));
foreach($listasFiltradasContratadas as $index=>$listaFiltradaContratada):
$arrayHijos = $em->getRepository(PluRelacionesListas::class)->getListaHija($listaFiltradaContratada->getLisId(),$idListasContratadas);
$listasFiltradas = array_merge($listasFiltradas,$arrayHijos);
endforeach;
/**/
return $this->render('frontend/paginas/listas_contratadas.html.twig', [
"listasContratadas" => $listasFiltradas,
"cantidadListasContratadas" => count($listasFiltradas)
"cantidadListasContratadas" => count($listasFiltradas),
"listas" => $listasFiltradas
]);
}
......
......@@ -7,6 +7,8 @@ use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Doctrine\ORM\EntityManagerInterface;
use App\Entity\PluRelacionesListas;
use App\Entity\PluLista;
use App\Entity\PluImagen;
use App\Entity\PluCancion;
......@@ -25,6 +27,11 @@ class ReproductorController extends AbstractController
$em = $this->getDoctrine()->getManager('default');
$lista = $em->getRepository(PluLista::class)->find($id);
$cancionesLista = $this->getDoctrine()->getRepository(PluLista::class)->getCancionesLista($id);
return $this->render('frontend/paginas/reproductor.html.twig', array("cancionesLista"=>$cancionesLista, "IdentificadorListaCanciones"=>$id, "lista" => $lista, "isChrome" => Utiles::isWindowsChrome($ua)));
/*Busca listas vigentes*/
$listas = $em->getRepository(PluLista::class)->getListasVigentes($msisdn);
/**/
return $this->render('frontend/paginas/reproductor.html.twig', array("cancionesLista"=>$cancionesLista, "IdentificadorListaCanciones"=>$id, "lista" => $lista, "listas"=>$listas,"isChrome" => Utiles::isWindowsChrome($ua)));
}
}
......@@ -9,6 +9,8 @@ use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Doctrine\ORM\EntityManagerInterface;
use App\Entity\PluRelacionesListas;
use App\Entity\PluLista;
use App\Entity\PluImagen;
use App\Entity\PluCancion;
......@@ -21,19 +23,24 @@ class SuscripcionController extends AbstractController
public function mostrarContratar(Request $request) : Response{
$log = Utiles::setLog('App\FrontendBundle\Controller::SuscripcionController::mostrarContratar', 'app/frontend/contratacion');
$em = $this->getDoctrine()->getManager('default');
$msisdn = $request->get("msisdn");
$lisId = $request->get("lisId");
$session = $this->get("session");
$msisdnSesion = $session->get('msisdn');
$msisdnEntrante = $request->get("msisdn");
/*Busca listas vigentes*/
$listas = $em->getRepository(PluLista::class)->getListasVigentes($msisdn);
/**/
if ($msisdnEntrante != $msisdnSesion || !Utiles::isMsisdn($msisdnEntrante)) {
$log->debug("el msisdn entrante no cumple con el formato o es distinto al obtenido de la sesion...");
$url = $this->container->get('router')->generate('front_index', array('msisdn' => $msisdnSesion));
$url = $this->container->get('router')->generate('front_index', array('msisdn' => $msisdnSesion, 'listas'=>$listasFiltradas));
$statusCode = 302;
return new RedirectResponse($url, $statusCode);
......@@ -44,15 +51,16 @@ class SuscripcionController extends AbstractController
$cant = $em->getRepository(PluLista::class)->getCantListaSuscrita($msisdn, $lisId);
if ($cant > 0){
$lista = $em->getRepository(PluLista::class)->find($lisId);
$cancionesLista = $this->getDoctrine()->getRepository(PluLista::class)->getCancionesLista($lisId);
return $this->render('frontend/paginas/reproductor.html.twig', array("cancionesLista"=>$cancionesLista, "IdentificadorListaCanciones"=>$lisId, "lista" => $lista, "isChrome" => Utiles::isWindowsChrome($ua)));
return $this->render('frontend/paginas/reproductor.html.twig', array("cancionesLista"=>$cancionesLista,"msisdn" => $msisdn, "IdentificadorListaCanciones"=>$lisId, "listas"=>$listas,"lista" => $lista, "isChrome" => Utiles::isWindowsChrome($ua)));
}
else
$lista = $em->getRepository(PluLista::class)->find($lisId);
return $this->render('frontend/paginas/mostrarContratar.html.twig', array("lista"=>$lista, "msisdn"=>$msisdn));
return $this->render('frontend/paginas/mostrarContratar.html.twig', array("lista"=>$lista, "listas"=>$listas, "msisdn"=>$msisdn));
}
......@@ -60,11 +68,15 @@ class SuscripcionController extends AbstractController
$log = Utiles::setLog('App\FrontendBundle\Controller::SuscripcionController::confirmarContratar', 'app/frontend/contratacion');
$em = $this->getDoctrine()->getManager('default');
$msisdn = $request->get("msisdn");
$lisId = $request->get("lisId");
$lista = $em->getRepository(PluLista::class)->find($lisId);
$lisId = $request->get("lisId");
return $this->render('frontend/paginas/confirmacionContratar.html.twig', array("lista"=>$lista, "msisdn"=>$msisdn));
/*Busca listas vigentes*/
$listas = $em->getRepository(PluLista::class)->getListasVigentes($msisdn);
/**/
$lista = $em->getRepository(PluLista::class)->find($lisId);
return $this->render('frontend/paginas/confirmacionContratar.html.twig', array("lista"=>$lista, "msisdn"=>$msisdn, 'listas'=>$listas));
}
......@@ -117,6 +129,10 @@ class SuscripcionController extends AbstractController
$resultado = EntelVPW::suscribirEntel($msisdn, $lista, $suscripcion, $em);
$log->debug("Resultado suscripcion ENTEL VPW :".print_r($resultado,true));
/*Busca listas vigentes*/
$listas = $em->getRepository(PluLista::class)->getListasVigentes($msisdn);
/**/
if($resultado["statusCode"] == 200){
$suscripcion->setSusVigente(PluSuscripcion::VIGENTE);
$em->persist($suscripcion);
......@@ -125,9 +141,10 @@ class SuscripcionController extends AbstractController
$json->setData(array('success' => 'OK.'));
$json->setStatusCode(JsonResponse::HTTP_OK);
return $this->render('frontend/paginas/resultado.html.twig', [
"lista" => $lista,
"listas" => $listas,
"mensaje" => "Suscripción realizada correctamente",
"isChrome" => Utiles::isWindowsChrome($ua)
]);
......@@ -142,6 +159,8 @@ class SuscripcionController extends AbstractController
return $this->render('frontend/paginas/resultado.html.twig', [
"lista" => $lista,
"listas" => $listas,
"msisdn" => $msisdn,
"error" => "Estimado usuario, no se ha podido realizar la suscripción",
"isChrome" => Utiles::isWindowsChrome($ua)
]);
......@@ -155,27 +174,34 @@ class SuscripcionController extends AbstractController
$lisId = $request->get("lisId",null);
$json = new JsonResponse();
/*Busca listas vigentes*/
$listas = $em->getRepository(PluLista::class)->getListasVigentes($msisdn);
/**/
$log->debug("msisdn" . $msisdn);
$log->debug("lisId" . $lisId);
if(!is_numeric($lisId)){
$log->debug("La lista seleccionada no es válida...");
$json->setData(array('errors' => "La lista seleccionada no es válida"));
$json->setStatusCode(JsonResponse::HTTP_BAD_REQUEST);
$url = $this->container->get('router')->generate('front_mi_cuenta', array('msisdn' => $msisdn, 'error' => "La lista seleccionada no es válida"));
return new RedirectResponse($url);
$json->setStatusCode(JsonResponse::HTTP_BAD_REQUEST);
$url = $this->container->get('router')->generate('front_mi_cuenta', array('msisdn' => $msisdn, 'error' => "La lista seleccionada no es válida", 'listas' => $listas));
return new RedirectResponse($url);
}
if(!Utiles::formatMsisdnSpecial($msisdn)){
$log->debug("El msisdn ingresado no es válido...");
$json->setData(array('errors' => "El número ingresado no es valido"));
$json->setStatusCode(JsonResponse::HTTP_BAD_REQUEST);
$json->setStatusCode(JsonResponse::HTTP_BAD_REQUEST);
$url = $this->container->get('router')->generate('front_mi_cuenta', array('msisdn' => $msisdn, 'error' => "El número ingresado no es valido"));
$url = $this->container->get('router')->generate('front_mi_cuenta', array('msisdn' => $msisdn, 'error' => "El número ingresado no es valido", 'listas' => $listas));
return new RedirectResponse($url);
}
$ultimaSuscripcionVigenteLista = $this->getDoctrine()->getRepository(PluSuscripcion::class)->getUltimaSuscripcionLista($msisdn, $lisId);
$ultimaSuscripcionVigenteLista = $this->getDoctrine()->getRepository(PluSuscripcion::class)->getUltimaSuscripcionLista($msisdn, $lisId);
$lista = $this->getDoctrine()->getRepository(PluLista::class)->find($lisId);
//Registro de desuscripcion
$suscripcion = new PluSuscripcion();
......@@ -202,11 +228,11 @@ class SuscripcionController extends AbstractController
$json->setStatusCode(JsonResponse::HTTP_OK);
return $json;*/
$url = $this->container->get('router')->generate('front_mi_cuenta', array('msisdn' => $msisdn, 'success' => 'Se ha desuscrito con éxito'));
$url = $this->container->get('router')->generate('front_mi_cuenta', array('msisdn' => $msisdn, 'success' => 'Se ha desuscrito con éxito', 'listas' => $listas));
return new RedirectResponse($url);
}else{
$url = $this->container->get('router')->generate('front_mi_cuenta', array('msisdn' => $msisdn, 'error' => $resultado["descr"]));
$url = $this->container->get('router')->generate('front_mi_cuenta', array('msisdn' => $msisdn, 'error' => $resultado["descr"], 'listas' => $listas));
return new RedirectResponse($url);
}
......
......@@ -3,7 +3,10 @@
<a href="javascript:void(0)" class="closebtn" onclick="closeNav()">&times;</a>
<div class="overlay-content">
<a class="nav-link" href="{{path('front_index', {msisdn: app.session.get('msisdn')})}}">Inicio</a>
{% if app.session.get('msisdn')!="" %}
{% if app.session.get('msisdn')!="" %}
{%for lista in listas%}
<a class="nav-link" href="{{ path('front_mostrar_contratar', { 'msisdn': msisdn, 'lisId': lista.lisId }) }}">{{lista.lisNombre}}</a>
{% endfor %}
<a class="nav-link" href="{{path('front_mi_cuenta', {msisdn: app.session.get('msisdn')})}}">Mi cuenta</a>
<a class="nav-link" href="{{path('salir', {msisdn: app.session.get('msisdn')})}}">Salir</a>
{% endif %}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment