From da91d3bde01712567c609ddaa1492d1d8445e13c Mon Sep 17 00:00:00 2001 From: Andros Fenollosa Date: Wed, 30 Aug 2017 11:34:15 +0200 Subject: [PATCH] Update images and README --- README.md | 301 ++++++++++++++++++++++++----- avisador.py | 47 +++-- templates/emails/notificacion.html | 14 ++ templates/emails/notificacion.txt | 3 + workshop/aplausos.jpg | Bin 0 -> 77683 bytes {static => workshop}/en.png | Bin {static => workshop}/es.png | Bin {images => workshop}/mailgun/1.jpg | Bin {images => workshop}/mailgun/2.jpg | Bin {images => workshop}/mailgun/3.jpg | Bin {images => workshop}/mailgun/4.jpg | Bin {images => workshop}/mailgun/5.jpg | Bin {images => workshop}/title.png | Bin 13 files changed, 297 insertions(+), 68 deletions(-) mode change 100644 => 100755 avisador.py create mode 100644 templates/emails/notificacion.html create mode 100644 templates/emails/notificacion.txt create mode 100644 workshop/aplausos.jpg rename {static => workshop}/en.png (100%) rename {static => workshop}/es.png (100%) rename {images => workshop}/mailgun/1.jpg (100%) rename {images => workshop}/mailgun/2.jpg (100%) rename {images => workshop}/mailgun/3.jpg (100%) rename {images => workshop}/mailgun/4.jpg (100%) rename {images => workshop}/mailgun/5.jpg (100%) rename {images => workshop}/title.png (100%) diff --git a/README.md b/README.md index 7eae86d..6418675 100644 --- a/README.md +++ b/README.md @@ -1,24 +1,24 @@ # PyConES17 -![Title](https://raw.githubusercontent.com/tanrax/flask-wallapop-watcher/master/images/title.png) +![Title](https://raw.githubusercontent.com/tanrax/flask-wallapop-watcher/master/workshop/title.png) -![English](https://raw.githubusercontent.com/tanrax/flask-wallapop-watcher/master/static/en.png) Workshop: Flask-wallapop-watcher (Application to monitor prices in Wallapop) +![English](https://raw.githubusercontent.com/tanrax/flask-wallapop-watcher/master/workshop/en.png) Workshop: Flask-wallapop-watcher (Application to monitor prices in Wallapop) -![Castellano](https://raw.githubusercontent.com/tanrax/flask-wallapop-watcher/master/static/es.png) Taller: Flask-wallapop-watcher (Aplicación para vigilar precios en Wallapop) +![Castellano](https://raw.githubusercontent.com/tanrax/flask-wallapop-watcher/master/workshop/es.png) Taller: Flask-wallapop-watcher (Aplicación para vigilar precios en Wallapop) ## Demo -![English](https://raw.githubusercontent.com/tanrax/flask-wallapop-watcher/master/static/en.png) Currently implemented on a real site: +![English](https://raw.githubusercontent.com/tanrax/flask-wallapop-watcher/master/workshop/en.png) Currently implemented on a real site: -![Castellano](https://raw.githubusercontent.com/tanrax/flask-wallapop-watcher/master/static/es.png) Actualmente esta implementado en un sitio real: +![Castellano](https://raw.githubusercontent.com/tanrax/flask-wallapop-watcher/master/workshop/es.png) Actualmente esta implementado en un sitio real: [wallaviso.com](http://wallaviso.com) ## Run (Ejecutar) -![English](https://raw.githubusercontent.com/tanrax/flask-wallapop-watcher/master/static/en.png) For the impatient, you can play with the finished exercise. You should download the code and execute the following commands. +![English](https://raw.githubusercontent.com/tanrax/flask-wallapop-watcher/master/workshop/en.png) For the impatient, you can play with the finished exercise. You should download the code and execute the following commands. -![Castellano](https://raw.githubusercontent.com/tanrax/flask-wallapop-watcher/master/static/es.png) Para los impacientes, podéis jugar con el ejercicio acabado. Debéis descargar el código y ejecutar los siguientes comandos. +![Castellano](https://raw.githubusercontent.com/tanrax/flask-wallapop-watcher/master/workshop/es.png) Para los impacientes, podéis jugar con el ejercicio acabado. Debéis descargar el código y ejecutar los siguientes comandos. ```bash cd flask-wallapop-watcher @@ -32,9 +32,9 @@ python3 models.py db upgrade python3 app.py ```` -![English](https://raw.githubusercontent.com/tanrax/flask-wallapop-watcher/master/static/en.png) Then open in your favorite browser, which will possibly be the fantastic Firefox, a new tab with [http://127.0.0.1:5000](http://127.0.0.1:5000) +![English](https://raw.githubusercontent.com/tanrax/flask-wallapop-watcher/master/workshop/en.png) Then open in your favorite browser, which will possibly be the fantastic Firefox, a new tab with [http://127.0.0.1:5000](http://127.0.0.1:5000) -![Castellano](https://raw.githubusercontent.com/tanrax/flask-wallapop-watcher/master/static/es.png) Después abrir en tu navegador favorito, que posiblemente será el fantástico Firefox, una pestaña nueva con [http://127.0.0.1:5000](http://127.0.0.1:5000) +![Castellano](https://raw.githubusercontent.com/tanrax/flask-wallapop-watcher/master/workshop/es.png) Después abrir en tu navegador favorito, que posiblemente será el fantástico Firefox, una pestaña nueva con [http://127.0.0.1:5000](http://127.0.0.1:5000) --- ## Workshop (Taller) @@ -61,9 +61,9 @@ ping -c 5 google.com #### 1.1 Ready? -![English](https://raw.githubusercontent.com/tanrax/flask-wallapop-watcher/master/static/en.png) We prepare our virtual environment. +![English](https://raw.githubusercontent.com/tanrax/flask-wallapop-watcher/master/workshop/en.png) We prepare our virtual environment. -![Castellano](https://raw.githubusercontent.com/tanrax/flask-wallapop-watcher/master/static/es.png) Preparamos nuestro entorno virtual. +![Castellano](https://raw.githubusercontent.com/tanrax/flask-wallapop-watcher/master/workshop/es.png) Preparamos nuestro entorno virtual. ```bash mkdir flask-wallapop-watcher @@ -78,9 +78,9 @@ pip3 install -r requirements.txt --- #### 1.1 Hello PyConES17 -![English](https://raw.githubusercontent.com/tanrax/flask-wallapop-watcher/master/static/en.png) Template Flask. We created a new file called **app.py**. +![English](https://raw.githubusercontent.com/tanrax/flask-wallapop-watcher/master/workshop/en.png) Template Flask. We created a new file called **app.py**. -![Castellano](https://raw.githubusercontent.com/tanrax/flask-wallapop-watcher/master/static/es.png) Plantilla Flask. Creamos un nuevo archivo llamado **app.py**. +![Castellano](https://raw.githubusercontent.com/tanrax/flask-wallapop-watcher/master/workshop/es.png) Plantilla Flask. Creamos un nuevo archivo llamado **app.py**. ```python3 from flask import Flask @@ -99,9 +99,9 @@ if __name__ == '__main__': app.run() ``` -![English](https://raw.githubusercontent.com/tanrax/flask-wallapop-watcher/master/static/en.png) We run and check that everything works. +![English](https://raw.githubusercontent.com/tanrax/flask-wallapop-watcher/master/workshop/en.png) We run and check that everything works. -![Castellano](https://raw.githubusercontent.com/tanrax/flask-wallapop-watcher/master/static/es.png) Ejecutamos y comprobamos que todo funciona. +![Castellano](https://raw.githubusercontent.com/tanrax/flask-wallapop-watcher/master/workshop/es.png) Ejecutamos y comprobamos que todo funciona. ```bash python3 app.py @@ -114,9 +114,9 @@ http://127.0.0.1:5000 --- #### 1.2 Templates -![English](https://raw.githubusercontent.com/tanrax/flask-wallapop-watcher/master/static/en.png) We created a folder called **templates**. Inside we make two more folders: **layouts** and **items**. In **layouts** we will make a new one with the name **master.html**. +![English](https://raw.githubusercontent.com/tanrax/flask-wallapop-watcher/master/workshop/en.png) We created a folder called **templates**. Inside we make two more folders: **layouts** and **items**. In **layouts** we will make a new one with the name **master.html**. -![Castellano](https://raw.githubusercontent.com/tanrax/flask-wallapop-watcher/master/static/es.png) Creamos una carpeta llamada **templates**. Dentro dos más: **layouts** y **items**. En **layouts** haremos uno nuevo con el nombre **master.html**. +![Castellano](https://raw.githubusercontent.com/tanrax/flask-wallapop-watcher/master/workshop/es.png) Creamos una carpeta llamada **templates**. Dentro dos más: **layouts** y **items**. En **layouts** haremos uno nuevo con el nombre **master.html**. ```jinja2 @@ -139,9 +139,9 @@ http://127.0.0.1:5000 ``` -![English](https://raw.githubusercontent.com/tanrax/flask-wallapop-watcher/master/static/en.png) In **items** we are going to have our first real page that will inherit from **master.html**. Within **items** we create **searcher.html**. +![English](https://raw.githubusercontent.com/tanrax/flask-wallapop-watcher/master/workshop/en.png) In **items** we are going to have our first real page that will inherit from **master.html**. Within **items** we create **searcher.html**. -![Castellano](https://raw.githubusercontent.com/tanrax/flask-wallapop-watcher/master/static/es.png) En **items** vamos a tener nuestra primera página real que va a heredar de **master.html**. Dentro de **items** creamos **buscador.html**. +![Castellano](https://raw.githubusercontent.com/tanrax/flask-wallapop-watcher/master/workshop/es.png) En **items** vamos a tener nuestra primera página real que va a heredar de **master.html**. Dentro de **items** creamos **buscador.html**. ```jinja2 {% extends 'layouts/master.html' %} @@ -152,9 +152,9 @@ http://127.0.0.1:5000 {% endblock %} ``` -![English](https://raw.githubusercontent.com/tanrax/flask-wallapop-watcher/master/static/en.png) You update **app.py** to work with our template engine. +![English](https://raw.githubusercontent.com/tanrax/flask-wallapop-watcher/master/workshop/en.png) You update **app.py** to work with our template engine. -![Castellano](https://raw.githubusercontent.com/tanrax/flask-wallapop-watcher/master/static/es.png) Actulizamos **app.py** para que trabaje nuestro motor de plantillas. +![Castellano](https://raw.githubusercontent.com/tanrax/flask-wallapop-watcher/master/workshop/es.png) Actulizamos **app.py** para que trabaje nuestro motor de plantillas. ```python3 from flask import Flask, render_template @@ -174,9 +174,9 @@ if __name__ == '__main__': app.run() ``` -![English](https://raw.githubusercontent.com/tanrax/flask-wallapop-watcher/master/static/en.png) We create the second page where we will have our searches stored. Within **items** we create a new file with the name of **programadas.html**. +![English](https://raw.githubusercontent.com/tanrax/flask-wallapop-watcher/master/workshop/en.png) We create the second page where we will have our searches stored. Within **items** we create a new file with the name of **programadas.html**. -![Castellano](https://raw.githubusercontent.com/tanrax/flask-wallapop-watcher/master/static/es.png) Creamos la segunda página donde tendremos nuestras busquedas almacenadas. Dentro de **items** creamos un fichero nuevo con el nombre de **programadas.html**. +![Castellano](https://raw.githubusercontent.com/tanrax/flask-wallapop-watcher/master/workshop/es.png) Creamos la segunda página donde tendremos nuestras busquedas almacenadas. Dentro de **items** creamos un fichero nuevo con el nombre de **programadas.html**. ```jinja2 {% extends 'layouts/master.html' %} @@ -187,9 +187,9 @@ if __name__ == '__main__': {% endblock %} ``` -![English](https://raw.githubusercontent.com/tanrax/flask-wallapop-watcher/master/static/en.png) We update **app.py** with the new page. +![English](https://raw.githubusercontent.com/tanrax/flask-wallapop-watcher/master/workshop/en.png) We update **app.py** with the new page. -![Castellano](https://raw.githubusercontent.com/tanrax/flask-wallapop-watcher/master/static/es.png) Actulizamos **app.py** con la nueva página. +![Castellano](https://raw.githubusercontent.com/tanrax/flask-wallapop-watcher/master/workshop/es.png) Actulizamos **app.py** con la nueva página. ```python3 from flask import Flask, render_template @@ -214,9 +214,9 @@ if __name__ == '__main__': app.run() ``` -![English](https://raw.githubusercontent.com/tanrax/flask-wallapop-watcher/master/static/en.png) As a final detail we will make our browser buttons have the correct routes. +![English](https://raw.githubusercontent.com/tanrax/flask-wallapop-watcher/master/workshop/en.png) As a final detail we will make our browser buttons have the correct routes. -![Castellano](https://raw.githubusercontent.com/tanrax/flask-wallapop-watcher/master/static/es.png) Como último detalle haremos que nuestros botones del navegador tengan las rutas correctas. +![Castellano](https://raw.githubusercontent.com/tanrax/flask-wallapop-watcher/master/workshop/es.png) Como último detalle haremos que nuestros botones del navegador tengan las rutas correctas. ```jinja2 @@ -242,9 +242,9 @@ if __name__ == '__main__': --- #### 1.3 Forms -![English](https://raw.githubusercontent.com/tanrax/flask-wallapop-watcher/master/static/en.png) We make the new file **forms.py**. +![English](https://raw.githubusercontent.com/tanrax/flask-wallapop-watcher/master/workshop/en.png) We make the new file **forms.py**. -![Castellano](https://raw.githubusercontent.com/tanrax/flask-wallapop-watcher/master/static/es.png) Realizamos el nuevo archivo **forms.py**. +![Castellano](https://raw.githubusercontent.com/tanrax/flask-wallapop-watcher/master/workshop/es.png) Realizamos el nuevo archivo **forms.py**. ```python3 from flask_wtf import FlaskForm @@ -257,9 +257,9 @@ class SearchForm(FlaskForm): price_max = IntegerField('Precio', [NumberRange(1, message='No puede ser inferior a 1'), Optional()]) ``` -![English](https://raw.githubusercontent.com/tanrax/flask-wallapop-watcher/master/static/en.png) We load it and pass it to the template. +![English](https://raw.githubusercontent.com/tanrax/flask-wallapop-watcher/master/workshop/en.png) We load it and pass it to the template. -![Castellano](https://raw.githubusercontent.com/tanrax/flask-wallapop-watcher/master/static/es.png) Lo cargamos y se lo pasamos a la plantilla. +![Castellano](https://raw.githubusercontent.com/tanrax/flask-wallapop-watcher/master/workshop/es.png) Lo cargamos y se lo pasamos a la plantilla. ```python3 from flask import Flask, render_template @@ -287,9 +287,9 @@ if __name__ == '__main__': app.run() ``` -![English](https://raw.githubusercontent.com/tanrax/flask-wallapop-watcher/master/static/en.png) We print the fields with a **loop** in our template **buscador.html**. +![English](https://raw.githubusercontent.com/tanrax/flask-wallapop-watcher/master/workshop/en.png) We print the fields with a **loop** in our template **buscador.html**. -![Castellano](https://raw.githubusercontent.com/tanrax/flask-wallapop-watcher/master/static/es.png) Imprimimos los campos con un **bucle** en nuestra plantilla **buscador.html**. +![Castellano](https://raw.githubusercontent.com/tanrax/flask-wallapop-watcher/master/workshop/es.png) Imprimimos los campos con un **bucle** en nuestra plantilla **buscador.html**. ```jinja2 {% extends 'layouts/master.html' %} @@ -331,9 +331,9 @@ if __name__ == '__main__': --- #### 1.4 Search -![English](https://raw.githubusercontent.com/tanrax/flask-wallapop-watcher/master/static/en.png) It's time for fun. First we update our **app.py** to get the form data if you pass the validations. Then, with that information, we will make a call to the Wallapop API. We will only need the URL that they use in your APP. With **urllib3** we will have all the results in a simple dictionary. Which is great, since it is easy to iterate within our template. +![English](https://raw.githubusercontent.com/tanrax/flask-wallapop-watcher/master/workshop/en.png) It's time for fun. First we update our **app.py** to get the form data if you pass the validations. Then, with that information, we will make a call to the Wallapop API. We will only need the URL that they use in your APP. With **urllib3** we will have all the results in a simple dictionary. Which is great, since it is easy to iterate within our template. -![Castellano](https://raw.githubusercontent.com/tanrax/flask-wallapop-watcher/master/static/es.png) Ha llegado la hora de lo divertido. Primero actulizamos nuestro **app.py** para obtener los datos del formulario si pasa las validaciones. Después, con esa información, haremos una llamada al API de Wallapop. Solo necesitaremos la URL que utilizan en su APP. Con *urllib3* tendremos todos los resultados en un sencillo diccionario. Lo cual es magnífico, ya que es fácil de iterar dentro de nuestra plantilla. +![Castellano](https://raw.githubusercontent.com/tanrax/flask-wallapop-watcher/master/workshop/es.png) Ha llegado la hora de lo divertido. Primero actulizamos nuestro **app.py** para obtener los datos del formulario si pasa las validaciones. Después, con esa información, haremos una llamada al API de Wallapop. Solo necesitaremos la URL que utilizan en su APP. Con *urllib3* tendremos todos los resultados en un sencillo diccionario. Lo cual es magnífico, ya que es fácil de iterar dentro de nuestra plantilla. ```python3 from flask import Flask, render_template, request @@ -382,9 +382,9 @@ if __name__ == '__main__': app.run() ``` -![English](https://raw.githubusercontent.com/tanrax/flask-wallapop-watcher/master/static/en.png) And in our template of **buscador.html**. +![English](https://raw.githubusercontent.com/tanrax/flask-wallapop-watcher/master/workshop/en.png) And in our template of **buscador.html**. -![Castellano](https://raw.githubusercontent.com/tanrax/flask-wallapop-watcher/master/static/es.png) Y en nuestra plantilla de **buscador.html**. +![Castellano](https://raw.githubusercontent.com/tanrax/flask-wallapop-watcher/master/workshop/es.png) Y en nuestra plantilla de **buscador.html**. ```jinja2 {% extends 'layouts/master.html' %} @@ -435,16 +435,16 @@ if __name__ == '__main__': {% endblock %} ``` -![English](https://raw.githubusercontent.com/tanrax/flask-wallapop-watcher/master/static/en.png) And ... *Voilá*. +![English](https://raw.githubusercontent.com/tanrax/flask-wallapop-watcher/master/workshop/en.png) And ... *Voilá*. -![Castellano](https://raw.githubusercontent.com/tanrax/flask-wallapop-watcher/master/static/es.png) Y... *Voilá*. +![Castellano](https://raw.githubusercontent.com/tanrax/flask-wallapop-watcher/master/workshop/es.png) Y... *Voilá*. ### Break (Descanso) - 10 min -![English](https://raw.githubusercontent.com/tanrax/flask-wallapop-watcher/master/static/en.png) We debug bugs and prepare for the next point. +![English](https://raw.githubusercontent.com/tanrax/flask-wallapop-watcher/master/workshop/en.png) We debug bugs and prepare for the next point. -![Castellano](https://raw.githubusercontent.com/tanrax/flask-wallapop-watcher/master/static/es.png) Depuramos bugs y nos preparamos para el siguiente punto. +![Castellano](https://raw.githubusercontent.com/tanrax/flask-wallapop-watcher/master/workshop/es.png) Depuramos bugs y nos preparamos para el siguiente punto. --- ### Part 2 - Databases and CRUD with Flask (Bases de datos y CRUD elementos con Flask) @@ -1023,9 +1023,9 @@ if __name__ == '__main__': --- ### Break (Descanso) - 10 min -![English](https://raw.githubusercontent.com/tanrax/flask-wallapop-watcher/master/static/en.png) We take air for the last part. Otherwise, we make as we go to the bathroom and do not come back. +![English](https://raw.githubusercontent.com/tanrax/flask-wallapop-watcher/master/workshop/en.png) We take air for the last part. Otherwise, we make as we go to the bathroom and do not come back. -![Castellano](https://raw.githubusercontent.com/tanrax/flask-wallapop-watcher/master/static/es.png) Cogemos aire para la última parte. En caso contrario, hacemos como que vamos al baño y nos piramos. +![Castellano](https://raw.githubusercontent.com/tanrax/flask-wallapop-watcher/master/workshop/es.png) Cogemos aire para la última parte. En caso contrario, hacemos como que vamos al baño y nos piramos. --- ### Part 3 - Sending emails with new items (Envío de emails con nuevos elementos) @@ -1070,23 +1070,23 @@ hello PyConES17 [ES] Creamos una nueva cuenta. -![step 1](https://github.com/tanrax/flask-wallapop-watcher/raw/master/images/mailgun/1.jpg) +![step 1](https://github.com/tanrax/flask-wallapop-watcher/raw/master/workshop/mailgun/1.jpg) [ES] Confirmamos nuestra cuenta por el enlace que nos han enviado a nuestro email. -![step 2](https://github.com/tanrax/flask-wallapop-watcher/raw/master/images/mailgun/2.jpg) +![step 2](https://github.com/tanrax/flask-wallapop-watcher/raw/master/workshop/mailgun/2.jpg) [ES] Al pulsar sobre el enlace nos llevará a esta página. Pulsamos en *Domains*. -![step 3](https://github.com/tanrax/flask-wallapop-watcher/raw/master/images/mailgun/3.jpg) +![step 3](https://github.com/tanrax/flask-wallapop-watcher/raw/master/workshop/mailgun/3.jpg) [ES] Entramos en nuestro dominio activo. -![step 4](https://github.com/tanrax/flask-wallapop-watcher/raw/master/images/mailgun/4.jpg) +![step 4](https://github.com/tanrax/flask-wallapop-watcher/raw/master/workshop/mailgun/4.jpg) [ES] Aquí tendremos los accesos que necesitaremos. Dejamos abierta esta página. -![step 5](https://github.com/tanrax/flask-wallapop-watcher/raw/master/images/mailgun/5.jpg) +![step 5](https://github.com/tanrax/flask-wallapop-watcher/raw/master/workshop/mailgun/5.jpg) #### 3.3 Send email @@ -1166,6 +1166,207 @@ if __name__ == "__main__": [ES] Revisamos nuestra bandeja de entrada. En caso contrario buscamos en *spam*. -#### 3.4 History +#### 3.4 Notification -[ES] Estamos listos para notificar. La lógica será lo más sencilla posible: buscamos todos los productos que tenga la palabra almacenada. Si el último resultado es el mismo que tenemos guardado, no hacemos nada. Si es diferente, lo guardamos y enviamos un email. \ No newline at end of file +[ES] Estamos listos para realizar el sistema de notificación. La lógica será de lo más sencilla: buscamos todos los productos que tenga la palabra que tenemos guarda. Nos quedamos con la primera *id*. Si la *id* es la misma que tenemos en la misma de la base de datos, no hacemos nada. Si es diferente, actualizamos la base de datos y enviamos un email. + +[ES] Abrimos **avisador.py**. Primero, importamos nuestra funcion para obtener los elementos del API de Wallapop. + +```python3 +from app import app, get_resultados +``` + +[ES] Además, importamos nuestra tabla con las palabras guardadas. + +```python3 +from models import db, Programado +``` + +[ES] Recorremos todas las palabras almacenadas. + +```python3 +@manager.command +def send_email(): + programados = Programado.query.all() + for item in programados: +``` + +[ES] Obtenemos el primer *id*. Que lo usaremos para comparar. + +```python3 +@manager.command +def send_email(): + programados = Programado.query.all() + for item in programados: + # Get last id + results = get_resultados(item.title) + itemId = results[0]['itemId'] + if int(itemId) != item.last_item: +``` + +[ES] Para actualizar en SQLAlchemy hay que obtener el resultado, modificar el objeto, y volverlo. El siguiente ejemplo modifico la columna *gana* que es un *boolean* y la columna *nombre* que es un *string*. + +```python3 +spartano = User.query.filter_by(id=1).first() +spartano.gana = False +spartano.nombre = 'Leónidas' +db.session.add(spartano) +db.session.commit() +``` + +[ES] En nuestro código quedaría implementado de la siguiente forma. + +```python3 +@manager.command +def send_email(): + programados = Programado.query.all() + for item in programados: + # Get last id + results = get_resultados(item.title) + itemId = results[0]['itemId'] + # Update last item in database + if int(itemId) != item.last_item: + programado_update = Programado.query.filter_by(id=item.id).first() + programado_update.last_item = itemId + db.session.add(programado_update) + try: + db.session.commit() + except: + db.session.rollback() +``` + +[ES] Ya solo nos queda enviar el *email*. + +```python3 +@manager.command +def send_email(): + programados = Programado.query.all() + for item in programados: + # Get last id + results = get_resultados(item.title) + itemId = results[0]['itemId'] + # Update last item in database + if int(itemId) != item.last_item: + programado_update = Programado.query.filter_by(id=item.id).first() + programado_update.last_item = itemId + db.session.add(programado_update) + try: + db.session.commit() + except: + db.session.rollback() + # Send email + msg = Message( + "Nuevo aviso", + sender="no-reply@pycon17.es", + recipients=["tu email"] + ) + msg.body = render_template('emails/notificacion.txt', title=results[0]['title'], id=itemId) + msg.html = render_template('emails/notificacion.html', title=results[0]['title'], id=itemId) + mail.send(msg) +``` + +[ES] Todo junto quedaría. + + +```python3 +#!/usr/bin/env python3 +from flask import render_template +from flask_script import Manager +from app import app, get_resultados +from flask_mail import Mail, Message +from models import db, Programado + +app.config.update( + MAIL_SERVER='smtp.mailgun.org', + MAIL_PORT=587, + MAIL_USERNAME='tu_default_smtp_login', + MAIL_PASSWORD='tu_default_password' +) +mail = Mail(app) + +manager = Manager(app) + +@manager.command +def send_email(): + programados = Programado.query.all() + for item in programados: + # Get last id + results = get_resultados(item.title) + itemId = results[0]['itemId'] + # Update last item in database + if int(itemId) != item.last_item: + programado_update = Programado.query.filter_by(id=item.id).first() + programado_update.last_item = itemId + db.session.add(programado_update) + try: + db.session.commit() + except: + db.session.rollback() + # Send email + msg = Message( + "Nuevo aviso", + sender="no-reply@pycon17.es", + recipients=["tu email"] + ) + msg.body = render_template('emails/notificacion.txt', title=results[0]['title'], id=itemId) + msg.html = render_template('emails/notificacion.html', title=results[0]['title'], id=itemId) + mail.send(msg) + +if __name__ == "__main__": + manager.run() +``` + +[ES] Ya no estoy enviando un texto sencillo en el *email*. Necesito la magia de *flask* con su *render_template*. Puedes observar como hago uso de dos plantillas donde paso dos variables. El *titulo* y la *id* del item. + +[ES] Creamos una carpeta nueva dentro de *templates* con el nombre *emails*. Y dentro de esta, el archivo *notificacion.html* y *notificacion.txt*. Quedará la siguiente estructura. + +```bash +--> templates + --> emails + --> notificacion.html + --> notificacion.txt + --> items + --> buscador.html + --> programadas.html + --> layouts + --> master.html +``` + +[ES] Abrimos *notificacion.txt* e introducimos. + +```txt +Aviso + +{{ title }} + +http://p.wallapop.com/i/{{ id }}?_pid=web&_me=www&campaign=mobile_item +``` + +[ES] Y en *notificacion.html* lo siguiente. + +```html + + + + + + + Notificacion + + +

Aviso

+

{{ title }}

+ Ver + + +``` + +[ES] ¡E voilà! Ya hemos terminado. Solo tendrás que ejecutar el comando personalizado en cada ocasion que desees revisar nuevos items. De la misma forma que antes. + +```bash +./avisador.py send_email +``` + +[ES] Mi recomendación es ejecutarlo en un *cron* cada hora y listo. + +![aplausos](https://raw.githubusercontent.com/tanrax/flask-wallapop-watcher/master/workshop/aplausos.jpg) diff --git a/avisador.py b/avisador.py old mode 100644 new mode 100755 index aecb59e..6b19a70 --- a/avisador.py +++ b/avisador.py @@ -1,9 +1,10 @@ +#!/usr/bin/env python3 +from flask import render_template from flask_script import Manager +from app import app, get_resultados from flask_mail import Mail, Message from models import db, Programado -from app import app - app.config.update( MAIL_SERVER='smtp.mailgun.org', MAIL_PORT=587, @@ -15,21 +16,31 @@ mail = Mail(app) manager = Manager(app) @manager.command -def buscar_y_notificar(): - msg = Message( - "Nuevo aviso", - sender="no-reply@pycon17.es", - recipients=["andros@fenollosa.email"] - ) - msg.body = "testing" - msg.html = "testing" - mail.send(msg) - - -@manager.command -def test(): - programado_all = Programado.query.all() - app.get_resultados() +def send_email(): + programados = Programado.query.all() + for item in programados: + # Get last id + results = get_resultados(item.title) + itemId = results[0]['itemId'] + # Update last item in database + if int(itemId) != item.last_item: + programado_update = Programado.query.filter_by(id=item.id).first() + programado_update.last_item = itemId + db.session.add(programado_update) + try: + db.session.commit() + except: + db.session.rollback() + # Send email + msg = Message( + "Nuevo aviso", + sender="no-reply@pycon17.es", + recipients=["andros@fenollosa.email"] + ) + msg.body = render_template('emails/notificacion.txt', title=results[0]['title'], id=itemId) + msg.html = render_template('emails/notificacion.html', title=results[0]['title'], id=itemId) + mail.send(msg) if __name__ == "__main__": - manager.run() \ No newline at end of file + manager.run() + diff --git a/templates/emails/notificacion.html b/templates/emails/notificacion.html new file mode 100644 index 0000000..519fcbc --- /dev/null +++ b/templates/emails/notificacion.html @@ -0,0 +1,14 @@ + + + + + + + Notificacion + + +

Aviso

+

{{ title }}

+ Ver + + \ No newline at end of file diff --git a/templates/emails/notificacion.txt b/templates/emails/notificacion.txt new file mode 100644 index 0000000..39f6ca0 --- /dev/null +++ b/templates/emails/notificacion.txt @@ -0,0 +1,3 @@ +Aviso +{{ title }} +http://p.wallapop.com/i/{{ id }}?_pid=web&_me=www&campaign=mobile_item \ No newline at end of file diff --git a/workshop/aplausos.jpg b/workshop/aplausos.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e60b9655196e56ba66a825831bf63204d1685afc GIT binary patch literal 77683 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%0ASzy|D=#I5+CjS663Bc{_ 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