Selaa lähdekoodia

Merged in FD3-62 (pull request #37)

FD3-62
Maximiliano Schvindt 7 vuotta sitten
vanhempi
commit
66c269cd25

+ 1 - 1
app/config/routing.yml

@@ -41,7 +41,7 @@ _sonata:
 
 FTTHBundle:
     resource: "@FTTHBundle/Resources/config/routing/admin.xml"
-    prefix: /admin
+    prefix: /
 
 base_oauth_client:
     resource: "@BaseOAuthClientBundle/Resources/config/routing.yml"

+ 1 - 0
app/config/url_webservice.yml.dist

@@ -16,3 +16,4 @@ parameters:
     remote_device_log_url: '%url_base%/api/devicelogs.json'
     remote_get_map_url: '%url_mapas%/api/maps.json'
     remote_get_object_type_url: '%url_mapas%/api/objecttypes.json'
+    remote_get_objects_url: '%url_mapas%/api/objects.json'

+ 2 - 0
app/config/url_webservice.yml.docker

@@ -9,6 +9,8 @@ parameters:
     remote_device_url: '%url_base%/api/devices.json'
     remote_device_log_url: '%url_base%/api/devicelogs.json'
     remote_get_map_url: '%url_mapas%/api/maps.json'
+    remote_get_object_type_url: '%url_mapas%/api/objecttypes.json'
+    remote_get_objects_url: '%url_mapas%/api/objects.json'
     sidebar_menu:
         Base: '%url_base%'
         Mapas: '%url_mapas%'

+ 1 - 1
src/FTTHBundle/Admin/OLTModelAdmin.php

@@ -50,7 +50,7 @@ class OLTModelAdmin extends BaseAdmin
     protected function configureFormFields(FormMapper $formMapper)
     {
         $marks = ['FiberHome' => 'FiberHome', 'FiberLink' => 'FiberLink', 'Huawei' => 'Huawei', 'ZTE' => 'ZTE', 'Calix' => 'Calix'];
-        $libraries = ['OIDSBase' => 'OIDSBase','OIDSFiberHomeV1' => 'OIDSFiberHomeV1','OIDSHuaweiV1' => 'OIDSHuaweiV1'];
+        $libraries = ['OIDSBase' => 'OIDSBase','OIDSFiberHomeV1' => 'OIDSFiberHomeV1','OIDSHuaweiV1' => 'OIDSHuaweiV1', 'OIDSFiberLinkV1' => 'OIDSFiberLinkV1', "OIDSZTEV1" => "OIDSZTEV1", "OIDSCalixV1" => "OIDSCalixV1"];
         $formMapper
             ->add('name')
             ->add('mark', 'choice', array('required'=>true, 'choices' => $marks))

+ 45 - 0
src/FTTHBundle/Admin/ONUAdmin.php

@@ -8,6 +8,9 @@ use Sonata\AdminBundle\Form\FormMapper;
 use Sonata\AdminBundle\Show\ShowMapper;
 use Sonata\DoctrineORMAdminBundle\Filter\CallbackFilter;
 use WorkflowBundle\Admin\WorkflowBaseAdmin;
+use Symfony\Component\Form\FormEvent;
+use Symfony\Component\Form\FormEvents;
+use Doctrine\ORM\EntityRepository;
 
 class ONUAdmin extends WorkflowBaseAdmin
 {
@@ -79,6 +82,31 @@ class ONUAdmin extends WorkflowBaseAdmin
             ->end()
             ->setHelps(array(
                 'nap' => $this->trans("helps.check_address")));
+
+        
+        /*
+         *  Si vienen parámetros por GET de olt=id o psn=string seteamos los campos
+         */
+        $formMapper->getFormBuilder()->addEventListener(FormEvents::PRE_SET_DATA,
+            function (FormEvent $event) use ($formMapper) {
+                $form = $event->getForm();
+                
+                $olt = $this->getRequest()->query->get('olt');
+                if(!is_null($olt)) {
+                    $em = $this->get("doctrine.orm.entity_manager");
+                    $query_olt = $em->createQueryBuilder('o')
+                            ->select('o')
+                            ->from('FTTHBundle:OLT', 'o')
+                            ->where('o.id = :id')
+                            ->setParameter('id', $olt);
+
+                    $form->add('olt', 'entity', array('class' => 'FTTHBundle:OLT', 'query_builder' => $query_olt));
+                }
+                
+                $ponSerialNumber = $this->getRequest()->query->get('psn');
+                $form->add('ponSerialNumber', null, array('data' => $ponSerialNumber));
+            }
+        );        
     }
 
     /**
@@ -115,6 +143,23 @@ class ONUAdmin extends WorkflowBaseAdmin
             ->end();
     }
 
+    /**
+     * @param string $action
+     * @param Object $object
+     * 
+     * @return array
+     */
+    public function configureActionButtons($action, $object = null)
+    {
+        $actions = parent::configureActionButtons($action, $object);
+        
+        if($action == "list") {
+            $actions['import_onu'] = array('template' => 'FTTHBundle:ONU:import_button.html.twig');
+        } 
+
+        return $actions;
+    }
+
     public function configure()
     {
         $this->setTemplate('create', 'FTTHBundle:ONU:form.html.twig');

+ 151 - 4
src/FTTHBundle/Controller/ONUController.php

@@ -2,12 +2,21 @@
 
 namespace FTTHBundle\Controller;
 
-use FTTHBundle\Entity\NAP;
-use FTTHBundle\Entity\ONU;
+use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
 use Symfony\Bundle\FrameworkBundle\Controller\Controller;
-use FOS\RestBundle\Controller\Annotations\RouteResource;
-use Symfony\Component\HttpFoundation\JsonResponse;
 use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpFoundation\JsonResponse;
+use Symfony\Component\HttpFoundation\Response;
+use MapBundle\Entity\Location;
+use FTTHBundle\Entity\ONU;
+use FTTHBundle\Entity\NAP;
+
+use Symfony\Component\Form\Extension\Core\Type\TextType;
+use Symfony\Component\Form\Extension\Core\Type\DateType;
+use Symfony\Component\Form\Extension\Core\Type\SubmitType;
+use WebserviceBundle\Form\Type\RemoteClientType;
+use MapBundle\Form\Type\RemoteMapType;
+use FOS\RestBundle\Controller\Annotations\RouteResource;
 
 /**
  * ONU controller.
@@ -16,6 +25,144 @@ use Symfony\Component\HttpFoundation\Request;
 class ONUController extends Controller
 {
 
+    public function importAction() 
+    {
+        $adminPool = $this->get('sonata.admin.pool');
+        $webservice = $this->get("webservice");
+        $translator = $this->get('translator');
+        $flashbag = $this->get('session')->getFlashBag();
+
+        $urlObjects = $this->container->hasParameter('remote_get_objects_url');
+        $urlObjectTypes = $this->container->hasParameter('remote_get_object_type_url');
+        $_types = array(); 
+        $disabled = false;
+        $objectTypeId = 0;
+
+        if(!$urlObjects) {
+            $flashbag->add("error", $translator->trans("msg_no_defined_ftth_url",array(),"FTTHBundle"));
+            $disabled = true;
+        } else {
+            if(!$urlObjectTypes) {
+                $flashbag->add("error", $translator->trans("msg_no_defined_ftth_url",array(),"FTTHBundle"));
+                $disabled = true;
+            } else {
+                $urlObjectTypes = $this->getParameter('remote_get_object_type_url');
+                $filters = array('name' => 'ONU');
+                $_types = $webservice->getData($urlObjectTypes, $filters, array(), null, null);
+            }
+            
+            if(empty($_types)) {
+                $flashbag->add("error", $translator->trans("msg_no_onu_in_map",array(),"FTTHBundle"));
+                $disabled = true;
+                $objectTypeId = 0;
+            } else {
+                $disabled = false;
+                $objectTypeId = $_types[0]['id'];
+            }
+        }
+        
+        $form = $this->createFormBuilder()
+        ->add('mapId', RemoteMapType::class, array('label' => $translator->trans("form.label_map",array(),"FTTHBundle"), 'disabled' => $disabled))
+        ->add('clientId', RemoteClientType::class, array('label' => $translator->trans("form.label_client",array(),"FTTHBundle"), 'disabled' => $disabled))
+        ->getForm();
+        
+        $flashbag->add("warning", $translator->trans("msg_select_map",array(),"FTTHBundle"));
+        
+        return $this->render('FTTHBundle:ONU:onu_import.html.twig', array(
+            'base_template' => $adminPool->getTemplate('layout'),
+            'admin_pool' => $adminPool,
+            'admin' => $adminPool->getAdminByClass("FTTHBundle\Entity\ONU"),
+            'objectTypeId' => $objectTypeId,
+            'form' => $form->createView(),
+            'disabled' => $disabled
+        ));
+
+    }
+
+    /*
+     * Queda pendiente enviar un comando para actualizar masivamente los devices
+     * /admin/ftth/onu/onu_save?_=1508847664462&limit=100&mapId=3&offset=0&clientId=1
+     */
+    public function onuSaveAction(Request $request) 
+    {
+        $em = $this->get('doctrine')->getManager();        
+        $webservice = $this->get("webservice");
+        $tenancy_service = $this->get("base_tenancy.tenancy_service");
+
+        $mapId = $request->get('mapId');
+        $clientId = $request->get('clientId');
+        
+        if(is_null($mapId) || empty($mapId) || is_null($clientId) || empty($clientId)) {
+            $response = new Response(
+                json_encode(array()),
+                Response::HTTP_OK,
+                array('content-type' => 'application/json')
+            );
+    
+            return $response;
+        }
+        
+        $limit = $request->get('limit');
+        $offset = $request->get('offset');
+        $objectTypeId = $request->get('objectTypeId');
+
+        $urlObjectTypes = $this->getParameter('remote_get_objects_url');
+        
+        $filters = array('type' => $objectTypeId, 'map' => $mapId);
+        $_onus = $webservice->getData($urlObjectTypes, $filters, array(), $limit, $offset);
+
+        $return = array();
+        foreach($_onus as $onu) {
+            $object = $em->getRepository("FTTHBundle:ONU")->findOneByPonSerialNumber($onu['text']);
+            if(is_null($object)) {
+                $object = new ONU();
+                $object->setClientId($clientId);
+                $object->setTenancyId($tenancy_service->getTenancyIdCurrent());
+                $object->setPonSerialNumber($onu['text']);
+                $em->persist($object);
+                $em->flush();
+                $return[] = "ONU create {$onu['text']}";
+            }
+            
+            $location = $object->getLocation();
+            $action = "update";
+            if(is_null($location)) {
+                $location = new Location();
+                $em->persist($location);
+                $em->flush();
+                $object->setLocation($location);
+                $action = "create";
+            }
+            
+            $data = json_decode($onu['vector']['data'],true);
+            $mapLocation = $data[0];
+            $mapLocation['zoom'] = 17;
+            $mapLocation['onu'] = "{$object->getPonSerialNumber()}";
+            $mapLocation['map_object_id'] = $onu['id'];
+            
+            $location->setJsonExtraData($mapLocation);
+            $location->setObjectTypeId($objectTypeId);
+            $location->setMapId($mapId);
+            
+            $em->persist($location);
+            
+            $return[] = "LOCATION (id {$location->getId()}) {$action} - ONU (id {$object->getId()}) {$onu['text']} - ".json_encode($mapLocation);
+        }
+
+        $em->flush();
+
+        $response = new Response(
+            json_encode($return),
+            Response::HTTP_OK,
+            array('content-type' => 'application/json')
+        );
+
+        return $response;
+
+    }
+
+
+
     /**
      * @param Request $request
      * @return JsonResponse

+ 1 - 0
src/FTTHBundle/Entity/NAP.php

@@ -53,6 +53,7 @@ class NAP implements TenancyIdTraitInterface, LocationInterface
      * @ORM\OneToMany(targetEntity="ONU", mappedBy="nap", fetch="EXTRA_LAZY")
      */
     protected $onus;
+
     /**
      * @var ContainerInterface
      */

+ 10 - 0
src/FTTHBundle/Entity/ONU.php

@@ -308,6 +308,16 @@ class ONU implements DeviceInterface, TenancyIdTraitInterface, LocationInterface
         return $this->updated;
     }
 
+    /**
+     * Set updated
+     *
+     */
+    public function setUpdated($updated)
+    {
+        $this->updated = $updated;
+        return $this;
+    }
+
     /**
      * Get administrativeState
      *

+ 7 - 0
src/FTTHBundle/Resources/config/routing/admin.xml

@@ -4,4 +4,11 @@
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://symfony.com/schema/routing http://symfony.com/schema/routing/routing-1.0.xsd">
 
+    <route id="onu_import" path="/admin/ftth/onu/import">
+        <default key="_controller">FTTHBundle:ONU:import</default>
+    </route>
+    
+    <route id="onu_save" path="/admin/ftth/onu/onu_save">
+        <default key="_controller">FTTHBundle:ONU:onuSave</default>
+    </route>
 </routes>

+ 13 - 0
src/FTTHBundle/Resources/translations/FTTHBundle.es.yml

@@ -98,6 +98,8 @@ form:
     label_time_pon_stats: Estadísticas de PON PORTs
     label_time_onu_stats: Estadísticas de ONUs
     label_time_olt_octets: Tráfico de OLT
+    label_map: Mapa
+    label_client: Cliente
 
 list:
     label_id: Id
@@ -178,3 +180,14 @@ Incorrect State: Estado erróneo
 Undefined State: Estado no definido
 Undefined Workflow: Workflow no definido
 Incorrect Workflow: El workflow no existe o no es compatible con este objeto
+link_action_import_from_map: Importar desde Mapa
+msg_no_defined_ftth_url: No se encuentran definidas las urls para obtener ONUs del módulo MAPA.
+msg_no_onu_in_map: No existen ONUs definidas en el módulo de Mapas.
+msg_select_map: Seleccione el Mapa desde el que se importarán las ONUs y el cliente al que se asociarán.
+import: Importador
+button_import: Importar
+alert_select_map_client: Debe seleccionar un mapa y cliente
+msg_import_onu: Importar ONUs
+msg_init_import: Iniciando importación, espere un momento.
+msg_end_import: FIN :)
+

+ 6 - 0
src/FTTHBundle/Resources/views/ONU/import_button.html.twig

@@ -0,0 +1,6 @@
+<li>
+    <a class="sonata-action-element" href="{{ path('onu_import') }}">
+        <i class="fa fa-download" aria-hidden="true"></i>
+        {{ 'link_action_import_from_map'|trans({}, 'FTTHBundle') }}
+    </a>
+</li>

+ 156 - 0
src/FTTHBundle/Resources/views/ONU/onu_import.html.twig

@@ -0,0 +1,156 @@
+{% extends 'SonataAdminBundle:CRUD:base_list.html.twig' %}
+
+{% block stylesheets %}
+{{ parent() }}
+
+<style>
+footer {z-index: 1100;}
+.container-fluid {padding-left: 0px; padding-right: 0px;}
+.container-fluid div.row {padding-left: 15px; padding-right: 15px;}
+.bold-title {font-weight: bold}
+#console-message {box-shadow: none; border-top:0px; max-height: 330px; overflow: auto;}
+</style>
+{% endblock %}
+
+{% block actions %}
+ {% endblock %}
+
+{% block tab_menu %}
+<ol class="nav navbar-top-links breadcrumb">
+    <li>
+        <a href="{{url('sonata_admin_dashboard')}}"><i class="fa fa-home"></i></a>
+    </li>
+    <li class="active"><span>{{ 'msg_import_onu'|trans({}, 'FTTHBundle') }}</span></li>
+</ol>
+{% endblock %}
+
+{% block title %}
+{% endblock %}
+
+{% block navbar_title %}
+{% endblock %}
+
+{% block list_filters_actions %}
+<ul class="nav navbar-nav navbar-right">
+    <li><a class="sonata-action-element" href="{{url('admin_ftth_onu_list')}}"><i class="fa fa-list" aria-hidden="true"></i>
+        {{ 'link_action_list'|trans({}, 'SonataAdminBundle') }}
+    </a></li>
+</ul>
+{% endblock %}
+
+{% block list_filters %}
+{% endblock %}
+
+{% block list_table %}
+{% endblock %}
+
+{% block sonata_wrapper %}
+{{ parent() }}
+<footer class="footer">
+    <span id="statusBar" class="statusBar">Listo.</span>
+</footer>
+{% endblock %}
+
+{% block content %}
+
+<div id='wrapper' class="box box-primary">
+    <div id='page-content-wrapper'>
+        <div class="row">
+            <div class="col-md-12">
+                <div class="box box-primary" style="border-top:0px">
+                    <div class="box-header">
+                        <h4 class="box-title">
+                            {{ 'import'|trans({}, 'FTTHBundle') }}
+                        </h4>
+                    </div>
+                    <div class="box-body">  
+                        <div class="sonata-ba-collapsed-fields">
+                            <div class="form-group clearfix">
+                                {{ form_widget(form) }}
+                            </div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+            <div class="col-md-12" style="padding: 25px; padding-top: 0px">
+                <div class="box box-primary box-body" id="console-message"></div>
+            </div>
+        </div>
+
+    </div>
+</div>
+
+<div class="sonata-ba-form-actions well well-small form-actions">
+    {% if disabled %}
+        <button class="btn btn-success" type="submit" id="btn_import" disabled="disabled">
+    {% else %}
+        <button class="btn btn-success" type="submit" id="btn_import">
+    {% endif %}
+    <i class="fa fa-download" aria-hidden="true"></i>&nbsp;{{ 'button_import'|trans({}, 'FTTHBundle') }}
+    </button>
+</div>
+
+
+<script>
+
+$(document).ready(function() {
+
+    var limit = 100;
+    var offset = 0;
+
+    $("#btn_import").change(function() {
+        offset = 0;
+    });
+
+    $("#btn_import").click(function(){
+        $("#btn_import").attr('disabled','disabled');
+        mapId = $("#mapId").val();
+        clientId = $("#form_clientId").val();
+
+        if(!mapId || !clientId) {
+            $("#btn_import").removeAttr('disabled');
+            alert("{{ 'alert_select_map_client'|trans({}, 'FTTHBundle') }}");
+            return;
+        }
+
+        count = 0;
+
+        $("#console-message").prepend("<span class='bold-title'>{{ 'msg_init_import'|trans({},'FTTHBundle') }}</span><br />");
+        
+        do {
+            result = importData(mapId, limit, offset);
+            offset += limit;
+            count++;
+            result.forEach(function(row) {
+                $("#console-message").prepend(row + "<br />");
+            });
+            $("#console-message").prepend("<span class='bold-title'>{{ 'msg_init_import'|trans({},'FTTHBundle') }}</span><br />");
+            
+        } while (result && result.length);
+        
+        $("#console-message").prepend("<span class='bold-title'>{{ 'msg_end_import'|trans({},'FTTHBundle') }}</span><br />");
+        $("#btn_import").removeAttr('disabled');
+        offset = 0;
+    }); 
+});
+
+function importData(mapId, limit, offset) {
+
+    var r = false;
+    $.ajax({
+        method: "POST",
+        async: false,
+        cache: false,
+        url: "{{url('onu_save')}}?_=" + new Date().getTime(),
+        data: { mapId: mapId, clientId: clientId, limit: limit, offset: offset, objectTypeId: {{objectTypeId}} }
+    }).done(function( result ) {
+        r = result;
+    });
+
+    return r;
+
+
+}
+
+</script>
+{% endblock %}