Migration to python-sql

review1001002
This commit is contained in:
Cédric Krier committed 2013-09-06 22:35:00 +02:00
1 parent 29fac6dc74
commit f7d1888fc4
5 files changed
+81 -71

No files matched your search

+1
View File
@@ -5,6 +5,7 @@ Prerequisites
-------------
* Python 2.6 or later (http://www.python.org/)
* python-sql (http://code.google.com/p/python-sql/)
* trytond (http://www.tryton.org/)
* trytond_company (http://www.tryton.org/)
* trytond_company_work_time (http://www.tryton.org/)
+59 -52
View File
@@ -1,8 +1,12 @@
#This file is part of Tryton. The COPYRIGHT file at the top level of
#this repository contains the full copyright notices and license terms.
from sql import Literal
from sql.aggregate import Max, Sum
from sql.conditionals import Coalesce
from sql.functions import Extract
from trytond.model import ModelView, ModelSQL, fields
from trytond.wizard import Wizard, StateView, StateAction, Button
from trytond.backend import FIELDS
from trytond.pyson import Eval, PYSONEncoder, Date, Get
from trytond.transaction import Transaction
from trytond.pool import Pool
@@ -126,25 +130,24 @@ class HoursEmployee(ModelSQL, ModelView):
@staticmethod
def table_query():
clause = ' '
args = [True]
pool = Pool()
Line = pool.get('timesheet.line')
line = Line.__table__()
where = Literal(True)
if Transaction().context.get('start_date'):
clause += 'AND date >= %s '
args.append(Transaction().context['start_date'])
where &= line.date >= Transaction().context['start_date']
if Transaction().context.get('end_date'):
clause += 'AND date <= %s '
args.append(Transaction().context['end_date'])
return ('SELECT DISTINCT(employee) AS id, '
'MAX(create_uid) AS create_uid, '
'MAX(create_date) AS create_date, '
'MAX(write_uid) AS write_uid, '
'MAX(write_date) AS write_date, '
'employee, '
'SUM(COALESCE(hours, 0)) AS hours '
'FROM timesheet_line '
'WHERE %s '
+ clause +
'GROUP BY employee', args)
where &= line.date <= Transaction().context['end_date']
return line.select(
line.employee.as_('id'),
Max(line.create_uid).as_('create_uid'),
Max(line.create_date).as_('create_date'),
Max(line.write_uid).as_('write_uid'),
Max(line.write_date).as_('write_date'),
line.employee,
Sum(Coalesce(line.hours, 0)).as_('hours'),
where=where,
group_by=line.employee)
class OpenHoursEmployeeStart(ModelView):
@@ -192,23 +195,25 @@ class HoursEmployeeWeekly(ModelSQL, ModelView):
@classmethod
def table_query(cls):
type_name = FIELDS[cls.year._type].sql_type(cls.year)[0]
return ('SELECT id, create_uid, create_date, write_uid, write_date, '
'CAST(year AS ' + type_name + ') AS year, week, '
'employee, hours '
'FROM ('
'SELECT EXTRACT(WEEK FROM date) + '
'EXTRACT(YEAR FROM date) * 100 + '
'employee * 1000000 AS id, '
'MAX(create_uid) AS create_uid, '
'MAX(create_date) AS create_date, '
'MAX(write_uid) AS write_uid, '
'MAX(write_date) AS write_date, '
'EXTRACT(YEAR FROM date) AS year, '
'EXTRACT(WEEK FROM date) AS week, employee, '
'SUM(COALESCE(hours, 0)) AS hours '
'FROM timesheet_line '
'GROUP BY year, week, employee) AS ' + cls._table, [])
pool = Pool()
Line = pool.get('timesheet.line')
line = Line.__table__()
type_name = cls.year.sql_type().base
year_column = Extract('YEAR', line.date).cast(type_name).as_('year')
week_column = Extract('WEEK', line.date).as_('week')
return line.select(
Max(Extract('WEEK', line.date)
+ Extract('YEAR', line.date) * 100
+ line.employee * 1000000).as_('id'),
Max(line.create_uid).as_('create_uid'),
Max(line.create_date).as_('create_date'),
Max(line.write_uid).as_('write_uid'),
Max(line.write_date).as_('write_date'),
year_column,
week_column,
line.employee,
Sum(Coalesce(line.hours, 0)).as_('hours'),
group_by=(year_column, week_column, line.employee))
class HoursEmployeeMonthly(ModelSQL, ModelView):
@@ -228,20 +233,22 @@ class HoursEmployeeMonthly(ModelSQL, ModelView):
@classmethod
def table_query(cls):
type_name = FIELDS[cls.year._type].sql_type(cls.year)[0]
return ('SELECT id, create_uid, create_date, write_uid, write_date, '
'CAST(year AS ' + type_name + ') AS year, month, '
'employee, hours '
'FROM ('
'SELECT EXTRACT(MONTH FROM date) + '
'EXTRACT(YEAR FROM date) * 100 + '
'employee * 1000000 AS id, '
'MAX(create_uid) AS create_uid, '
'MAX(create_date) AS create_date, '
'MAX(write_uid) AS write_uid, '
'MAX(write_date) AS write_date, '
'EXTRACT(YEAR FROM date) AS year, '
'EXTRACT(MONTH FROM date) AS month, employee, '
'SUM(COALESCE(hours, 0)) AS hours '
'FROM timesheet_line '
'GROUP BY year, month, employee) AS ' + cls._table, [])
pool = Pool()
Line = pool.get('timesheet.line')
line = Line.__table__()
type_name = cls.year.sql_type().base
year_column = Extract('YEAR', line.date).cast(type_name).as_('year')
month_column = Extract('MONTH', line.date).as_('month')
return line.select(
Max(Extract('MONTH', line.date)
+ Extract('YEAR', line.date) * 100
+ line.employee * 1000000).as_('id'),
Max(line.create_uid).as_('create_uid'),
Max(line.create_date).as_('create_date'),
Max(line.write_uid).as_('write_uid'),
Max(line.write_date).as_('write_date'),
year_column,
month_column,
line.employee,
Sum(Coalesce(line.hours, 0)).as_('hours'),
group_by=(year_column, month_column, line.employee))
+1 -1
View File
@@ -21,7 +21,7 @@ major_version, minor_version, _ = info.get('version', '0.0.1').split('.', 2)
major_version = int(major_version)
minor_version = int(minor_version)
requires = []
requires = ['python-sql']
for dep in info.get('depends', []):
if not re.match(r'(ir|res|webdav)(\W|$)', dep):
requires.append('trytond_%s >= %s.%s, < %s.%s' %
+17 -15
View File
@@ -1,5 +1,8 @@
#This file is part of Tryton. The COPYRIGHT file at the top level of
#this repository contains the full copyright notices and license terms.
from sql import Literal
from sql.aggregate import Sum
from trytond.model import ModelView, ModelSQL, fields
from trytond.wizard import Wizard, StateView, StateAction, Button
from trytond.pyson import PYSONEncoder, Not, Bool, Eval
@@ -105,27 +108,26 @@ class Work(ModelSQL, ModelView):
in_max = cursor.IN_MAX
context = transaction.context
table_w = cls.__table__()
table_c = cls.__table__()
line = Line.__table__()
ids = [w.id for w in works]
hours = dict.fromkeys(ids, 0)
date_cond = ''
date_args = []
where = Literal(True)
if context.get('from_date'):
date_cond = ' AND date >= %s'
date_args.append(context['from_date'])
where &= line.date >= context['from_date']
if context.get('to_date'):
date_cond += ' AND date <= %s'
date_args.append(context['to_date'])
where &= line.date <= context['to_date']
for i in range(0, len(ids), in_max):
sub_ids = ids[i:i + in_max]
red_sql, red_ids = reduce_ids('w.id', sub_ids)
cursor.execute('SELECT w.id, SUM(l.hours) '
'FROM "' + cls._table + '" AS w '
'JOIN "' + cls._table + '" AS c '
'ON c.left >= w.left AND c.right <= w.right '
'LEFT JOIN "' + Line._table + '" AS l '
'ON l.work = c.id '
'WHERE ' + red_sql + ' ' + date_cond + ' '
'GROUP BY w.id', red_ids + date_args)
red_sql = reduce_ids(table_w.id, sub_ids)
cursor.execute(*table_w.join(table_c,
condition=(table_c.left >= table_w.left)
& (table_c.right <= table_w.right)
).join(line, 'LEFT', condition=line.work == table_c.id
).select(table_w.id, Sum(line.hours),
where=red_sql & where,
group_by=table_w.id))
hours.update(dict(cursor.fetchall()))
return hours
+3 -3
View File
@@ -25,7 +25,7 @@ this repository contains the full copyright notices and license terms. -->
<record model="ir.action.act_window" id="act_work_tree">
<field name="name">Works</field>
<field name="res_model">timesheet.work</field>
<field name="domain">[('parent', '=', False)]</field>
<field name="domain">[('parent', '=', None)]</field>
</record>
<record model="ir.action.act_window.view"
id="act_work_tree_view1">
@@ -71,7 +71,7 @@ this repository contains the full copyright notices and license terms. -->
<record model="ir.action.act_window" id="act_work_tree2">
<field name="name">Works</field>
<field name="res_model">timesheet.work</field>
<field name="domain">[('parent', '=', False)]</field>
<field name="domain">[('parent', '=', None)]</field>
</record>
<record model="ir.action.act_window.view"
id="act_work_tree2_view1">
@@ -88,7 +88,7 @@ this repository contains the full copyright notices and license terms. -->
<record model="ir.action.act_window" id="act_work_form2">
<field name="name">Hours per Work</field>
<field name="res_model">timesheet.work</field>
<field name="domain">[('parent', '=', Get(Eval('timesheet.act_work_tree2', {}), 'id', False))]</field>
<field name="domain">[('parent', '=', Get(Eval('timesheet.act_work_tree2', {}), 'id', None))]</field>
</record>
<record model="ir.action.act_window.view"
id="act_work_form2_view1">