<?php
namespace App\Admin;
use Sonata\AdminBundle\Admin\AbstractAdmin;
use Sonata\AdminBundle\Datagrid\ListMapper;
use Sonata\AdminBundle\Datagrid\DatagridMapper;
use Sonata\AdminBundle\Form\FormMapper;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Sonata\AdminBundle\Form\Type\ModelType;
use Sonata\Form\Type\BooleanType;
use Sonata\AdminBundle\Form\Type\CollectionType;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Doctrine\ORM\EntityRepository;
use Sonata\AdminBundle\Show\ShowMapper;
use App\Entity\Project;
use App\Entity\Config;
use App\Entity\EnvironmentType;
use App\Entity\Environment;
use App\Entity\Job;
use App\Service\EnvironmentService;
use Sonata\DoctrineORMAdminBundle\Model\ModelManager;
use App\Form\EnvironmentOptionType;
use App\Form\EnvironmentMonitorType;
use Sonata\AdminBundle\Form\Type\Filter\ChoiceType;
final class EnvironmentAdmin extends AbstractAdmin
{
private $environmentService;
protected function configureDefaultFilterValues(array &$filterValues): void
{
$filterValues['project'] = [
'value' => 180,
];
}
protected function configureDefaultSortValues(array &$sortValues): void
{
// display the first page (default = 1)
$sortValues['_page'] = 1;
// reverse order (default = 'ASC')
$sortValues['_sort_order'] = 'ASC';
// name of the ordered field (default = the model's id field, if any)
$sortValues['_sort_by'] = 'type.name';
}
protected function configureFormFields(FormMapper $formMapper): void
{
/****PROJECT****/
$formMapper->tab('Environment');
$formMapper->add('project', EntityType::class, [
'class' => Project::class,
'choice_label' => 'name',
]);
$formMapper->add('type', EntityType::class, [
'class' => EnvironmentType::class,
// 'choice_label' => 'name',
]);
$formMapper->add('server', EntityType::class, [
'class' => Config::class,
'query_builder' => function (EntityRepository $er) {
return $er->createQueryBuilder('c')
->andWhere('c.configGroup = 5')
->addOrderBy('c.name', 'ASC');
},
'choice_label' => 'name',
]);
$formMapper->add('modules', EntityType::class, [
'class' => Config::class,
'query_builder' => function (EntityRepository $er) {
return $er->createQueryBuilder('c')
->andWhere('c.configGroup = 16')
->addOrderBy('c.name', 'ASC');
},
'choice_label' => 'name',
'multiple' => true
]);
$formMapper->add('monitoring', EntityType::class, [
'class' => Config::class,
'query_builder' => function (EntityRepository $er) {
return $er->createQueryBuilder('c')
->andWhere('c.configGroup = 8')
->addOrderBy('c.name', 'ASC');
},
'choice_label' => 'name',
]);
$formMapper->add('autoRestart', BooleanType::class, [
'choices' => [
'Nem' => 0,
'Igen' => 1,
],
'help' => 'This environment should restart around midnight?'
]);
$formMapper->add('autostop', BooleanType::class, [
'choices' => [
'Nem' => 0,
'Igen' => 1,
],
'help' => 'This environment should stop at around midnight?'
]);
$formMapper->add('lastAutoStopChange', null, [
'attr' => [
'readonly' => true,
],
'widget' => "single_text",
]);
$formMapper->add('debugMode', BooleanType::class, [
'choices' => [
'Nem' => 0,
'Igen' => 1,
],
'attr' => [
'readonly' => true,
'disabled' => true,
],
]);
$formMapper->add('lastDebugModeChange', null, [
'attr' => [
'readonly' => true,
],
'widget' => "single_text",
]);
$formMapper->end();
$formMapper->end();
$formMapper->tab('Options');
$formMapper->add('environmentOptions', CollectionType::class, [
'by_reference' => false, // Use this because of reasons
'allow_add' => true, // True if you want allow adding new entries to the collection
'allow_delete' => true, // True if you want to allow deleting entries
'prototype' => true, // True if you want to use a custom form type
'entry_type' => EnvironmentOptionType::class, // Form type for the Entity that is being attached to the object
// 'help' => "<ul><li>alma</li><li>banán</li></ul>",
// 'help_html' => true,
]);
$formMapper->end();
$formMapper->end();
$formMapper->tab('Monitors');
$formMapper->add('environmentMonitors', CollectionType::class, [
'by_reference' => false, // Use this because of reasons
'allow_add' => true, // True if you want allow adding new entries to the collection
'allow_delete' => true, // True if you want to allow deleting entries
'prototype' => true, // True if you want to use a custom form type
'entry_type' => EnvironmentMonitorType::class, // Form type for the Entity that is being attached to the object
// 'help' => "<ul><li>alma</li><li>banán</li></ul>",
// 'help_html' => true,
]);
$formMapper->end();
$formMapper->end();
}
protected function configureDatagridFilters(DatagridMapper $datagridMapper): void
{
$datagridMapper->add('id');
$datagridMapper->add('project');
$datagridMapper->add('type');
$datagridMapper->add('server', null, [
'field_type' => EntityType::class,
'field_options' => array(
'class' => 'App\Entity\Config',
'query_builder' => function(EntityRepository $er) {
return $er->createQueryBuilder('c')
->andWhere('c.configGroup = 5')
->addOrderBy('c.name', 'ASC');
},
),
]);
$datagridMapper->add('project.type', null, [
'field_type' => EntityType::class,
'field_options' => array(
'class' => 'App\Entity\Config',
'query_builder' => function(EntityRepository $er) {
return $er->createQueryBuilder('c')
->andWhere('c.configGroup = 10')
->addOrderBy('c.name', 'ASC');
},
),
]);
$datagridMapper->add('modules', null, [
'field_type' => EntityType::class,
'field_options' => array(
'class' => 'App\Entity\Config',
'query_builder' => function(EntityRepository $er) {
return $er->createQueryBuilder('c')
->andWhere('c.configGroup = 16')
->addOrderBy('c.name', 'ASC');
},
),
]);
$datagridMapper->add('autoStop');
$datagridMapper->add('autoRestart');
}
protected function configureRoutes(\Sonata\AdminBundle\Route\RouteCollectionInterface $collection): void
{
$collection->add('build', $this->getRouterIdParameter().'/build');
$collection->add('deploy', $this->getRouterIdParameter().'/deploy');
$collection->add('log_level', $this->getRouterIdParameter().'/loglevel');
$collection->add('stop', $this->getRouterIdParameter().'/stop');
$collection->add('db_export', $this->getRouterIdParameter().'/db-export');
$collection->add('db_import', $this->getRouterIdParameter().'/db-import');
$collection->add('db_language_import', $this->getRouterIdParameter().'/db-language-import');
$collection->add('idp_generate', $this->getRouterIdParameter().'/idp_generate');
$collection->add('create_perma_user', $this->getRouterIdParameter().'/create_perma_user');
$collection->add('viber_token', $this->getRouterIdParameter().'/viber_token');
$collection->add('resourceproxy_to_db', $this->getRouterIdParameter().'/resourceproxy_to_db');
$collection->add('create_botdip_user', $this->getRouterIdParameter().'/create_botdip_user');
$collection->add('init_rds_db', $this->getRouterIdParameter().'/init_db/rds');
$collection->add('init_adp_db', $this->getRouterIdParameter().'/init_db/adp');
$collection->add('init_shared_db', $this->getRouterIdParameter().'/init_db/shared');
$collection->add('clone', $this->getRouterIdParameter().'/clone');
$collection->add('debug', $this->getRouterIdParameter().'/debug');
$collection->add('create_resourceproxy_user', $this->getRouterIdParameter().'/create_resourceproxy_user');
// $collection->remove('show');
}
protected function configureListFields(ListMapper $listMapper): void
{
$this->environmentService = new EnvironmentService();
$listMapper->addIdentifier('id');
$listMapper->add('project');
$listMapper->addIdentifier('type.name');
$listMapper->add("server", null, [
'template' => 'CRUD\list__server.html.twig',
'route' => ['name' => 'edit'],
]);
$listMapper->add("modules", null, [
'template' => 'CRUD\list__modules.html.twig',
'route' => ['name' => 'edit'],
]);
$listMapper->add('autostop', 'boolean');
$listMapper->add('autoRestart', 'boolean');
$listMapper->add('project.type.name');
$listMapper->add('monitoring.name');
$listMapper->add("Links", null, [
'template' => 'CRUD\list__links.html.twig'
]);
$listMapper->add('LogLevel', 'actions', [
'actions' => [
'loglevel' => [
'template' => 'CRUD\list__action_loglevel.html.twig',
],
]
]);
$listMapper->add('ResourceInfo', 'actions', [
'actions' => [
'loglevel' => [
'template' => 'CRUD\list__environment_resourceinfo.html.twig',
],
]
]);
$listMapper->add("StatusInfo", 'actions', [
'mapped' => false,
'template' => 'CRUD\list__latest_deploy.html.twig'
]);
// $listMapper->addIdentifier('environmentOptions');
$listMapper->add('TAB Actions', 'actions', [
'actions' => [
'deploy' => [
'template' => 'CRUD\list__action_deploy.html.twig',
],
]
]);
$listMapper->add('DB Actions', 'actions', [
'actions' => [
'database' => [
'template' => 'CRUD\list__action_database.html.twig',
],
]
]);
$CHEQSharedDeployTags = $this->getModelManager()->getEntityManager('App\Entity\Environment')->getRepository('App\Entity\DeployTag')->findBy(["project" => 431], ["name" => "DESC"]);
$phoenixSharedDeployTags = $this->getModelManager()->getEntityManager('App\Entity\Environment')->getRepository('App\Entity\DeployTag')->findBy(["project" => 460], ["name" => "DESC"]);
$naomiSharedDeployTags = $this->getModelManager()->getEntityManager('App\Entity\Environment')->getRepository('App\Entity\DeployTag')->findBy(["project" => 461], ["name" => "DESC"]);
$amiraSharedDeployTags = $this->getModelManager()->getEntityManager('App\Entity\Environment')->getRepository('App\Entity\DeployTag')->findBy(["project" => 403], ["name" => "DESC"]);
$resourceProxySharedDeployTags = $this->getModelManager()->getEntityManager('App\Entity\Environment')->getRepository('App\Entity\DeployTag')->findBy(["project" => 487], ["name" => "DESC"]);
$phoenixPushSharedDeployTags = $this->getModelManager()->getEntityManager('App\Entity\Environment')->getRepository('App\Entity\DeployTag')->findBy(["project" => 488], ["name" => "DESC"]);
$this->sharedDeployTags = [
"cheq" => ["CHEQ Global Bot" => $CHEQSharedDeployTags, "Resourceproxy" => $resourceProxySharedDeployTags],
"cheqcrisis" => ["CHEQ Global Bot" => $CHEQSharedDeployTags, "Resourceproxy" => $resourceProxySharedDeployTags],
"phoenix" => ["Phoenix" => $phoenixSharedDeployTags, "Naomi" => $naomiSharedDeployTags, "Amira" => $amiraSharedDeployTags, "Resourceproxy" => $resourceProxySharedDeployTags, "Push" => $phoenixPushSharedDeployTags],
];
$this->costs = $this->environmentService->getEnvironemntCosts();
$this->globalDbExports = $this->getModelManager()->getEntityManager('App\Entity\Project')->getRepository('App\Entity\Project')->getDbExports();
$this->sharedDBServers = $this->getModelManager()->getEntityManager('App\Entity\Project')->getRepository('App\Entity\Config')->findBy(["configGroup" => 13]);
// $listMapper->add('jobs', EntityType::class, [
// 'class' => Job::class,
// 'query_builder' => function (EntityRepository $er) {
// return $er->createQueryBuilder('j')
// ->andWhere('j.environment = 6')
// ->andWhere('j.type IN (6, 28, 45, 74)')
// ->addOrderBy('j.id', 'DESC')
// ->setMaxResults('1');
// },
// // 'choice_label' => 'name',
// ]);
$listMapper->add('_action', 'actions', [
'actions' => [
'edit' => [],
'delete' => [],
'show' => [],
'history' => [],
'clone' => [
"template" => "CRUD/list__action_clone.html.twig",
],
]
]);
}
protected function configureShowFields(ShowMapper $showMapper): void
{
$showMapper->add("id");
$showMapper->add("project");
$showMapper->add("type.name");
$showMapper->add("server", null, [
'template' => 'CRUD\show__server.html.twig',
'label' => "Server",
]);
$showMapper->add("modules", null, [
'template' => 'CRUD\show__modules.html.twig',
]);
$showMapper->add('monitoring');
$showMapper->add('autoRestart', 'boolean');
$showMapper->add('autostop', 'boolean');
$showMapper->add('lastAutoStopChange');
$showMapper->add('debugMode', 'boolean');
$showMapper->add('lastDebugModeChange');
$showMapper->add('project.type.name');
$showMapper->add('monitoring.name');
$showMapper->add("Links", null, [
'template' => 'CRUD\show__links.html.twig',
]);
$showMapper->add('updated', "datetime");
$showMapper->add('created', "datetime");
$showMapper->add('environmentOptions');
$showMapper->add('environmentMonitors');
}
public function toString($object): string {
return $object instanceof Environment
? $object->__toString()
: $object->__toString(); // shown in the breadcrumb on the create view
}
public function prePersist($object): void {
foreach ($object->getEnvironmentOptions() as $option) {
$option->setEnvironment($object);
}
}
public function preUpdate($object): void{
foreach ($object->getEnvironmentOptions() as $option) {
$option->setEnvironment($object);
}
}
}
?>