diff --git a/lib/Alchemy/Phrasea/Account/CollectionRequestMapper.php b/lib/Alchemy/Phrasea/Account/CollectionRequestMapper.php index 5f14f65c3a..ae729fbb8f 100644 --- a/lib/Alchemy/Phrasea/Account/CollectionRequestMapper.php +++ b/lib/Alchemy/Phrasea/Account/CollectionRequestMapper.php @@ -31,15 +31,15 @@ class CollectionRequestMapper $demands = array(); foreach ($databoxStatuses as $databoxId => $data) { - foreach ($data['registrations']['by-type']['pending'] as $collectionId => $waiting) { + foreach (['registrations-by-type']['pending'] as $collectionId => $waiting) { $demands[] = $this->mapCollectionStatus($databoxId, $collectionId, "pending"); } - foreach ($data['registrations']['by-type']['rejected'] as $collectionId => $waiting) { + foreach ($data['registrations-by-type']['rejected'] as $collectionId => $waiting) { $demands[] = $this->mapCollectionStatus($databoxId, $collectionId, "rejected"); } - foreach ($data['registrations']['by-type']['accepted'] as $collectionId => $waiting) { + foreach ($data['registrations-by-type']['accepted'] as $collectionId => $waiting) { $demands[] = $this->mapCollectionStatus($databoxId, $collectionId, "accepted"); } } diff --git a/lib/Alchemy/Phrasea/Authentication/RegistrationService.php b/lib/Alchemy/Phrasea/Authentication/RegistrationService.php index 2ffe87f0cd..eeaac178fc 100644 --- a/lib/Alchemy/Phrasea/Authentication/RegistrationService.php +++ b/lib/Alchemy/Phrasea/Authentication/RegistrationService.php @@ -289,7 +289,7 @@ class RegistrationService * @param array $selectedCollections * @return \collection[] */ - private function getAuthorizedCollections(array $selectedCollections = null) + private function getAuthorizedCollections($selectedCollections) { $inscriptions = $this->registrationManager->getRegistrationSummary(); $authorizedCollections = []; @@ -300,7 +300,7 @@ class RegistrationService continue; } - if (\igorw\get_in($inscriptions, [$databox->get_sbas_id(), 'config', 'collections', $collection->get_base_id(), 'can-register'])) { + if (\igorw\get_in($inscriptions, [$databox->get_sbas_id(), 'collections', $collection->get_base_id(), 'can-register'])) { $authorizedCollections[$collection->get_base_id()] = $collection; } } diff --git a/lib/Alchemy/Phrasea/Core/Configuration/RegistrationManager.php b/lib/Alchemy/Phrasea/Core/Configuration/RegistrationManager.php index 5bf21bc37c..d539e95bf6 100644 --- a/lib/Alchemy/Phrasea/Core/Configuration/RegistrationManager.php +++ b/lib/Alchemy/Phrasea/Core/Configuration/RegistrationManager.php @@ -63,142 +63,108 @@ class RegistrationManager } foreach ($this->appbox->get_databoxes() as $databox) { - $data[$databox->get_sbas_id()] = [ + $sbas_id = $databox->get_sbas_id(); + $data[$sbas_id] = [ // Registrations on databox by type - 'registrations' => [ - 'by-type' => [ - 'inactive' => [], - 'accepted' => [], - 'in-time' => [], - 'out-dated' => [], - 'pending' => [], - 'rejected' => [], - ] + 'registrations-by-type' => [ + 'active' => [], + 'inactive' => [], + 'accepted' => [], + 'in-time' => [], + 'out-dated' => [], + 'pending' => [], + 'rejected' => [], ], // Registration configuration on databox and collections that belong to the databox - 'config' => [ - 'db-name' => $databox->get_dbname(), - 'cgu' => $databox->get_cgus(), - 'can-register' => $databox->isRegistrationEnabled(), - // Configuration on collection - 'collections' => [], - ] + 'db-name' => $databox->get_dbname(), + 'cgu' => $databox->get_cgus(), + 'can-register' => $databox->isRegistrationEnabled(), + // Configuration on collection + 'collections' => [], + 'display' => false, // set to true if there is at least one collection to display ]; foreach ($databox->get_collections() as $collection) { + $base_id = $collection->get_base_id(); + + $userRegistration = igorw\get_in($userData, [$sbas_id, $base_id]); + // Sets collection info - $data[$databox->get_sbas_id()]['config']['collections'][$collection->get_base_id()] = $this->getCollectionSummary($collection, $userData); + $data[$sbas_id]['collections'][$base_id] = [ + 'coll-name' => $collection->get_label($this->locale), + // gets collection registration or fallback to databox configuration + 'can-register' => $collection->isRegistrationEnabled(), + // boolean to tell whether user has already requested an access to the collection + 'registration' => !is_null($userRegistration) && !is_null($userRegistration['active']), + 'type' => null + ]; + // Sets registration by type - if (null !== $registration = $this->getUserCollectionRegistration($collection, $userData)) { - $data[$databox->get_sbas_id()]['registrations']['by-type'][$registration['type']][] = $registration; + if (!is_null($userRegistration)) { // && !is_null($userRegistration['active'])) { + + $userRegistration['coll-name'] = $collection->get_label($this->locale); + $userRegistration['can-register'] = $collection->isRegistrationEnabled(); + // sets default type + $type = 'inactive'; + + // gets registration entity + $registration = $userRegistration['registration']; + + if(!is_null($userRegistration['active'])) { + // rights are set in basusr, we don't really care about registration + $isTimeLimited = (Boolean) $userRegistration['time-limited']; + if($isTimeLimited) { + // any time limit overrides (=automates) the 'active' value + $isOnTime = (Boolean) $userRegistration['in-time']; + $type = $isOnTime ? 'in-time' : 'out-dated'; + } + else { + // no time limit, use the 'active' value - but be nice if this is the result of registration + $isPending = !is_null($registration) && $registration->isPending(); + $isRejected = !is_null($registration) && !$isPending && $registration->isRejected(); + $isAccepted = !is_null($registration) && !$isPending && !$isRejected; + if ($userRegistration['active'] === false) { + // no access + $type = $isRejected ? 'rejected' : 'inactive'; + } + else { + // access + $type = $isAccepted ? 'accepted' : 'active'; + } + } + } + else { + // nothing in basusr, use only registration + if(is_null($registration)) { + // no registration + $type = 'inactive'; + } + else { + // something in registration + $isPending = $registration->isPending(); + $isRejected = !$isPending && $registration->isRejected(); + if($isPending) { + $type = 'pending'; + } + else { + $type = $isRejected ? 'rejected' : 'accepted'; + } + } + } + + // the twig template will not display an inactive collection, unless it is registrable + if($type !== 'inactive' || $collection->isRegistrationEnabled()) { + // at least one collection is displayed so the dbox must be displayed + $data[$sbas_id]['display'] = true; + } + + $userRegistration['type'] = $type; + $data[$sbas_id]['collections'][$base_id]['type'] = $type; + $data[$sbas_id]['registrations-by-type'][$type][] = $userRegistration; } } } return $data; } - - /** - * Tells whether user has ever requested a registration on collection or not. - * - * @param \collection $collection - * @param $userData - * - * @return boolean - */ - private function userHasRequestedARegistrationOnCollection(\collection $collection, $userData) - { - if (null === $userRegistration = igorw\get_in($userData, [$collection->get_sbas_id(), $collection->get_base_id()])) { - return false; - } - - return !is_null($userRegistration['active']); - } - - /** - * Returns a user registration for given collection or null if no registration were requested. - * - * @param \collection $collection - * @param $userData - * - * @return null|array - */ - private function getUserCollectionRegistration(\collection $collection, $userData) - { - if (false === $this->userHasRequestedARegistrationOnCollection($collection, $userData)) { - return null; - } - - $userRegistration = igorw\get_in($userData, [$collection->get_sbas_id(), $collection->get_base_id()]); - - // sets collection name - $userRegistration['coll-name'] = $collection->get_label($this->locale); - // sets default type - $userRegistration['type'] = 'active'; - - // gets registration entity - $registration = $userRegistration['registration']; - - // set registration type & return user registration - $registrationStillExists = !is_null($registration); - $registrationNoMoreExists = !$registrationStillExists; - $isPending = $registrationStillExists && $registration->isPending() && !$registration->isRejected(); - $isRejected = $registrationStillExists && $registration->isRejected(); - $isDone = ($registrationNoMoreExists) || (!$isPending && !$isRejected); - $isActive = (Boolean) $userRegistration['active']; - $isTimeLimited = (Boolean) $userRegistration['time-limited']; - $isNotTimeLimited = !$isTimeLimited; - $isOnTime = (Boolean) $userRegistration['in-time']; - $isOutDated = !$isOnTime; - - if (!$isActive) { - $userRegistration['type'] = 'inactive'; - - return $userRegistration; - } - - if ($isDone) { - $userRegistration['type'] = 'accepted'; - - return $userRegistration; - } - - if ($isRejected) { - $userRegistration['type'] = 'rejected'; - - return $userRegistration; - } - - if ($isTimeLimited && $isOnTime && $isPending) { - $userRegistration['type'] = 'in-time'; - - return $userRegistration; - } - - if ($isTimeLimited && $isOutDated && $isPending) { - $userRegistration['type'] = 'out-dated'; - - return $userRegistration; - } - - if ($isNotTimeLimited && $isPending) { - $userRegistration['type'] = 'pending'; - - return $userRegistration; - } - - return $userRegistration; - } - - private function getCollectionSummary(\collection $collection, $userData) - { - return [ - 'coll-name' => $collection->get_label($this->locale), - // gets collection registration or fallback to databox configuration - 'can-register' => $collection->isRegistrationEnabled(), - 'cgu' => $collection->getTermsOfUse(), - // boolean to tell whether user has already requested an access to the collection - 'registration' => $this->userHasRequestedARegistrationOnCollection($collection, $userData) - ]; - } } diff --git a/lib/Alchemy/Phrasea/Form/Login/PhraseaRegisterForm.php b/lib/Alchemy/Phrasea/Form/Login/PhraseaRegisterForm.php index 136b4e7e76..fca84f1ba8 100644 --- a/lib/Alchemy/Phrasea/Form/Login/PhraseaRegisterForm.php +++ b/lib/Alchemy/Phrasea/Form/Login/PhraseaRegisterForm.php @@ -73,8 +73,8 @@ class PhraseaRegisterForm extends AbstractType $choices = $baseIds = []; foreach ($this->app['registration.manager']->getRegistrationSummary() as $baseInfo) { - $dbName = $baseInfo['config']['db-name']; - foreach ($baseInfo['config']['collections'] as $baseId => $collInfo) { + $dbName = $baseInfo['db-name']; + foreach ($baseInfo['collections'] as $baseId => $collInfo) { if (false === $collInfo['can-register']) { continue; } diff --git a/lib/Alchemy/Phrasea/Model/Repositories/RegistrationRepository.php b/lib/Alchemy/Phrasea/Model/Repositories/RegistrationRepository.php index c6fab6453c..e95835c73c 100644 --- a/lib/Alchemy/Phrasea/Model/Repositories/RegistrationRepository.php +++ b/lib/Alchemy/Phrasea/Model/Repositories/RegistrationRepository.php @@ -84,40 +84,59 @@ class RegistrationRepository extends EntityRepository $data = []; $rsm = $this->createResultSetMappingBuilder('d'); $rsm->addScalarResult('sbas_id','sbas_id'); - $rsm->addScalarResult('base_id','base_id'); + $rsm->addScalarResult('bas_id','bas_id'); $rsm->addScalarResult('dbname','dbname'); $rsm->addScalarResult('time_limited', 'time_limited'); $rsm->addScalarResult('limited_from', 'limited_from'); $rsm->addScalarResult('limited_to', 'limited_to'); $rsm->addScalarResult('actif', 'actif'); - $sql = " - SELECT dbname, sbas.sbas_id, time_limited, - UNIX_TIMESTAMP( limited_from ) AS limited_from, - UNIX_TIMESTAMP( limited_to ) AS limited_to, - bas.server_coll_id, Users.id, basusr.actif, - bas.base_id, " . $rsm->generateSelectClause(['d' => 'd',]) . " - FROM (Users, bas, sbas) - LEFT JOIN basusr ON ( Users.id = basusr.usr_id AND bas.base_id = basusr.base_id ) - LEFT JOIN Registrations d ON ( d.user_id = Users.id AND bas.base_id = d.base_id ) - WHERE basusr.actif = 1 AND bas.sbas_id = sbas.sbas_id - AND Users.id = ?"; + // nb: UNIX_TIMESTAMP will return null if date is 0000-00-00 00:00:00 + $sql = "SELECT dbname, sbas.sbas_id, time_limited,\n" + . " UNIX_TIMESTAMP( limited_from ) AS limited_from,\n" + . " UNIX_TIMESTAMP( limited_to ) AS limited_to,\n" + . " bas.server_coll_id, Users.id, basusr.actif,\n" + . " bas.base_id AS bas_id, " . $rsm->generateSelectClause(['d' => 'd',]) . "\n" + . "FROM (Users, bas, sbas)\n" + . " LEFT JOIN basusr ON ( Users.id = basusr.usr_id AND bas.base_id = basusr.base_id )\n" + . " LEFT JOIN Registrations d ON ( d.user_id = Users.id AND bas.base_id = d.base_id )\n" + . "WHERE bas.active = 1 AND bas.sbas_id = sbas.sbas_id\n" + . " AND Users.id = ?\n" + . " AND ISNULL(model_of)"; $query = $this->_em->createNativeQuery($sql, $rsm); $query->setParameter(1, $user->getId()); foreach ($query->getResult() as $row) { $registrationEntity = $row[0]; - $data[$row['sbas_id']][$row['base_id']] = [ - 'base-id' => $row['base_id'], + $in_time = null; + if(($row['time_limited'] !== null) && ($row['limited_from'] !== null || $row['limited_to'] !== null)) { + $in_time = true; + if($row['limited_from'] !== null && time() < $row['limited_from']) { + $in_time = false; + } + elseif($row['limited_to'] !== null && time() > $row['limited_to']) { + $in_time = false; + } + } + $data[$row['sbas_id']][$row['bas_id']] = [ + 'base-id' => $row['bas_id'], 'db-name' => $row['dbname'], - 'active' => (Boolean) $row['actif'], - 'time-limited' => (Boolean) $row['time_limited'], - 'in-time' => $row['time_limited'] && ! ($row['limited_from'] >= time() && $row['limited_to'] <= time()), + 'active' => self::nullOrBoolean($row['actif']), + 'time-limited' => self::nullOrBoolean($row['time_limited']), + 'in-time' => $in_time, 'registration' => $registrationEntity ]; } return $data; } -} \ No newline at end of file + + public static function nullOrBoolean($v) + { + if(!is_null($v)) { + $v = (boolean)$v; + } + return $v; + } +} diff --git a/lib/classes/collection.php b/lib/classes/collection.php index 276098fc1d..df457b8735 100644 --- a/lib/classes/collection.php +++ b/lib/classes/collection.php @@ -821,22 +821,6 @@ class collection implements ThumbnailedElement, cache_cacheableInterface return $this->get_databox()->getAutoregisterModel($email); } - /** - * Gets terms of use. - * - * @return null|string - */ - public function getTermsOfUse() - { - if (false === $xml = simplexml_load_string($this->get_prefs())) { - return null; - } - - foreach ($xml->xpath('/baseprefs/cgu') as $sbpcgu) { - return $sbpcgu->saveXML(); - } - } - public function get_cache_key($option = null) { return 'collection_' . $this->collectionVO->getCollectionId() . ($option ? '_' . $option : ''); diff --git a/resources/www/account/styles/_skin.scss b/resources/www/account/styles/_skin.scss index 5f0cb7d2ab..0bc8961dc7 100644 --- a/resources/www/account/styles/_skin.scss +++ b/resources/www/account/styles/_skin.scss @@ -818,8 +818,8 @@ form[name=registerForm] .multiselect-container li.active label { } form[name=registerForm] .multiselect b.caret { - float: right; - + position: absolute; + right: 10px; } form[name=registerForm] .multiselect-group { @@ -1157,7 +1157,7 @@ h1, h2, h3, h4 { border-radius:10px; display:inline-block; position: relative; - top: 0.35rem; + top: -15px; } #updatingDemand .icon.active { diff --git a/templates/web/account/access.html.twig b/templates/web/account/access.html.twig index 0d150daf41..06ddfcf0a1 100644 --- a/templates/web/account/access.html.twig +++ b/templates/web/account/access.html.twig @@ -35,9 +35,9 @@ {% if show == true %}