lims_administrative_task: ref task scheduling

This commit is contained in:
Adrián Bernardi 2021-06-01 19:40:41 -03:00
parent 7c4b81a6d6
commit 8cde29fb2b
8 changed files with 226 additions and 144 deletions

View File

@ -15,7 +15,6 @@ def register():
task.AdministrativeTask,
task.EditAdministrativeTaskStart,
task.AdministrativeTaskProgram,
task.GenerateAdministrativeTaskStart,
department.Department,
user.User,
configuration.Configuration,

View File

@ -95,38 +95,58 @@ msgctxt "field:lims.administrative.task.edit.start,responsible:"
msgid "Responsible User"
msgstr "Usuario responsable"
msgctxt "field:lims.administrative.task.generate.start,end_date:"
msgid "End Date"
msgstr "Fecha de finalización"
msgctxt "field:lims.administrative.task.generate.start,start_date:"
msgid "Start Date"
msgstr "Fecha de inicio"
msgctxt "field:lims.administrative.task.generate.start,task_program:"
msgid "Administrative Task Scheduling"
msgstr "Programación de Tarea administrativa"
msgctxt "field:lims.administrative.task.generate.start,tasks:"
msgid "Tasks"
msgstr "Tareas"
msgctxt "field:lims.administrative.task.program,description:"
msgid "Description"
msgstr "Descripción"
msgctxt "field:lims.administrative.task.program,frequency:"
msgid "Frequency"
msgctxt "field:lims.administrative.task.program,detail_frequence:"
msgid "Frequence"
msgstr "Frecuencia"
msgctxt "field:lims.administrative.task.program,detail_frequence_selection:"
msgid "Frequence"
msgstr "Frecuencia"
msgctxt "field:lims.administrative.task.program,end_date:"
msgid "End Date"
msgstr "Fecha de finalización"
msgctxt "field:lims.administrative.task.program,end_repetition:"
msgid "Repetition Qty."
msgstr "Cant. de Repeticiones"
msgctxt "field:lims.administrative.task.program,finish_selection:"
msgid "Ends on"
msgstr "Finalizar en"
msgctxt "field:lims.administrative.task.program,frequence_selection:"
msgid "Select Frequence"
msgstr "Seleccione frecuencia"
msgctxt "field:lims.administrative.task.program,latest_date:"
msgid "Latest scheduled date"
msgstr "Última fecha programada"
msgctxt "field:lims.administrative.task.program,only_workdays:"
msgid "Allow working days only"
msgstr "Permitir solamente días laborables"
msgctxt "field:lims.administrative.task.program,responsible:"
msgid "Responsible User"
msgstr "Usuario responsable"
msgctxt "field:lims.administrative.task.program,specific_day:"
msgid "Specific Day"
msgstr "Día específico"
msgctxt "field:lims.administrative.task.program,specific_time:"
msgid "Specific Time"
msgstr "Horario específico"
msgctxt "field:lims.administrative.task.program,start_date:"
msgid "Start Date"
msgstr "Fecha de inicio"
msgctxt "field:lims.administrative.task.program,type:"
msgid "Type"
msgstr "Tipo"
@ -286,6 +306,18 @@ msgctxt "model:ir.message,text:msg_no_task_sequence"
msgid "There is no task sequence configured"
msgstr "No hay una secuencia de tarea configurada"
msgctxt "model:ir.model.button,confirm:task_program_create_tasks_button"
msgid "Are you sure you want to generate new administrative tasks?"
msgstr "¿Está seguro que quiere generar nuevas tareas administrativas?"
msgctxt "model:ir.model.button,help:task_program_create_tasks_button"
msgid "Generate administrative tasks"
msgstr "Generar tareas administrativas"
msgctxt "model:ir.model.button,string:task_program_create_tasks_button"
msgid "Generate"
msgstr "Generar"
msgctxt "model:ir.sequence,name:seq_task"
msgid "Administrative Task"
msgstr "Tarea administrativa"
@ -342,10 +374,6 @@ msgctxt "model:lims.administrative.task.edit.start,name:"
msgid "Edit Administrative Task"
msgstr "Editar Tarea administrativa"
msgctxt "model:lims.administrative.task.generate.start,name:"
msgid "Generate Administrative Tasks Calendar"
msgstr "Generar Calendario de Tareas administrativas"
msgctxt "model:lims.administrative.task.program,name:"
msgid "Administrative Task Scheduling"
msgstr "Programación de Tarea administrativa"
@ -430,22 +458,108 @@ msgctxt "selection:lims.administrative.task.edit.start,priority:"
msgid "Very Low"
msgstr "Muy baja"
msgctxt "selection:lims.administrative.task.program,frequency:"
msgctxt ""
"selection:lims.administrative.task.program,detail_frequence_selection:"
msgid "Days"
msgstr "Días"
msgctxt ""
"selection:lims.administrative.task.program,detail_frequence_selection:"
msgid "Hours"
msgstr "Horas"
msgctxt ""
"selection:lims.administrative.task.program,detail_frequence_selection:"
msgid "Minutes"
msgstr "Minutos"
msgctxt ""
"selection:lims.administrative.task.program,detail_frequence_selection:"
msgid "Months"
msgstr "Meses"
msgctxt ""
"selection:lims.administrative.task.program,detail_frequence_selection:"
msgid "Weeks"
msgstr "Semanas"
msgctxt ""
"selection:lims.administrative.task.program,detail_frequence_selection:"
msgid "Years"
msgstr "Años"
msgctxt "selection:lims.administrative.task.program,finish_selection:"
msgid "Date"
msgstr "Fecha"
msgctxt "selection:lims.administrative.task.program,finish_selection:"
msgid "Quantity"
msgstr "Cantidad"
msgctxt "selection:lims.administrative.task.program,frequence_selection:"
msgid "Customize"
msgstr "Personalizada"
msgctxt "selection:lims.administrative.task.program,frequence_selection:"
msgid "Daily"
msgstr "Diaria"
msgctxt "selection:lims.administrative.task.program,frequency:"
msgctxt "selection:lims.administrative.task.program,frequence_selection:"
msgid "Every 15 days"
msgstr "Cada 15 días"
msgctxt "selection:lims.administrative.task.program,frequence_selection:"
msgid "Hourly"
msgstr "Cada hora"
msgctxt "selection:lims.administrative.task.program,frequence_selection:"
msgid "Monthly"
msgstr "Mensual"
msgctxt "selection:lims.administrative.task.program,frequency:"
msgctxt "selection:lims.administrative.task.program,frequence_selection:"
msgid "Weekly"
msgstr "Semanal"
msgctxt "selection:lims.administrative.task.program,frequency:"
msgctxt "selection:lims.administrative.task.program,frequence_selection:"
msgid "Yearly"
msgstr "Anual"
msgctxt "selection:lims.administrative.task.program,specific_day:"
msgid "Friday"
msgstr "Viernes"
msgctxt "selection:lims.administrative.task.program,specific_day:"
msgid "Monday"
msgstr "Lunes"
msgctxt "selection:lims.administrative.task.program,specific_day:"
msgid "Saturday"
msgstr "Sábado"
msgctxt "selection:lims.administrative.task.program,specific_day:"
msgid "Sunday"
msgstr "Domingo"
msgctxt "selection:lims.administrative.task.program,specific_day:"
msgid "Thursday"
msgstr "Jueves"
msgctxt "selection:lims.administrative.task.program,specific_day:"
msgid "Tuesday"
msgstr "Martes"
msgctxt "selection:lims.administrative.task.program,specific_day:"
msgid "Wednesday"
msgstr "Miércoles"
msgctxt "view:lims.administrative.task.program:"
msgid "Frequence"
msgstr "Frecuencia"
msgctxt "view:lims.administrative.task.program:"
msgid "Generate Administrative Tasks"
msgstr "Generar tareas administrativas"
msgctxt "view:lims.administrative.task:"
msgid "Comments"
msgstr "Observaciones"
@ -481,11 +595,3 @@ msgstr "Confirmar"
msgctxt "wizard_button:lims.administrative.task.edit,start,end:"
msgid "Cancel"
msgstr "Cancelar"
msgctxt "wizard_button:lims.administrative.task.generate,start,end:"
msgid "Cancel"
msgstr "Cancelar"
msgctxt "wizard_button:lims.administrative.task.generate,start,generate:"
msgid "Generate"
msgstr "Generar"

View File

@ -17,6 +17,7 @@ from trytond.exceptions import UserError
from trytond.i18n import gettext
from trytond.config import config
from trytond.tools import get_smtp_server
from trytond.modules.lims_tools.event_creator import EventCreator
logger = logging.getLogger(__name__)
@ -481,24 +482,33 @@ class EditAdministrativeTask(Wizard):
return 'end'
class AdministrativeTaskProgram(ModelSQL, ModelView):
class AdministrativeTaskProgram(EventCreator, ModelSQL, ModelView):
'Administrative Task Scheduling'
__name__ = 'lims.administrative.task.program'
_rec_name = 'type'
_rec_name = 'description'
type = fields.Selection('get_types', 'Type', required=True)
description = fields.Char('Description', required=True)
responsible = fields.Many2One('res.user', 'Responsible User',
required=True)
frequency = fields.Selection([
('daily', 'Daily'),
('weekly', 'Weekly'),
('monthly', 'Monthly'),
('yearly', 'Yearly'),
], 'Frequency', required=True, sort=False)
latest_date = fields.Function(fields.Date('Latest scheduled date'),
'get_latest_date')
@classmethod
def __register__(cls, module_name):
table_h = cls.__table_handler__(module_name)
super().__register__(module_name)
if table_h.column_exist('frequency'):
table_h.drop_column('frequency')
@classmethod
def __setup__(cls):
super().__setup__()
cls._buttons.update({
'create_tasks': {
},
})
@classmethod
def get_types(cls):
AdministrativeTaskTemplate = Pool().get(
@ -519,94 +529,48 @@ class AdministrativeTaskProgram(ModelSQL, ModelView):
latest_task[0].date or None)
return result
@classmethod
@ModelView.button_action(
'lims_administrative_task.wizard_generate_task_calendar')
def create_tasks(cls, programs):
pass
class GenerateAdministrativeTaskStart(ModelView):
'Generate Administrative Tasks Calendar'
__name__ = 'lims.administrative.task.generate.start'
@classmethod
def _create_tasks(cls, program, schedule_info):
pool = Pool()
AdministrativeTask = pool.get('lims.administrative.task')
start_date = fields.Date('Start Date', required=True)
end_date = fields.Date('End Date', required=True)
task_program = fields.Many2Many(
'lims.administrative.task.program', None, None,
'Administrative Task Scheduling', required=True)
tasks = fields.One2Many('lims.administrative.task',
None, 'Tasks')
task = AdministrativeTask()
task.type = program.type
task.description = program.description
task.responsible = program.responsible
task.expiration_date = schedule_info['scheduled_date'].date()
task.priority = '3'
task.state = 'draft'
task.scheduled = True
return task
class GenerateAdministrativeTask(Wizard):
'Generate Administrative Tasks Calendar'
__name__ = 'lims.administrative.task.generate'
start = StateView('lims.administrative.task.generate.start',
'lims_administrative_task.generate_task_calendar_start_view_form', [
Button('Cancel', 'end', 'tryton-cancel'),
Button('Generate', 'generate', 'tryton-ok', default=True),
])
generate = StateTransition()
start_state = 'open'
open = StateAction('lims_administrative_task.act_task')
def default_start(self, fields):
Date = Pool().get('ir.date')
today = Date.today()
programs = Transaction().context['active_ids']
defaults = {
'start_date': today,
'end_date': today,
'task_program': programs,
}
return defaults
def transition_generate(self):
AdministrativeTask = Pool().get('lims.administrative.task')
new_tasks = []
for program in self.start.task_program:
new_tasks.extend(self._get_new_tasks(program))
tasks = AdministrativeTask.create(new_tasks)
if tasks:
AdministrativeTask.pending(tasks)
self.start.tasks = tasks
return 'open'
return 'end'
def _get_new_tasks(self, program):
new_tasks = []
for date in self._get_dates(self.start.start_date,
program.frequency, self.start.end_date):
task = {
'type': program.type,
'description': program.description,
'responsible': program.responsible.id,
'expiration_date': date,
'priority': '3',
'state': 'draft',
'scheduled': True,
}
new_tasks.append(task)
return new_tasks
def _get_dates(self, start_date, frequency, end_date):
dates = []
if frequency == 'daily':
delta = relativedelta(days=1)
elif frequency == 'weekly':
delta = relativedelta(days=7)
elif frequency == 'monthly':
delta = relativedelta(months=1)
elif frequency == 'yearly':
delta = relativedelta(years=1)
date = start_date
while date <= end_date:
dates.append(date)
date += delta
return dates
def do_open(self, action):
pool = Pool()
TaskProgram = pool.get('lims.administrative.task.program')
AdministrativeTask = pool.get('lims.administrative.task')
programs = TaskProgram.browse(Transaction().context['active_ids'])
tasks = TaskProgram.create_events(programs, TaskProgram._create_tasks)
if tasks:
AdministrativeTask.save(tasks)
AdministrativeTask.pending(tasks)
action['pyson_domain'] = PYSONEncoder().encode([
('id', 'in', [m.id for m in self.start.tasks]),
('id', 'in', [t.id for t in tasks]),
])
return action, {}

View File

@ -339,27 +339,21 @@
id="menu_task_program"
parent="menu_config" sequence="30"/>
<!-- Wizard Generate Administrative Tasks Calendar -->
<record model="ir.ui.view"
id="generate_task_calendar_start_view_form">
<field name="model">lims.administrative.task.generate.start</field>
<field name="type">form</field>
<field name="name">generate_task_calendar_start_form</field>
<record model="ir.model.button" id="task_program_create_tasks_button">
<field name="name">create_tasks</field>
<field name="string">Generate</field>
<field name="confirm">Are you sure you want to generate new administrative tasks?</field>
<field name="help">Generate administrative tasks</field>
<field name="model" search="[('model', '=', 'lims.administrative.task.program')]"/>
</record>
<!-- Wizard Generate Administrative Tasks Calendar -->
<record model="ir.action.wizard" id="wizard_generate_task_calendar">
<field name="name">Generate Administrative Tasks Calendar</field>
<field name="wiz_name">lims.administrative.task.generate</field>
</record>
<record model="ir.action.keyword"
id="wizard_generate_task_calendar_keyword">
<field name="keyword">form_action</field>
<field name="model">lims.administrative.task.program,-1</field>
<field name="action" ref="wizard_generate_task_calendar"/>
</record>
<!-- Administrative Tasks Calendar -->
<record model="ir.ui.view" id="task_view_calendar">

View File

@ -2,6 +2,7 @@
version=5.6.0
depends:
lims
lims_tools
xml:
user.xml
task.xml

View File

@ -1,8 +0,0 @@
<?xml version="1.0"?>
<form>
<label name="start_date"/>
<field name="start_date"/>
<label name="end_date"/>
<field name="end_date"/>
<field name="task_program" colspan="4"/>
</form>

View File

@ -6,8 +6,35 @@
<field name="description"/>
<label name="responsible"/>
<field name="responsible"/>
<label name="frequency"/>
<field name="frequency"/>
<label name="latest_date"/>
<field name="latest_date"/>
<group id="frequence" colspan="4" string="Frequence">
<label name="frequence_selection"/>
<field name="frequence_selection"/>
<group id="detail_frequence" colspan="2" col="2">
<field name="detail_frequence" xexpand="0" width="30"/>
<field name="detail_frequence_selection" xexpand="1"/>
</group>
<label name="only_workdays"/>
<field name="only_workdays"/>
<group id="specific" colspan="2" col="2">
<label name="specific_day"/>
<field name="specific_day"/>
<label name="specific_time"/>
<field name="specific_time"/>
</group>
</group>
<group id="create_tasks" colspan="4" string="Generate Administrative Tasks">
<label name="start_date"/>
<field name="start_date"/>
<label name="finish_selection"/>
<field name="finish_selection"/>
<group id="end" colspan="2" col="2">
<label name="end_repetition"/>
<field name="end_repetition"/>
<label name="end_date"/>
<field name="end_date"/>
</group>
<button name="create_tasks" colspan="2"/>
</group>
</form>

View File

@ -3,6 +3,5 @@
<field name="type"/>
<field name="description"/>
<field name="responsible"/>
<field name="frequency"/>
<field name="latest_date"/>
</tree>