Commit e50c958a authored by LE GAC Renaud's avatar LE GAC Renaud
Browse files

Polish the class MySelector.

parent 9b84dd68
......@@ -3,11 +3,7 @@
"""
from reporting_tools import (MySelector,
Hardware,
Person,
get_header)
TIME_FIELDS = ('year', 'period_start', 'period_end')
Person)
def hardware():
......@@ -15,30 +11,22 @@ def hardware():
"""
selector = MySelector(db)
# build the query
query = selector.query('hardware', exclude_fields=TIME_FIELDS)
if selector.period_start and selector.period_end:
q = db.hardware.start_date <= selector.period_end
q = (q) & ((db.hardware.end_date == None) | (db.hardware.end_date >= selector.period_start))
query = (query) & (q)
# define virtual field to compute time data
# to be added in the report via extra columns
db.hardware.duration = Field.Virtual(Hardware(selector).duration)
# build the query
query = selector.query_active_items('hardware')
# select the records
# retrieve the records
rows = db(query).select(db.hardware.ALL,
db.people.ALL,
orderby=(db.hardware.model, db.people.last_name))
header = get_header(selector, prefix='List of hardware ')
header = '%s %s' % (T('List of hardware'), selector)
return dict(footer='',
header=header,
rows=rows,
selector=selector)
return dict(footer='', header=header, rows=rows)
def history():
......@@ -62,11 +50,10 @@ def history():
db.teams.ALL,
orderby=(db.people.last_name, db.history.start_date))
header = get_header(selector, prefix='History ')
return dict(footer='',
header=header,
rows=rows,
selector=selector)
header = '%s %s' % (T('History'), selector)
return dict(footer='', header=header, rows=rows)
def index():
return 'List section'
......@@ -77,33 +64,25 @@ def people():
"""
selector = MySelector(db)
# build the query
query = selector.query('history', exclude_fields=TIME_FIELDS)
if selector.period_start and selector.period_end:
q = db.history.start_date <= selector.period_end
q = (q) & ((db.history.end_date == None) | (db.history.end_date >= selector.period_start))
query = (query) & (q)
# avoid the category "stage"
q = db.categories.usual != 'stagiaire'
query = (query) & (q)
# define virtual field to compute time data
# to be added in the report via extra columns
tool = Person(selector)
db.history.time_coverage = Field.Virtual(tool.coverage)
db.people.age = Field.Virtual(tool.age)
# build the query avoiding the category "stage"
query = selector.query_active_items('history')
q = db.categories.usual != 'stagiaire'
query = (query) & (q)
# retrieve the records
rows = db(query).select(db.categories.ALL,
db.history.ALL,
db.people.ALL,
orderby=(db.categories.usual, db.people.last_name))
header = '%s %s' % (T('List of people '), selector)
header = get_header(selector, prefix='List of people ')
return dict(footer='',
header=header,
rows=rows,
selector=selector)
\ No newline at end of file
return dict(footer='', header=header, rows=rows)
\ No newline at end of file
# coding: utf8
{
'%s between %s and %s': '%s du %s au %s',
'%s in %s': '%s en %s',
'%Y-%m-%d': '%Y-%m-%d',
'Age': 'Age',
'Agencies': 'Agencies',
......@@ -66,6 +68,7 @@
'Line': 'Ligne',
'List of hardware': 'Liste de matériel',
'List of people': 'Liste de personne',
'List of people ': 'Liste des personnes ',
'Lists': 'Lists',
'Max Records': 'Max Records',
'Model': 'Modèle',
......@@ -82,9 +85,9 @@
'Period End': 'Period End',
'Period Start': 'Period Start',
'Person': 'Persone',
'Phd': 'Phd',
'PHD': 'PHD',
'PhD': 'PhD',
'Phd': 'Phd',
'Phd Date': 'Phd Date',
'Phd defense date': 'Date de la soutenance de la thèse',
'plugin not install': 'plugin not install',
......
......@@ -2,54 +2,109 @@
"""
from datetime import date, datetime, timedelta
from gluon import current
from plugin_dbui import Selector
class MySelector(Selector):
"""Custom version of the selector.
It determines the period range which can be defined in several
different ways.
It contains all the tools to play with the period range
which can be defined in several different ways.
The argument period_start and period_end are datetime.Date
while the year is an integer
"""
def __init__(self, db, extfield='format'):
self.year = None
self.period_start = None
self.periode_end = None
Selector.__init__(self, db, extfield)
if 'period_start' not in self and 'period_end' not in self:
return
if self.year:
self.year = int(self.year)
self.period_start = date(self.year, 1, 1)
self.period_end = date(self.year, 12, 31)
if self.period_start and isinstance(self.period_start, str):
ds = datetime.strptime(self.period_start, '%Y-%m-%dT%H:%M:%S')
self.period_start = date(ds.year, ds.month, ds.day)
if self.period_end and isinstance(self.period_end, str):
de = datetime.strptime(self.period_end, '%Y-%m-%dT%H:%M:%S')
self.period_end = date(de.year, de.month, de.day)
def __str__(self):
if 'year' in self and self.year:
self.period_start = "%s-01-01" % self.year
self.period_end = "%s-12-31" % self.year
db = self._db
s = ""
# team and or project
if not self.id_projects and self.id_teams:
s = db.teams[self.id_teams].team
elif self.id_projects and not self.id_teams:
s = db.projects[self.id_projects].project
elif self.id_projects and self.id_teams:
s = "%s/%s" % (db.teams[self.id_teams].team,
db.projects[self.id_projects].project)
# person
if "id_people" in self and self.id_people:
s = "%s %s" % (s, db.people[self.id_people].last_name)
# time period
if self.year:
s = current.T("%s in %s") % (s, self.year)
elif self.period_start and self.period_end:
for field in ('period_start', 'period_end'):
s = self[field]
self[field] = s[:s.find('T')]
s = current.T("%s between %s and %s") % (s,
self.period_start.strftime("%d %b %Y"),
self.period_end.strftime("%d %b %Y"))
return s
def query_active_items(self, tablename):
"""Build the database query for the table tablename
including inner join for foreign keys and selector constraints.
The query is tuned to selected active items during the selected
period of time. It also assume that the item has the database
field start_date and end_date.
"""
db = self._db
query = self.query(tablename, exclude_fields=('year',
'period_start',
'period_end'))
if self.period_start and self.period_end:
q = db[tablename].start_date <= self.period_end
q = (q) & ((db[tablename].end_date == None) | (db[tablename].end_date >= self.period_start))
query = (query) & (q)
return query
class Base(object):
"""Base class for reporting tool.
The base class translate selector period fields in python date.
"""
def __init__(self, selector):
now = datetime.now()
self.now = date(now.year, now.month, now.day)
self.period_start = None
self.period_end = None
self.period_start = selector.period_start
self.period_end = selector.period_end
if 'period_start' in selector:
ds = datetime.strptime(selector.period_start, '%Y-%m-%d')
self.period_start = date(ds.year, ds.month, ds.day)
if 'period_end' in selector:
de = datetime.strptime(selector.period_end, '%Y-%m-%d')
self.period_end = date(de.year, de.month, de.day)
class Hardware(Base):
"""Tool associate to a hardware item.
......@@ -57,7 +112,8 @@ class Hardware(Base):
"""
def duration(self, row):
"""Compute the duration of an hardware item.
Return a timedelta
Return a datetime.TimeDelta
"""
start = row.hardware.start_date
end = row.hardware.end_date
......@@ -125,44 +181,9 @@ class Person(Base):
return timedelta
def get_header(selector, prefix="", suffix=""):
"""Helper function returning the header for the report.
The return string contains the team, the project and some
indication on the time period:
'prefix'+'team/project in years'+'suffix'
'prefix'+'team/group between date and date'+'suffix'
The element team/project van be team, project or team/project.
"""
db = selector._db
header = ""
if not selector.id_projects and selector.id_teams:
header = db.teams[selector.id_teams].team
elif selector.id_projects and not selector.id_teams:
header = db.projects[selector.id_projects].project
elif selector.id_projects and selector.id_teams:
header = "%s/%s" % (db.teams[selector.id_teams].team,
db.projects[selector.id_projects].project)
if selector.year:
header = "%s in %s" % (header, selector.year)
elif selector.period_start and selector.period_end:
header = "%s between %s and %s" % (header,
selector.period_start,
selector.period_end)
return "%s%s%s" % (prefix, header, suffix)
def repr_timedelta(dt):
"""Helper function to convert a datetime.TimeDelta
into a string 'x years y months'.
into a string 'x years y months'.
"""
ny = dt.days / 365
......
......@@ -2,6 +2,8 @@
HEAD
- Migrate to plugin_dbui 0.4.9 to develop filter on date.
- Add the class MySelector, Base, Hardware and Person.
- Build the list of history, hardware and people.
0.1.0 (July 2012)
- First running version based on dbui 0.4.7.6
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment