Preciosa Documentation Publicación dev Martín Gaitán y colaboradores 11 de May de 2015 Índice general 1. A modo de intro 2. Índice 2.1. Instalación de la plataforma . . . . . 2.2. Arquitectura . . . . . . . . . . . . . 2.3. La API de Preciosa . . . . . . . . . . 2.4. Tutorial de uso de la aplicación móvil 2.5. Preguntas Frecuentes . . . . . . . . . 2.6. Glosario . . . . . . . . . . . . . . . 2.7. Licencia . . . . . . . . . . . . . . . 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 5 9 11 14 15 16 16 3. Preciosa en los medios 19 4. Indices and tables 21 I II Preciosa Documentation, Publicación dev Preciosa es una plataforma web colaborativa con aplicaciones para teléfonos inteligentes que facilita el relevamiento de precios y ayuda a encontrar mejores ofertas. A diferencia de otras aplicaciones existentes, Preciosa no limita la información a precios de productos bajo acuerdo y enfatiza la participación de los usuarios para mantener la información actualizada. issue tracker https://github.com/mgaitan/preciosa/issues twitter @PreciosaApp lista https://groups.google.com/forum/#!forum/preciosa-devs estado email Martín Gaitán <[email protected]> Índice general 1 Preciosa Documentation, Publicación dev 2 Índice general CAPÍTULO 1 A modo de intro (...) Entran a un super, agarran el paquete de harina, le sacan una fotito con su cámara al código de barra (o buscan el producto por nombre, marca, etc.) y la app les dice cuál es el precio de referencia (o del acuerdo), en qué super cercano está más barato, cuándo y cuánto aumentó, etc. Idea original Repercusión y primeros pasos 3 Preciosa Documentation, Publicación dev 4 Capítulo 1. A modo de intro CAPÍTULO 2 Índice 2.1 Instalación de la plataforma Preciosa es una aplicación web basada en Django y Geodjango. Como depende de una base de dato espacial (en particular, usamos PostGis) y de muchos otros componentes, no es trivial (pero tampoco difícil) armar un entorno de programación. Esta sección describe distintos modos, dependiendo el sistema operativo y el objetivo de la instalación. Para la configuración de un entorno de desarrollo rápido, la recomendación es utilizar Vagrant. 2.1.1 Creación de un entorno de desarrollo basado en Vagrant El objetivo de este documento es permitir que desarrolladores puedan crear sus entornos de desarrollo rápidamente e ir a lo que interesa: contribuir con código. Se basa en Vagrant, una herramienta para la creación y configuración de entornos de desarrollo virtualizados. En una maquina virtual basada en Ubuntu, Vagrant realiza una instalación automatizada del entorno de desarrollo (configurando base de dato, dependencias, usuario, etc.) y configura la “conexión de red” y la carpeta compartida para trabajar desde la maquina física, independientemente del sistema operativo que tenga, y “ejecutar” el código en la maquina virtual. Atención: Una forma alternativa para desarrolladores más experimentados o que desean mayor control sobre su entorno se describe en Creación de un entorno de desarrollo local en Linux. Esta guía está pensada principalmente para sistemas Linux Ubuntu/Debian, y esta probado para VirtualBox >= 4.3 y Vagrant >= 1.3.5, pero debería funcionar desde cualquier sistema operativo host. Leé la documentación de Vagrant para obtener información particular para tu sistema operativo. Instalación de Vagrant y VirtualBox Para instalar y ejecutar Vagrant y VirtualBox en tu shell: sudo apt-get install vagrant virtualbox Por ultimo instalamos un plugin de Vagrant que es necesario para que todo funcione bien: vagrant plugin install vagrant-vbguest 5 Preciosa Documentation, Publicación dev Instalando el Entorno Posicionados en la carpeta raíz del repositorio instalamos el entorno de desarrollo con un solo comando: vagrant up Va a tomar un tiempo la instalación porque implica bajar una maquina virtual completa pero luego de eso accedemos via ssh a una maquina virtual completa: vagrant ssh Adentro del entorno nos posicionamos en la carpeta preciosa y creamos un superuser: cd preciosa python manage.py createsuperuser y levantamos el server de Django: sudo python manage.py runserver 0:8000 Una vez ejecutado, Preciosa estará disponible en tu browser tecleado http://localhost:8000 Para manipular la base de datos podes acceder a /admin en tu browser en el puerto especificado e ingresar con el usuario y contraseña creados en createsuperuser. El script de provisión El script que Vagrant ejecuta para crear por primera la maquina virtual se encuentre en /tools/install.sh y es el siguiente: #!/bin/bash sudo sudo sudo sudo sudo sudo apt-get apt-get apt-get apt-get apt-get apt-get -y -y -y -y -y -y install install install install install install language-pack-es-base language-pack-en-base postgresql-9.1 libpq-dev postgresql-9.1-postgis gdal-bin postgresql-contrib git python-pip python-dev libxml2-dev libxslt1-dev libjpeg-dev zlib1g-dev libpng12-dev # enforce UTF8 encoding in all databases (instead of SQL_ASCII): sudo -u postgres pg_dropcluster --stop 9.1 main sudo -u postgres pg_createcluster 9.1 main -e UTF8 sudo -u postgres pg_ctlcluster 9.1 main start sudo sudo sudo sudo sudo sudo -u -u -u -u -u -u postgres postgres postgres postgres postgres postgres psql -c "CREATE ROLE dev LOGIN PASSWORD 'dev' SUPERUSER VALID UNTIL 'infinity';" createdb template_postgis psql -d template_postgis -f /usr/share/postgresql/9.1/contrib/postgis-1.5/postgis.sq psql -d template_postgis -f /usr/share/postgresql/9.1/contrib/postgis-1.5/spatial_re psql -d template_postgis -f /usr/share/postgresql/9.1/contrib/postgis_comments.sql psql -c "CREATE DATABASE preciosa WITH OWNER=dev TEMPLATE=template_postgis CONNECTIO ln -s /vagrant/ /home/vagrant/preciosa cd preciosa sudo pip install -r requirements.txt cp preciosa/local_settings.py.template preciosa/local_settings.py python manage.py syncdb --noinput python manage.py createsuperuser --username=preciosa [email protected] --noinput 6 Capítulo 2. Índice Preciosa Documentation, Publicación dev python manage.py migrate python manage.py loaddata fixtures/flatpages.json fixtures/blog.json fixtures/newsletter.json fixture 2.1.2 Creación de un entorno de desarrollo local en Linux El objetivo de este documento es permitir que los desarrolladores puedan crear sus entornos de desarrollo en una maquina local. Esta instalación es para usuarios más avanzados, que prefieren un control particular sobre la instalación o necesitan mayor performance. En cualquier otro caso recomendamos vagrant. Esta guía está pensada principalmente para sistemas Linux Ubuntu/Debian, aunque hay comentarios para otros entornos. Preparación del entorno 1. Instalación de virtualenv virtualenv nos permite aislar la instalación de paquetes de la instalación del sistema. Es buena práctica utilizarlo por dos motivos: 1. No genera conflictos de los paquetes necesarios para correr Preciosa con los paquetes de sistema 2. No instala paquetes innecesarios en el sistema Para instalarlo ejecutar en tu shell: pip install virtualenv virtualenv --no-site-packages preciosa_ve Una vez instalado, es necesario activar el entorno usando: source preciosa_ve/bin/activate Para desactivarlo basta ejecutar deactivate en cualquier path del terminal. En Windows no se puede usar el comando source. Para activar el virtualenv luego de haber creado preciosa_ve, ejecutar preciosa_veScriptsactivate La creación del directorio preciosa_ve se hace en un directorio de trabajo, preferentemente, para evitar modificar el directorio del proyecto actual. 2. Instalación de los requerimientos Preciosa requiere muchos paquetes para que funcione correctamente. Para instalar lo estrictamente necesario en tu entorno basta ejecutar: pip install -r requirements.txt Opcionalmente, si querés algunos otros paquetes útiles (como IPython), podés instalar los paquetes opcionales: pip install -r requirements/optional.txt Atención: Para que estos comandos funcionen, tenés que ejecutarlo desde root de Preciosa (es decir, la carpeta que creaste cuando clonaste el repositorio) con el virtualenv activado. 2.1. Instalación de la plataforma 7 Preciosa Documentation, Publicación dev Instalar y configurar Postgres y PostGIS Como Preciosa utiliza funciones de geolocalización basadas en Geodjango, requiere una base de datos con soporte GIS. Usamos Postgres 9.1 con PostGIS >1.5 . Seguí esta guia en la wiki de Preciosa, para instalar lo necesario. Luego hace falta indicarle a Django la configuración de la base de datos recién creada, y te conviene hacerlo en un archivo local_settings.py, que está excluído del control de versiones. Dejamos un template que debería funcionar sin cambios si seguiste el tutorial de instalación de la base de datos textualmente: cp preciosa/local_settings.py.template preciosa/local_settings.py Crear esquemas y cargar datos 1. Crear base de datos Para crear el schema de la base de datos basta ejecutar los comandos: python manage.py syncdb --noinput luego: python manage.py migrate y luego: python manage.py createsuperuser 2. Cargar los fixtures: python manage.py loaddata fixtures/flatpages.json fixtures/blog.json fixtures/newsletter.json fi Los fixtures cargan datos al schema creado en la etapa anterior. Ejecutando Preciosa Primero probá si todo salió bien corriendo los tests: python manage.py test Para correr Preciosa basta ejecutar: python manage.py runserver Una vez ejecutado, Preciosa estará disponible en el puerto indicado en la terminal (por defecto es el 8000) Para hacer uso del admin de Django y editar la base de datos, basta acceder a /admin en tu browser en el puerto especificado y acceder con el usuario y contraseña creados en syncdb. 2.1.3 Creación de un entorno de desarrollo local en Mac Recomendamos enfáticamente usar la vagrant Atención: No obstante, aceptamos la contribución de escribir una guia de instalación local en un entorno Max Os X 8 Capítulo 2. Índice Preciosa Documentation, Publicación dev 2.1.4 Creación de un entorno de desarrollo local en Windows Recomendamos enfáticamente usar la vagrant Atención: No obstante, aceptamos la contribución de escribir una guia de instalación local en un entorno Windows. Ver tickets #127 y #153 2.1.5 Instalación en Producción TO DO 2.2 Arquitectura 2.2.1 Modelo de base de datos Los modelos fundamentales de Preciosa se definen en la </preciosa/precios/models.py>. Un diagrama simplificado es el siguiente: aplicación precios 2.2.2 Algoritmos de “precios” Como se observa, el relevamiento de un precio está asociado a un producto y a una sucursal específica (y, opcionalmente, a un usuario), además de su fecha de relevamiento. Al ser improbable la existencia de precios para cualquier producto en todas las sucursales, la consulta del precio de un producto para una sucursal en particular se realiza a través del método PrecioManager.mas_probables(), que realiza un degradado de información: 1. Si existe un precio relevado para el producto en la sucursal, dentro del rango de máximo de dias, se devuelve ese dato 2. En caso de que no exista, se buscan precios para el producto en sucursales de la misma cadena o un radio definido. 3. Si no hay precios en Sucursales, se buscan el precio del producto en la “Sucursal Online” de la Cadena. 4. Si no hay sucursal online asociada o no existe un precio vigente, no se devuelve un resultado. def mas_probables(self, producto, sucursal, dias=None, radio=10): """ Cuando no hay datos especificos de un producto para una sucursal (:meth:`PrecioManager.historico`), debe ofrecerse un precio más probable. Se calcula - Precio más nuevo para el producto en otras sucursales de la misma cadena en la ciudad y/o un radio de distancia si es dado - En su defecto, precio online de la cadena """ qs = self.historico(producto, sucursal, dias) if len(qs) > 0: return qs qs = super(PrecioManager, self).get_queryset() 2.2. Arquitectura 9 Preciosa Documentation, Publicación dev # precios para sucursales de la misma cadena de la ciudad cercanas_ciudad = sucursal.cercanas(misma_cadena=True).values_list('id', flat=True) if radio: cercanas_radio = sucursal.cercanas(radio=radio, misma_cadena=True).values_list('id', flat=True) else: cercanas_radio = [] cercanas = set(list(cercanas_ciudad) + list(cercanas_radio)) qs = qs.filter(producto=producto, sucursal__id__in=cercanas).distinct('precio') if qs.exists(): return self._registro_precio(qs) qs = super(PrecioManager, self).get_queryset() qs = qs.filter(producto=producto, sucursal__cadena=sucursal.cadena, sucursal__online=True).distinct('precio') # precios online if qs.exists(): return self._registro_precio(qs) return [] Análogamente se calculan los mejores precios. Dado un producto, una ubicación (o sucursal) y radio de distancia, se obtiene una lista de los mejores precios en la zona para ese producto. def mejores(self, producto, ciudad=None, punto_o_sucursal=None, radio=None, dias=None, limite=5): """ devuelve una lista de instancias Precio para el producto, ordenados por menor precio (importe) para un determinado producto y un radio de distancia o ciudad. Sólo considera el último precio en cada sucursal. """ #si tiene puto.. tenemos que tener el radio if punto_o_sucursal and not radio: raise ValueError( 'Si se especifica el punto o sucursal debe proveer el radio') if radio and not punto_o_sucursal and not ciudad: raise ValueError( 'Si se especifica el radio debe proveer el punto o sucursal') #si no tenemos una ciudad o un punto con radio if not ciudad and not radio: raise ValueError( 'Debe proveer una ciudad o un radio en kilometros') qs = super(PrecioManager, self).get_queryset().filter(producto=producto, activo__isnull=False) if dias: desde = timezone.now() - timedelta(days=dias) qs = qs.filter(created__gte=desde) 10 Capítulo 2. Índice Preciosa Documentation, Publicación dev if ciudad: if isinstance(ciudad, City): ciudad = ciudad.id qs = qs.filter(sucursal__ciudad__id=ciudad).distinct( 'sucursal')[:limite] elif radio: if isinstance(punto_o_sucursal, Sucursal): punto = punto_o_sucursal.ubicacion else: punto = punto_o_sucursal cercanas = Sucursal.objects.filter(ubicacion__distance_lte=(punto, D(km=radio))) cercanas = cercanas.values_list('id', flat=True) qs = qs.filter(sucursal__id__in=cercanas).distinct( 'sucursal')[:limite] if qs.exists(): return sorted(qs, key=lambda i: i.precio) return [] 2.3 La API de Preciosa Atención: La API está en plena fase de diseño e implementación. Puede cambiar sin previo aviso 2.3.1 Breve intro a Django Rest Framework La API REST de Preciosa está implementada con Django Rest Framework (DRF) Hay 3 módulos que importan serializers.py views.py urls.py El primero define los serializadores, conceptualmente análogos a un formulario, que dado un objeto (en general, una instancia de un Modelo), define las reglas de como debe mostrar los atributos en un formato de representación (como JSON) o, en sentido inverso, como debe recontruir un objecto a partir de una representación. El segundo módulo define las “vistas”, que son similares a las de Django (aunque el objeto Response que usa la API es ligeramente distinto). Para los casos de uso más comunes se pueden usar Class Based View (análogas a las CBV de Django, que saben listar, mostrar, crear, etc. objetos/instancias de modelos) o una abstracciín aún más general denominada ViewSet, que puede pensarse como una factory de Class Based Views: un Viewset para un modelo, ya sabe hacer todos los casos comunes y, como yapa, mediante un Router, nos genera automáticamente una estructura de urls tipicas. Por último, puede definirse una vista tipica como función, decorada con el decorador de DRF @api_view Las urls son iguales a las de cualquier aplicación Django, salvo por la utilización opcional de un router (una factory de URLs). Preciosa utiliza una mezcla de todas las posilidades de que brinda DRF. Por ejemplo, los endpoints para modelos simples como Cadena (Walmart, Disco, etc), utilizan ViewSets, algunos listados/detalles como el del modelo Producto (que puede accederse en general o para una sucursal en particular) usa CBVs y la vista de detalle para productos (en una sucursal) usa una vista basada implenentada como función decorada. 2.3. La API de Preciosa 11 Preciosa Documentation, Publicación dev Advertencia: DISCLAIMER: Estamos aprendiendo a usar este framework sobre la marcha. Si tenés ideas de cómo mejorar, recomendaciones, etc. estaremos contentos de recibirlas. 2.3.2 Autenticación básica basada en token La API de preciosa utiliza una manera muy simple y opcionalmente anónima de autenticación. El motivo de usar autenticación es para prevenir/aminorar el vandalismo y el uso desleal de los recursos. Cada usuario está asociado a un token. Registrar un usuario para obtener un token es muy fácil. Basta hacer un POST al enpoint http://preciosdeargentina.com.ar/api/v1/auth/registro Opcionalmente la petición puede enviar esta información uuid un identificador único del equipo (ejemplo, el movil) nombre un nombre elegido por el usuario para el equipo plataforma la plataforma subyacente (ejemplo: “Android”) phonegap si el cliente es Phonegap, la versión. plataforma_version la versión de la plataforma (ejemplo “2.2” para Android) preciosa_version la versión del cliente de preciosa. Los parámetros no son obligatorios, pero cualquiera subconjunto que se envie debe incluir el uuid (sin uuid ninguna información quedará guardada) Obtenido el token, este debe enviarse para cada subsecuente petición. Puede hacerse configurando el un header HTTP. Por ejemplo Authorization: Token XXXXX Donde XXXX es el token dado. Desde jQuery, puede configurarse para todas las peticiones ajax $.ajaxSetup({ headers: { 'Authorization': "Token XXXXX" } }); Alternativamente, se puede enviar un token como parámetro en el QUERY de la URL. Por ejemplo: api/v1/<end_point>/?token=XXXX Si ya se cuenta con un usuario y contraseña (por ejemplo un Voluntario registrado via web) se puede obtener un token enviando parámetros usuario y password al recurso http://preciosdeargentina.com.ar/api/v1/auth/token Devuelve el token en formato json de igual manera que /auth/registro 2.3.3 ¿Qué se puede hacer? Como DRF ofrece una versión HTML del contenido de la API, gran parte de los recursos que la API de preciosa ofrece pueden autodescubrirse navegando desde la raiz. 12 Capítulo 2. Índice Preciosa Documentation, Publicación dev http://preciosdeargentina.com.ar/api/v1/ 2.3.4 Otros recursos Detalle de una sucursal http://preciosdeargentina.com.ar/api/v1/sucursales/<pk> Listado de productos con precios conocidos en una sucursal http://preciosdeargentina.com.ar/api/v1/sucursal Es igual que http://preciosdeargentina.com.ar/api/v1/productos, pero filtra aquellos productos en los que para esa sucursal hay precios conocidos. Detalle de producto para una sucursal en particular http://preciosdeargentina.com.ar/api/v1/sucursales/<p Este recurso devuelve un detalle exhaustivo de los precios probables y los mejores para una zona, incluyendo sucursales asociadas a esos mejores precios. 2.3.5 Filtros El listado de productos (http://preciosdeargentina.com.ar/api/v1/productos) puede recibir los siguientes parámetros opcionales via GET q cadena a buscar. Usa el criterio definido en Producto.objects.buscar (es decir, dará los mismos resultados que el buscador de la web). Por ejemplo, puede ser un conjunto de palabras claves o un código de barras (completo o los primeros números desde la izquierda). limite cuantos resultados mostrar para el criterio pk limita la busqueda a un PK de producto en particular El listado de sucursales (http://preciosdeargentina.com.ar/api/v1/sucursales) puede recibir los siguientes parámetros via GET q cadena a buscar. Por ejemplo, nombre de ciudad, cadena, o calle. lat, lon y radio: una posición y el radio en kilometros que determina las zona donde se buscan sucursales. Estos parámetros son interdependientes. El listado de Ciudades (http://preciosdeargentina.com.ar/api/v1/ciudades) puede recibir los siguientes parámetros via GET: q cadena a buscar. Por ejemplo, nombre de ciudad o provincia. 2.3.6 Formatos DRF sabe interpretar el content-type preferido en el encabezado de la petición HTTP. Alternativamente puede definirse mediante el parámetro format en la URL del recurso. Por ejemplo http://preciosdeargentina.com.ar/api/v1/cadenas/?format=json Forzará el serializado de la lista de cadenas en formato JSON, aun desde un navegador web que acepta HTML. 2.3.7 Tasas de limitación (throttling) Complementario a la autenticación, la API tiene un sistema de limitación de peticiones (throttling), para evitar el abuso de usuarios malintencionados. Actualmente las tasas son: 2.3. La API de Preciosa 13 Preciosa Documentation, Publicación dev 30 peticiones por dia para usuarios anónimos. Actualmente permite acceder a la URL /auth/registro 40 peticiones por minuto para usuarios autorizados. Es para evitar los picos de peticiones automatizadas. 1000 peticiones por dia para usuarios autorizados. Es para evitar el “leeching”. 2.4 Tutorial de uso de la aplicación móvil Preciosa tiene un cliente para dispositivos móviles. Esta es una guía de uso de la versión actual. 2.4.1 Instalación Nuestra intención es que Preciosa sea muy fácil de usar y funcione en la mayor cantidad de teléfonos posible. Existe una aplicación descargable desde Google Play para teléfonos con Android 2.1 o superior. Otras plataformas o dispositivos pueden acceder a una versión simplificadada para el navegador web desde la url http://mobile.preciosdeargentina.com.ar [1]_. 2.4.2 Paso 1: elegir tu sucursal Una vez que instalaste la aplicación, el primer paso es elegir la sucursal de supermercado en la que estás (o querés consultar precios). Hay tres maneras de elegir una sucursal: Buscar por palabras clave. Por ejemplo, podés buscar el nombre de la cadena y la calle, o intentar con el nombre de tu barrio y tu ciudad. Elegir una sucursal que ya elegiste antes.Esta es la opción “Recientes”. Se van guardando las sucursales que más frecuentemente elegís, para facilitar la búsqueda. O podés buscar sucursales cercanas.Esta es una función experimental que utiliza geolocalización, es decir, intenta detectar tu ubicación y te da un listado de las sucursales conocidas más cercanas. Si estás en un super, la primera que aparece debería ser aquella en la que estás. Si creés que no te detecta correctamente la ubicación, poder corregirla con el botón Configurar Ubicación que sale al pie de de la solapa, y eligiendo tu ubicación correcta en el mapa. ¿No aparece la sucursal que buscás? ¡Cargala desde el panel de voluntarios! 2.4.3 Paso 2: Buscar productos Una vez que encontraste la sucursal que buscabas, podés consultar productos. Las opciones son: usar el buscador de palabras claves, o, sí tu teléfono tiene una buena cámara, usar el lector de código de barras. Tenés que tener en cuenta que aun si no te funciona el lector de códigos, podés buscar ingresando los primeros números que aparecen bajo el código del producto. (¡Como hacen las cajeras!). Actualmente conocemos más de 30mil productos (aunque todavía no sabemos los precios de todos). Si buscás un producto específico que te parece muy importante que esté y no aparece, por favor avisanos. 14 Capítulo 2. Índice Preciosa Documentation, Publicación dev 2.4.4 Paso 3: ¡Comparar los precios! Una vez que encontraste el producto que buscabas, haciendo click verás los detalles. Preciosa intenta decirte cuál es el precio más probable que conoce para la sucursal en la que estás(que elegiste en el paso 1) y te pide que la confirmes o la corrijas, con los botones SIoNO. Este paso es la esencia de Preciosa. Cuando vos actualizás un precio estás ayudando a todos los que consulten por ese producto más adelante. Te pedimos que seas solidario y envíes información fidedigna. ¡Acá está la inteligencia colectiva contra la inflación! Una vez que enviaste el precio que estás viendo en la góndola, ¡verás los mejores preciosque Preciosa conoce (gracias a los usuarios) en otros supermercados cercanos! Si sabés los precios para ese mismo producto, podés saber si te conviene o no comprarlo donde estás. ** ¿Te gusta la idea? ¡Buenísimo! Queremos hacer de Preciosa una herramienta útil para defender el bolsillo de todos los argentinos. Tenemos muchas ideas y funciones nuevas, pero necesitamos ser miles usando Preciosa. ¡Ayudanos a difundir! 2.5 Preguntas Frecuentes 2.5.1 ¿En qué lenguaje está programado Preciosa? La aplicación web (sitio + API) se basa en el framework Django_, programado principalmente con Python_. Para la API rest usamos ‘Django Rest Framework‘_ 2.5.2 ¿Puedo ayudar en las aplicaciones móviles? Por supuesto. El respositorio está acá. La aplicación cliente es común para las distintas plataformas está basada en HTML5 y javascript utilizando Phonegap_ 2.5.3 Quiero ayudar, ¿cómo hago? En primer lugar, ¡muchas gracias por eso! Primero anotate en la lista de correo de colaboradores. Luego fijate cómo trabajamos. 2.5.4 ¿Cómo trabajamos? En general tenemos milestones <https://github.com/mgaitan/preciosa/issues/milestones>, es decir, conjuntos de tareas prioritarias para los objetivos de corto plazo. Preciosa tiene algunos desarrolladores “core-committers” pero recibe activamente código de la comunidad a través de pull requests. Proponé tus ideas o preguntá qué es prioritario hacer en la lista de correo. Luego hacés un fork y pull request (contra la rama develop) de tus aportes! Si encontrás bugs, reportalos en el ‘issue tracker‘_. 2.5. Preguntas Frecuentes 15 Preciosa Documentation, Publicación dev 2.5.5 ¿Por qué programan y documentan en español? Preciosa comenzó como un proyecto particularmente orientado a Argentina, donde el problema del aumento de precios afecta cada vez más el poder adquisitivo de la población. No sólo se trata de construir una plataforma colaborativa, sino que el propio desarrollo del proyecto se realiza de manera abierta a la comunidad. En este contexto, la idea fue ampliar la base de potenciales colaboradores de Argentina (y Latinoamérica), rompiendo la barrera de la limitación idiomática. Sabemos y aceptamos que la lengua franca en el software es el inglés, pero creemos que esta excepción, por ahora, es válida. 2.6 Glosario EAN, UPC distintos tipos de códigos de barras. Scrapping Web Scraping es una técnica utilizada mediante programas de software para extraer información de sitios web. Usualmente, estos programas simulan la navegación de un humano en la World Wide Web ya sea utilizando el protocolo HTTP manualmente, o incrustando un navegador en una aplicación como puede ser Internet Explorer o Mozilla Firefox. JSON acrónimo de JavaScript Object Notation, es un formato ligero para el intercambio de datos. JSON es un subconjunto de la notación literal de objetos de JavaScript que no requiere el uso de XML. 2.7 Licencia Por las virtudes técnicas y ventajas estratégicas que aporta, el desarrollo de Preciosa es Software Libre, basado en la licencia AGPL. Podés leer el hilo de discusión en la lista de correo donde se discutió el tema. Además, el desarrollo abierto y comunitario, donde las ideas se discuten públicamente. Gracias a esta transparencia y la empatía con el fin social del proyecto, decenas de voluntarios han colaborado ad honorem. Gracias a ser También recibimos la colaboración y apoyo del equipo técnico de Huayra Linux, el sistema operativo libre del programa Conectar Igualdad. A partir de la versión 2.0, Huayra incluye a Preciosa como una de sus aplicaciones destacadas. 2.7.1 Términos Podés leer el texto completo de la licencia en el sitio de GNU. Preciosa, software colaborativo para relevar precios y encontrar mejores ofertas Copyright (c) 2014 Martín Gaitán and contributors. This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. 16 Capítulo 2. Índice Preciosa Documentation, Publicación dev You should have received a copy of the GNU Affero General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. 2.7. Licencia 17 Preciosa Documentation, Publicación dev 18 Capítulo 2. Índice CAPÍTULO 3 Preciosa en los medios Durante febrero de 2014 (cuando retomamos el proyecto, iniciado originalmente en junio de 2013) Preciosa, aún en desarrollo, tuvo muchísima repercusión en los medios: Entrevista en Radio Nacional Entrevista en Radio Madres/Universidad de Córdoba Nota en Agencia Télam. Entrevista en Canal 10 de Córdoba Y muchísimas aparaciones más. 19 Preciosa Documentation, Publicación dev 20 Capítulo 3. Preciosa en los medios CAPÍTULO 4 Indices and tables genindex modindex search 21 Preciosa Documentation, Publicación dev 22 Capítulo 4. Indices and tables Índice E EAN, 16 J JSON, 16 S Scrapping, 16 U UPC, 16 23
© Copyright 2025