瀏覽代碼

Fusionado fsm_onu_v1 con master

Maximiliano Schvindt 8 年之前
父節點
當前提交
d1b64d9361

+ 1 - 0
.gitignore

@@ -1,4 +1,5 @@
 /app/config/parameters.yml
+/app/config/hwioauthbundle/parameters.yml
 /build/
 /phpunit.xml
 /var/*

+ 4 - 1
app/AppKernel.php

@@ -26,7 +26,10 @@ class AppKernel extends Kernel
             new FOS\RestBundle\FOSRestBundle(),
             new JMS\SerializerBundle\JMSSerializerBundle($this),
             new Nelmio\CorsBundle\NelmioCorsBundle(),
-            new Base\AdminBundle\BaseAdminBundle()
+            new Base\AdminBundle\BaseAdminBundle(),
+            new Stof\DoctrineExtensionsBundle\StofDoctrineExtensionsBundle(),
+            new HWI\Bundle\OAuthBundle\HWIOAuthBundle(),
+            new Base\OAuthBundle\BaseOAuthBundle()
         ];
 
         if (in_array($this->getEnvironment(), ['dev', 'test'], true)) {

+ 23 - 9
app/config/config.yml

@@ -6,9 +6,12 @@ imports:
     - { resource: url_webservice.yml }
     - { resource: "@FTTHBundle/Resources/config/services.yml" }
     - { resource: "@WebserviceBundle/Resources/config/services.yml" }
+    - { resource: workflow.yml }
+    - { resource: "hwioauthbundle/parameters.yml" }
+    - { resource: "@BaseOAuthBundle/Resources/config/services.yml" }
+    - { resource: "@BaseOAuthBundle/Resources/config/hwioauthbundle/services.yml" }
+    - { resource: "@BaseOAuthBundle/Resources/config/hwioauthbundle/config.yml" }
 
-# Put parameters here that don't need to change on each machine where the app is deployed
-# http://symfony.com/doc/current/best_practices/configuration.html#application-related-configuration
 parameters:
     locale: es
 
@@ -28,6 +31,7 @@ framework:
     trusted_hosts:   ~
     trusted_proxies: ~
     session:
+        name: ftth_session
         # http://symfony.com/doc/current/reference/configuration/framework.html#handler-id
         handler_id:  session.handler.native_file
         save_path:   "%kernel.root_dir%/../var/sessions/%kernel.environment%"
@@ -54,18 +58,18 @@ doctrine:
         user:     "%database_user%"
         password: "%database_password%"
         charset:  UTF8
-        # if using pdo_sqlite as your database driver:
-        #   1. add the path in parameters.yml
-        #     e.g. database_path: "%kernel.root_dir%/../var/data/data.sqlite"
-        #   2. Uncomment database_path in parameters.yml.dist
-        #   3. Uncomment next line:
-        #path:     "%database_path%"
 
     orm:
         auto_generate_proxy_classes: "%kernel.debug%"
         naming_strategy: doctrine.orm.naming_strategy.underscore
         auto_mapping: true
 
+stof_doctrine_extensions:
+    orm:
+        default:
+            timestampable: true
+        
+
 # Swiftmailer Configuration
 swiftmailer:
     transport: "%mailer_transport%"
@@ -74,8 +78,18 @@ swiftmailer:
     password:  "%mailer_password%"
     spool:     { type: memory }
 
+sonata_admin:
+    templates:
+        layout: BaseAdminBundle::standard_layout.html.twig
+        user_block: BaseAdminBundle:Core:user_block.html.twig
+        
 sonata_block:
     default_contexts: [sonata_page_bundle]
     blocks:
         sonata.admin.block.admin_list:
-            contexts:   [admin]
+            contexts:   [admin]
+
+sonata_admin:
+    templates:
+        layout: BaseAdminBundle::standard_layout.html.twig
+        user_block: BaseOAuthBundle:Core:oauth_user_block.html.twig

+ 6 - 0
app/config/hwioauthbundle/parameters.yml

@@ -0,0 +1,6 @@
+parameters:
+    client_id: 2_69u0epm6clk4w8kw8sw8c4so88404go80wc08oc4co0gsoo0cg
+    client_secret: 1eji8ahod9k0oo8ows0c0oookwsg8gg0wkw0c0so0wkowgg0o0
+    access_token_url:    "http://200.50.175.17/base/app_dev.php/oauth/v2/token"
+    authorization_url:   "http://200.50.175.17/base/app_dev.php/oauth/v2/auth"
+    infos_url:           "http://200.50.175.17/base/app_dev.php/api/user/me"

+ 6 - 0
app/config/hwioauthbundle/parameters.yml.dist

@@ -0,0 +1,6 @@
+parameters:
+    client_id:           "5_4pweqwos4jy8wokw0cssks04gg4k04o0ccgcskc0ow0skg88s0"
+    client_secret:       "26gqveoflockc88w88gsc0o0kow404wo8ww8s4gkk08c0c44g0"
+    access_token_url:    "http://200.50.168.111/base/app_dev.php/oauth/v2/token"
+    authorization_url:   "http://200.50.168.111/base/app_dev.php/oauth/v2/auth"
+    infos_url:           "http://200.50.168.111/base/app_dev.php/api/user/me"

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

@@ -17,3 +17,4 @@ parameters:
 
     # A secret key that's used to generate certain security-related tokens
     secret:            ThisTokenIsNotSoSecretChangeIt
+    jms_serializer.camel_case_naming_strategy.class: JMS\Serializer\Naming\IdenticalPropertyNamingStrategy

+ 28 - 1
app/config/routing.yml

@@ -1,3 +1,20 @@
+login:
+    path: /admin/login
+    defaults:
+        _controller: FrameworkBundle:Redirect:urlRedirect
+        path: /connect/login
+        permanent: true
+
+logout:
+    path: /logout
+
+homepage:
+    path: /
+    defaults:
+        _controller: FrameworkBundle:Redirect:urlRedirect
+        path: /admin/dashboard
+        permanent: true
+
 ftth_onu_api:
     resource: "@FTTHBundle/Controller/ONURESTController.php"
     type:   rest
@@ -12,4 +29,14 @@ ftth:
     prefix:   /
 
 _sonata:
-    resource: "routing_sonata.yml"
+    resource: "routing_sonata.yml"
+
+FTTHBundle:
+    resource: "@FTTHBundle/Resources/config/routing/admin.xml"
+    prefix: /admin    
+    
+base_oauth:
+    resource: "@BaseOAuthBundle/Resources/config/routing.yml"
+    
+base_hwioauthbundle_oauth:
+    resource: "@BaseOAuthBundle/Resources/config/hwioauthbundle/routing.yml"

+ 28 - 18
app/config/security.yml

@@ -1,24 +1,34 @@
-# To get started with security, check out the documentation:
-# http://symfony.com/doc/current/security.html
 security:
-
-    # http://symfony.com/doc/current/security.html#b-configuring-how-users-are-loaded
+    
     providers:
-        in_memory:
-            memory: ~
-
+        oauth:
+            id: base_oauth_bundle.oauth_user_provider
+    
+    role_hierarchy:
+        ROLE_ADMIN: [ROLE_USER, ROLE_ALLOWED_TO_SWITCH]
+        ROLE_SUPER_ADMIN: ROLE_ADMIN
+            
     firewalls:
-        # disables authentication for assets and the profiler, adapt it according to your needs
         dev:
             pattern: ^/(_(profiler|wdt)|css|images|js)/
             security: false
-
-        main:
-            anonymous: ~
-            # activate different ways to authenticate
-
-            # http_basic: ~
-            # http://symfony.com/doc/current/security.html#a-configuring-how-your-users-will-authenticate
-
-            # form_login: ~
-            # http://symfony.com/doc/current/cookbook/security/form_login_setup.html
+        secured_area:
+            pattern: ^/
+            logout:
+                path:   /logout
+                target: /
+            anonymous: true
+            
+            # HWIOAuthBundle + BaseOAuthBundle Configuration
+            oauth:
+                login_path: /login
+                failure_path: /login
+                check_path: /login
+                resource_owners:
+                    login: /login_check
+                oauth_user_provider:
+                    service: base_oauth_bundle.oauth_user_provider
+                    
+    access_control:
+        - { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
+        - { path: ^/admin/, role: ROLE_ADMIN }

+ 1 - 1
app/config/url_webservice.yml

@@ -1,2 +1,2 @@
 parameters:
-    client: 'http://200.50.168.111/base/app_dev.php/api/clients.json'
+    client: 'http://200.50.175.17/base/app_dev.php/api/clients.json'

+ 49 - 0
app/config/workflow.yml

@@ -0,0 +1,49 @@
+framework:
+    workflows:
+        onu_state:
+            type: 'state_machine'
+            marking_store:
+                type: 'single_state'
+                arguments:
+                    - 'currentState'
+            supports:
+                - FTTHBundle\Entity\ONU
+            places:
+                - active
+                - suspend
+            transitions:
+                active_to_suspend:
+                    from: active
+                    to:   suspend
+                suspend_to_active:
+                    from: suspend
+                    to:   active 
+        transition_state:
+            type: 'workflow'
+            marking_store:
+                type: 'single_state'
+                arguments:
+                    - 'transitionState'
+            supports:
+                - FTTHBundle\Entity\ONU
+            places:
+                - pending
+                - process
+                - fail
+                - success
+            transitions:
+                pending_to_process:
+                    from: pending
+                    to:   process
+                process_to_fail:
+                    from: process
+                    to:   fail
+                process_to_success:
+                    from: process
+                    to:   success
+                fail_to_pending:
+                    from: fail
+                    to:   pending
+                success_to_pending:
+                    from: success
+                    to:   pending

+ 11 - 1
composer.json

@@ -30,6 +30,13 @@
             "options": {
                     "local_pk": "./keys/bitbucket.id_rsa"
             }
+        },
+        {
+            "type": "vcs",
+            "url":  "ssh://git@200.50.168.30:222/VendorSoftwareFlowdat3/BaseOAuthBundle.git",
+            "options": {
+                    "local_pk": "./keys/bitbucket.id_rsa"
+            }
         }
     ],
     "config":{
@@ -54,7 +61,10 @@
         "stof/doctrine-extensions-bundle": "^1.2",
         "voryx/restgeneratorbundle": "dev-master",
         "base-admin": "dev-master",
-        "webservice": "dev-master"
+        "webservice": "dev-master",
+        "symfony/workflow": "^3.2",
+        "base-oauth-bundle": "dev-master",
+        "hwi/oauth-bundle": "^0.5.3"
     },
     "require-dev": {
         "sensio/generator-bundle": "^3.0",

File diff suppressed because it is too large
+ 572 - 198
composer.lock


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

@@ -37,11 +37,14 @@ class ONUAdmin extends BaseAdmin
             ->add('serialNumber')
             ->add('ponSerialNumber')
             ->add('clientId')
+            ->add('currentState','string', array('template' => 'FTTHBundle:ONU:base_list_field_onu_state.html.twig'))
+            ->add('transitionState')
             ->add('_action', null, array(
                 'actions' => array(
                     'show' => array(),
                     'edit' => array(),
                     'delete' => array(),
+                    'state' => array('template' => 'FTTHBundle:ONU:onu_state.html.twig')
                 )
             ))
         ;

+ 34 - 0
src/FTTHBundle/Controller/ONUController.php

@@ -0,0 +1,34 @@
+<?php
+
+namespace FTTHBundle\Controller;
+
+use Symfony\Bundle\FrameworkBundle\Controller\Controller;
+use Symfony\Component\Workflow\Exception\ExceptionInterface;
+
+class ONUController extends Controller
+{
+
+    public function applyTransitionAction(\FTTHBundle\Entity\ONU $onu, $transition, $workflow = "state_machine.onu_state")
+    {
+        try {
+            $this->get("{$workflow}")->apply($onu, $transition);
+            $this->get('doctrine')->getManager()->flush();
+        } catch (ExceptionInterface $e) {
+            $this->get('session')->getFlashBag()->add('danger', $e->getMessage());
+        }
+
+        return $this->redirect($this->generateUrl('admin_ftth_onu_list'));
+    }
+
+    public function showWorkflowAction(\FTTHBundle\Entity\ONU $onu)
+    {
+        return $this->render('FTTHBundle:ONU:show_workflow.html.twig', ['onu' => $onu]);
+    }
+
+    public function resetStateAction(\FTTHBundle\Entity\ONU $onu)
+    {
+        $onu->setCurrentState('active');
+        $this->get('doctrine')->getManager()->flush();
+        return $this->redirect($this->generateUrl('admin_ftth_onu_list'));
+    }
+}

+ 119 - 4
src/FTTHBundle/Entity/ONU.php

@@ -3,20 +3,26 @@
 namespace FTTHBundle\Entity;
 
 use Doctrine\ORM\Mapping as ORM;
+use Gedmo\Mapping\Annotation as Gedmo;
 use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
 use Symfony\Component\Validator\Constraints as Assert;
+use Doctrine\Common\Persistence\Event\LifecycleEventArgs;
+
 
 /**
- * @ORM\Table
+ * ONU
+ *
  * @ORM\Entity
- * @UniqueEntity("ponSerialNumber")
+ * @ORM\HasLifecycleCallbacks
+ * @UniqueEntity(fields={"ponSerialNumber", "tenancyId"}, message="errors.duplicate_key")
+ * @ORM\Table(uniqueConstraints={@ORM\UniqueConstraint(name="unique_idx", columns={"pon_serial_number", "tenancy_id"})})
  */
 class ONU
 {
     /**
      * @var int
      *
-     * @ORM\Column(name="id", type="integer")
+     * @ORM\Column(name="id", type="integer", nullable=false)
      * @ORM\Id
      * @ORM\GeneratedValue(strategy="AUTO")
      */
@@ -47,7 +53,7 @@ class ONU
     /**
      * @var string
      *
-     * @ORM\Column(type="string", length=12, nullable=true, unique=true)
+     * @ORM\Column(type="string", length=12, nullable=false, unique=true)
      */
     private $ponSerialNumber;
 
@@ -59,6 +65,35 @@ class ONU
      */
     private $clientId;
 
+    /**
+     * @Gedmo\Timestampable(on="create")
+     * @ORM\Column(type="datetime")
+     */
+    protected $created;
+
+    /**
+     * @Gedmo\Timestampable(on="update")
+     * @ORM\Column(type="datetime")
+     */
+    protected $updated;
+
+    /**
+     * @ORM\Column(type="string", nullable=false, options={"default": "active"}) 
+     */
+    protected $currentState = 'active';
+    
+    /**
+     * @ORM\Column(type="string", nullable=false, options={"default": "pending"}) 
+     */
+    protected $transitionState = 'pending';
+
+    /**
+     * @var int
+     *
+     * @ORM\Column(type="integer", nullable=false, options={"default":1})
+     */
+    protected $tenancyId = 1;
+
 
     /**
      * @return string
@@ -197,5 +232,85 @@ class ONU
     {
         return $this->clientId;
     }
+
+    /**
+     * Get created
+     *
+     * @return \DateTime
+     */
+    public function getCreated()
+    {
+        return $this->created;
+    }
+
+    /**
+     * Get updated
+     *
+     * @return \DateTime
+     */
+    public function getUpdated()
+    {
+        return $this->updated;
+    }
+
+    /**
+     * Get currentState
+     *
+     */
+    public function getCurrentState()
+    {
+        return $this->currentState;
+    }
+    
+    /**
+     * Set currentState
+     *
+     */
+    public function setCurrentState($currentState)
+    {
+        $this->currentState = $currentState;
+    }
+
+    /**
+     * Get transitionState
+     *
+     */
+    public function getTransitionState()
+    {
+        return $this->transitionState;
+    }
+    
+    /**
+     * Set transitionState
+     *
+     */
+    public function setTransitionState($transitionState)
+    {
+        $this->transitionState = $transitionState;
+    }
+
+    /**
+     * Set tenancyId
+     *
+     * @param int $tenancyId
+     *
+     * @return ONU
+     */
+    public function setTenancyId($tenancyId)
+    {
+        $this->tenancyId = $tenancyId;
+
+        return $this;
+    }
+
+    /**
+     * Get tenancyId
+     *
+     * @return int
+     */
+    public function getTenancyId()
+    {
+        return $this->tenancyId;
+    }
 }
 

+ 1 - 1
src/FTTHBundle/Form/ONUType.php

@@ -13,7 +13,7 @@ class ONUType extends AbstractType
      */
     public function buildForm(FormBuilderInterface $builder, array $options)
     {
-        $builder->add('ip')->add('mac')->add('serialNumber')->add('ponSerialNumber')->add('clientId')        ;
+        $builder->add('ip')->add('mac')->add('serialNumber')->add('ponSerialNumber')->add('clientId')->add('currentState')->add('transitionState');
     }
     
     /**

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

@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<routes xmlns="http://symfony.com/schema/routing"
+    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="admin_ftth_onu_apply_transition" path="/ftth/onu/apply_transition/{id}/{transition}/{workflow}">
+        <default key="_controller">FTTHBundle:ONU:applyTransition</default>
+        <default key="id">1</default>
+        <default key="transition">suspend_to_active</default>
+        <default key="workflow">state_machine.onu_state</default>
+    </route>
+    
+    <route id="admin_ftth_onu_show_workflow" path="/ftth/onu/{id}/show_workflow">
+        <default key="_controller">FTTHBundle:ONU:showWorkflow</default>
+        <default key="id">1</default>
+    </route>
+    
+    <route id="admin_ftth_onu_reset_state" path="/ftth/onu/{id}/reset_state">
+        <default key="_controller">FTTHBundle:ONU:resetState</default>
+        <default key="id">1</default>
+    </route>
+</routes>

+ 20 - 1
src/FTTHBundle/Resources/translations/FTTHBundle.es.yml

@@ -5,6 +5,11 @@ filter:
     label_serial_number: Número Serie
     label_pon_serial_number: Número Serie Pon
     label_client_id: Cliente
+    label_current_state: Estado
+    label__action: Acciones
+    label_created: Creado
+    label_updated: Actualizado
+    label_transition_state: Transición
 breadcrumb:
     link_o_n_u_list: Listado ONU
     link_o_n_u_create: Crear ONU
@@ -16,6 +21,11 @@ form:
     label_serial_number: Número Serie
     label_pon_serial_number: Número Serie Pon
     label_client_id: Cliente
+    label_current_state: Estado
+    label__action: Acciones
+    label_created: Creado
+    label_updated: Actualizado
+    label_transition_state: Transición
 list:
     label_id: Id
     label_ip: Ip
@@ -23,11 +33,20 @@ list:
     label_serial_number: Número Serie
     label_pon_serial_number: Número Serie Pon
     label_client_id: Cliente
+    label_current_state: Estado
     label__action: Acciones
+    label_created: Creado
+    label_updated: Actualizado
+    label_transition_state: Transición
 show:
     label_id: Id
     label_ip: Ip
     label_mac: Mac
     label_serial_number: Número Serie
     label_pon_serial_number: Número Serie Pon
-    label_client_id: Cliente
+    label_client_id: Cliente
+    label_current_state: Estado
+    label__action: Acciones
+    label_created: Creado
+    label_updated: Actualizado
+    label_transition_state: Transición

+ 7 - 0
src/FTTHBundle/Resources/views/ONU/base_list_field_onu_state.html.twig

@@ -0,0 +1,7 @@
+{% extends 'SonataAdminBundle:CRUD:base_list_field.html.twig' %}
+
+{% block field %}
+    <div>
+        <a href="{{path('admin_ftth_onu_show_workflow',{id:object.getId()})}}">{{object.getCurrentState()}}</a>
+    </div>
+{% endblock %}

+ 33 - 0
src/FTTHBundle/Resources/views/ONU/layout.html.twig

@@ -0,0 +1,33 @@
+<!DOCTYPE html>
+<html>
+    <head>
+        <meta charset="utf-8">
+        <meta http-equiv="X-UA-Compatible" content="IE=edge">
+        <meta name="viewport" content="width=device-width, initial-scale=1">
+        <title>Workflow demo application</title>
+        {% block stylesheets %}
+            <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" integrity="sha384-1q8mTJOASx8j1Au+a5WDVnPi2lkFfwwEAa8hDDdjZlpLegxhjVME1fgjWPGmkzs7" crossorigin="anonymous">
+            <style>
+                svg text {
+                    font-size: 0.75em;
+                    font-weight: bold;
+                }
+            </style>
+        {% endblock %}
+    </head>
+    <body>
+        <div class="container">
+
+            {% block content %}
+
+                {% block main '' %}
+            
+                <hr />
+            {% endblock %}
+        </div>
+        {% block javascripts %}
+            <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
+            <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js" integrity="sha384-0mSbJDEHialfmuBBQP6A4Qrprq5OVfW37PRR3j5ELqxss1yVqOtnepnHVP9aJ7xS" crossorigin="anonymous"></script>
+        {% endblock %}
+    </body>
+</html>

+ 14 - 0
src/FTTHBundle/Resources/views/ONU/onu_state.html.twig

@@ -0,0 +1,14 @@
+{#<a href="{{ admin.generateObjectUrl('edit', object) }}" class="btn btn-sm btn-default view_link">
+    <i class="fa fa-hashtag" aria-hidden="true"></i>
+    Workflow
+</a>        #}
+
+{% for transition in workflow_transitions(object, "onu_state") %}
+        <a  href="{{path('admin_ftth_onu_apply_transition',{id:object.getId(),transition:transition.name})}}" name="transition" value="{{ transition.name }}"
+    {% if workflow_can(object, transition.name, "onu_state") -%}
+        class="btn btn-sm btn-default view_link"
+    {%- else -%}
+        class="btn btn-sm btn-default view_link btn-danger" disabled="disabled"
+    {%- endif -%}
+    > {{ transition.name }}</a>
+{% endfor %}

+ 77 - 0
src/FTTHBundle/Resources/views/ONU/show_workflow.html.twig

@@ -0,0 +1,77 @@
+{% extends 'FTTHBundle:ONU:layout.html.twig' %}
+
+{% block main %}
+    <h1>ONU "{{ onu.ponSerialNumber}}"</h1>
+    <div class="row">
+        <div class="col-md-5">
+            <h2>Current State</h2>
+            <p>
+                <code>
+                    FTTHBundle\Entity\ONU::current_state = {{ onu.getCurrentState() }}
+                </code>
+                <br />
+                <code>
+                    FTTHBundle\Entity\ONU::transitionState = {{ onu.getTransitionState() }}
+                </code>
+            </p>
+            <p>
+                <form action="{{ path('admin_ftth_onu_reset_state', {id: onu.getId()}) }}" method="post" class="form-inline">
+                    <button type="submit" class="btn btn-danger btn-xs">Reset State</button>
+                </form>
+            </p>
+        </div>
+        <div class="col-md-6">
+            <h2>What can you do?</h2>
+                <div class="btn-group-vertical" role="group">
+                    <code style="color:black;text-align:center">current_state</code> 
+                    {% if workflow_transitions(onu, "onu_state")|length > 0 %}
+                        {% for transition in workflow_transitions(onu, "onu_state") %}
+                            <a  href="{{path('admin_ftth_onu_apply_transition',{id:onu.getId(),transition:transition.name})}}" name="transition" value="{{ transition.name }}"
+                                {% if workflow_can(onu, transition.name, "onu_state") -%}
+                                    class="btn btn-primary"
+                                {%- else -%}
+                                    class="btn btn-danger" disabled="disabled"
+                                {%- endif -%}
+                            >
+                                {{ transition.name }}
+                            </a>
+                        {% endfor %}
+                    {% else %}
+                        <a  href="" name="transition" class="btn btn-danger" disabled="disabled">Sin opciones</a>
+                    {% endif %}
+                </div>
+                <div class="btn-group-vertical" role="group">
+                    <code style="color:black;text-align:center">transation_state</code> 
+                    {% if workflow_transitions(onu, "transition_state")|length > 0 %}
+                        {% for transition in workflow_transitions(onu, "transition_state") %}
+                            <a  href="{{path('admin_ftth_onu_apply_transition',{id:onu.getId(),transition:transition.name,workflow:'workflow.transition_state'})}}" name="transition" value="{{ transition.name }}"
+                                {% if workflow_can(onu, transition.name, "transition_state") -%}
+                                    class="btn btn-primary"
+                                {%- else -%}
+                                    class="btn btn-danger" disabled="disabled"
+                                {%- endif -%}
+                            >
+                                {{ transition.name }}
+                            </a>
+                        {% endfor %}
+                    {% else %}
+                        <a  href="" name="transition" class="btn btn-danger" disabled="disabled">Sin opciones</a>
+                    {% endif %}
+                </div>
+            <br />
+        </div>
+    </div>
+    <div>
+        <br />
+        <img src="http://200.50.175.17/ftth/onu_state.png" />
+        <br />
+        <img src="http://200.50.175.17/ftth/transition_state.png" />
+    </div>
+    <br />
+    <div>
+        <a  href="{{path('admin_ftth_onu_list')}}" class="btn btn-primary">
+            Volver al listado de onus
+        </a>
+    </div>
+    
+{% endblock %}

+ 0 - 0
var/cache/.gitkeep


+ 0 - 0
var/logs/.gitkeep


+ 0 - 0
var/sessions/.gitkeep


+ 7 - 7
web/app_dev.php

@@ -10,13 +10,13 @@ use Symfony\Component\Debug\Debug;
 
 // This check prevents access to debug front controllers that are deployed by accident to production servers.
 // Feel free to remove this, extend it, or make something more sophisticated.
-if (isset($_SERVER['HTTP_CLIENT_IP'])
-    || isset($_SERVER['HTTP_X_FORWARDED_FOR'])
-    || !(in_array(@$_SERVER['REMOTE_ADDR'], ['127.0.0.1', '::1']) || php_sapi_name() === 'cli-server')
-) {
-    header('HTTP/1.0 403 Forbidden');
-    exit('You are not allowed to access this file. Check '.basename(__FILE__).' for more information.');
-}
+// if (isset($_SERVER['HTTP_CLIENT_IP'])
+//     || isset($_SERVER['HTTP_X_FORWARDED_FOR'])
+//     || !(in_array(@$_SERVER['REMOTE_ADDR'], ['127.0.0.1', '::1']) || php_sapi_name() === 'cli-server')
+// ) {
+//     header('HTTP/1.0 403 Forbidden');
+//     exit('You are not allowed to access this file. Check '.basename(__FILE__).' for more information.');
+// }
 
 /** @var \Composer\Autoload\ClassLoader $loader */
 $loader = require __DIR__.'/../app/autoload.php';

二進制
web/onu_state.png


二進制
web/transition_state.png