From 223b944199f789ea033f04b554649d9c30ae18c0 Mon Sep 17 00:00:00 2001 From: Sam Date: Fri, 26 Feb 2021 13:59:30 +0000 Subject: [PATCH] improvements in product loader --- core/utils.py | 2 +- datasets/primeras_coops.csv | 57 ++++++++++++++++++++++++++ datasets/products.AUREA.csv | 18 +++++++++ products/utils.py | 80 ++++++++++++++++++++++++++++++++++++- products/views.py | 70 +++++--------------------------- 5 files changed, 164 insertions(+), 63 deletions(-) create mode 100755 datasets/primeras_coops.csv create mode 100755 datasets/products.AUREA.csv diff --git a/core/utils.py b/core/utils.py index b4c1c8e..a0a98ad 100644 --- a/core/utils.py +++ b/core/utils.py @@ -184,7 +184,7 @@ def coop_loader(csv_reader, request=None): logging.error(f"Source image [{row['logo-url']}] not reachable: {response.status_code}") except Exception as e: logging.error(f"Could not add image to COOP {coop.company_name} from [{row['logo-url']}]: {str(e)}") - # + logging.info(f"Created Coop: {coop_data}") coop_counter += 1 diff --git a/datasets/primeras_coops.csv b/datasets/primeras_coops.csv new file mode 100755 index 0000000..4ab6a40 --- /dev/null +++ b/datasets/primeras_coops.csv @@ -0,0 +1,57 @@ +email,cif,nombre-coop,nombre-corto,url,es-tienda,logo-url,telefono,provincia,localidad,cp,direccion +info@enreda.coop,F91729517,ENREDA SCA,ENREDA,enreda.coop,FALSE,http://enreda.coop/_nuxt/img/07accd8.png,,Sevilla,Sevilla,, +rosi@coceta.coop,F78606514,PRUEBA DE VALLECAS,,NO TENGO ,FALSE,,,MADRID,MADRID,, +coecan@coecan.com,F35100452,COOPERATIVA DE ECONOMISTAS CANARIOS COECAN S. COOP.,,http://coecan.com/,FALSE,,,LAS PALMAS DE GRAN CANARIA,LAS PALMAS DE GRAN CANARIA,, +info@porsiete.org,F 37452109,Porsiete,Porsiete,www.porsiete.com,FALSE,,,Salamanca,Salamanca,, +desarrollo@endesys.com,F86865607,"Endesys, Ingeniería de Desarrollo y Sistemas, S.Coop. Mad.",Endesys,https://www.endesys.es/,FALSE,https://www.endesys.es/wp-content/uploads/2020/12/logo-azul-web.png,,MADRID,MADRID,, +sisifo@sisifo.coop,F87349700,SISIFO S. COOP. MAD.,SISIFO,www.sisifo.coop,FALSE,http://www.sisifo.madrid/images/pp_images/s/sisifo.madrid_98aa0df17f17c58deda271e8067d6191.png,,MADRID,MADRID,, +comunicacion@urdime.net,F70353982,"URDIME, S.C.G.","URDIME,",https://urdime.gal/,FALSE,https://urdime.gal/wp-content/uploads/2018/03/logo.png,,,Cerceda,, +e.davila@intergal.coop,F36856276,"INTERGAL, SOC. COOP. GALEGA","INTERGAL,",http://intergal.coop/,FALSE,http://intergal.coop/images/logo-intergal-azul-medio.png,,,"Gondomar, A Coruña, Vigo",, +contacto@miudinho.gal,F27823442,Miudiño S.Coop.Galega,Miudiño,https://miudinho.gal/tenda/,TRUE,https://miudinho.gal/wp-content/uploads/2019/03/logotipo_miudinho_2019_color.png,,Pontevedra,Vigo ,, +info@ofic.coop,F76786417,Oficina de Innovación Cívica S.Coop,Oficina de Innovación Cívica ,www.ofic.coop,FALSE,https://ofic.coop/wp-content/uploads/2020/04/OfIC_logo_web-03-1080x648.png,,Santa Cruz de Tenerife,Santa Cruz de Tenerife,, +jaumeoller@tandemsocial.coop,F65570400,Tandem Social SCCL,Tandem Social,www.tandemsocial.coop,FALSE,https://www.tandemsocial.coop/wp-content/themes/bridge/img/logo-1-ca.png,,Barcelona,Barcelona,, +canariasfenix.info@gmail.com,F76264993 ,Canarias Fenix S.Coop ,Canarias Fenix ,WWW.CANARIASFENIX.COM,FALSE,"https://static.wixstatic.com/media/0c65ac_8ebfc5ef8bd04a3ba0dd8d678f645e22~mv2.png/v1/fill/w_249,h_244,al_c,q_85,usm_0.66_1.00_0.01/CANARIAS%20FENIX%20-%20logo%202019.webp",,Las Palmas de Gran Canaria ,Las Palmas de Gran Canaria ,, +comunica@sepra.coop,F63097992,"Sepra, Servei de prvenció Aliè SCC",SePrA,https://sepra.coop/es/,FALSE,https://sepra.coop/wp-content/uploads/2020/04/logo_SePrA_Circulo_medium.png,934574145,Barcelona,Barcelona,8026,C/Coll i Vehí 127 Local +apinyol@auriagrup.cat,F08670077,Auria Cooperativa,Auria ,www.auriacosmetics.com,TRUE,https://www.auriacosmetics.com/cdnassets/logo.svg,,,Igualada,, +cooperativa@trescadires.cat,F25806407,Tres Cadires SCCL,Tres Cadires,http://botiga.trescadires.cat,TRUE,https://app.katuma.org/images/enterprises/logos/72/thumb/TresCadires_Logo_10x10_cm_-_XXSS.png?1584341686,,,Arbeca,, +abolado@arc.coop,F58302002,"ARC CORREDORIA D'ASSEGURANCES,SCCL","ARC CORREDORIA D'ASSEGURANCES,",WWW.ARC.COOP,FALSE,https://arc.coop/wp-content/uploads/2020/07/arc-logo.png,,Barcelona,Barcelona,, +cooperativa@andaira.net,F84492800,"Andaira, S. Coop. Mad.","Andaira,",https://www.andaira.net/,FALSE,https://www.andaira.net/wp-content/themes/andaira/public/img/logo-central.png,,Madrid,Madrid,, +john-fil@john-fil.com,F25009804,"COOPERATIVA JOHN-FIL, SCCL","JOHN-FIL,",www.stjor.com,TRUE,https://www.stjor.com/wp-content/uploads/2016/02/logo_head.png,,,L'ESPLUGA CALBA,, +info@somaigua.com.es,F67389825,Som Aigua,Som Aigua,www.somaigua.com.es,FALSE,http://www.somaigua.com.es/images/logo.jpg,,,Mataró,, +info@escolamoragas.com,F-08641003,IPT JERONI DE MORAGAS SCCL. Escuela EE Moragas,IPT JERONI DE MORAGAS ,WWW.ESCOLAMORAGAS.COM,FALSE,http://www.escolamoragas.com/img/logo.gif,,Barcelona,Barcelona,, +info@strglass.com,F65766701,"STR GLASS, S.C.C.L.",STR GLASS,www.strglass.com,FALSE,https://www.strglass.com/s/misc/logo.jpg?t=1608648253,,Barcelona,Barcelona,, +cristina@elfarcooperatiu.cat,F55749360,El Far Cooperatiu SCCL,El Far Cooperatiu ,http://elfarcooperatiu.cat/,FALSE,http://elfarcooperatiu.cat/wp-content/uploads/2018/11/logo-el-far-web-x2.png,,Tarragona,Tarragona,, +ciclica@ciclica.eu,F66899055,Cíclica Arquitectura SCCL,Cíclica Arquitectura,www.ciclica.eu,FALSE,https://ciclica.eu/wp-content/uploads/2018/04/LogoPortada.png,,,Sant Cugat del Vallès,, +sprint@sprint.coop,F66888140,"Sprintcoop, SCCL",Sprintcoop,https://sprint.coop,FALSE,https://sprint.coop/wp-content/uploads/2019/09/Logo-Sprintcoop.png,,,Terrassa,, +info@ocableingles.com,F27768563,"O Cable Inglés, S. Coop. Galega","O Cable Inglés,",www.ocableingles.com,FALSE,https://coop57.coop/sites/default/files/2698_256_256_0.jpg,,,Vigo,, +info@compacto.coop,F65450629,Compacto.coop,COMPACTO,http://www.compacto.coop/tienda/,TRUE,http://compacto.coop/wp-content/uploads/2015/06/logo-compacto-menu.png,,Barcelona,Barcelona,, +francisco@coopterapeutas.org,F67158956,"Cooperativa unión de terapeutas, SCCL",Cooperativa unión de terapeutas,www.coagora.org ,FALSE,https://coagora.org/wp-content/uploads/2020/09/cropped-CoAgora.png,,Barcelona,Barcelona,, +polell.sccl@gmail.com,F65192593,Fem ecologia de muntanya al Polell SCCL,Fem ecologia de muntanya al Polell ,www.fustaeco.cat www.polellmontseny.com,FALSE,https://www.fustaeco.cat/wp-content/uploads/2019/07/fustaeco-logo-tampo-negre-header.png,,,Sant Pere de Vilamajor,, +adm@societatorganica.com,F66674805,"Societat Orgànica + 1, SCCL",Societat Orgànica + 1,www.societatorganica.com,FALSE,http://societatorganica.com/wp-content/themes/stockholm/img/logo_black.png,,Barcelona,Barcelona,, +rebeca@abeluria.coop,G15160609,Abeluria,Abeluria,https://abeluria.coop/inicio.php,FALSE,https://espazo.coop/wp-content/uploads/2018/12/logo-Abeluria.png,,A coruña,Santiago de Compostela,, +paqui@laqperativa.cat,F55346449,FCP Associats SCCL,FCP Associats ,https://laqperativa.cat/,FALSE,,,,Ripoll,, +roger@olivera.org,F25014176,L'olivera S.c.c.l.,BODEGA L'OLIVERA ,http://www.olivera.org/botiga/es/,TRUE,http://www.olivera.org/botiga/img/logo.jpg?1569423042,,,VALLBONA DE LES MONGES,, +rest-lacoronela@hotmail.com,F-38043055,"Guatativoas, Soc. Coop. ",Guatativoas,www.restaurantecoronela.com,FALSE,http://www.restaurantecoronela.com/img/logo.png,,,Puerto de la Cruz,, +info@aeatec.coop,F76806579,AEATEC S Coop,AEATEC,www.aeatec.coop,FALSE,http://aeatec.coop/wp-content/uploads/2020/09/logoaeatec2x-400x140.png,,,El Rosario,, +teixugo@teixugo.com,F-36861656,Teixugo S.Coop. Galega,Teixugo,https://teixugo.com,FALSE,https://teixugo.com/cms/wp-content/uploads/2011/11/Logo-nuevo-Teixugo-4-300x230.jpg,,,Vigo,, +contact@olistis.org ,F66668385,"OLISTIS, SCCL",OLISTIS,www.olistis.org ,FALSE,http://olistis.org/wp-content/uploads/2016/10/web-olistis-header-tren.svg,,Barcelona,Barcelona,, +providencialopeztorres@hotmail.com,F01795673,"Casalimpiabcn,sccl",Casalimpiabcn,Casalimpiabcn.com,FALSE,"https://static.wixstatic.com/media/8ae460_26274dc9e6bd4376acfe5e211a9f75ac~mv2.jpg/v1/fill/w_291,h_199,al_c,q_80,usm_0.66_1.00_0.01/PHOTO-2020-01-14-11-40-07.webp",,Barcelona,Barcelona,, +cervesacornelia@gmail.com,F66109430,Cervesa Cornèlia SCCL,Cervesa Cornèlia,https://www.cervesacornelia.net/,TRUE,"https://static.wixstatic.com/media/472c30_ab21c107a1e44d73b2abe72929f24067~mv2.jpg/v1/fill/w_462,h_432,al_c,lg_1,q_80/logo%20fons%20negre.webp",,Barcelona,Cornellà de Llobregat,, +botiga@agranel.coop,F66973348,A Granel SCCL,A Granel,botiga.agranel.coop,TRUE,https://botiga.agranel.coop/sites/default/files/logotip.png,,Barcelona,Barcelona,, +info@pol-len.cat,F66231440,"Pol·len edicions, sccl",Pol·len edicions,www.pol-len.cat,TRUE,https://pol-len.cat/w2018/wp-content/uploads/2015/09/pollen-logo.png,,Barcelona,Sant Cugat del Vallès,, +arestacooperativa@gmail.com,F55610190,L'Aresta,L'Aresta,https://aresta.coop/,FALSE,https://aresta.coop/wp-content/uploads/2018/05/aresta-web-logo.png,,Tarragona,Santa Coloma de Queralt,, +opalvidrieras@hotmail.com,F37251816,OPAL VIDRIERAS,OPAL VIDRIERAS,opalvidrieras.com,FALSE,https://opalvidrieras.com/wp-content/uploads/2019/09/logo-opal-vidrieras-salamanca-142x229.png,,SALAMANCA,SALAMANCA,, +nuria.salamanca@formacionredcyl.es,F47759287,"FORMACIÓN Y GESTIÓN DE SERVICIOS SOCIALES, SOC. COOP.",FORMACIÓN Y GESTIÓN DE SERVICIOS SOCIALES,www.formacionredcyl.es,FALSE,https://www.formacionredcyl.es/cache/5/2/6/9/5/52695a77c2e890b294cc6a2a13e21ca64a882e54.png,,VALLADOLID,VALLADOLID,, +info@helechos.com,F-78034022,HELECHOS S. COOP. MAD.,HELECHOS,https://helechos.coop/,TRUE,https://helechos.coop/imagenes/helecho-logo-ok.png,,Madrid,LEGANES,, +JOSE@SOCIEDADCOOPERATIVA.ORG,F39835608,SOCIEDAD COOPERATIVA DE INVESTIGACION Y DESARROLLO TECNOLOGICO,SOCIEDAD COOPERATIVA DE INVESTIGACION Y DESARROLLO TECNOLOGICO,HTTP://WWW.TIPICOCANTABRIA.COM | HTTP://WWW.CANTABRIA.ORG.ES,FALSE,https://www.tipicocantabria.com/Logotipo/logo_trazado-cooperativa.png,,,CAMARGO,, +cacsccl@gmail.com,F67367243,CERVESERS ARTESANS DE CATALUNYA SCCL,CERVESERS ARTESANS DE CATALUNYA,cervesers.cat,TRUE,https://cervesers.cat/img/prestashop-logo-1589718937.jpg,,Barcelona,Barcelona,, +info@solabria.es,F39781794,SOLABRIA Scdad. Coop.,SOLABRIA,https://solabria.es/,FALSE,https://solabria.es/wp-content/uploads/2020/06/Solabria.png,,,BOO DE PIELAGOS,, +hola@freepress.coop,F85337947,Freepress S. Coop. Mad.,Freepress,https://www.freepress.coop,TRUE,https://www.freepress.coop/wp-content/uploads/2016/06/Logo.png,,Madrid,Madrid,, +jsole@cooperativasocialpenedes.org,F66713603,"Cooperativa Social Penedes, SCCL",Cooperativa Social Penedes,http://cooperativasocialpenedes.org,FALSE,https://cooperativasocialpenedes.org/wp-content/uploads/2018/11/COOP-SOCIAL-PENEDES-LOGO-NEGREimp.png,,,Vilafranca del Penedes,, +info@yomiconsultoria.com,F39801238,YOMI CONSULTORIA S COOP CANT,YOMI CONSULTORIA,www.yomiconsultoria.com,FALSE,http://www.yomiconsultoria.com/img/logoyomiweb4.png,,,LOS CORRALES DE BUELNA,, +carpesancooperativa@gmail.com,F39795604,Carpesan cooperativa de la madera,Carpesan cooperativa de la madera,Www.carpesancooperativa.es,FALSE,https://carpesancooperativa.es/wp-content/uploads/2014/07/logo-carpesan-cooperativa1.png,,,Camargo,, +info@timeoutescape.com,F39863345,Timeout Escape S.Coop.,Timeout Escape,https://www.timeoutescape.com/,FALSE,https://www.timeoutescape.com/wp-content/uploads/2020/11/logo-WEB-header.png,,,Astillero,, +josemariadominguezmurillo@gmail.com,F39852306,MADIVAL 2050 SOCIEDAD COOPERATIVA,MADIVAL 2050 ,www,FALSE,,,,Torrelavega,, +info@entra.cat,F55611826,ENTRA! cooperativa,ENTRA! ,www.entra.cat,FALSE,,,Tarragona,Tarragona,, +tenda@benmercado.gal,F15715683,Cidadanía S. Coop. Galega,Cidadanía,benmercado.gal,TRUE,https://benmercado.gal/market/img/marketplace-logo-1509698678.jpg,,A Coruña,Santiago de Compostela,, +rotulossalamanca@gmail.com,F-3727736,"Rótulos Salamanca, S.coop.","Rótulos Salamanca,",www.rotulossalamanca.com,FALSE,https://www.rotulossalamanca.com/wp-content/uploads/2019/01/ROTULOS-SALAMANCA-LOGO-1.png,,Salamanca,Salamanca,, \ No newline at end of file diff --git a/datasets/products.AUREA.csv b/datasets/products.AUREA.csv new file mode 100755 index 0000000..924eb16 --- /dev/null +++ b/datasets/products.AUREA.csv @@ -0,0 +1,18 @@ +id,nombre-producto,descripcion,imagen,url,precio,gastos-envio,cond-envio,descuento,stock,tags,categoria,identificadores +V0775M043822,Solución hidroalcohólica 100 ml spray,"Solución Hidroalcohólica 100 ml con vaporizador - spray. Todos los precios incluyen IVA, pero recuerda que según el RD 34/220 las entidades sin ánimo de lucro están exentos de IVA para este producto hasta el 30/4/2021",https://www.auriacosmetics.com/cdnassets/g-100-ml-ok_l.jpg,https://www.auriacosmetics.com/solucion-hidroalcoholica-100-ml-con-vaporizador-spray,"1,44 €","0,00 €",72horas- Envio gratuito a partir de 60 €. Importes inferiores: 10€. ,5,60000,"hidroalcohol, gel hidroalcohólico, solución hidroalcohòlica, desinfectante de manos",Salud y belleza/Cuidado personal/Cosméticos,Àuria Cosmetics +V0775M133822,Solución hidroalcohólica 500 ml dosificador,"Solución Hidroal. Todos los precios incluyen IVA, pero recuerda que según el RD 34/220 las entidades sin ánimo de lucro están exentos de IVA para este producto hasta el 30/4/2021cohólica 500 ml con dosificador",https://www.auriacosmetics.com/cdnassets/g-500-ml.-dosificador-1200-1_l.jpg,https://www.auriacosmetics.com/solucion-hidroalcoholica-500-ml-con-dosificador,"3,57 €","0,00 €",72horas- Envio gratuito a partir de 60 €. Importes inferiores: 10€. ,5,39000,"hidroalcohol, gel hidroalcohólico, solución hidroalcohòlica, desinfectante de manos",Salud y belleza/Cuidado personal/Cosméticos,Àuria Cosmetics +V0775M253822,Solución hidroalcohólica 1 litro dosificador,"Solución Hidroalcohólica 1 litro con dosificador. Todos los precios incluyen IVA, pero recuerda que según el RD 34/220 las entidades sin ánimo de lucro están exentos de IVA para este producto hasta el 30/4/2021",https://www.auriacosmetics.com/cdnassets/1000-ml-dosificador.png,https://www.auriacosmetics.com/solucion-hidroalcoholica-1-litro-con-dosificador,"4,83 €","0,00 €",72horas- Envio gratuito a partir de 60 €. Importes inferiores: 10€. ,5,300,"hidroalcohol, gel hidroalcohólico, solución hidroalcohòlica, desinfectante de manos",Salud y belleza/Cuidado personal/Cosméticos,Àuria Cosmetics +V0775M053822,Solución hidroalcohólica 5 litros garrafa,"Solución Hidroalcohólica 5 litros . Todos los precios incluyen IVA, pero recuerda que según el RD 34/220 las entidades sin ánimo de lucro están exentos de IVA para este producto hasta el 30/4/2021",https://www.auriacosmetics.com/cdnassets/g-5l_s.jpg,https://www.auriacosmetics.com/solucion-hidroalcoholica-5-litros,"22,75 €","0,00 €",72horas- Envio gratuito a partir de 60 €. Importes inferiores: 10€. ,5,240,"hidroalcohol, gel hidroalcohólico, solución hidroalcohòlica, desinfectante de manos, garrafa",Salud y belleza/Cuidado personal/Cosméticos,Àuria Cosmetics +V0775M323822,Pack familiar de Solución Hidroalcohólica,"Contiene: 1 unid de 5l + 1 grifo + 1 unid 500 ml pulv. + 4 unid 100 ml spray. Todos los precios incluyen IVA, pero recuerda que según el RD 34/220 las entidades sin ánimo de lucro están exentos de IVA para este producto hasta el 30/4/2021",https://www.auriacosmetics.com/cdnassets/Productes/PACK/PACK-FAMILIAR.png,https://www.auriacosmetics.com/solucion-hidroalcoholica-pack-familiar,"31,85 €","0,00 €",72horas- Envio gratuito a partir de 60 €. Importes inferiores: 10€. ,5,78,"hidroalcohol, gel hidroalcohólico, solución hidroalcohòlica, desinfectante de manos",Salud y belleza/Cuidado personal/Cosméticos,Àuria Cosmetics +V0775M313822,Grifo para envase 5 litros ,Grifo para envase 5 litros ,https://www.auriacosmetics.com/cdnassets/Productes/TAP-GARRAFA/TAP.png,https://www.auriacosmetics.com/grifo-para-envase-5-litros,"3,51 €","0,00 €",72horas- Envio gratuito a partir de 60 €. Importes inferiores: 10€.,,462,grifo para garrafa,Salud y belleza/Cuidado personal/Cosméticos,Àuria Cosmetics +V0775M073822,"Dispensador de Jabon rellenable 1,1 litros ","Dispensador de Jabon rellenable 1,1 litros ",https://www.auriacosmetics.com/cdnassets/g-Dispensador-Paret_l.jpg,https://www.auriacosmetics.com/dosificador-de-liquidos-industrial-rellenable-11-litros,"17,90 €","0,00 €",72horas- Envio gratuito a partir de 60 €. Importes inferiores: 10€.,,2120,dispensador jabón,Salud y belleza/Cuidado personal/Cosméticos,Àuria Cosmetics +V0775M283822,Dispensador manual pulverizador 1 litro ,Dispensador manual pulverizador 1 litro ,https://www.auriacosmetics.com/cdnassets/Productes/DISPENSADORS/Dispensador-manual-pulv.JPG,https://www.auriacosmetics.com/dispensador-manual-pulverizador-1-litro,"19,90 €","0,00 €",72horas- Envio gratuito a partir de 60 €. Importes inferiores: 10€.,,915,"dispensador gel, dispensador pared",Salud y belleza/Cuidado personal/Cosméticos,Àuria Cosmetics +V0775M273822,Dispensador automático pulverizador 1 litro ,Dispensador automático pulverizador 1 litro ,https://www.auriacosmetics.com/cdnassets/Productes/DISPENSADORS/DosificadorAutomatic.jpg,https://www.auriacosmetics.com/dispensador-automatico-pulverizador-1-litro,"49,79 €","0,00 €",72horas- Envio gratuito a partir de 60 €. Importes inferiores: 10€.,,239,"dispensador gel, dispensador pared",Salud y belleza/Cuidado personal/Cosméticos,Àuria Cosmetics +V0775M473822,Soporte de pie metálico para dispensador automático,Soporte de pie metálico para dispensador automático,https://www.auriacosmetics.com/cdnassets//Peu-sense-difusor-1.jpg,https://www.auriacosmetics.com/products/1053,"108,90 €","0,00 €",72horas- Envio gratuito a partir de 60 €. Importes inferiores: 10€.,,20,"soporte, dispensador pie",Salud y belleza/Cuidado personal/Cosméticos,Àuria Cosmetics +V0775M393822,Soporte de pie metálico con dispensador automático,Soporte de pie metálico con dispensador automático,https://www.auriacosmetics.com/cdnassets//Peu-amb-difusor-1.jpg,https://www.auriacosmetics.com/products/1054,"140,00 €","0,00 €",72horas- Envio gratuito a partir de 60 €. Importes inferiores: 10€.,,20,"dispensador pie, dispensador gel",Salud y belleza/Cuidado personal/Cosméticos,Àuria Cosmetics +V0775M263822,Desinfectante de superficies concentrado para 100 lt - Kleer-Kim,Desinfectante de superficies concentrado para 100 lt - Kleer-Kim,https://www.auriacosmetics.com/cdnassets/Productes/NETEJA/Kleer-Kim.jpg,https://www.auriacosmetics.com/kleer-kim-desinfectant,"39,87 €","0,00 €",72horas- Envio gratuito a partir de 60 €. Importes inferiores: 10€.,,50,"desinfectante de superficies, higienizante de superficies",Salud y belleza/Cuidado personal/Cosméticos,Klee-Kim +V0775M463822,Desinfectante de superficies DESCOL 5 L,Desinfectante de superficies DESCOL 5 L,https://www.auriacosmetics.com/cdnassets/Productes/DESINFECTANT-DESCOL/descol-5l.jpg,https://www.auriacosmetics.com/products/1057,"19,30 €","0,00 €",72horas- Envio gratuito a partir de 60 €. Importes inferiores: 10€.,,50,"desinfectante de superficies, higienizante de superficies",Salud y belleza/Cuidado personal/Cosméticos,Descol +V0775M443822,Desinfectante de superficies DESCOL 750 ml,Desinfectante de superficies DESCOL 750 ml,https://www.auriacosmetics.com/cdnassets/Productes/DESINFECTANT-DESCOL/Descol.jpg,https://www.auriacosmetics.com/products/1058,"3,62 €","0,00 €",72horas- Envio gratuito a partir de 60 €. Importes inferiores: 10€.,,50,"desinfectante de superficies, higienizante de superficies",Salud y belleza/Cuidado personal/Cosméticos,Descol +V0775M423822,Mascarilla FFP2 no reutilizable 50 unidades,"Mascarilla FFP2 no reutilizable 50 unidades. Todos los precios incluyen IVA, pero recuerda que según el RD 34/220 las entidades sin ánimo de lucro están exentos de IVA para este producto hasta el 30/4/2021",https://www.auriacosmetics.com/cdnassets//50-mascarillas-ffp2-nr-teelmask-2.jpg,https://www.auriacosmetics.com/products/1046,"55,00 €","0,00 €",72horas- Envio gratuito a partir de 60 €. Importes inferiores: 10€. ,,2500,"mascarilla, ffp2",Salud y belleza/Cuidado personal/Cosméticos,Telemask +V0775M403822,Mascarilla Higiènica no reutilizable 50 unidades,"Mascarilla higiénica TALMA no reutilizable 50 unidades. Todos los precios incluyen IVA, pero recuerda que según el RD 34/220 las entidades sin ánimo de lucro están exentos de IVA para este producto hasta el 30/4/2021",https://www.auriacosmetics.com/cdnassets//Voques-Mascareta-7.jpg,https://www.auriacosmetics.com/products/1047,"8,48 €","0,00 €",72horas- Envio gratuito a partir de 60 €. Importes inferiores: 10€. ,,2500,"mascarilla, mascarillas",Salud y belleza/Cuidado personal/Cosméticos,Talma +V0775M413822,Mascarilla Higiènica no reutilizable 10 unidades,"Mascarilla higiénica TALMA no reutilizable 10 unidades. Todos los precios incluyen IVA, pero recuerda que según el RD 34/220 las entidades sin ánimo de lucro están exentos de IVA para este producto hasta el 30/4/2021",https://www.auriacosmetics.com/cdnassets//Voques-Mascareta-7.jpg,https://www.auriacosmetics.com/products/1050,"1,90 €","0,00 €",72horas- Envio gratuito a partir de 60 €. Importes inferiores: 10€. ,,2500,"mascarilla, mascarillas",Salud y belleza/Cuidado personal/Cosméticos,Talma \ No newline at end of file diff --git a/products/utils.py b/products/utils.py index 3d51ce6..4e17900 100644 --- a/products/utils.py +++ b/products/utils.py @@ -1,11 +1,16 @@ import logging +import datetime from django.db.models import Q from django.contrib.postgres.search import SearchQuery, SearchRank, SearchVector, TrigramSimilarity from django.db.models import Max, Min +from django.conf import settings + +import requests from products.models import Product - +from companies.models import Company +from history.models import HistorySync def extract_search_filters(result_set): @@ -210,3 +215,76 @@ def find_related_products_v4(keyword): ).order_by('-similarity') return set(products_qs) + + +def product_loader(csv_reader, user): + """ + Parse csv data and extract: + + - product data + + Return counts + """ + counter = 0 + # create historysync instance + history = HistorySync.objects.create(company=user.company, sync_date=datetime.datetime.now()) + + for row in csv_reader: + # trim strings + for key in row: + if row[key]: row[key] = row[key].strip().lower() + + # check required data + if '' in (row['nombre-producto'], row['descripcion'], row['precio'], row['categoria']): + logging.error(f"Required data missing: {row}") + continue + + try: + # TODO: if tags is empty, auto-generate tags + + # assemble instance data + product_data = { + 'company': user.company, + 'name': row['nombre-producto'].strip(), + 'description': row['descripcion'].strip(), + #'url': row['url'].strip(), + #'price': row['precio'].strip(), + #'shipping_cost': row['gastos-envio'].strip(), + #'shipping_terms': row['cond-envio'].strip(), + #'discount': row['descuento'].strip(), + #'stock': row['stock'].strip(), + #'tags': row['tags'].strip(), + #'category': row['categoria'].strip(), + #'identifiers': row['identificadores'].strip(), + #'history': history, + 'creator': user, + } + + product = Product.objects.create(**product_data) + # image logo data + if row['imagen'] is not None: + try: + # get image + headers={"User-Agent" : "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36"} + response = requests.get(row['imagen'], stream=True, headers=headers) + assert(response.status_code==200) + response.raw.decode_content = True + image = Image.open(response.raw) + # save using File object + img_io = BytesIO() + image.save(img_io, format=image.format) + product.image.save(f"{product.company.company_name}{product.name}.{image.format.lower()}", File(img_io), save=False) + product.save() + except AssertionError as e: + logging.error(f"Source image [{row['imagen']}] not reachable: {response.status_code}") + except Exception as e: + logging.error(f"Could not add image to product from [{row['imagen']}]: {str(e)}") + logging.info(f"Created Product {product.id}") + counter += 1 + except Exception as e: + import ipdb; ipdb.set_trace() + logging.error(f"Could not parse {row}") + + history.quantity = counter + history.save() + return counter diff --git a/products/views.py b/products/views.py index 697203a..d2cb25e 100644 --- a/products/views.py +++ b/products/views.py @@ -22,7 +22,7 @@ from companies.models import Company from history.models import HistorySync from back_latienda.permissions import IsCreator -from .utils import extract_search_filters, find_related_products_v3, find_related_products_v6 +from .utils import extract_search_filters, find_related_products_v3, find_related_products_v6, product_loader from utils.tag_serializers import TaggitSerializer from utils.tag_filters import ProductTagFilter, ProductOrderFilter @@ -64,8 +64,14 @@ def my_products(request): def load_coop_products(request): """Read CSV file being received Parse it to create products for related Company + + Authenticated user must have a related company """ try: + # check company linked to user + if request.user.company is None: + return Response({"errors":{"details": "Your user has no company to add products to"}}) + csv_file = request.FILES['csv_file'] if csv_file.name.endswith('.csv') is not True: logging.error(f"File {csv_file.name} is not a CSV file") @@ -74,67 +80,9 @@ def load_coop_products(request): logging.info(f"Reading contents of {csv_file.name}") decoded_file = csv_file.read().decode('utf-8').splitlines() csv_reader = csv.DictReader(decoded_file, delimiter=',') - counter = 0 - # get company linked to user - company_qs = Company.objects.filter(creator=request.user) + count = product_loader(csv_reader, request.user) - if company_qs: - company = company_qs.first() - else: - return Response({"errors":{"details": "Your user has no company to add products to"}}) - # create historysync instance - history = HistorySync.objects.create(company=company, sync_date=datetime.datetime.now(), quantity=len(decoded_file)) - - for row in csv_reader: - if '' in (row['nombre-producto'], row['descripcion'], row['precio'], row['categoria']): - logging.error(f"Required data missing: {row}") - continue - try: - # download image references in csv - if row['imagen'].strip() != '': - image_url = row['imagen'].strip() - response = requests.get(image_url, stream=True) - if response.status_code == 200: - path = f"{setting.BASE_DIR}media/{row['nombre-producto'].strip()}.{image.url.split('/')[-1]}" - logging.info(f"Saving product image to: {path}") - new_image = open(path, 'wb') - for chunk in response: - new_image.write(chunk) - new_image.close() - else: - logging.warning(f"Image URL did not work: {image_url}") - new_image = None - else: - new_image = None - - # TODO: if tags is empty, auto-generate tags - - # assemble instance data - product_data = { - 'id': None if row['id'].strip()=='' else row['id'].strip(), - 'company': Company.objects.filter(creator=request.user).first(), - 'name': row['nombre-producto'].strip(), - 'description': row['descripcion'].strip(), - 'image': new_image, - 'url': row['url'].strip(), - 'price': row['precio'].strip(), - 'shipping_cost': row['gastos-envio'].strip(), - 'shipping_terms': row['cond-envio'].strip(), - 'discount': row['descuento'].strip(), - 'stock': row['stock'].strip(), - 'tags': row['tags'].strip(), - 'category': row['categoria'].strip(), - 'identifiers': row['identificadores'].strip(), - 'history': history, - 'creator': request.user, - } - - Product.objects.create(**product_data) - logging.info(f"Created Product: {product_data}") - counter += 1 - except Exception as e: - logging.error(f"Could not parse {row}") - return Response() + return Response(f"{count} products registered for {request.user.company_name}") except Exception as e: return Response({"errors": {"details": str(type(e))}}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)