Actualizar navegador Porsche PCM2.1 (Boxster, Cayenne, Cayman): La guía definitiva

Os dejo el manual para actualizar el navegador PCM2.1 de Porsche (Boxster / Cayenne / Cayman) a los últimos mapas disponibles a día de hoy (versión 2015). Probado en PCM2.1 equipado en Porsche BoxsterS MY05 con amplificador BOSE.

DISCLAIMER: No me hago responsable de cualquier daño ocasionado en vuestros PCM.

El software completo de actualización de compone de 3 CD’s y un DVD.

CD1: 000.043.205.46.002 – update LevelA to LevelB. http://dl.dropbox.com/u/14202177/Update-PCM%202.1-disco%201.nrg

CD2: 000.043.205.46.003 – updates Motorola Phone Module, if installed. http://dl.dropbox.com/u/14202177/Update-PCM%202.1-disco%202.nrg

CD3: 000.044.901.40 – Update for PCM21_NavDVD – Updates Navigation after Level B is installed or if Level B or Level C/C1 was previously installed) http://uploaded.net/file/nl4gapqx

DVD Mapas. En mi caso PORSCHE PCM 2.1 DVD EUROPE 2015 (mapas 2015)

http://ul.to/nu9hrsvw
http://ul.to/3yxpp8pl
http://ul.to/6awukige
http://ul.to/2xuzbgka
http://ul.to/144f68w1
http://ul.to/hpsmtt56

 

Actualizar navegador PCM2.1: PASO 0

Descargar todos los CD’s y grabarlos. Os recomiendo seguir el método indicado por el forero Grimosa (aqui: [url]http://soloporsche.com/showpost.php?p=1288917&postcount=1213[/url]). Es decir, grabarlos a mínima velocidad (1x) con ImgBurn, sobre CD-R de marca reconocida, tipo Verbatim.

Una vez tengamos todo grabado, nos vamos al coche, sacamos el CD del PCM 2.1 y también sacamos la SIM, si hubiera una insertada.

Después pasamos al PASO 1.

Actualizar navegador PCM2.1: PASO 1

Vamos a averiguar la versión de firmware de nuestro PCM2.1. Para ello, se enciende el PCM y se aprietan MAIN+NAVI simultáneamente.

En mi caso, los datos de inicio eran estos:

Aparato: Software de sist.
Teórico: 04113AD1 / 1104
Real: 04113AD1 / 1104
Introducidos: Sí
Encontrados: Sí

Aparato: PCM
Teórico:04202JD1 / 3004 
Real:04202JD1 / 3004
Introducidos: Sí
Encontrados: Sí

Aparato: Amplificador
Teórico: 00017500 / 3504
Real: 00017500 / 3504 
Introducidos: Sí
Encontrados: Sí

Aparato: Sistema navegac...
Teórico: /
Real: 00174156 / 2704
Introducidos:Sí
Encontrados:Sí

PCM2.1 firmware version mode level A

PCM2.1 bose amplifier firmware version mode level A

Si tenéis equipo BOSE, lo más importante es mirar la versión del firmware que tiene. Si tiene la versión 16400 lo más probable es que el equipo quede inservible al actualizar el navegador. Por tanto, NO ACTUALICES si tienes la 16400.

Otro dato importante es la versión del Aparato: PCM. Los valores posibles serán:

04035xxx --> indica Standard Version.
04202xxx --> indica Model Level A.
05024xxx --> indica Model Level B.
05395xxx --> indica Model Level C.

Si estás en la 04035xxx te recomiendo que NO HAGAS NADA, podrías dejar el BOSE inservible. La propia documentación de PORSCHE lo indica:
[quote]Vehicles equipped with Standard Version (04035xxx) first need to be updated to Model Level A (04202xxx) using update disc 000.043.205.46.004 which is not included in this kit. Refer to bulletin Group 9, #1/04, titled “PCM2.1 & BOSE Amplifier Spare Parts Requirements, Part ID 9110.
Read the information in bulletin #1/04 carefully. An update of the BOSE Amplifier (if equipped) may be necessary.[/quote]

Si estás en Model Level A, debes actualizar a Model Level B para poder usar el DVD de mapas de 2015. Ve al PASO 2.

Si estás en Model Level B, únicamente debes actualizar el firmware del navegador y los mapas. Ve al PASO 4.

Actualizar navegador PCM2.1: PASO 2

El propósito de este paso es actualizar del model level A al model level B. Para ello vamos a utilizar el CD1: 000.043.205.46.002.

Lo primero, ENCIENDE EL MOTOR. Si por un casual el PCM se apaga durante la actualización de firmware, el equipo puede quedar inservible. Asi pues, MANTEN ENCENDIDO EL MOTOR durante esta actualización. Haz todo el proceso en un sitio bien ventilado.

Enciende el PCM.

Inserta el CD1 en la ranura del PCM. Pondrá algo asi como “reconociendo CD de datos” y al poco, se iniciará automáticamente. Nos preguntará si queremos actualizar a Model Level B. Le decimos que Sí. Tarda un poco, pero al poco sale una barra de proceso. Ahora podemos tener dos casos, en función de si tienes instalado módulo de teléfono y la versión del mismo.

En el caso de vehículos sin módulo de teléfono o con el módulo de teléfono Motorola, la actualización te irá indicando 2 pasos (R51 y R02).

pcm2.1a update pcm2.1b

pcm2.1a update pcm2.1b

En el caso de vehículos con módulo de teléfono Harman/Becker, la actualización se hará en tres pasos (V5.03.4, R51 y R02).

Tarda un rato. No seas impaciente, no toques nada hasta que termine. Cuando termine el PCM se apagará y volverá a encenderse solo. Si no se encendiera solo, enciéndelo tú a mano y saca el CD.

Si tienes módulo de teléfono Motorola, pasa al PASO 3. Sino, pasa al PASO 4.

Actualizar navegador PCM2.1: PASO 3

El propósito de este paso es actualizar el firmware del módulo de teléfono Motorola.
Asegúrate de que no haya SIM en la ranura de SIM y de tener el motor encendido.

Inserta el CD2 (000.043.205.46.003). Te pondrá algo asi como “reconociendo CD de datos” y al poco te preguntará si quieres actualizar MicPegel Motorola.

update micpegel motorola porsche pcm2.1

Le dices que sí y esperas. Saldrá una barra de proceso. Te indicará que está actualizando a versión R36.

update micpegel motorola porsche pcm2.1

Al terminar aparecerá un mensaje indicando que el proceso ha concluido de forma exitosa.

update micpegel motorola porsche pcm2.1

Saca el CD del PCM y ve al PASO 4.

Actualizar navegador PCM2.1: PASO 4

Este paso debe acometerse cuando nuestro firmware está en Mode Level B, C o C1. Aprieta MAIN+NAVI y asegúrate de que la versión del PCM es 05024xxx (Model Level B) o 05395xxx (Mode Level C).

Saca el DVD de navegación anterior de su sitio. En mi Boxster está en el maletero delantero. En los Cayenne creo que está bajo el asiento del copiloto. Guarda ese DVD.

Inserta ahora en el DVD de navegación (NO en el PCM!) el CD3 (000.044.901.40). Apaga el PCM. Apaga el motor y déjalo apagado 2 minutos o más.

Enciende el motor y DÉJALO ENCENDIDO.

El navegador se encenderá automáticamente. Si no se encendiera, pulsa NAVI en el PCM.

Aparecerá un mensaje preguntándote si quieres actualizar el software de navegación. Le dices que sí.

update pcm2.1 navigation

Aparecerá una barra de proceso, que ira subiendo hasta llegar al 10%.

actualizar navegador pcm porsche boxster 987

Pasará del 10% al 0 y te pondrá: “error durante arranque navegación”.

actualizar navegador pcm porsche boxster 987

En ese momento, ve al cargador de DVD de navegación (maletero o asiento), saca el CD3 y mete el DVD con los mapas de 2015. Pondrá “Sistema navegación arrancando” y al poco, el proceso termina y ya tenemos los nuevos mapas.

actualizar navegador pcm porsche boxster 987

El firmware actualizado:
actualizar navegador pcm porsche boxster 987

Espero que os resulte útil.

CDS INVENIO: Check if record belongs to any collection

A record can be in “Processing” state (and show an orange warning) like this one:

cds invenio "processing" record

This “RESTRICTED: Processing record” warning shows up in two scenarios:
1) When the record belongs to restricted collections (get_restricted_collections_for_recid function returns some colls)
2) When the record is NOT in any collection. (is_record_in_any_collection function returns false)

Here is a quick script that checks which records do not belong to any collection.

from invenio.search_engine import \
                 get_restricted_collections_for_recid, \
                 is_record_in_any_collection
 
 
for i in range(40000,45000):   # check records from 40000 to 45000
    if not is_record_in_any_collection(i):
        print "El registro %s no tiene col" %i

Magento 1.9: Extensión Wishlist admin email, traducir a español y arreglar precios

Puede que nos interese conocer qué productos han añadido nuestros clientes a su wishlist. Para ello, existe una extensión (gratuita) que funciona con Magento 1.9, llamada Wishlist Admin Email.

Esta extensión funciona muy bien, pero tiene dos pegas:
1) Cuando envía el email de la wishlist, el precio que muestra en los productos es el precio SIN IMPUESTOS. Para corregirlo y que muestre el precio con impuestos, debemos editar el fichero app/design/frontend/base/default/template/me/wlae/email/items.phtml y modificar el cálculo del precio.

Reemplazar:

<?php echo $coreHelper->formatPrice($_product->getFinalPrice()); ?>

Por

<!-- modifico para que salga el precio con impuestos -->
<!--<?php echo $coreHelper->formatPrice($_product->getFinalPrice()); ?>-->
<?php 
$_priceIncludingTax = Mage::helper('tax')->getPrice($_product, $_product->getFinalPrice());
echo $_priceIncludingTax;
?>

2) El email se envía en inglés. Aunque no es muy trascendente, puesto que solo el administrador recibe estos emails (y NO los reciben clientes) es interesante saber cómo traducir la plantilla.

Para añadir el fichero de traducciones, vamos a app/locale/es_ES y subimos el fichero con las traducciones (Me_Wlae.csv) con el siguiente contenido:

"Wishlist Admin Email","Wishlist Admin Email"
"Basic","Basico"
"Enable Extension","Habilitar extension"
"Enable Extension.","Deshabilitar extension."
"Yes","Si"
"No","No"
"Email Options","Opciones de email"
"Email Wishlist Items","Enviar items de wishlist"
"Send Only Newly Added","Enviar solo los nuevos"
"Send Entire Wishlist","Enviar wishlist completa"
"Please select to send only the recently added item, or the whole wishlist. In the second option the newly added item will be marked.","Por favor seleccione si enviar solo los items nuevos o la wishlist completa. En la segunda opcion se marcaran los productos nuevos."
"Send Emails To","Enviar emails a"
"Please enter the email address where notification will be sent.","Introduzca la direccion de email a la que llegaran las notificaciones."
"Send BCC Emails To","Enviar BCC a"
"Please enter the bcc copy email address where notification will be also sent.","Por favor introduce la direccion de email a la que se enviara copia de la notificacion."
"Email Sender","Email Sender"
"Please select the email sender from store email addresses.","Por favor, seleccione un sender de la lista de emails."
"Email Template","Plantilla Email"
"Please select the custom email template or use the default.","Por favor seleccione la plantilla custom de email o utilice la defecto."
"Email Items Setting","Ajustes basicos de email"
"Email Basic Setting","Ajuste basico email"

Asi nos quedaría, ya traducido, el panel de Admin del módulo (System > Config > Admin Wishlist Email)

magevolve-wishlist admin email traducido

Además hay que modificar el fichero app/locale/es_ES/template/email/me_wlae_notification.html y ponerle éste contenido:

<!--@subject {{var store.getFrontendName()}}: Wishlist Admin Notification @-->
<!--@vars
{"store url=\"\"":"Store Url",
"var logo_url":"Email Logo Image Url",
"var logo_alt":"Email Logo Image Alt",
"var customer_name":"Customer Name",
"var customer_email":"Customer Email",
"var items":"Items",
"var store.getFrontendName()":"Store Name"}
@-->
<!--@styles
body,td { color:#2f2f2f; font:11px/1.35em Verdana, Arial, Helvetica, sans-serif; }
@-->
 
<body style="background:#F6F6F6; font-family:Verdana, Arial, Helvetica, sans-serif; font-size:12px; margin:0; padding:0;">
<div style="background:#F6F6F6; font-family:Verdana, Arial, Helvetica, sans-serif; font-size:12px; margin:0; padding:0;">
    <table cellspacing="0" cellpadding="0" border="0" height="100%" width="100%">
        <tr>
            <td align="center" valign="top" style="padding:20px 0 20px 0">
                <!-- [ header starts here] -->
                <table bgcolor="#FFFFFF" cellspacing="0" cellpadding="10" border="0" width="650" style="border:1px solid #E0E0E0;">
                    <tr>
                        <td valign="top"><a href="{{store url=""}}"><img src="{{var logo_url}}" alt="{{var logo_alt}}" style="margin-bottom:10px;" border="0"/></a></td>
                    </tr>
                    <!-- [ middle starts here] -->
                    <tr>
                        <td valign="top">
                            <h1 style="font-size:22px; font-weight:normal; line-height:22px; margin:0 0 11px 0;">Notificación de wishlist</h1>
                            <p style="font-size:12px; line-height:16px; margin:0 0 16px 0;">Nuevo producto en wishlist...</p>
                            <p style="font-size:12px; line-height:16px; margin:0 0 16px 0;">
                                <strong>Detalles:</strong><br /><br />
                                Nombre cliente: {{var customer_name}}<br />
                                Email cliente: {{var customer_email}}
                            </p>
                            {{var items}}
                        </td>
                    </tr>
                    <tr>
                        <td bgcolor="#EAEAEA" align="center" style="background:#EAEAEA; text-align:center;"><center><p style="font-size:12px; margin:0;"><strong>{{var store.getFrontendName()}}</strong></p></center></td>
                    </tr>
                </table>
            </td>
        </tr>
    </table>
</div>
</body>

Después vaciamos la cache y ¡listo!

Asi quedaría el email que recibe el admin…
magevolve admin wishlist email including taxes

[SOLVED] Magento 1.9 BUG FIX Cron email alerts sent in wrong language

I found a Magento bug which makes cron (price, stock) alerts emails being in the wrong language.

Issue

I have configured price alerts for a client (which originally registered into my shop with spanish language).

The user receives the email, but it is in english.

For instance, the text: “You are receiving this notification because you subscribed to receive alerts when the prices for the following products changed:” (in ./app/design/frontend/base/default/template/email/productalert/price.phtml) is not being translated to spanish.

I have checked and the translation is present in ./app/locale/es_ES/Mage_ProductAlert.csv: “You are receiving this notification because you subscribed to receive alerts when the prices for the following products changed:”,”Usted está recibiendo esta notificación porque está suscrito para recibir alertas cuando los precios de los siguientes productos cambien:”

I am using a custom theme.

I have also tried to add that translation to my theme: app/design/frontend/mytheme/default/locale/es_ES/translate.csv

I have flushed translations cache and deleted Magento cache. Still not being translated.

Fix

What I did to fix the issue:

Edit app/code/core/Mage/ProductAlert/Model/Email.php

Replace this (line 255):

       $appEmulation = Mage::getSingleton('core/app_emulation');
       $initialEnvironmentInfo = $appEmulation->startEnvironmentEmulation($storeId);

With this:

        $appEmulation = Mage::getSingleton('core/app_emulation');
        $initialEnvironmentInfo = $appEmulation->startEnvironmentEmulation($storeId);
        //Dealing with uninitialized translator!
        Mage::app()->getTranslator()->init('frontend', true);

Flushed the cache and voila! Now magento is sending the email alerts in the right language 🙂

Magento 1.9: Alertas de reposición de stock y alertas de precio

Una de las funcionalidades que ofrece Magento es que el usuario pueda suscribirse a alertas en productos. Bien sean alertas de modificación de precio (“productalert/price”) o de reposición de stocks (“productalert/stock”).

Para activar dicha funcionalidad, hay que ir a Sistema > Configuración > Catálogo > Catálogo:

alertas magento precio y stock

Y los productos (de los productos configurables hablaremos más adelante) pasan a mostrar dicha alerta:
alertas_magento_stock_price-23

Para ello, el theme debe llamar a:

<?php echo $this->getChildHtml('alert_urls') ?>

Y la plantilla por defecto que se ejecuta es productalert/product/view.phtml:

<?php /* @var $this Mage_ProductAlert_Block_Product_View */?>
<h1>Hello</h1>
<p class="<?php echo $this->getHtmlClass() ?>">
    <a href="<?php echo $this->escapeHtml($this->getSignupUrl()) ?>" title="<?php echo $this->escapeHtml($this->__($this->getSignupLabel())); ?>"><?php echo $this->escapeHtml($this->__($this->getSignupLabel())); ?></a>
</p>

En layout/productalert.xml encontramos la función a la que se llama (preparePriceAlertData o prepareStockAlertData):

<layout version="0.1.0">
    <catalog_product_view>
        <reference name="content">
            <reference name="product.info">
                <reference name="alert.urls">
                    <block type="productalert/product_view" name="productalert.price" as="productalert_price" template="productalert/product/view.phtml">
                        <action method="preparePriceAlertData"/>
                        <action method="setHtmlClass"><value>alert-price link-price-alert</value></action>
                        <action method="setSignupLabel" translate="value"><value>Sign up for price alert</value></action>
                    </block>
                    <block type="productalert/product_view" name="productalert.stock" as="productalert_stock" template="productalert/product/view.phtml">
                        <action method="prepareStockAlertData"/>
                        <action method="setHtmlClass"><value>alert-stock link-stock-alert</value></action>
                        <action method="setSignupLabel" translate="value"><value>Sign up to get notified when this product is back in stock</value></action>
                    </block>
                </reference>
            </reference>
        </reference>
    </catalog_product_view>
</layout>

Además, desde cada producto (Catálogo > Administrar producto), se puede ver quién se ha suscrito a cada alerta, en la pestaña “Alertas de producto”:

magento alerts

Estas alertas se almacenan internamente en la tabla product_alert_* (una para precio, otra para stock).

Si queremos obtener un informe con sumario, podemos hacer una query a las tablas anteriores o, si queremos verlo de forma gráfica, podemos instalar la extensión Amasty – Product Alert Reports (gratuita) https://amasty.com/product-alerts-reports.html y en Informes > Alerts dispondremos de la información de alertas a modo de sumario.

Para que los correos de alerta salgan, es necesario tener configurado CRON (+info aqui y aqui).

Hasta aqui, todo bien. Ahora, algunas dudas habituales:

¿Qué sucede si el cliente no está registrado y por tanto no se dispone de su email?
Si el cliente no está registrado, por defecto Magento le pide que se identifique para poder usar las alertas. No muestra un input donde el cliente no registrado pueda introducir su email para suscribirse a la alerta…

¿Qué sucede con los productos configurables?
Imaginemos que vendemos camisetas en tallas S,M,L. El producto “camiseta roja” será un prod configurable y los productos simples tendrán la variante de la talla. Sin embargo, Magento por defecto NO muestra el aviso de “Sign up to get notified when product is back in stock” en los productos configurables, aunque alguno de los productos simples asociados no esté en stock.

¿Puede el cliente registrado acceder desde su panel a la lista de suscripciones de stock y precio?
No, por defecto no puede. El código para mostrar las alertas de cada cliente sería algo asi:

/* LIST STOCK ALERTS */
$customer_id = Mage::getSingleton('customer/session')->getCustomer()->getId();
$customer_stock_alerts = Mage::getModel('productalert/stock')
         ->getCollection()
         ->addFieldToFilter('customer_id', $customer_id);
<p>foreach ( $customer_stock_alerts as $alert )
{
 echo $alert->getProductId();
}
 
/* LIST PRICE ALERTS */
$customer_id = Mage::getSingleton('customer/session')->getCustomer()->getId();
$customer_stock_alerts = Mage::getModel('productalert/price')
         ->getCollection()
         ->addFieldToFilter('customer_id', $customer_id);
<p>foreach ( $customer_stock_alerts as $alert )
{
 echo $alert->getProductId();
}

¿Cómo solucionar estas cuestiones, si no queremos ponernos a programar? Podemos comprar e instalar el módulo Amasty – Out of stock notification, que da solución a estas cuestiones: https://amasty.com/out-of-stock-notification.html

+info:
https://stackoverflow.com/questions/11648920/magento-show-sign-up-to-get-notified-when-this-product-is-back-in-stock-link-f
http://magento.stackexchange.com/questions/10989/cant-see-alert-urls-block-template
http://stackoverflow.com/questions/10810960/show-out-of-stock-for-configurable-products-in-magento
http://magento.stackexchange.com/questions/470/configurable-product-inventory-stock-availability-status-doesnt-change-when
http://stackoverflow.com/questions/5290868/how-would-test-cron-with-magento
http://merch.docs.magento.com/ee/user_guide/content/catalog/inventory-product-alert-run-settings.html
http://www.megamagento.com/2013/11/magento-product-stock-back-alerts-out.html

Magento 1.9 – mostrar productos sin existencias

Imaginemos un producto configurable (“Camiseta”) con varios productos simples asociados, de diversas tallas (“Camiseta-M”, “Camiseta-XL”). Imaginemos que tenemos 5 unidades de Camiseta-M pero ninguna de Camiseta-L.

Por defecto, si tenemos marcada en Magento la opción de configuración de no mostrar productos sin stock, Magento solo mostrará en el desplegable de tallas las tallas para las que haya stock.

¿Cómo mostrar las tallas para las que no hay stock?

Hay dos posibles soluciones:

1) Por código

: crear un nuevo módulo y en el config.xml del módulo añadir 2 eventos dentro del tag :

    <events>
        <controller_action_layout_render_before_catalog_product_view>
            <observers>
                <[namespace]_[module]>
                    <class>[module]/observer</class>
                    <method>showOutOfStock</method>
                </[namespace]_[module]>
            </observers>
        </controller_action_layout_render_before_catalog_product_view>
        <controller_action_layout_render_before_checkout_cart_configure>
            <observers>
                <[namespace]_[module]>
                    <class>[module]/observer</class>
                    <method>showOutOfStock</method>
                </[namespace]_[module]>
            </observers>
        </controller_action_layout_render_before_checkout_cart_configure>
    </events>

A continuación crear un observer en app/code/local/[Namespace]/[Module]/Model/Observer.php

class [Namespace]_[Module]_Model_Observer {
    public function showOutOfStock($observer){
        Mage::helper('catalog/product')->setSkipSaleableCheck(true);
    }
}

2) Solución por extensión (la que he aplicado yo)

– Descargar e instalar la extensión EasyLifeSwitcher para Magento: https://github.com/tzyganu/Switcher (mirror)
– Configurarla (más info aqui) para que permita mostrar y seleccionar prods simples sin stock

easylife_switcher

– Editar js/easylife_switcher/product.js y reemplazar:

/**
     * rewrite fillSelect to transform elements to labels
     * @param $super
     * @param element
     */
    fillSelect: function($super, element){
        $super(element);
        //if (this.config.transform_dropdowns){
        var transformed = this.transformDropdown(element);
        if (!transformed && !this.getConfigValue(this.config, 'allow_no_stock_select', false)) {
            var attributeId = element.id.replace(/[a-z]*/, '');
            var options = this.getAttributeOptions(attributeId);
            for (var i in options) {
                if (options.hasOwnProperty(i)){
                    var optVal = options[i].id;
                    var inStock = this.isInStock(attributeId, optVal);
                    $(element).select('option').each (function(elem){
                        if ($(elem).value == optVal && !inStock) {
                            $(elem).disabled="disabled";
                        }
                    });
                }
            }
        }
    },

Por:

/**
     * rewrite fillSelect to transform elements to labels
     * @param $super
     * @param element
     */
    fillSelect: function($super, element){
        $super(element);
        //if (this.config.transform_dropdowns){
        var transformed = this.transformDropdown(element);
        if (!transformed && !this.getConfigValue(this.config, 'allow_no_stock_select', false)) {
            var attributeId = element.id.replace(/[a-z]*/, '');
            var options = this.getAttributeOptions(attributeId);
            for (var i in options) {
                if (options.hasOwnProperty(i)){
                    var optVal = options[i].id;
                    var inStock = this.isInStock(attributeId, optVal);
                    $(element).select('option').each (function(elem){
                        if ($(elem).value == optVal && !inStock) {
                            $(elem).disabled="disabled";
                            // este evento solo se dispara si allow_no_stock_select=0 (NO Permitir seleccionar productos sin existencias)
                            //alert("debug product.js");
                        }
                    });
                }
            }
        }
        // para añadir etiqueta "sin stock" - esto se ejecuta solo si allow_no_stock_select=1 (Permitir seleccionar productos sin existencias)
        if (!transformed && this.getConfigValue(this.config, 'allow_no_stock_select', false)) {
            var attributeId = element.id.replace(/[a-z]*/, '');
            var options = this.getAttributeOptions(attributeId);
            for (var i in options) {
                if (options.hasOwnProperty(i)){
                    var optVal = options[i].id;
                    var inStock = this.isInStock(attributeId, optVal);
                    $(element).select('option').each (function(elem){
                        if ($(elem).value == optVal && !inStock) {
                            //$(elem).label = "Sin stock";
                            $(elem).classList.add("sin-stock-actual");
                        }
                    });
                }
            }
        } // HASTA AQUI ACERTIUS NUEVO
    },

– Editar nuestro archivo de estilos y añadir las reglas:

 /* para mostrar en rojo los productos sin stock */
 .sin-stock-actual{ color: red; }
 .sin-stock-actual::after{content: " - ¡Existencias agotadas!"; }

De esta forma nuestros desplegables de tallas mostrarán todas las tallas:

easylife_switcher_custom_css

Invenio: print records in marcxml format using invenio API

Sometimes it is useful to get the marcxml output of some records.

This is an example showing how to print recid’s from 18007 to 18200 in marcxml format using Invenio API:

from invenio.search_engine import print_record
 
salida = ''
 
for recid in range(18007,18200):
    #print "Registro %s" %recid
    salida += print_record(recid,format='xm')
 
print salida

Introducing MARCXML manipulation tool

If you have to import/export your MARCXML records in Invenio, tind.io offers this great online utility: https://tools.tind.io/xml/xml-manipulation/ that allows to manipulate marcxml.

Marcxml manipulation tool tind.io

Exporting marc is not only useful on migration processes, but also when you have to perform changes to a lot of records in your Invenio system. It is way better than performing those changes at database level.

You can export records using web interface or command line. I prefer this second method, using BibExport:

First change this config file: /opt/invenio/etc/bibexport/marcxml.cfg

The MARCXML exporting method export all the records matching a particular search query, zip them and move them to the requested folder. The output of this exporting method is similar to what one would get by listing the records in MARCXML from the web search interface.

Default configurations are given below. The job would have exported all records from the Book collection into one xml.-file and all articles with the author “Polyakov, A M” into another.

[export_job]
export_method = marcxml
[export_criterias]
books = 980__a:BOOK
polyakov_articles = 980__a:ARTICLE and author:"Polyakov, A M"

the job is run by this command:

/opt/invenio/bin/bibexport -u admin -wmarcxml

Default folder for storing is:

/opt/invenio/var/www/export/marcxml

Invenio 1: BibRank exception

I was getting several exceptions in Bibrank:

* 2015-01-15 08:32:17 -> NoOptionError: No option 'citation_loss_limit' in section: 'citation' (ConfigParser.py:618:get)

** User details
No client information available

** Traceback details 

Traceback (most recent call last):
  File "/usr/lib64/python2.7/site-packages/invenio/bibtask.py", line 606, in task_init
    ret = _task_run(task_run_fnc)
  File "/usr/lib64/python2.7/site-packages/invenio/bibtask.py", line 1146, in _task_run
    if callable(task_run_fnc) and task_run_fnc():
  File "/usr/lib64/python2.7/site-packages/invenio/bibrank.py", line 159, in task_run_core
    func_object(key)
  File "/usr/lib64/python2.7/site-packages/invenio/bibrank_tag_based_indexer.py", line 443, in citation
    return bibrank_engine(run)
  File "/usr/lib64/python2.7/site-packages/invenio/bibrank_tag_based_indexer.py", line 356, in bibrank_engine
    func_object(rank_method_code, cfg_name, config)
  File "/usr/lib64/python2.7/site-packages/invenio/bibrank_tag_based_indexer.py", line 68, in citation_exec
    dic, index_update_time = get_citation_weight(rank_method_code, config)
  File "/usr/lib64/python2.7/site-packages/invenio/bibrank_citation_indexer.py", line 141, in get_citation_weight
    weights = process_and_store(updated_recids, config, chunk_size)
  File "/usr/lib64/python2.7/site-packages/invenio/bibrank_citation_indexer.py", line 157, in process_and_store
    citation_loss_limit = int(config.get(function, "citation_loss_limit"))
  File "/usr/lib64/python2.7/ConfigParser.py", line 618, in get
    raise NoOptionError(option, section)
NoOptionError: No option 'citation_loss_limit' in section: 'citation'

** Stack frame details

This was solved by updating /opt/invenio/etc/bibrank/citation.cfg with citation_loss_limit = 50 and I also included some more options:

[...]
reference_via_doi= 999C5a
reference_via_record_id= 990C50
reference_via_isbn= 999C5i
[...]
citation_loss_limit = 50
collections =

Then it was solved 🙂

Botón de flecha animada con CSS3

El otro día un amigo me pedía que metiera una flechita en movimiento en su web. Os dejo el ejemplo de cómo lo hice, por si os resulta útil. Para crear la flecha utilizo font-awesome 😉

1. En el MARCADO:

<span class="hero-btn-holder" style="">
   <a target="_blank" href="/#main-content" class="hero-btn hero-slider-button">
         <i style="color: #ffffff;" class="fa fa-angle-down fa-4x ut-service-box-icon"></i>
   </a>
</span>

2. En el CSS:

/* flecha abajo en movimiento */
/* buscamos el selector que sea la flecha (en este caso la selección está sacada de un theme de ejemplo) */
#ut-hero-captions > ul:nth-child(1) > li:nth-child(n) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > span:nth-child(2) > a:nth-child(1){
	cursor: pointer;
	-webkit-animation: jumpInc 2s infinite;
       -moz-animation: jumpInc 2s infinite;
         -o-animation: jumpInc 2s infinite;
            animation: jumpInc 2s infinite;
}

@-webkit-keyframes jumpInc {
	0%   {
		margin-top: -122%;
		opacity: 0;
	}
	50%  {
		margin-top: 0%;
		opacity: 1;
	}
	100% {
		margin-top: 122%;
		opacity: 0;
	}
}

@-moz-keyframes jumpInc {
	0%   {
		margin-top: -122%;
		opacity: 0;
	}
	50%  {
		margin-top: 0%;
		opacity: 1;
	}
	100% {
		margin-top: 122%;
		opacity: 0;
	}
}
@-o-keyframes jumpInc {
	0%   {
		margin-top: -122%;
		opacity: 0;
	}
	50%  {
		margin-top: 0%;
		opacity: 1;
	}
	100% {
		margin-top: 122%;
		opacity: 0;
	}
}
@keyframes jumpInc {
	0%   {
		margin-top: -122%;
		opacity: 0;
	}
	50%  {
		margin-top: 0%;
		opacity: 1;
	}
	100% {
		margin-top: 122%;
		opacity: 0;
	}
}

/* /flecha abajo */