Commit 924fe6b0 authored by Ghislain Loas's avatar Ghislain Loas

Merge branch 'dev#73297_assimil_migration_de_tous_les_clients_vers_v2' into 'master'

Dev#73297 assimil migration de tous les clients vers v2

See merge request afi/opacce!2670
parents efd6aa33 b5448c29
- ticket #73297 : Assimil : Prise en charge de la nouvelle version (v2)
\ No newline at end of file
<?php
(new Class_Migration_DigitalResource_Assimil)->migrateToV2();
\ No newline at end of file
......@@ -1295,10 +1295,6 @@ class Class_Album extends Storm_Model_Abstract {
}
/**
* Return arteVOD trailer video list
* @return array
*/
public function getTrailers() {
$trailers = [];
$trailers_url = $this->getUnimarc856Values('trailer');
......@@ -1308,10 +1304,6 @@ class Class_Album extends Storm_Model_Abstract {
}
/**
* Return arteVOD poster url
* @return string
*/
public function getPoster() {
if (!$posters_url = $this->getUnimarc856Values('poster'))
return '';
......
......@@ -261,7 +261,7 @@ class Class_DigitalResource_Config extends Class_Entity {
public function renderHarvestDiagOn($view) {
return $view->tagInfo($this->_('Cette ressource ne prend pas en charge l\'affichage du l\'url de moissonnage'));
return $view->tagNotice($this->_('Cette ressource ne prend pas en charge l\'affichage de l\'url de moissonnage'));
}
......
......@@ -22,6 +22,53 @@
class Class_Migration_DigitalResource_Assimil extends Class_Migration_DigitalResource_Abstract {
public function migrateToV2() {
Class_AdminVar::init();
if(!$this->_getConfig()->isEnabled())
return $this;
Class_AdminVar::set($this->_getConfig()->withNameSpace('SSO_URL'), 'https://biblio.assimil.online/assimilweb');
$this->_upgradeAlbums();
return $this;
}
protected function _upgradeAlbums() {
$xml = (new Class_WebService_Abstract)->httpGet($this->_getConfig()->getAdminVar('HARVEST_URL'));
$catalog = new SimpleXMLElement($xml);
$map = [];
foreach($catalog->item as $item)
$map[(string) $item->Identifier] = (string) $item->PrimaryDocUrl;
foreach(Class_Album::findAllBy(['type_doc_id' => $this->_getConfig()->getDocType()]) as $album)
$this->_upgradeAlbum($album, $map);
return $this;
}
protected function _upgradeAlbum($album, $map) {
$id_origine = $album->getIdOrigine();
if(!array_key_exists($id_origine, $map))
return $this;
$url = $map[$id_origine];
$album->getMarc()->clearZone('856');
$album
->setExternalUri($url)
->setUrlOrigine($url)
->addPosterURI(sprintf('https://biblio.assimil.online/extraits/facing/%s_TL.jpg',
$id_origine))
->save();
}
protected function _getOldRightToken() {
return 30;
}
......
......@@ -90,7 +90,10 @@ abstract class Class_WebService_BibNumerique_Abstract extends Class_WebService_A
* @return array of harvested ids
*/
protected function _importRessources($ressources) {
$harvestedIds = array();
if(!$ressources)
return [];
$harvestedIds = [];
foreach ($ressources as $ressource) {
$harvestedIds[] = $ressource->getId();
if ($ressource->isAlreadyHarvested())
......
......@@ -77,6 +77,45 @@ class ZendAfi_View_Helper_DigitalResource_Dashboard_Harvest extends ZendAfi_View
'id' => $batch_name],
null,
true)))]);
$actions = [
['url' => '/admin/batch/delete/id/%s',
'icon' => 'show',
'label' => $this->_('Désactiver la tâche'),
'condition' => function($model)
{
return $model->isDeletable();
},
'anchorOptions' =>
['onclick' => 'return confirm(\''
. str_replace(['\'', '"'], '\\\'',
$this->_('Etes-vous sur de vouloir désactiver cette tâche ?'))
. '\')']],
['url' => '/admin/batch/plan/id/%s',
'icon' => 'calendar',
'label' => $this->_('Plannifier la tâche'),
'condition' => function($model) {
return Class_Users::isCurrentUserSuperAdmin()
&& $model->isActive();
},
'anchorOptions' => ['data-popup' => 'true']],
['url' => '/admin/batch/run/id/%s',
'icon' => 'test',
'label' => $this->_('Lancer manuellement'),
'condition' => function($model)
{
return $model->isManuallyRunnable() && (!$model->isAjaxRunnable());
}],
['url' => '/admin/batch/run-ajax/id/%s',
'icon' => 'test',
'label' => $this->_('Lancer'),
'condition' => function($model)
{
return $model->isManuallyRunnable() && $model->isAjaxRunnable();
}]
];
$description = (new Class_TableDescription('batchs'))
->addColumn($this->_('Batch'), function($model) { return $model->getLabel(); })
......@@ -86,31 +125,9 @@ class ZendAfi_View_Helper_DigitalResource_Dashboard_Harvest extends ZendAfi_View
return (new Class_Repeat_WeekDays())->humanReadable($model->getPickDay());
})
->addColumn($this->_('Dernière exécution'), function($model) { return $model->getLastRun(); })
->addRowAction(function($model)
->addRowAction(function($model) use ($actions)
{
return $this->view->renderModelActions($model,
[
['url' => '/admin/batch/delete/id/%s',
'icon' => 'show',
'label' => $this->_('Désactiver la tâche'),
'condition' => function($model)
{
return $model->isDeletable();
},
'anchorOptions' =>
['onclick' => 'return confirm(\''
. str_replace(['\'', '"'], '\\\'',
$this->_('Etes-vous sur de vouloir désactiver cette tâche ?'))
. '\')']],
['url' => '/admin/batch/plan/id/%s',
'icon' => 'calendar',
'label' => $this->_('Plannifier la tâche'),
'condition' => function($model) {
return Class_Users::isCurrentUserSuperAdmin()
&& $model->isActive();
},
'anchorOptions' => ['data-popup' => 'true']],]);
return $this->view->renderModelActions($model, $actions);
});
return $this->view->renderTable($description, [new Class_Batch_Definition($config->getBatchInstance())]);
......
......@@ -37,13 +37,13 @@ class Assimil_Config extends Class_DigitalResource_Config {
'MailUrl' => 'http://fr.assimil.con/contact',
'AdminVars' => [
'Assimil' => Class_AdminVar_Meta::newOnOff($this->_('Activer ou désactiver la ressource numérique Assimil'))->bePrivate(),
'SSO_URL' => Class_AdminVar_Meta::newCombo($this->_('URL pour le SSO'),
['value' => 'http://biblio.assimil.com/assimilweb',
'options' => ['selectOptions' => ['label' => $this->_('URL'),
'multiOptions' => ['http://biblio.assimil.com/assimilweb' => 'http://biblio.assimil.com/assimilweb',
'https://assimil.online/assimilweb' => 'https://assimil.online/assimilweb',
'https://biblio.assimil.online/assimilweb' => 'https://biblio.assimil.online/assimilweb']]]])->bePrivate()
'Assimil' => Class_AdminVar_Meta::newOnOff($this->_('Activer ou désactiver la ressource numérique Assimil'), ['value' => 0])->bePrivate(),
'HARVEST_URL' => Class_AdminVar_Meta::newDefault($this->_('URL de moissonnage'),
['value' => 'https://biblio.assimil.online/extraits/catalogue-xml/catalogue_XML_Assimil_V2.xml'])->bePrivate(),
'SSO_URL' => Class_AdminVar_Meta::newDefault($this->_('URL pour le SSO'),
['value' => 'https://biblio.assimil.online/assimilweb'])->bePrivate()
],
'SsoAction' => true,
......@@ -57,11 +57,11 @@ class Assimil_Config extends Class_DigitalResource_Config {
public function getSsoUrl($user) {
return Class_AdminVar::getValueOrDefault($this->withNameSpace('SSO_URL'));
return $this->getAdminVar('SSO_URL');
}
public function getHarvestUrl($page = 1) {
return 'http://fr.assimil.com/extraits/catalogueXML/catalogue_XML_Assimil.xml';
return $this->getAdminVar('HARVEST_URL');
}
}
......@@ -21,10 +21,6 @@
class Assimil_Service extends Class_DigitalResource_Service {
const EXTERNAL_RECORD_BASE_URL = 'https://biblio.assimil.com/assimilweb/FrontControler?nomMethod=catalogue.consulter&idProduit=';
const IMAGE_URL = 'http://fr.assimil.com/images/produit/%06d-front-G-GRAND.png';
protected $_parser,
$_assimil_albums;
......
......@@ -20,20 +20,6 @@
*/
class AssimilAdminVars {
public static function activate() {
Class_AdminVar::set('Assimil_Assimil', '1');
Class_AdminVar::set('SSO_URL', '1');
}
public static function deactivate() {
Class_AdminVar::set('Assimil_Assimil', '0');
}
}
class AssimilConfigTest extends ModelTestCase {
protected
......@@ -95,15 +81,29 @@ class AssimilNotActivatedAdminTest extends Admin_AbstractControllerTestCase {
class AssimilActivatedAdminTest extends Admin_AbstractControllerTestCase {
abstract class AssimilActivatedTestCase extends Admin_AbstractControllerTestCase {
protected
$_config,
$_storm_default_to_volatile = true;
public function setUp() {
parent::setUp();
Class_DigitalResource::resetInstance();
AssimilAdminVars::activate();
Class_AdminVar::set('Assimil_Assimil', '1');
$this->_config = Assimil_Config::getInstance();
}
}
class AssimilActivatedAdminTest extends AssimilActivatedTestCase {
public function setUp() {
parent::setUp();
$bib = $this->fixture('Class_Bib',
['id' => 2,
'libelle' => 'Tombouctou']);
......@@ -139,7 +139,7 @@ class AssimilActivatedAdminTest extends Admin_AbstractControllerTestCase {
/** @test */
public function batchHarvestAssimilShouldHaveBeedDeleted() {
AssimilAdminVars::deactivate();
Class_AdminVar::set('Assimil_Assimil', 0);
$this->assertNull(Class_Batch::findFirstBy(['type' => 'Assimil_Batch']));
}
......@@ -150,7 +150,7 @@ class AssimilActivatedAdminTest extends Admin_AbstractControllerTestCase {
['id' => 1,
'parent_id' => 0,
'libelle' => 'Assimil']);
AssimilAdminVars::deactivate();
Class_AdminVar::set('Assimil_Assimil', 0);
$this->assertNull(Class_AlbumCategorie::findFirstBy(['libelle' => 'Assimil']));
}
......@@ -228,7 +228,7 @@ class AssimilOpacIndexControllerWithMenuTest extends AbstractControllerTestCase
public function setUp() {
parent::setUp();
AssimilAdminVars::activate();
Class_AdminVar::set('Assimil_Assimil', 1);
$cfg_menus = ['H' => ['libelle' => 'Menu horizontal',
'picto' => 'vide.gif',
'menus' => [['type_menu' => 'MENU',
......@@ -275,18 +275,20 @@ abstract class AssimilServiceTestCase extends ModelTestCase {
public function setUp() {
parent::setUp();
AssimilAdminVars::activate();
Class_AdminVar::set('Assimil_Assimil', 1);
Class_AdminVar::init();
$catalogue_xml = file_get_contents(__DIR__. '/catalogue_XML_Assimil.xml');
$catalogue_xml = file_get_contents(__DIR__. '/catalogue_XML_Assimil_V2.xml');
$this->_http_client = $this->mock();
$this->_http_client
->whenCalled('open_url')
->with('http://fr.assimil.com/extraits/catalogueXML/catalogue_XML_Assimil.xml')
->with('https://biblio.assimil.online/extraits/catalogue-xml/catalogue_XML_Assimil_V2.xml')
->answers($catalogue_xml)
->whenCalled('open_url')
->answers(true);
->answers(42)
;
$this->_service = Assimil_Service::getInstance();
Assimil_Service::setDefaultHttpClient($this->_http_client);
......@@ -302,7 +304,7 @@ abstract class AssimilServiceTestCase extends ModelTestCase {
class AssimilServiceHarvestTest extends AssimilServiceTestCase {
/** @test */
public function nameShouldAssimil() {
public function nameShouldBeAssimil() {
$this->assertEquals('Assimil', $this->_service->getName());
}
......@@ -314,8 +316,8 @@ class AssimilServiceHarvestTest extends AssimilServiceTestCase {
/** @test */
public function shouldHaveSaved6Albums() {
$this->assertCount(6, Class_Album::findAll());
public function shouldHaveSaved34Albums() {
$this->assertCount(34, Class_Album::findAll());
}
......@@ -369,7 +371,7 @@ class AssimilServiceHarvestTest extends AssimilServiceTestCase {
/** @test */
public function albumUrlOrigine() {
$this->assertEquals('https://assimil.online/assimilweb?code_produit=5167',
$this->assertEquals('https://biblio.assimil.online/assimilweb?code_produit=4647',
$this->_e_course->getUrlOrigine());
}
......@@ -382,14 +384,14 @@ class AssimilServiceHarvestTest extends AssimilServiceTestCase {
/** @test */
public function albumShouldContainsUrlRessource() {
$this->assertEquals('https://assimil.online/assimilweb?code_produit=5167',
$this->assertEquals('https://biblio.assimil.online/assimilweb?code_produit=4647',
$this->_e_course->getRessources()[0]->getUrl());
}
/** @test */
public function albumsShouldBeIndexed() {
$this->assertCount(6, Class_Notice::findAll());
$this->assertCount(34, Class_Notice::findAll());
}
}
......@@ -399,27 +401,47 @@ class AssimilServiceSecondHarvestTest extends AssimilServiceTestCase {
public function setUp() {
parent::setUp();
$catalogue_xml = file_get_contents(__DIR__ . '/assimil_with_32_ressources.xml');
$catalogue_xml = file_get_contents(__DIR__ . '/catalogue_XML_Assimil_V2_second.xml');
$http_client = $this->mock();
$http_client
->whenCalled('open_url')
->with('http://fr.assimil.com/extraits/catalogueXML/catalogue_XML_Assimil.xml')
->with('https://biblio.assimil.online/extraits/catalogue-xml/catalogue_XML_Assimil_V2.xml')
->answers($catalogue_xml)
->whenCalled('open_url')
->answers(true);
$service = Assimil_Service::getInstance();
Assimil_Service::setDefaultHttpClient($http_client);
Assimil_Service::setHttpClient($http_client);
$this->fixture('Class_Album',
['id' => 1,
'titre' => 'French - Français',
'type_doc_id' => 'Assimil',
'id_origine' => '5167']);
$this->fixture('Class_Album',
['id' => 2,
'titre' => 'El frances - Français',
'type_doc_id' => 'Assimil',
'id_origine' => '6034']);
$service->harvest();
Class_Album::clearCache();
}
/** @test */
public function assimilShouldContainsOnly32Albums() {
$this->assertCount(32, Class_Album::findAll());
public function frenchShouldStay() {
$this->assertNotNull(Class_Album::find(1));
}
/** @test */
public function elFrancesShouldBeGone() {
$this->assertNull(Class_Album::find(2));
}
}
......@@ -599,7 +621,6 @@ class AssimilBibnumControllerIndexTest extends Admin_AbstractControllerTestCase
abstract class AssimilModulesControllerAssimilTestCase extends AbstractControllerTestCase {
protected
$_storm_default_to_volatile = true,
$_user,
......@@ -608,7 +629,9 @@ abstract class AssimilModulesControllerAssimilTestCase extends AbstractControlle
public function setUp() {
parent::setUp();
AssimilAdminVars::activate();
Class_AdminVar::init();
Class_AdminVar::set('Assimil_Assimil', 1);
$this->_group = $this->fixture('Class_UserGroup', ['id' => 1]);
}
}
......@@ -664,17 +687,17 @@ abstract class AssimilModulesControllerAssimilLoggedUserTestCase extends Assimil
class AssimilModulesControllerAssimilLoggedTest extends AssimilModulesControllerAssimilLoggedUserTestCase {
/** @test */
public function shouldContainsScriptWithRedirectionToAssimil() {
public function shouldContainsScriptWithRedirectionToBiblioAssimilOnline() {
$this->dispatch('/opac/modules/assimil', true);
$this->assertXPathContentContains('//script', 'http://biblio.assimil.com/assimilweb');
$this->assertXPathContentContains('//script', 'https://biblio.assimil.online/assimilweb');
}
/** @test */
public function withAssimilBaseURLShouldSetToAssimilOnline() {
Class_AdminVar::set('Assimil_SSO_URL', 'https://assimil.online/assimilweb');
public function withAssimilSsoUrlShouldRedirectToIt() {
Class_AdminVar::set('Assimil_SSO_URL', 'https://anywhere.online/assimilweb');
$this->dispatch('/opac/modules/assimil', true);
$this->assertXPathContentContains('//script', 'https://assimil.online/assimilweb');
$this->assertXPathContentContains('//script', 'https://anywhere.online/assimilweb');
}
}
......@@ -723,4 +746,51 @@ class AssimilRechercheControllerWithFacetTest extends AbstractControllerTestCase
public function facetAssimilShouldBeValid() {
$this->assertXPath('//div[@class="criteres_recherche"]//a', 'Type de document: ASSIMIL e-méthode');
}
}
class AssimilMigrationToV2Tests extends AssimilActivatedTestCase {
public function setUp() {
parent::setUp();
Class_AdminVar::set('Assimil_SSO_URL', 'https://assimil.old.com');
Class_WebService_Abstract::setHttpClient($this->mock()
->whenCalled('open_url')
->with('https://biblio.assimil.online/extraits/catalogue-xml/catalogue_XML_Assimil_V2.xml')
->answers(file_get_contents(__DIR__ . '/catalogue_XML_Assimil_V2.xml'))
->beStrict());
$album = $this->fixture('Class_Album',
['id' => 6,
'titre' => 'El Frances',
'type_doc_id' => 'Assimil',
'id_origine' => '5158',
'url_origine' => 'https://assimil.online/assimilweb?code_produit=5158',
'notes' => 'a:3:{i:0;a:2:{s:5:"field";s:3:"210";s:4:"data";a:1:{i:0;a:2:{i:0;s:1:"c";i:1;s:14:"Assimil S.A.S.";}}}i:1;a:2:{s:5:"field";s:3:"856";s:4:"data";a:2:{s:1:"x";s:6:"poster";s:1:"a";s:55:"http://fr.assimil.com/images/produit/online/5158_TL.jpg";}}i:2;a:2:{s:5:"field";s:3:"856";s:4:"data";a:2:{s:1:"x";s:12:"external_uri";s:1:"a";s:51:"https://assimil.online/assimilweb?code_produit=5158";}}}']);
(new Class_Migration_DigitalResource_Assimil)->migrateToV2();
}
/** @test */
public function ssoUrlShouldBeBiblioDotAssimilDotOnline() {
$this->assertEquals('https://biblio.assimil.online/assimilweb', $this->_config->getAdminVar('SSO_URL'));
}
/** @test */
public function albumElFrancesSsoUrlShouldBeBiblioDotAssimilDotOnline() {
$this->assertEquals('https://biblio.assimil.online/assimilweb?code_produit=4755',
$this->_config->urlFor($this->_config->getTestUser(), ['album_id' => 6]));
}
/** @test */
public function posterUrlShouldBeBiblioDotAssimilDotOnline() {
$this->assertEquals('https://biblio.assimil.online/extraits/facing/5158_TL.jpg',
Class_Album::find(6)->getPoster());
}
}
\ No newline at end of file
This diff is collapsed.
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<entry>
<item>
<Title>French - Français</Title>
<Author>Bulger Anthony</Author>
<Publisher>Assimil S.A.S.</Publisher>
<TypeOfDocument>Formation en ligne</TypeOfDocument>
<Language>Anglais</Language>
<ContentDescription>The With Ease series is a revolutionary self-study method based on the simple, effective principle of intuitive assimilation. This is the natural process through which we learn our first language. The methodology uses entertaining, practical dialogues supported by brief explanatory notes and followed by review exercises to create an educational framework that will allow you to achieve a level of fluency almost effortlessly. Learning a language has never been so easy. Discover the digital version of our top-selling courses! The Assimil method now exists in an electronic version featuring a host of interactive features to help you enjoy your learning experience to the full. The structure and progression that underpin the success of our courses have been enhanced by a voice recording app that lets you compare your accent and pronunciation against the original soundtrack. Our e-course also provides easy access to the notes and comments that make the lessons so compelling.</ContentDescription>
<Identifier>5167</Identifier>
<PrimaryDocUrl>https://assimil.online/assimilweb?code_produit=5167</PrimaryDocUrl>
<ThumbSmall>http://fr.assimil.com/images/produit/online/5167_TS.jpg</ThumbSmall>
<ThumbMedium>http://fr.assimil.com/images/produit/online/5167_TM.jpg</ThumbMedium>
<ThumbLarge>http://fr.assimil.com/images/produit/online/5167_TL.jpg</ThumbLarge>
<Audience>Débutants et Faux-débutants</Audience>
<SubjectTopic>Apprentissage de la langue : Français</SubjectTopic>
<DateOfInsertion>20170428</DateOfInsertion>
</item>
<item>
<Title>El Francés - Français</Title>
<Publisher>Assimil S.A.S.</Publisher>
<TypeOfDocument>Formation en ligne</TypeOfDocument>
<Language>Espagnol</Language>
<ContentDescription>La colección Sin Esfuerzo es un método revolucionario de autoaprendizaje basado en simple y eficaz principio de la asimilación intuitiva. Este es el proceso natural a través del cual aprendemos nuestra lengua materna. La metodología utiliza diálogos prácticos y entretenidos apoyados por breves notas explicativas, seguido de unos ejercicios de repaso para crear un marco educativo que te permitirá conseguir un nivel fluido casi sin esfuerzo. Aprender un idioma nunca ha sido tan fácil. ¡Descubre la versión digital de nuestros cursos más vendidos! El método Assimil ahora también en versión digital, con características interactivas que te ayudarán a disfrutar plenamente de la experiencia del aprendizaje. La estructura y la progresión en la que se basa el éxito de nuestros cursos ha sido mejorada con una aplicación para grabar tu propia voz, lo que te permitirá comparar tu acento y pronunciación con el de la grabación original. Nuestro e-método también te proporciona un acceso fácil a las notas y comentarios que hacen las lecciones mucho más atractivas.</ContentDescription>
<Identifier>5158</Identifier>
<PrimaryDocUrl>https://assimil.online/assimilweb?code_produit=5158</PrimaryDocUrl>
<ThumbSmall>http://fr.assimil.com/images/produit/online/5158_TS.jpg</ThumbSmall>
<ThumbMedium>http://fr.assimil.com/images/produit/online/5158_TM.jpg</ThumbMedium>
<ThumbLarge>http://fr.assimil.com/images/produit/online/5158_TL.jpg</ThumbLarge>
<Audience>Débutants et Faux-débutants</Audience>
<SubjectTopic>Apprentissage de la langue : Français</SubjectTopic>
<DateOfInsertion>20170428</DateOfInsertion>
</item>
<item>
<Title>L'allemand - Deutsch</Title>
<Publisher>Assimil S.A.S.</Publisher>
<YearOfPublication>2016</YearOfPublication>
<TypeOfDocument>Formation en ligne</TypeOfDocument>
<Language>Français</Language>
<ContentDescription>Vous avez choisi L’Allemand, dans la collection “Sans peine” d’Assimil pour votre apprentissage, et nous vous en félicitons ! En nous suivant attentivement – et régulièrement –, vous allez apprendre en quelques mois le vocabulaire de la langue courante, ainsi que les règles fondamentales de la grammaire. Très rapidement, cette belle langue vous semblera familière, grâce à la centaine de dialogues tirés de la vie quotidienne que nous vous présentons ici. Assimil vous propose sa méthode sur support 100% numérique. A la structure et la progression qui ont fait le succès des méthodes de langue de nos éditions, de nombreuses fonctions interactives ont été ajoutées pour une expérience inédite de l'auto-apprentissage. Privilégiant une approche par le dialogue, vous allez maitriser progressivement la compréhension orale et écrite. La progression grammaticale est également soigneusement étudiée tout au long des leçons et des exercices, et des révisions régulières pour consolider vos acquis. Avec la e-méthode, enregistrez-vous et comparez votre accent à la bonne prononciation, accédez facilement aux notes et remarques pendant l'apprentissage !</ContentDescription>
<Identifier>5001</Identifier>
<PrimaryDocUrl>https://assimil.online/assimilweb?code_produit=5001</PrimaryDocUrl>
<ThumbSmall>http://fr.assimil.com/images/produit/online/5001_TS.jpg</ThumbSmall>
<ThumbMedium>http://fr.assimil.com/images/produit/online/5001_TM.jpg</ThumbMedium>
<ThumbLarge>http://fr.assimil.com/images/produit/online/5001_TL.jpg</ThumbLarge>
<Audience>Débutants et Faux-débutants</Audience>
<SubjectTopic>Apprentissage de la langue : Allemand</SubjectTopic>
<DateOfInsertion>20170428</DateOfInsertion>
</item>
<item>
<Title>Perfectionnement Allemand - Deutsch</Title>
<Publisher>Assimil S.A.S.</Publisher>
<TypeOfDocument>Formation en ligne</TypeOfDocument>
<Language>Français</Language>
<ContentDescription>Quels que soient les motifs personnels qui vous ont décidé à vouloir perfectionner votre maîtrise de l’allemand, il y a une raison qui vaut pour tout le monde : les connaissances acquises dans une langue étrangère constituent un capital linguistique précieux qu’il s’agit d’entretenir en le faisant “travailler”. Le laisser dormir équivaut à le perdre un peu, chaque jour ! L’acquisition d’une langue a beaucoup en commun avec la découverte progressive d’un continent inconnu : un point de départ, un rayon d’action d’abord limité, puis des explorations de plus en plus lointaines, une familiarité croissante avec le paysage, des allées et venues régulières dans un périmètre de plus en plus vaste. Assimil vous propose sa méthode sur support 100% numérique. A la structure et la progression qui ont fait le succès des méthodes de langue de nos éditions, de nombreuses fonctions interactives ont été ajoutées pour une expérience inédite de l'auto-apprentissage. Privilégiant une approche par le dialogue, vous allez maitriser progressivement la compréhension orale et écrite. La progression grammaticale est également soigneusement étudiée tout au long des leçons et des exercices, et des révisions régulières pour consolider vos acquis. Avec la e-méthode, enregistrez-vous et comparez votre accent à la bonne prononciation, accédez facilement aux notes et remarques pendant l'apprentissage !</ContentDescription>
<Identifier>5013</Identifier>
<PrimaryDocUrl>https://assimil.online/assimilweb?code_produit=5013</PrimaryDocUrl>