Logo

Marc Pampols

  • Acerca de
  • Contacto
  • Proyectos web
  • Gráficos 3D
  • Aleatorio
  • Archivo
  • RSS
  • Envíame una pregunta
  • Colabora

Importar datos CSV en Plone

He subido un pequeño script en Python en el Github Gist, que pertenece a una vista de un producto de Plone, y que puede utilizarse como base para importar datos de un fichero CSV en tipos de contenido.

Muy sencillo para tener una idea de cómo hacerlo, y fácilmente adaptable a la necesidad de cada uno.

Import CSV data to Plone content type: https://gist.github.com/2256740

# -*- coding: utf-8 -*-
import datetime
import urllib

from Acquisition import aq_inner

from zope import interface
from zope import schema

from zope.app.pagetemplate import viewpagetemplatefile
from zope.app.component.hooks import getSite

from Products.CMFCore.utils import getToolByName
from Products.Five import BrowserView
from Products.Five.browser.pagetemplatefile import ViewPageTemplateFile

from Products.statusmessages.interfaces import IStatusMessage

# Control BadRequest errors (duplicate id's found)
try: from zExceptions import BadRequest
except ImportError: BadRequest = 'BadRequest'

# Control errors caused by WebDAV open objects in Plone durint import
from Products.CMFDefault.exceptions import ResourceLockedError

import StringIO
import csv

class Import(BrowserView):

    # Template where we show the import results
    template = viewpagetemplatefile.ViewPageTemplateFile('import.pt')

    # Import function
    def render(self):
        plone_utils = getToolByName(self.context, 'plone_utils')
        workflowTool = getToolByName(self.context, "portal_workflow")

        # Read the CSV file
        csv_contents = str(self.context)
        f = StringIO.StringIO(csv_contents)
        file = f.read()
        csv_reader = csv.reader(file.splitlines(), delimiter=';')

        # Counting successful and failed register imports
        stats_ok = 0
        stats_failed = 0

        # Set the name of the content type to create
        content_type = "Name of the Content Type"

        headers = 0
        for field in csv_reader:
            if (headers == 1):
               
                # Set the csv values to new python variables and do the proper processing for each register
                obj_id          = plone_utils.normalizeString(unicode(field[0]))
                obj_title       = str(field[1])
                obj_descripcion = str(field[2])
                
                # Try to create the object in Plone
                try:
                    subfolder_item[1].invokeFactory(content_type, obj_id)
                    obj_newObject = getattr(self, obj_id)
                    obj_newObject.setTitle(obj_title)
                    obj_newObject.setDescription(obj_description)
                    obj_newObject.reindexObject()
                    stats_ok += 1

                    except BadRequest:
                        print "Can't create object."
                        stats_failed += 1

                    except ResourceLockedError:
                        print "Can't create object, locked entry by WebDAV."
                        stats_failed += 1

            if (headers == 0):
                headers = 1

        return str("Import process results: CREATED: " + str(stats_ok) + " FAILED: " + str(stats_failed))

    def __call__(self):
        return self.render()
    • #plone
  • hace 1 mes
  • Enlace permanente
  • Share
    Tweet

Tuenti Programming Challenge 2

Competición anual de programación de Tuenti. En mi opinión mucho más divertida que la ‘Facebook HackerCup’. Tienes 20 problemas por resolver y una semana de tiempo, y los mejores 15 podrán visitar las oficinas de Tuenti en Madrid.

    • #programación
    • #competición
  • hace 1 mes
  • Enlace permanente
  • Share
    Tweet

Adapta los gráficos de tu web para las pantallas con Retina Display

En la salida del iPhone 4, Apple presentó su nueva tecnología Retina Display, en la que simplemente aumenta la densidad de píxeles en las pantallas y así se logra una calidad de imagen que en comparación a las anteriores, es bastante notable.

Hasta ahora, estabamos acostumbrados a diseñar con 72 dpi, pero la pantalla Retina puede mostrar 326 dpi en el caso del iPhone 4 / 4S, y 264 en el nuevo iPad.

Para aprovechar la nueva pantalla, podemos diseñar nuestras aplicaciones web con imágenes a dichas densidades, pero conservando también las de 72 dpi.

1. Detectar el pixel ratio

El primer paso es lograr detectar el pixel ratio del dispositivo visitante, un dato que podemos leer utilizando las Media Queries de CSS3.

Entonces, podemos crear un nuevo fichero CSS para utilizar exclusivamente en este caso, por ejemplo: retina-display.css, y para poder cargarlo, podemos utilizar la siguiente Media Query:

<link rel='stylesheet' href='retina-display.css' 
media='only screen and (-moz-min-device-pixel-ratio: 2),
only screen and (-o-min-device-pixel-ratio: 2/1),
only screen and (-webkit-min-device-pixel-ratio: 2),
only screen and (min-device-pixel-ratio: 2)' />


2. Adaptar las imágenes

En las naming conventions del SDK de Apple, se sugiere que los ficheros para la Retina Display, tengan el sufijo “@2x”. Si nuestra imagen original se llama “logo-site.png”, la versión Retina se puede llamar “logo-site@2x.png”

En cuestión de tamaño, si la imagen tiene una resolución de 50x50 pixeles, la versión Retina deberá tener 100x100.


3. Añadir las nuevas imágenes en nuestra hoja de estilos.

Si antes hemos creado el fichero retina-display.css, ahora podemos indicar en el fichero las nuevas imágenes adaptadas. Siguiendo el ejemplo anterior:

#home #header .logo 
{
    background-image:url(assets/img/images/logo-site@2x.png);
background-size: 50px 50px;
}

Necesitamos añadir la propiedad background-size para volver a adaptar el tamaño de las imágenes.

    • #retina display
    • #media query
    • #css3
  • hace 2 meses
  • Enlace permanente
  • Share
    Tweet
Primeros dias con la BlackBerry Playbook que nos regaló RIM. Decepcionado con la batería, tras cargarla al 100%, pasadas menos de 48 horas, ya ha bajado un 10%&#8230; ¡Sin usarla!
Pop-upView Separately

Primeros dias con la BlackBerry Playbook que nos regaló RIM. Decepcionado con la batería, tras cargarla al 100%, pasadas menos de 48 horas, ya ha bajado un 10%… ¡Sin usarla!

  • hace 2 meses
  • Enlace permanente
  • Share
    Tweet

El 'Lorem Ipsum' de las imágenes

Ideal para crear rápidamente imágenes de tamaños personalizados para poner a prueba tus proyectos.

    • #lorem ipsum
    • #imagenes
  • hace 2 meses
  • Enlace permanente
  • Share
    Tweet

10 conceptos de desarrollo web que los diseñadores deben saber.

Un artículo con un listado de 10 conceptos que deben tener claros todos aquellos que estén involucrados en el desarrollo de un diseño que debe terminar en una web.

Uno de los principales problemas con los que me encuentro en el desarrollo web cuando tengo que trabajar con empresas externas, es que muchas desconocen la diferencia entre “Diseño gráfico” y “Diseño web”, y cometen el error de encargar diseños web a diseñadores gráficos que no tienen ningún conocimiento de HTML, CSS o JavaScript. Horrible.

    • #diseño web
    • #conceptos
    • #desarrollo web
  • hace 2 meses
  • 4
  • Enlace permanente
  • Share
    Tweet

Protocolo para entrar en una "sala blanca" de Intel

  1. Guardar los objetos personales.
  2. Desechar chicles, caramelos, etc.
  3. Quitarse el maquillaje con agua y jabón estériles.
  4. Tomar un sorbo de agua para eliminar las partículas de la boca.
  5. …..
  1. Examinar el equipo en el espejo.
  2. Ponerse los guantes de látex.
  3. Entrar en la sala blanca.

  • hace 3 meses
  • Enlace permanente
  • Share
    Tweet

Validador de titulos duplicados para Plone 4.x

Un validador para Plone 4.x que permite avisar al usuario si ha introducido un elemento con un titulo duplicado. El funcionamiento por defecto del gestor es crear igualmente un elemento modificando el valor del id añadiendo un número, y así podemos tener elementos que comparten el campo Title.

Con este validador, que se puede añadir a cualquier tipo de contenido, podemos avisar al usuario y evitar que entre contenidos duplicados.

    • #plone
    • #validator
    • #archetypes
    • #content types
  • hace 3 meses
  • Enlace permanente
  • Share
    Tweet

Notificaciones Push desde la NAS de Synology

Hace tiempo que compré una NAS de Synology, y hoy, con la nueva versión 4.0 beta del firmware, activé las notificaciones Push.

Primero hay que instalar DS finder para “sincronizar” vuestro terminal con vuestra(s) NAS, y luego activar el envío de notificaciones. Lo que es realmente genial es que aprovecha todas las notificaciones que por defecto incluye el firmware de Synology (aviso por problemas de hardware, reboot remoto, backups finalizados, etc…), así que puedes estar informado al instante de todo lo que sucede con tu NAS.

La versión 4.0 beta puede descargarse desde la página oficial de Synology, y el proceso de actualización apenas tarda unos 15 minutos y mantiene toda la configuración actual.

Gracias a @jordipg por el aviso!

    • #synology
    • #nas
    • #iphone
    • #notificaciones
    • #4.0 beta
  • hace 4 meses
  • 1
  • Enlace permanente
  • Share
    Tweet

Primera ronda de calificación de la Facebook Hacker Cup 2012

Ayer terminó la primera ronda de calificación de la competición “Hacker Cup” de Facebook.

Por suerte, todos los amigos que participamos pudimos pasar la ronda :)

De los tres problemas planteados solucionamos uno o dos, el tercero era de una dificultad bastante más elevada y no llegamos a tiempo.

He publicado en github:gist el código fuente de mis soluciones escritas en Python.

  • Alphabet Soup
    https://gist.github.com/1670780
     
  • Billboards
    https://gist.github.com/1670910  
    • #facebook
    • #hacker cup
    • #solución
    • #código
    • #python
  • hace 4 meses
  • 6
  • Enlace permanente
  • Share
    Tweet
← Recientes • Antiguas →
Página 2 de 4

Acerca de

Avatar Tech entrepreneur. Founder of YoteConozco. Plone / Python project leader & programmer at Semic.

Sígueme en

  • @mpampols on Twitter
  • Facebook Profile
  • mpampols on Flickr
  • Google
  • Linkedin Profile
  • mpampols on github

Twitter

loading tweets…

  • RSS
  • Aleatorio
  • Archivo
  • Envíame una pregunta
  • Colabora
  • Móvil

Effector Theme by Carlo Franco.

Proporcionado por Tumblr