diff --git a/api/src/pcapi/sandboxes/scripts/creators/industrial/__init__.py b/api/src/pcapi/sandboxes/scripts/creators/industrial/__init__.py index 00ab448d05..b566a076ae 100644 --- a/api/src/pcapi/sandboxes/scripts/creators/industrial/__init__.py +++ b/api/src/pcapi/sandboxes/scripts/creators/industrial/__init__.py @@ -18,7 +18,6 @@ from pcapi.sandboxes.scripts.creators.industrial.create_industrial_eac_data import create_eac_data from pcapi.sandboxes.scripts.creators.industrial.create_industrial_event_occurrences import * from pcapi.sandboxes.scripts.creators.industrial.create_industrial_event_offers import * -from pcapi.sandboxes.scripts.creators.industrial.create_industrial_event_products import * from pcapi.sandboxes.scripts.creators.industrial.create_industrial_event_stocks import * from pcapi.sandboxes.scripts.creators.industrial.create_industrial_incidents import create_industrial_incidents from pcapi.sandboxes.scripts.creators.industrial.create_industrial_individual_offerers import ( @@ -41,7 +40,6 @@ create_industrial_search_indexed_objects, ) from pcapi.sandboxes.scripts.creators.industrial.create_industrial_thing_offers import * -from pcapi.sandboxes.scripts.creators.industrial.create_industrial_thing_products import * from pcapi.sandboxes.scripts.creators.industrial.create_industrial_thing_stocks import * from pcapi.sandboxes.scripts.creators.industrial.create_industrial_venues import * from pcapi.sandboxes.scripts.creators.industrial.create_industrial_venues_with_timezone import ( @@ -79,13 +77,9 @@ def save_industrial_sandbox() -> None: venues_by_name = create_industrial_venues(offerers_by_name) - event_products_by_name = create_industrial_event_products() + event_offers_by_name = create_industrial_event_offers(offerers_by_name) - thing_products_by_name = create_industrial_thing_products() - - event_offers_by_name = create_industrial_event_offers(event_products_by_name, offerers_by_name) - - thing_offers_by_name = create_industrial_thing_offers(thing_products_by_name, offerers_by_name, venues_by_name) + thing_offers_by_name = create_industrial_thing_offers(offerers_by_name, venues_by_name) create_industrial_draft_offers(offerers_by_name) diff --git a/api/src/pcapi/sandboxes/scripts/creators/industrial/create_industrial_event_occurrences.py b/api/src/pcapi/sandboxes/scripts/creators/industrial/create_industrial_event_occurrences.py index 635fa1aad1..17ee90c201 100644 --- a/api/src/pcapi/sandboxes/scripts/creators/industrial/create_industrial_event_occurrences.py +++ b/api/src/pcapi/sandboxes/scripts/creators/industrial/create_industrial_event_occurrences.py @@ -44,7 +44,7 @@ def create_industrial_event_occurrences( price_categories: dict[decimal.Decimal, offers_models.PriceCategory] = {} for index, beginning_datetime in enumerate(EVENT_OCCURRENCE_BEGINNING_DATETIMES, start=1): name = "{} / {} / {} ".format( - event_offer_with_occurrences.product.name if event_offer_with_occurrences.product else "", + event_offer_with_occurrences.name, event_offer_with_occurrences.venue.name, beginning_datetime.strftime(date_utils.DATE_ISO_FORMAT), ) diff --git a/api/src/pcapi/sandboxes/scripts/creators/industrial/create_industrial_event_offers.py b/api/src/pcapi/sandboxes/scripts/creators/industrial/create_industrial_event_offers.py index 83e29f9374..bc0c8cd697 100644 --- a/api/src/pcapi/sandboxes/scripts/creators/industrial/create_industrial_event_offers.py +++ b/api/src/pcapi/sandboxes/scripts/creators/industrial/create_industrial_event_offers.py @@ -1,9 +1,11 @@ import logging +from pcapi.core.categories import subcategories_v2 import pcapi.core.offerers.models as offerers_models import pcapi.core.offers.factories as offers_factories import pcapi.core.offers.models as offers_models from pcapi.repository import repository +from pcapi.sandboxes.scripts.mocks.event_mocks import MOCK_NAMES logger = logging.getLogger(__name__) @@ -14,7 +16,6 @@ def create_industrial_event_offers( - events_by_name: dict[str, offers_models.Product], offerers_by_name: dict[str, offerers_models.Offerer], ) -> dict[str, offers_models.Offer]: logger.info("create_industrial_event_offers") @@ -24,7 +25,7 @@ def create_industrial_event_offers( event_index = 0 offer_index = 0 - event_items = list(events_by_name.items()) + event_subcategories = [s for s in subcategories_v2.ALL_SUBCATEGORIES if s.is_event and s.is_offline_only] for offerer in offerers_by_name.values(): event_venues = [venue for venue in offerer.managedVenues if not venue.isVirtual] @@ -35,9 +36,10 @@ def create_industrial_event_offers( event_venue = event_venues[0] for venue_event_index in range(0, EVENTS_PER_OFFERER_WITH_PHYSICAL_VENUE): - rest_event_index = (venue_event_index + event_index) % len(event_items) - - (event_name, event) = event_items[rest_event_index] + event_subcategory_index = (venue_event_index + event_index) % len(event_subcategories) + event_subcategory = event_subcategories[event_subcategory_index] + mock_index = (venue_event_index + event_index) % len(MOCK_NAMES) + event_name = MOCK_NAMES[mock_index] name = "{} / {}".format(event_name, event_venue.name) if offer_index % DEACTIVATED_OFFERS_PICK_MODULO == 0: @@ -50,8 +52,10 @@ def create_industrial_event_offers( is_duo = True event_offers_by_name[name] = offers_factories.OfferFactory( venue=event_venue, - product=event, - extraData=event.extraData, + subcategoryId=event_subcategory.id, + extraData=offers_factories.build_extra_data_from_subcategory( + event_subcategory.id, set_all_fields=False + ), isActive=is_active, isDuo=is_duo, ) diff --git a/api/src/pcapi/sandboxes/scripts/creators/industrial/create_industrial_event_products.py b/api/src/pcapi/sandboxes/scripts/creators/industrial/create_industrial_event_products.py deleted file mode 100644 index 4e4b6da15f..0000000000 --- a/api/src/pcapi/sandboxes/scripts/creators/industrial/create_industrial_event_products.py +++ /dev/null @@ -1,85 +0,0 @@ -import logging -import random - -from pcapi.core.categories import subcategories_v2 -import pcapi.core.offers.factories as offers_factories -import pcapi.core.offers.models as offers_models -from pcapi.domain.music_types import MUSIC_TYPES -from pcapi.domain.show_types import SHOW_TYPES -from pcapi.repository import repository -from pcapi.sandboxes.scripts.mocks.event_mocks import MOCK_DESCRIPTIONS -from pcapi.sandboxes.scripts.mocks.event_mocks import MOCK_NAMES -from pcapi.sandboxes.scripts.mocks.user_mocks import MOCK_FIRST_NAMES -from pcapi.sandboxes.scripts.mocks.user_mocks import MOCK_LAST_NAMES - - -logger = logging.getLogger(__name__) - - -EVENT_COUNTS_PER_TYPE = 7 - - -def create_industrial_event_products() -> dict[str, offers_models.Product]: - logger.info("create_industrial_event_products") - - event_products_by_name = {} - - event_subcategories = [s for s in subcategories_v2.ALL_SUBCATEGORIES if s.is_event and s.is_offline_only] - - for product_creation_counter in range(0, EVENT_COUNTS_PER_TYPE): - for event_subcategories_list_index, event_subcategory in enumerate(event_subcategories): - mock_index = (product_creation_counter + event_subcategories_list_index) % len(MOCK_NAMES) - event_name = MOCK_NAMES[mock_index] - description = MOCK_DESCRIPTIONS[mock_index] - - name = "{} / {}".format(event_subcategory.id, event_name) - event_product = offers_factories.ProductFactory( - description=description, - durationMinutes=60, - name=event_name, - subcategoryId=event_subcategory.id, - ) - - extraData = {} - extra_data_index = 0 - for conditional_field_name in event_product.subcategory.conditional_fields: - conditional_index = product_creation_counter + event_subcategories_list_index + extra_data_index - if conditional_field_name in [ - subcategories_v2.ExtraDataFieldEnum.AUTHOR.value, - subcategories_v2.ExtraDataFieldEnum.PERFORMER.value, - subcategories_v2.ExtraDataFieldEnum.SPEAKER.value, - subcategories_v2.ExtraDataFieldEnum.STAGE_DIRECTOR.value, - ]: - mock_first_name_index = conditional_index % len(MOCK_FIRST_NAMES) - mock_first_name = MOCK_FIRST_NAMES[mock_first_name_index] - mock_last_name_index = conditional_index % len(MOCK_LAST_NAMES) - mock_last_name = MOCK_LAST_NAMES[mock_last_name_index] - mock_name = "{} {}".format(mock_first_name, mock_last_name) - extraData[conditional_field_name] = mock_name - elif conditional_field_name == subcategories_v2.ExtraDataFieldEnum.MUSIC_TYPE.value: - music_type_index: int = conditional_index % len(MUSIC_TYPES) - music_type = MUSIC_TYPES[music_type_index] - extraData[conditional_field_name] = str(music_type.code) - music_sub_type_index: int = conditional_index % len(music_type.children) - music_sub_type = music_type.children[music_sub_type_index] - extraData["musicSubType"] = str(music_sub_type.code) - elif conditional_field_name == subcategories_v2.ExtraDataFieldEnum.SHOW_TYPE.value: - show_type_index: int = conditional_index % len(SHOW_TYPES) - show_type = SHOW_TYPES[show_type_index] - extraData[conditional_field_name] = str(show_type.code) - show_sub_type_index: int = conditional_index % len(show_type.children) - show_sub_type = show_type.children[show_sub_type_index] - extraData["showSubType"] = str(show_sub_type.code) - elif conditional_field_name == subcategories_v2.ExtraDataFieldEnum.VISA.value: - extraData[conditional_field_name] = "".join(random.choices([str(i) for i in range(9)], k=10)) - extra_data_index += 1 - event_product.extraData = extraData - event_products_by_name[name] = event_product - - product_creation_counter += len(event_subcategories) - - repository.save(*event_products_by_name.values()) - - logger.info("created %d event products", len(event_products_by_name)) - - return event_products_by_name diff --git a/api/src/pcapi/sandboxes/scripts/creators/industrial/create_industrial_thing_offers.py b/api/src/pcapi/sandboxes/scripts/creators/industrial/create_industrial_thing_offers.py index e6504d89d5..a59f2c08fb 100644 --- a/api/src/pcapi/sandboxes/scripts/creators/industrial/create_industrial_thing_offers.py +++ b/api/src/pcapi/sandboxes/scripts/creators/industrial/create_industrial_thing_offers.py @@ -1,9 +1,11 @@ import logging +from pcapi.core.categories import subcategories_v2 import pcapi.core.offerers.models as offerers_models import pcapi.core.offers.factories as offers_factories import pcapi.core.offers.models as offers_models from pcapi.repository import repository +from pcapi.sandboxes.scripts.mocks.thing_mocks import MOCK_NAMES logger = logging.getLogger(__name__) @@ -14,7 +16,6 @@ def create_industrial_thing_offers( - thing_products_by_name: dict[str, offers_models.Product], offerers_by_name: dict[str, offerers_models.Offerer], venues_by_name: dict[str, offerers_models.Venue], ) -> dict[str, offers_models.Offer]: @@ -22,10 +23,11 @@ def create_industrial_thing_offers( thing_offers_by_name: dict[str, offers_models.Offer] = {} + thing_subcategories = [s for s in subcategories_v2.ALL_SUBCATEGORIES if not s.is_event] + id_at_provider = 1234 thing_index = 0 offer_index = 0 - thing_items = list(thing_products_by_name.items()) for offerer in offerers_by_name.values(): virtual_venue = [venue for venue in offerer.managedVenues if venue.isVirtual][0] @@ -34,17 +36,20 @@ def create_industrial_thing_offers( for venue_thing_index in range(0, THINGS_PER_OFFERER): thing_venue = None - while thing_venue is None: - rest_thing_index = (venue_thing_index + thing_index) % len(thing_items) - (thing_name, thing_product) = thing_items[rest_thing_index] - if thing_product.subcategory.is_offline_only: - thing_venue = physical_venue - elif thing_product.subcategory.is_online_only: - thing_venue = virtual_venue - else: - thing_venue = physical_venue - - thing_index += 1 + subcategory_index = (venue_thing_index + thing_index) % len(thing_subcategories) + subcategory = thing_subcategories[subcategory_index] + thing_name_index = (venue_thing_index + thing_index) % len(MOCK_NAMES) + thing_name = MOCK_NAMES[thing_name_index] + + if subcategory.is_offline_only: + thing_venue = physical_venue + elif subcategory.is_online_only: + thing_venue = virtual_venue + else: + thing_venue = physical_venue + + if thing_venue is None: + continue name = "{} / {}".format(thing_name, thing_venue.name) if offer_index % DEACTIVATED_OFFERS_PICK_MODULO == 0: @@ -53,11 +58,11 @@ def create_industrial_thing_offers( is_active = True thing_offers_by_name[name] = offers_factories.OfferFactory( venue=thing_venue, - subcategoryId=thing_product.subcategoryId, + subcategoryId=subcategory.id, isActive=is_active, - url="http://example.com" if thing_product.subcategory.is_online_only else None, + url="http://example.com" if subcategory.is_online_only else None, idAtProvider=str(id_at_provider), - extraData=thing_product.extraData, + extraData=offers_factories.build_extra_data_from_subcategory(subcategory.id, set_all_fields=False), ) offer_index += 1 id_at_provider += 1 diff --git a/api/src/pcapi/sandboxes/scripts/creators/industrial/create_industrial_thing_products.py b/api/src/pcapi/sandboxes/scripts/creators/industrial/create_industrial_thing_products.py deleted file mode 100644 index f2a7adbff6..0000000000 --- a/api/src/pcapi/sandboxes/scripts/creators/industrial/create_industrial_thing_products.py +++ /dev/null @@ -1,354 +0,0 @@ -import logging -import random - -from pcapi.core.categories import subcategories_v2 -import pcapi.core.offers.factories as offers_factories -import pcapi.core.offers.models as offers_models -import pcapi.core.providers.factories as providers_factories -from pcapi.core.providers.titelive_gtl import GTLS -from pcapi.domain.music_types import MUSIC_SUB_TYPES_BY_SLUG -from pcapi.domain.music_types import MUSIC_TYPES -from pcapi.domain.music_types import MUSIC_TYPES_BY_SLUG -from pcapi.repository import repository -import pcapi.sandboxes.scripts.creators.industrial.utils as industrial_utils -from pcapi.sandboxes.scripts.mocks.thing_mocks import MOCK_AUTHOR_NAMES -from pcapi.sandboxes.scripts.mocks.thing_mocks import MOCK_DESCRIPTIONS -from pcapi.sandboxes.scripts.mocks.thing_mocks import MOCK_NAMES -from pcapi.sandboxes.scripts.mocks.user_mocks import MOCK_FIRST_NAMES -from pcapi.sandboxes.scripts.mocks.user_mocks import MOCK_LAST_NAMES -from pcapi.utils import date as date_utils - - -logger = logging.getLogger(__name__) - - -THINGS_PER_SUBCATEGORY = 7 - - -def create_industrial_thing_products() -> dict[str, offers_models.Product]: - logger.info("create_industrial_thing_products") - - thing_products_by_name = {} - - thing_subcategories = [s for s in subcategories_v2.ALL_SUBCATEGORIES if not s.is_event] - - id_at_providers = 1234 - provider = providers_factories.PublicApiProviderFactory(name="ThingMusicProvider") - base_ean = 1234567890123 - - for product_creation_counter in range(0, THINGS_PER_SUBCATEGORY): - for thing_subcategories_list_index, thing_subcategory in enumerate(thing_subcategories): - mock_index = (product_creation_counter + thing_subcategories_list_index) % len(MOCK_NAMES) - - name = "{} / {}".format(thing_subcategory.id, MOCK_NAMES[mock_index]) - - # FIXME (yacine-pc, 2024-01-24): do not create product for only online subcategories (digital products) - thing_product = offers_factories.ProductFactory( - lastProvider=provider, - extraData={"author": MOCK_AUTHOR_NAMES[mock_index]}, - description=MOCK_DESCRIPTIONS[mock_index], - idAtProviders=str(id_at_providers), - name=MOCK_NAMES[mock_index], - subcategoryId=thing_subcategory.id, - ) - - extraData = {} - extra_data_index = 0 - for conditionalField_name in thing_product.subcategory.conditional_fields: - conditional_index = product_creation_counter + thing_subcategories_list_index + extra_data_index - if conditionalField_name in [ - subcategories_v2.ExtraDataFieldEnum.AUTHOR.value, - subcategories_v2.ExtraDataFieldEnum.PERFORMER.value, - subcategories_v2.ExtraDataFieldEnum.SPEAKER.value, - subcategories_v2.ExtraDataFieldEnum.STAGE_DIRECTOR.value, - ]: - mock_first_name_index = ( - product_creation_counter + thing_subcategories_list_index + extra_data_index - ) % len(MOCK_FIRST_NAMES) - mock_first_name = MOCK_FIRST_NAMES[mock_first_name_index] - mock_last_name_index = ( - product_creation_counter + thing_subcategories_list_index + extra_data_index - ) % len(MOCK_LAST_NAMES) - mock_last_name = MOCK_LAST_NAMES[mock_last_name_index] - mock_name = "{} {}".format(mock_first_name, mock_last_name) - extraData[conditionalField_name] = mock_name - elif conditionalField_name == "musicType": - music_type_index: int = conditional_index % len(MUSIC_TYPES) - music_type = MUSIC_TYPES[music_type_index] - extraData[conditionalField_name] = str(music_type.code) - music_sub_type_index: int = conditional_index % len(music_type.children) - music_sub_type = music_type.children[music_sub_type_index] - extraData["musicSubType"] = str(music_sub_type.code) - elif conditionalField_name == "ean": - extraData["ean"] = str(base_ean) - base_ean += 1 - elif conditionalField_name == "gtl_id": - extraData["gtl_id"] = random.choice(list(GTLS.keys())) - extra_data_index += 1 - thing_product.extraData = extraData - thing_products_by_name[name] = thing_product - id_at_providers += 1 - - product_creation_counter += len(thing_subcategories) - - titelive_synced_products = create_titelive_synced_music_products() - thing_products_by_name |= {product.name: product for product in titelive_synced_products} - - repository.save(*thing_products_by_name.values()) - - industrial_utils.create_products_thumb(titelive_synced_products) - - logger.info("created %d thing products", len(thing_products_by_name)) - - return thing_products_by_name - - -def create_titelive_synced_music_products() -> list[offers_models.Product]: - provider = providers_factories.PublicApiProviderFactory(name="ThingMusicProvider") - logger.info("create_titelive_synced_music_products") - - unavailable_cd = offers_factories.ProductFactory( - lastProvider=provider, - description=None, - extraData=offers_models.OfferExtraData( - artist="Queen", - author="Queen", - comment="Limited Edition", - dispo="4", - distributeur="Universal Music France", - ean="0602438073177", - editeur="VIRGIN RECORDS FRANCE", - gtl_id="70100", - music_label="UNIVERSAL MUSIC", - musicSubType=str(MUSIC_SUB_TYPES_BY_SLUG["ROCK-HARD_ROCK"].code), - musicType=str(MUSIC_TYPES_BY_SLUG["ROCK-HARD_ROCK"].code), - nb_galettes="1", - performer="Queen", - ), - idAtProviders="0602438073177", - name="Greatest Hits", - subcategoryId=subcategories_v2.SUPPORT_PHYSIQUE_MUSIQUE_CD.id, - ) - - soon_released_cd = offers_factories.ProductFactory( - lastProvider=provider, - description="Après les récentes rééditions de The Who 'Sell Out', 'My Generation', 'Tommy' et 'Quadrophenia', voici enfin Who's Next, considéré par de nombreux fans comme le plus grand album du groupe ! Découvrez cette nouvelle réédition déclinée en plusieurs supports : CD Cristal, 2CD Digipack, LP, Coffret 10CD+Blu-ray Audio ainsi qu'un coffret 4LP (album rematerisé Who's Next et le Live At The Civic Auditorium, San Francisco -1971).\n\nLe processus de création de l'album fut à l'époque révolutionnaire. Au début des années 70, The Who, et en particulier leur principal auteur-compositeur Pete Townshend, ont été confrontés à un immense défi : Comment succéder au succès international de Tommy ? La réponse a été un projet ambitieux, futuriste et prémonitoire nommé 'Life House'. Life House prédisait un monde dystopique qui semble aujourd'hui familier. Les thèmes abordés étaient ceux de la pollution, des entreprises trop puissantes et de la technologie. Le projet en deux volets réunissait un film et une performance live au Young Vic Theatre de Londres.\n\nEt comme l'écrit Pete Townshend « La fiction et l'expérience Live étaient toutes deux imparfaites, et aucune n'a été correctement réalisée. Mais une musique merveilleuse est sortie du projet, et l'idée m'a toujours hantée, car de nombreux éléments de la fiction semblent se réaliser »\n", - extraData=offers_models.OfferExtraData( - artist="The who", - author="The who", - comment="TBC", - date_parution=date_utils.parse_titelive_date_to_string("15/09/2023"), - dispo="2", - distributeur="Universal Music France", - ean="0602435858395", - editeur="UNIVERSAL", - gtl_id="70100", - music_label="UNIVERSAL", - musicSubType=str(MUSIC_SUB_TYPES_BY_SLUG["ROCK-HARD_ROCK"].code), - musicType=str(MUSIC_TYPES_BY_SLUG["ROCK-HARD_ROCK"].code), - nb_galettes="1", - performer="The Who", - ), - idAtProviders="0602435858395", - name="Who's Next", - subcategoryId=subcategories_v2.SUPPORT_PHYSIQUE_MUSIQUE_CD.id, - ) - - available_rap_cd_1 = offers_factories.ProductFactory( - lastProvider=provider, - description='GIMS revient avec " Les dernières volontés de Mozart ", un album de tubes.\n\n" Les dernières volontés de Mozart " est un album phénomène.\nWolfgang Amadeus Mozart ne rentrait dans aucune case, il a composé et excellé dans tous les registres de son époque. Son audace, sa virtuosité et son génie sont inégalables et traversent le temps.\nD\'une créativité rare, GIMS relève encore une fois le défi : celui d\'avoir composé des morceaux aux univers tous différents, à la fois populaires et toujours innovants. Ce nouvel opus est d\'une qualité redoutable, rassemblant 20 titres qui sont autant de tubes en devenir.\nEt pour que la surprise soit totale, l\'album offre des collaborations aussi réussies qu\'inattendues...\nInclus le tube " Maintenant ".\n', - extraData=offers_models.OfferExtraData( - artist="Gims", - author="Gims", - date_parution=date_utils.parse_titelive_date_to_string("02/12/2022"), - dispo="1", - distributeur="Believe", - ean="3700187679323", - editeur="BELIEVE", - gtl_id="110400", - music_label="PLAY TWO", - musicSubType=str(MUSIC_SUB_TYPES_BY_SLUG["HIP_HOP_RAP-RAP_FRANCAIS"].code), - musicType=str(MUSIC_TYPES_BY_SLUG["HIP_HOP_RAP-RAP_FRANCAIS"].code), - nb_galettes="1", - performer="Gims", - ), - idAtProviders="3700187679323", - name="Les dernières volontés de Mozart (symphony)", - subcategoryId=subcategories_v2.SUPPORT_PHYSIQUE_MUSIQUE_CD.id, - ) - - available_rap_cd_2 = offers_factories.ProductFactory( - lastProvider=provider, - description='.Après l\'immense succès de " Civilisation " (déjà plus de 600.000 ventes) et de la nouvelle saison de la série-documentaire " Montre jamais ça à personne ", OrelSan revient avec une version augmentée de 10 nouveaux titres de son album déjà culte : "Civilisation Edition Ultime".\n\nAvec près de 2,5 millions d\'albums vendus en cumulé et 9 Victoires de la Musique, OrelSan occupe une place à part dans le paysage français. La voix d\'une génération.\n\nOrelSan " Civilisation Edition Ultime ", double album CD.\n', - extraData=offers_models.OfferExtraData( - artist="Orelsan", - author="Orelsan", - comment="édition double CD sous fourreau", - date_parution=date_utils.parse_titelive_date_to_string("28/10/2022"), - dispo="1", - distributeur="Wagram Music", - ean="3596974281424", - editeur="3EME BUREAU", - gtl_id="110400", - music_label="3EME BUREAU", - musicSubType=str(MUSIC_SUB_TYPES_BY_SLUG["HIP_HOP_RAP-RAP_FRANCAIS"].code), - musicType=str(MUSIC_TYPES_BY_SLUG["HIP_HOP_RAP-RAP_FRANCAIS"].code), - nb_galettes="2", - performer="Orelsan", - ), - idAtProviders="3596974281424", - name="Civilisation - Edition ultime", - subcategoryId=subcategories_v2.SUPPORT_PHYSIQUE_MUSIQUE_CD.id, - ) - - available_multiple_discs_cd = offers_factories.ProductFactory( - lastProvider=provider, - description="PROJET CARITATIF, A BUT NON LUCRATIF :\n\nTOUS LES PROFITS SERONT REVERSES A L’ASSOCIATION LES RESTOS DU COEUR\n \nFidèles à l’appel lancé par Coluche dès 1985, et après 2 ans de concerts sans public, les plus grands artistes de la scène musicale française se réunissent pour la cause des Restos du Coeur.\n\nPlus que jamais, les Restos du Coeur ont besoin de vous !\nEt rappelez-vous que « CHAQUE CD OU DVD VENDU = 17 REPAS OFFERTS AUX RESTOS DU COEUR ».\n\nRetrouvez L’INTEGRALITE DU SPECTACLE « 2023 Enfoirés un jour, toujours ».\nInclus le single « Rêvons » écrit et composé par Amir, Nazim et Nyadjiko.", - extraData=offers_models.OfferExtraData( - artist="Les enfoirés", - author="Les enfoirés", - date_parution=date_utils.parse_titelive_date_to_string("04/03/2023"), - dispo="1", - distributeur="Sony Music Entertainement", - ean="0196587966423", - editeur="SONY MUSIC CATALOGUE", - gtl_id="50200", - music_label="COLUMBIA", - musicSubType=str(MUSIC_SUB_TYPES_BY_SLUG["CHANSON_VARIETE-CHANSON_FRANCAISE"].code), - musicType=str(MUSIC_TYPES_BY_SLUG["CHANSON_VARIETE-CHANSON_FRANCAISE"].code), - nb_galettes="2", - performer="Les Enfoirés", - ), - idAtProviders="0196587966423", - name="2023 Enfoirés un jour, toujours", - subcategoryId=subcategories_v2.SUPPORT_PHYSIQUE_MUSIQUE_CD.id, - ) - - available_french_cd = offers_factories.ProductFactory( - lastProvider=provider, - description="'Coeur Encore' est la nouvelle édition limitée du dernier album de Clara Luciani, déjà certifié triple disque de platine. Après deux Victoires de la Musique en 2022 (Artiste féminine et Meilleur album) l'artiste rend hommage au son qui a bercé la création de son album 'Coeur', en reprenant en français 4 titres légendaires du disco funk dont 'Celebration' en featuring avec Kool & The Gang.", - extraData=offers_models.OfferExtraData( - artist="Clara luciani", - author="Clara luciani", - date_parution=date_utils.parse_titelive_date_to_string("25/11/2022"), - dispo="1", - distributeur="Universal Music France", - ean="0602448125255", - editeur="ROMANCE MUSIQUE", - gtl_id="50200", - music_label="ROMANCE MUSIQUE", - musicSubType=str(MUSIC_SUB_TYPES_BY_SLUG["CHANSON_VARIETE-CHANSON_FRANCAISE"].code), - musicType=str(MUSIC_TYPES_BY_SLUG["CHANSON_VARIETE-CHANSON_FRANCAISE"].code), - nb_galettes="2", - performer="Clara Luciani", - ), - idAtProviders="0602448125255", - name="Coeur Encore", - subcategoryId=subcategories_v2.SUPPORT_PHYSIQUE_MUSIQUE_CD.id, - ) - - available_pop_vinyl_1 = offers_factories.ProductFactory( - lastProvider=provider, - description="LE GROUPE INTERNATIONAL N°1 DE RETOUR AVEC UN ALBUM DE TUBES POP ! NEUVIÈME ALBUM STUDIO DU QUATUOR BRITANNIQUE, PRODUIT PAR MAX MARTIN ET PORTÉ PAR LE SINGLE 'HIGHER POWER' LANCÉ AU PRINTEMPS 2021 DEPUIS LA STATION SPATIALE INTERNATIONALE AVEC L'AIDE DE THOMAS PESQUET.\nLe quatuor britannique s'apprête à sortir leur neuvième album studio, 'Music Of The Spheres', produit par le producteur star de nombreuses fois récompensé Max Martin, et introduit avec le single \"Higher Power\", ritournelle pop optimiste et entraînante lancée depuis la Station Spatiale Internationale par Thomas Pesquet. Sur le thème graphique de l'espace, Coldplay livre un nouvel opus pop taillé pour les stades, fait à la fois d'hymnes entraînants et de ballades chaleureuses.", - extraData=offers_models.OfferExtraData( - artist="Coldplay", - author="Coldplay", - date_parution=date_utils.parse_titelive_date_to_string("15/10/2021"), - dispo="1", - distributeur="Warner Music France", - ean="0190296666964", - editeur="WEA", - gtl_id="50300", - music_label="PARLOPHONE", - musicSubType=str(MUSIC_SUB_TYPES_BY_SLUG["POP-POP_ROCK"].code), - musicType=str(MUSIC_TYPES_BY_SLUG["POP-POP_ROCK"].code), - nb_galettes="1", - performer="Coldplay", - ), - idAtProviders="0190296666964", - name="Music Of The Spheres", - subcategoryId=subcategories_v2.SUPPORT_PHYSIQUE_MUSIQUE_VINYLE.id, - ) - - available_pop_vinyl_2 = offers_factories.ProductFactory( - lastProvider=provider, - description="Ce huitième album studio de Gorillaz est une collection énergique, optimiste et riche en genres de 10 titres mettant en vedette un line-up stellaire de collaborateurs : Thundercat, Tame Impala, Bad Bunny, Stevie Nicks, Adeleye Omotayo, Bootie Brown et Beck. Enregistré à Londres et à Los Angeles plus tôt, il est produit par Gorillaz, Remi Kabaka jr. et le producteur de multiples fois récompensé Greg Kurstin.", - extraData=offers_models.OfferExtraData( - artist="Gorillaz", - author="Gorillaz", - date_parution=date_utils.parse_titelive_date_to_string("24/02/2023"), - dispo="1", - distributeur="Warner Music France", - ean="5054197199738", - editeur="WARNER MUSIC UK", - gtl_id="50300", - music_label="WARNER MUSIC UK", - musicSubType=str(MUSIC_SUB_TYPES_BY_SLUG["POP-POP_ROCK"].code), - musicType=str(MUSIC_TYPES_BY_SLUG["POP-POP_ROCK"].code), - nb_galettes="1", - performer="Gorillaz", - ), - idAtProviders="5054197199738", - name="Cracker Island", - subcategoryId=subcategories_v2.SUPPORT_PHYSIQUE_MUSIQUE_VINYLE.id, - ) - - available_rock_vinyl = offers_factories.ProductFactory( - lastProvider=provider, - description='" The Hightlights " la compilation de ses plus grands tubes !\n\nAprès une année 2020 interstellaire ! The Weeknd nous livre ses plus grands HITS dans une compilation exceptionnelle !\n', - extraData=offers_models.OfferExtraData( - artist="The weeknd", - author="The weeknd", - date_parution=date_utils.parse_titelive_date_to_string("21/07/2023"), - dispo="1", - distributeur="Universal Music France", - ean="0602435931975", - editeur="UNIVERSAL", - gtl_id="60200", - music_label="RCA MUSIC GROUP/AMADE", - musicSubType=str(MUSIC_SUB_TYPES_BY_SLUG["ROCK-INDIE_ROCK"].code), - musicType=str(MUSIC_TYPES_BY_SLUG["ROCK-INDIE_ROCK"].code), - nb_galettes="1", - performer="The Weeknd", - ), - idAtProviders="0602435931975", - name="The Highlights", - subcategoryId=subcategories_v2.SUPPORT_PHYSIQUE_MUSIQUE_VINYLE.id, - ) - - available_multiple_discs_vinyl = offers_factories.ProductFactory( - lastProvider=provider, - description="LONDON GRAMMAR EST UN TRÈS JEUNE TRIO ANGLAIS FORMÉ SUR LES BANCS DE L'UNIVERSITÉ.\nAUTEURS-COMPOSITEURS-INTERPRÈTES : HANNAH REID, DOT MAJOR & DAN ROTHMAN SUSCITENT L'ENTHOUSIASME DE PART ET D'AUTRE DE LA MANCHE.\nPORTÉ PAR LA VOIX PUISSANTE ET BLUFFANTE DE HANNAH, LONDON GRAMMAR EST DÉJÀ CONSIDÉRÉ COMME LE PENDANT POP DE THE XX.", - extraData=offers_models.OfferExtraData( - artist="London grammar", - author="London grammar", - comment="édition double vinyle gatefold + CD", - date_parution=date_utils.parse_titelive_date_to_string("02/01/2019"), - dispo="1", - distributeur="Universal Music France", - ean="5060281614698", - editeur="BECAUSE", - gtl_id="60200", - music_label="BECAUSE", - musicSubType=str(MUSIC_SUB_TYPES_BY_SLUG["ROCK-INDIE_ROCK"].code), - musicType=str(MUSIC_TYPES_BY_SLUG["ROCK-INDIE_ROCK"].code), - nb_galettes="3", - performer="London Grammar", - ), - idAtProviders="5060281614698", - name="If you wait", - subcategoryId=subcategories_v2.SUPPORT_PHYSIQUE_MUSIQUE_VINYLE.id, - ) - - return [ - unavailable_cd, - soon_released_cd, - available_rap_cd_1, - available_rap_cd_2, - available_multiple_discs_cd, - available_french_cd, - available_pop_vinyl_1, - available_pop_vinyl_2, - available_rock_vinyl, - available_multiple_discs_vinyl, - ]