/**
  * Enables a User entity.
  *
  * @Route("/{username}/enable", name="admin_users_enable")
  * @Method("post")
  */
 public function users_enableAction($username)
 {
     $form = $this->createEnableForm($username);
     $request = $this->getRequest();
     if ('POST' === $request->getMethod()) {
         $form->bind($request);
         if ($form->isValid()) {
             $userManager = $this->get('fos_user.user_manager');
             $user = $userManager->findUserByUsername($username);
             if (!$user) {
                 throw $this->createNotFoundException('Unable to find User entity.');
             }
             $roles = $user->getRoles();
             if (!in_array('ROLE_ADMIN', $roles) && !in_array('ROLE_SUPER_ADMIN', $roles)) {
                 //check if database exists
                 $dbs_array = $this->database_list();
                 if (!in_array($user->getDbNameUq(), $dbs_array)) {
                     $dbName = $this->get_prefix() . $user->getDbNameUq();
                     //add Database entity
                     $dm = $this->get('doctrine.odm.mongodb.document_manager');
                     $database = new Database();
                     $database->setName($dbName);
                     $database->setDisplayedname(ucfirst($user->getDbNameUq()));
                     $database->setLink($user->getDbNameUq());
                     $database->setLanguage($user->getDefaultlanguage());
                     $dm->persist($database);
                     $dm->flush();
                     //create new database
                     $connection = new \MongoClient();
                     $db = $connection->{$dbName};
                     $db->listCollections();
                     //collections
                     $db->createCollection('Collection');
                     $db->createCollection('Config');
                     $db->createCollection('Definition');
                     $db->createCollection('Glossary');
                     $db->createCollection('Image');
                     $db->createCollection('Location');
                     $db->createCollection('Other');
                     $db->createCollection('Module');
                     $db->createCollection('Plantunit');
                     $db->createCollection('Taxon');
                     $db->createCollection('Page');
                     //indexes
                     $db->Image->ensureIndex(array('title1' => 1, 'title2' => 1));
                     $db->Location->ensureIndex(array('coordinates' => '2d'));
                     // $db->Plantunit->ensureIndex(array('attributes'=>'text'));
                     $db->Taxon->ensureIndex(array('name' => 1));
                     $db->Taxon->ensureIndex(array('identifier' => 1));
                     $db->Plantunit->ensureIndex(array('identifier' => 1));
                     $db->Plantunit->ensureIndex(array('taxonsrefs.$id' => 1));
                     //pages data
                     $db->Page->insert(array('name' => 'Home', 'alias' => 'home', 'order' => 1));
                     $db->Page->insert(array('name' => 'Mentions', 'alias' => 'mentions', 'order' => 2));
                     $db->Page->insert(array('name' => 'Credits', 'alias' => 'credits', 'order' => 3));
                     $db->Page->insert(array('name' => 'Contacts', 'alias' => 'contacts', 'order' => 4));
                     //init config
                     $db->Config->insert(array('defaultlanguage' => $user->getDefaultlanguage(), 'islocked' => false, 'originaldb' => $dbName, 'name' => ucfirst($user->getDbNameUq())));
                     //update user account
                     $user->setDbName($dbName);
                     $user->setDblist(array($dbName));
                     $user->addRole('ROLE_ADMIN');
                     $userManager->updateUser($user);
                     //send mail
                     $message = \Swift_Message::newInstance()->setSubject('Publish : account enabled')->setFrom($this->container->getParameter('from_email_adress'))->setTo($user->getEmail())->setBody($this->container->get('templating')->render('PlantnetDataBundle:Backend\\Mail:enable.txt.twig', array('url' => $this->get('router')->generate('admin_index', array(), true))), 'text/html');
                     $this->container->get('mailer')->send($message);
                     $this->get('session')->getFlashBag()->add('msg_success', 'Role Admin granted');
                 } else {
                     echo 'Error...';
                     exit;
                 }
             }
         }
     }
     return $this->redirect($this->generateUrl('admin_users_edit', array('username' => $username)));
 }
 private function check_databases($languages, $user, $default)
 {
     $default_db = $user->getDbName();
     $dm = $this->get('doctrine.odm.mongodb.document_manager');
     $dm->getConfiguration()->setDefaultDB($this->getDataBase());
     $database = $dm->getRepository('PlantnetDataBundle:Database')->findOneBy(array('name' => $default_db, 'language' => $default));
     if (!$database) {
         throw $this->createNotFoundException('Unable to find Database entity.');
     }
     $config = $dm->createQueryBuilder('PlantnetDataBundle:Config')->getQuery()->getSingleResult();
     if (!$config) {
         throw $this->createNotFoundException('Unable to find Config entity.');
     }
     $default_template = $config->getTemplate();
     $imgprotect = $config->getHasimageprotection();
     $default_link = $database->getLink();
     $children = $database->getChildren();
     if (count($children)) {
         foreach ($children as $child) {
             if (in_array($child->getLanguage(), $languages)) {
                 $child->setEnable(true);
                 $dm->persist($child);
             } else {
                 $child->setEnable(false);
                 $dm->persist($child);
             }
         }
         $dm->flush();
     }
     if (count($languages)) {
         foreach ($languages as $language) {
             $exists = false;
             if (count($children)) {
                 foreach ($children as $child) {
                     if ($language == $child->getLanguage()) {
                         $exists = true;
                     }
                 }
             }
             if (!$exists) {
                 $new_name = $default_db . '_' . $language;
                 $new_database = new Database();
                 $new_database->setName($new_name);
                 $new_database->setDisplayedname(ucfirst($default_link) . ' ' . $language);
                 $new_database->setLink($default_link . '_' . $language);
                 $new_database->setLanguage($language);
                 $new_database->setEnable(true);
                 $new_database->setParent($database);
                 $dm->persist($new_database);
                 $dm->flush();
                 //create new database
                 $connection = new \MongoClient();
                 $db = $connection->{$new_name};
                 $db->listCollections();
                 //collections
                 $db->createCollection('Collection');
                 $db->createCollection('Config');
                 $db->createCollection('Definition');
                 $db->createCollection('Glossary');
                 $db->createCollection('Image');
                 $db->createCollection('Location');
                 $db->createCollection('Other');
                 $db->createCollection('Module');
                 $db->createCollection('Plantunit');
                 $db->createCollection('Taxon');
                 $db->createCollection('Page');
                 //indexes
                 $db->Image->ensureIndex(array('title1' => 1, 'title2' => 1));
                 $db->Location->ensureIndex(array('coordinates' => '2d'));
                 // $db->Plantunit->ensureIndex(array('attributes'=>'text'));
                 $db->Taxon->ensureIndex(array('name' => 1));
                 $db->Taxon->ensureIndex(array('identifier' => 1));
                 $db->Plantunit->ensureIndex(array('identifier' => 1));
                 $db->Plantunit->ensureIndex(array('taxonsrefs.$id' => 1));
                 //pages data
                 $db->Page->insert(array('name' => 'Home', 'alias' => 'home', 'order' => 1));
                 $db->Page->insert(array('name' => 'Mentions', 'alias' => 'mentions', 'order' => 2));
                 $db->Page->insert(array('name' => 'Credits', 'alias' => 'credits', 'order' => 3));
                 $db->Page->insert(array('name' => 'Contacts', 'alias' => 'contacts', 'order' => 4));
                 //init config
                 $db->Config->insert(array('islocked' => true, 'originaldb' => $default_db, 'defaultlanguage' => $language, 'name' => ucfirst($default_link) . ' ' . $language, 'template' => $default_template, 'hasimageprotection' => $imgprotect));
             }
         }
     }
     $dm->getConfiguration()->setDefaultDB($this->getDataBase($user, $dm));
 }
 /**
  * Creates a new Database.
  *
  * @Route("/database/create", name="database_create")
  * @Method("post")
  * @Template()
  */
 public function collection_createAction(Request $request)
 {
     $user = $this->container->get('security.context')->getToken()->getUser();
     $form = $this->createDatabaseNewForm();
     $roles = $user->getRoles();
     if ($request->isMethod('POST')) {
         $form->bind($request);
         if (in_array('ROLE_ADMIN', $roles) && !in_array('ROLE_SUPER_ADMIN', $roles)) {
             $dbName = $form->get('dbname');
             $language = $form->get('defaultlanguage');
             if (!is_null($dbName->getData())) {
                 if (!ctype_lower($dbName->getData())) {
                     $dbName->addError(new FormError("This field is not valid (only lower case letters)"));
                 }
                 if (strlen($dbName->getData()) < 3 || strlen($dbName->getData()) > 50) {
                     $dbName->addError(new FormError("This field must contain 3 to 50 lower case letters"));
                 }
             } else {
                 $dbName->addError(new FormError("This field must not be empty"));
             }
             $dbs = $this->database_list();
             if (in_array($dbName->getData(), $dbs)) {
                 $dbName->addError(new FormError('This value is already used.'));
             }
             if ($form->isValid()) {
                 $new_db = $this->get_prefix() . $dbName->getData();
                 //add Database entity
                 $dm = $this->get('doctrine.odm.mongodb.document_manager');
                 $database = new Database();
                 $database->setName($new_db);
                 $database->setDisplayedname(ucfirst($dbName->getData()));
                 $database->setLink($dbName->getData());
                 $database->setLanguage($language->getData());
                 $dm->persist($database);
                 $dm->flush();
                 //create new database
                 $connection = new \MongoClient();
                 $db = $connection->{$new_db};
                 $db->listCollections();
                 //collections
                 $db->createCollection('Collection');
                 $db->createCollection('Config');
                 $db->createCollection('Definition');
                 $db->createCollection('Glossary');
                 $db->createCollection('Image');
                 $db->createCollection('Location');
                 $db->createCollection('Other');
                 $db->createCollection('Module');
                 $db->createCollection('Plantunit');
                 $db->createCollection('Taxon');
                 $db->createCollection('Page');
                 //indexes
                 $db->Image->ensureIndex(array('title1' => 1, 'title2' => 1));
                 $db->Location->ensureIndex(array('coordinates' => '2d'));
                 // $db->Plantunit->ensureIndex(array('attributes'=>'text'));
                 $db->Taxon->ensureIndex(array('name' => 1));
                 $db->Taxon->ensureIndex(array('identifier' => 1));
                 $db->Plantunit->ensureIndex(array('identifier' => 1));
                 $db->Plantunit->ensureIndex(array('taxonsrefs.$id' => 1));
                 //pages data
                 $db->Page->insert(array('name' => 'Home', 'alias' => 'home', 'order' => 1));
                 $db->Page->insert(array('name' => 'Mentions', 'alias' => 'mentions', 'order' => 2));
                 $db->Page->insert(array('name' => 'Credits', 'alias' => 'credits', 'order' => 3));
                 $db->Page->insert(array('name' => 'Contacts', 'alias' => 'contacts', 'order' => 4));
                 //init config
                 $db->Config->insert(array('defaultlanguage' => $language->getData(), 'islocked' => false, 'originaldb' => $new_db, 'name' => ucfirst($dbName->getData())));
                 //update user account
                 $userManager = $this->get('fos_user.user_manager');
                 $db_list = $user->getDblist();
                 $db_list[] = $new_db;
                 $user->setDblist($db_list);
                 $userManager->updateUser($user);
                 $this->get('session')->getFlashBag()->add('msg_success', 'Database created');
                 return $this->redirect($this->generateUrl('admin_index'));
             }
         }
     }
     return $this->render('PlantnetDataBundle:Backend\\Admin:database_new.html.twig', array('form' => $form->createView()));
 }