seitime-frappe/frappe/docs/user/es/tutorial/task-runner.md
Narciso E. Núñez Arias e081dff979 Translation of the Tutorial And Videos section to Spanish (#3718)
* Add basic files structure for spanish translation of the doc

* Translate the video tutorial index page

* Translate Before Start page

* Translate What is an app page

* Translate the Bench page

* Translate Conslusion page of the tutorial

* Translate to spanish Tutorial Index page

* Translate to spanish Reports page

* Translate to Spanish Roles Page

* Translate to Spanish the Tutorial Model Page

* Translate to Spanish the tutorial Single Doctypes page

* Translate to Spanish the tutorial Doctype files structure page

* Translate to Spanish the tutorial Start Bench page

* Translate to Spanish the tutorial New App page

* Translate to Spanish the tutorial Client Side Script page

* Translate to Spanish the tutorial Users and records page

* Translate to Spanish the tutorial Setting Up the site page

* Translate to Spanish the tutorial Task Runner page

* Translate to Spanish the tutorial Controllers Page

* Translate to Spanish the tutorial Doctypes page

* Translate to Spanish the tutorial Naming And Linking page

* Translate to Spanish the tutorial Web Views page
2017-07-19 10:29:16 +05:30

77 lines
2.7 KiB
Markdown

# Tareas Programadas
Finalmente, una aplicación también tiene que mandar notificaciones de email y hacer otros tipos de tareas programadas. En Frappe, si tienes el bench configurado, el programador de tareas es configurado vía Celery usando Redis Queue.
Para agregar un nuevo manejador(Handler) de tareas, ir a `hooks.py` y agrega un nuevo manejador. Los manejadores (Handlers) por defecto son `all`, `daily`, `weekly`, `monthly`. El manejador `all` es llamado cada 3 minutos por defecto.
# Tareas Programadas
# ---------------
scheduler_events = {
"daily": [
"library_management.tasks.daily"
],
}
Aquí hacemos referencia a una función Python que va a ser ejecutada diariamente. Vamos a ver como se ve esta función:
# Copyright (c) 2013, Frappe
# For license information, please see license.txt
from __future__ import unicode_literals
import frappe
from frappe.utils import datediff, nowdate, format_date, add_days
def daily():
loan_period = frappe.db.get_value("Library Management Settings",
None, "loan_period")
overdue = get_overdue(loan_period)
for member, items in overdue.iteritems():
content = """<h2>Following Items are Overdue</h2>
<p>Please return them as soon as possible</p><ol>"""
for i in items:
content += "<li>{0} ({1}) due on {2}</li>".format(i.article_name,
i.article,
format_date(add_days(i.transaction_date, loan_period)))
content += "</ol>"
recipient = frappe.db.get_value("Library Member", member, "email_id")
frappe.sendmail(recipients=[recipient],
sender="test@example.com",
subject="Library Articles Overdue", content=content, bulk=True)
def get_overdue(loan_period):
# check for overdue articles
today = nowdate()
overdue_by_member = {}
articles_transacted = []
for d in frappe.db.sql("""select name, article, article_name,
library_member, member_name
from `tabLibrary Transaction`
order by transaction_date desc, modified desc""", as_dict=1):
if d.article in articles_transacted:
continue
if d.transaction_type=="Issue" and \
datediff(today, d.transaction_date) > loan_period:
overdue_by_member.setdefault(d.library_member, [])
overdue_by_member[d.library_member].append(d)
articles_transacted.append(d.article)
Podemos pegar el código anterior en cualquier módulo de Python que sea accesible. La ruta es definida en `hooks.py`, por lo que para nuestro propósito vamos a poner el código en el archivo `library_management/tasks.py`.
Nota:
1. Obtenemos el período de prestamo desde **Library Management Settings** usando la función `frappe.db.get_value`.
1. Ejecutamos una consulta en la base de datos usando la función `frappe.db.sql`
1. Los Email son enviados usando `frappe.sendmail`
{next}