Commit 32a8e2be authored by LE GAC Renaud's avatar LE GAC Renaud
Browse files

Add the table metrics1d and modify the report metric1D accordingly.

parent 694de59f
......@@ -91,7 +91,7 @@ def metric1D():
# build report and extract the configuration
# for the Ext.data.Store and the App.grid.Panel
config = db.metrics[request.vars.id_metrics]
config = db.metrics1d[request.vars.id_metrics]
report = Metric1D(config, selector)
store = report.to_store()
grid = report.to_grid()
......
......@@ -21,6 +21,7 @@
'Agency': 'Agence',
'Alignments': 'Alignments',
'Any field of the history table including foreign table. The field is encoded as tablename.fieldname. For properties in the the user data block, use history.data.myproperty.': 'Any field of the history table including foreign table. The field is encoded as tablename.fieldname. For properties in the the user data block, use history.data.myproperty.',
'Any field of the history table including those of the foreign tables. The field is encoded as tablename.fieldname or history.data.myproperty.': 'Any field of the history table including those of the foreign tables. The field is encoded as tablename.fieldname or history.data.myproperty.',
'Are you sure you want to delete this object?': 'Are you sure you want to delete this object?',
'auth_cas': 'auth_cas',
'auth_event': 'auth_event',
......@@ -31,6 +32,8 @@
'Binary files': 'Fichiers binaires',
'Birth Date': 'Né le',
'budgets': 'budgets',
'Can be applied on any field of the history table using the SQL WHERE syntax, but the foreign keys are not resolved (more information in the smart_query in the web2py documentation). In addition individual property of the history.data dictionary are not available, but operator like contains can be applied.': 'Can be applied on any field of the history table using the SQL WHERE syntax, but the foreign keys are not resolved (more information in the smart_query in the web2py documentation). In addition individual property of the history.data dictionary are not available, but operator like contains can be applied.',
'Can be applied on any field of the history table using the SQL WHERE syntax, but the foreign keys are not resolved nor the individual property of the history.data dictionary. (more information in the smart_query in the web2py documentation).': 'Can be applied on any field of the history table using the SQL WHERE syntax, but the foreign keys are not resolved nor the individual property of the history.data dictionary. (more information in the smart_query in the web2py documentation).',
'Can be applied on any field of the history table using the SQL WHERE syntax. Be aware that foreign key are not resolved (more information in the smart_query in the web2py documentation). In addition individual property of the user block are not available, but operator like contains can be applied on the history.data field.': 'Can be applied on any field of the history table using the SQL WHERE syntax. Be aware that foreign key are not resolved (more information in the smart_query in the web2py documentation). In addition individual property of the user block are not available, but operator like contains can be applied on the history.data field.',
'Can be applied on any field of the table using the SQL WHERE syntax. Be aware that foreign key are not resolved (more information in the smart_query in the web2py documentation).': 'Can be applied on any field of the table using the SQL WHERE syntax. Be aware that foreign key are not resolved (more information in the smart_query in the web2py documentation).',
'can be applied on any field of the table using the SQL WHERE syntax. Be aware that foreign key are not resolved (see smart_query in the web2py)': 'can be applied on any field of the table using the SQL WHERE syntax. Be aware that foreign key are not resolved (see smart_query in the web2py)',
......@@ -305,6 +308,7 @@
'The graphs': 'Les graphs',
'The lists': 'les listes',
'The metrics': 'Les métriques',
'The metrics 1D': 'Les métriques 1D',
"The report id '%s' is unknown.": "The report id '%s' is unknown.",
'Time': 'Temps',
'Timestamp': 'Timestamp',
......
......@@ -61,6 +61,7 @@ tables = ['auth_group',
'history',
'lists',
'metrics',
'metrics1d',
'people',
'people_categories',
'projects',
......
......@@ -30,6 +30,10 @@ def_columns = \
def_features = \
"[{ftype:'grouping', groupHeaderTpl: '{name}', startCollapsed: false}]"
if MIGRATE:
def_columns = None
def_features = None
db.define_table("lists",
Field("name", "string", length=255, notnull=True, unique=True),
Field("title", "string", length=255),
......@@ -39,4 +43,4 @@ db.define_table("lists",
Field("columns", "text", default=def_columns, comment=tp_columns, notnull=True),
Field("features", "text", default=def_features, comment=tp_features),
Field("definition", "text"),
migrate="lists.table")
migrate="lists.table")
\ No newline at end of file
# -*- coding: utf-8 -*-
""" metrics1d
"""
tp_conditions = \
T("Can be applied on any field of the history table using the SQL WHERE syntax, "
"but the foreign keys are not resolved nor the individual property of "
"the history.data dictionary. "
"(more information in the smart_query in the web2py documentation).")
tp_fields = \
T("Any field of the history table including those of the foreign tables. "
"The field is encoded as tablename.fieldname or "
"history.data.myproperty.")
def_columns = \
"""[{
"aggregate": "",
"align": "right",
"dbfield": "",
"format": "0.0",
"text": ""
}]"""
if MIGRATE:
def_columns = None
db.define_table("metrics1d",
Field("name", "string", length=255, notnull=True, unique=True),
Field("title", "string", length=255),
Field("conditions", "text", comment=tp_conditions),
Field("group_field", "string", length=255, comment=tp_fields, notnull=True),
Field("columns", "text", default=def_columns, comment=tp_columns, notnull=True),
Field("definition", "text"),
migrate="metrics1d.table")
# -*- coding: utf-8 -*-
""" metrics1d
"""
table = "metrics1d"
#-------------------------------------------------------------------------------
#
# FIELDS CONFIGURATiON
#
#-------------------------------------------------------------------------------
fieldsModifier = dbui.FieldsModifier(table)
fieldsModifier.configure_field('columns',
height=240,
hideLabel=True)
fieldsModifier.configure_field('definition', height=100)
#-------------------------------------------------------------------------------
#
# FORM CONFIGURATiON
#
#-------------------------------------------------------------------------------
formModifier = dbui.FormModifier(table)
formModifier.merge_fields('name',
'title',
'definition',
'conditions',
title=T('General'))
formModifier.merge_fields('group_field',
title=T('Group'))
formModifier.merge_fields('columns',
title=T('Columns'))
formModifier.set_mapper(dbui.map_tabpanel)
formModifier.configure(width=450)
#-------------------------------------------------------------------------------
#
# GRID CONFIGURATiON
#
#-------------------------------------------------------------------------------
gridModifier = dbui.GridModifier(table)
gridModifier.configure_column('name', width=30)
gridModifier.hide_columns('title',
'columns',
'conditions',
'group_field')
#-------------------------------------------------------------------------------
#
# STORE CONFIGURATiON
#
#-------------------------------------------------------------------------------
storeModifier = dbui.StoreModifier(table)
storeModifier.orderby(db.metrics1d.name)
\ No newline at end of file
......@@ -69,6 +69,7 @@ helpNode.sort_children()
#-------------------------------------------------------------------------------
cfgNode = Node(T('Configure'))
cfgNode.add_child(T('The lists'), to_grid('lists'))
cfgNode.add_child(T('The metrics 1D'), to_grid('metrics1d'))
cfgNode.add_child(T('The metrics'), to_grid('metrics'))
cfgNode.add_child(T('The graphs'), to_grid('graphs'))
......@@ -116,15 +117,21 @@ for row in db(db.lists.id > 0).select(orderby=db.lists.name):
#-------------------------------------------------------------------------------
metricNode = Node(T('The metrics'))
for row in db(db.metrics.id > 0).select(orderby=db.metrics.name):
# select the action and the selector
action, selector = 'metric1D', virtdb.metric_selector_1D
if row.field_horizontal:
action, selector = 'metric2D', virtdb.metric_selector_2D
for row in db(db.metrics1d.id > 0).select(orderby=db.metrics1d.name):
leaf = PanelWithUrlSelector(selector,
baseUrl=URL('report', action),
leaf = PanelWithUrlSelector(virtdb.metric_selector_1D,
baseUrl=URL('report', 'metric1D'),
baseParams={'id_metrics': row.id})
metricNode.add_child(row.name, leaf)
for row in db(db.metrics.id > 0).select(orderby=db.metrics.name):
if not row.field_horizontal:
continue
leaf = PanelWithUrlSelector(virtdb.metric_selector_2D,
baseUrl=URL('report', 'metric2D'),
baseParams={'id_metrics': row.id})
metricNode.add_child(row.name, leaf)
......
"""report_objects module
"""
import json
import pandas as pd
import re
......@@ -59,7 +60,9 @@ def split_dbfield(value):
"""
li = value.split('.')
if len(li) == 2:
if len(li) == 1:
li.extend(['', ''])
elif len(li) == 2:
li.append('')
return tuple(li)
......@@ -137,7 +140,7 @@ class List(BaseReport):
Its configuration is returned by the method L{to_store}.
"""
def _get_data(self):
def _set_store_data(self):
""" Generate the C{Ext.data.Store.data} property.
It is a list of dictionaries. Each of them contains the data
for one row. One key, value pair for each C{Ext.data.Field} where
......@@ -166,7 +169,7 @@ class List(BaseReport):
self._store.data.append(di)
def _get_fields(self):
def _set_store_fields(self):
""" Generate the C{Ext.data.Store.fields} property.
It is a list of C{Ext.data.Field} configuration.
......@@ -269,8 +272,8 @@ class List(BaseReport):
self._store.groupField = config.group_field.replace('.', '')
self._store.sorters = [el.replace('.', '') for el in config.sorters]
self._get_fields()
self._get_data()
self._set_store_fields()
self._set_store_data()
return self._store
......@@ -298,86 +301,140 @@ class Metric1D(BaseReport):
"""
def __init__(self, config, selector):
BaseReport.__init__(self, config, selector)
BaseReport.__init__(self, config, selector, select=False)
map = split_dbfield(config.group_field)
self._field_groupby = config.group_field
self._map_groupby = map
if config.group_field == "year":
self._index_groupby = 'year'
else:
self._index_groupby = (map[2] if map[2] else map[1])
self._do_metric()
def _do_data(self, columns):
"""Build a temporarily list with the raw data for each metric.
This method handle the year group_field.
def _do_metric(self):
"""Compute the metric:
@type columns: list of Storage
@param columns: the columns configuration
- history records follow the selector criteria.
- history record are grouped by
The metric is:
@rtype: list
"""
data = []
db = self.db
config = self.config
selector = self.selector
maps = [split_dbfield(cfg.dbfield) for cfg in columns]
if self.config.group_field == 'year':
- the number of items in a group
- the sum of fte for the items in the group
- the average age for the items in the group
# build the year range
start = selector.period_start.year
end = selector.period_end.year
years = range(start, end + 1)
if config.conditions:
q_conditions = selector._extra_queries[0]
for year in years:
selector.reset_extra_queries()
selector.period_start = date(year, 1, 1)
selector.period_end = date(year, 12, 31)
if config.conditions:
selector.append_query(q_conditions)
for row in selector.select(db.history):
li = [year]
li.extend([get_value(row, *map) for map in maps[1:]])
data.append(li)
else:
for row in selector.select(db.history):
data.append([get_value(row, *map) for map in maps])
return data
def _do_metric(self):
"""Compute the metric according to user specifications.
"""
db = self.db
groupby = self.config.field_vertical
config = self.config
columns = [Storage(el) for el in json.loads(config.columns)]
field_groupby = self._field_groupby
index_groupby = self._index_groupby
# configuration
cfg = [Storage(label=groupby, field=groupby, op=None),
Storage(label='count', field='people.id', op='size'),
Storage(label='sum_fte', field='history.fte', op='sum'),
Storage(label='avg_age', field='people.age', op='mean')]
# fields, labels and operators
fields = [el.field.split('.') for el in cfg]
labels = [el.label for el in cfg]
cfg = [Storage(dbfield=field_groupby, text=index_groupby, aggregate="")]
cfg.extend(columns)
# columns labels and operators
labels = [el.text for el in cfg]
operators = dict()
for el in cfg:
if el.op != None:
operators[el.label] = el.op
if el.aggregate:
operators[el.text] = el.aggregate
# interrogate the database
# fill the data frame with field and virtual field contents
data = []
for row in self.rows:
data.append([row[table][field] for table, field in fields])
# interrogate the database and fill the data frame
data = self._do_data(cfg)
df = pd.DataFrame(data, columns=labels)
# aggregate the data running dedicated operator per column
df = df.groupby(groupby)
# aggregate the data running dedicated operator for each column
df = df.groupby(index_groupby)
df = df.agg(operators)
# the data frame is persistent
self.df = df
def _get_data(self):
def _set_store_data(self):
"""Generate the C{Ext.data.Store.data} property.
It is a list of dictionaries. Each of them contains the data
for one row. One key, value pair for each C{Ext.data.Field}.
The key is equal to the C{Ext.data.Field} name.
"""
index_groupby = self._index_groupby
# build the output: a list of dictionary
# The latter contains the key group, count, avg_age and sum_fte
data = []
for group, di in self.df.T.to_dict().iteritems():
di['group'] = group
di[index_groupby] = group
data.append(di)
self._store.data.extend(data)
def _get_fields(self):
def _set_store_fields(self):
""" Generate the Ext.data.Store.fields property.
The store contains four fields: group, count, sum_fte and avg_age
and data are grouped per the group field values.
"""
self._store.fields = [dict(name='group', type='string'),
dict(name='count', type='float'),
dict(name='sum_fte', type='float'),
dict(name='avg_age', type='float')]
index_groupby = self._index_groupby
store = self._store
# firs column is for the group field
store.fields = [dict(name=index_groupby, type='string')]
# add the others one
for el in self.df.columns:
di = dict(name=el, type='float')
store.fields.append(di)
self._store.sorters = ['group']
store.sorters = [index_groupby]
def to_grid(self):
......@@ -387,36 +444,31 @@ class Metric1D(BaseReport):
@return: the configuration of the C{App.grid.Panel}.
"""
tablename, fieldname = self.config.field_vertical.split('.')
grid = Storage(columns=[],
features=[],
title=self.config.title)
grid.columns = [{'text': fieldname.title(),
'dataIndex': 'group',
'flex': 0.8},
{'text': '∑ person',
'dataIndex': 'count',
'align': 'right',
'flex': 0.5,
'summaryType': 'sum' },
{'text': '∑ fte',
'dataIndex': 'sum_fte',
'align': 'right',
'flex': 0.5,
'format': '0.00',
'summaryType': 'sum',
'xtype': 'numbercolumn'},
{'text': '<age>',
'dataIndex': 'avg_age',
'align': 'right',
'flex': 0.5,
'format': '0.00',
'xtype': 'numbercolumn'}]
grid.features = [{'ftype': 'summary'}]
config = self.config
index_groupby = self._index_groupby
grid = Storage(columns=[], features=[], title=config.title)
# first column is for the group field
grid.columns = [{'text': current.T(index_groupby.title()),
'dataIndex': index_groupby,
'columnWidth': 0.8}]
# the other are already specified by the user
for di in json.loads(config.columns):
# remove non Ext JS property
for key in ('aggregate', 'dbfield'):
del di[key]
# build the dataIndex and fix column type
di['dataIndex'] = di['text']
di['xtype'] = 'numbercolumn'
grid.columns.append(di)
# activate summary feature
grid.features = [{'ftype': 'summary'}]
return grid
......@@ -429,8 +481,8 @@ class Metric1D(BaseReport):
"""
self._store = Store(data=[], fields=[])
self._get_fields()
self._get_data()
self._set_store_fields()
self._set_store_data()
return self._store
......@@ -457,13 +509,13 @@ class Metric2D(BaseReport):
else:
BaseReport.__init__(self, config, selector, select=True)
self._do_metric_2d()
self._do_metric()
# replace undefined value by 0
self.df = self.df.fillna(0)
def _do_metric_2d(self):
def _do_metric(self):
"""Compute the metric involving two database field.
"""
......@@ -579,7 +631,7 @@ class Metric2D(BaseReport):
self.df = df
def _get_data(self):
def _set_store_data(self):
""" Generate the C{Ext.data.Store.data} property.
"""
......@@ -601,7 +653,7 @@ class Metric2D(BaseReport):
self._store.data.append(di)
def _get_fields(self):
def _set_store_fields(self):
""" Generate the C{Ext.data.Store.fields} property.
"""
......@@ -668,8 +720,8 @@ class Metric2D(BaseReport):
# build the store configuration
self._store = Store(data=[], fields=[])
self._get_fields()
self._get_data()
self._set_store_fields()
self._set_store_data()
return self._store
......@@ -8,11 +8,12 @@ HEAD
- Redesing the viewport using a more generic organisation
(configure, metadata, events, lists, metrics and graphs)
- Use the pGridExport plugin in views/report/grid.html
- Add the class StoreFactory, StoreForListview, StoreForMetric1DView
and StoreForMetric2Dview.
- Imporve the design of the table for lists and metrics.
- Redesing the report section using pandas DataFrame and the
new classes List, Metrid1D and Metric2D.
- Improve the design of the table for lists and metrics.
Add a new table for graphs.
- Add user guide explaining how to create list, metric and graph.
- Add user guide explaining how to create list, metric and
graph using sphinx tools.
70753e8 (Jul 14)
- Migrate to plugin_dbui 0.6.1.6 and Web2py 2.9.5.
......
static/docs/database.png

91 KB | W: | H:

static/docs/database.png

94.5 KB | W: | H:

static/docs/database.png
static/docs/database.png
static/docs/database.png
static/docs/database.png
  • 2-up
  • Swipe
  • Onion skin
......@@ -22,4 +22,4 @@
<type label="Upload" length="0" sql="upload" quote="'"/>
<type label="Password" length="0" sql="password" quote="'"/>
</group>
</datatypes><table x="303" y="21" name="people"><row name="id" null="0" autoincrement="1"><datatype>integer</datatype></row><row name="first_name" null="0" autoincrement="0"><datatype>string</datatype></row><row name="last_name" null="0" autoincrement="0"><datatype>string</datatype></row><row name="initials" null="0" autoincrement="0"><datatype>string</datatype></row><row name="birth_date" null="1" autoincrement="0"><datatype>date</datatype></row><row name="note" null="1" autoincrement="0"><datatype>text</datatype></row><key type="PRIMARY" name=""><part>id</part></key></table><table x="302" y="174" name="teams"><row name="id" null="0" autoincrement="1"><datatype>integer</datatype></row><row name="team" null="0" autoincrement="0"><datatype>string</datatype></row><row name="domain" null="1" autoincrement="0"><datatype>string</datatype></row><key type="PRIMARY" name=""><part>id</part></key></table><table x="303" y="285" name="projects"><row name="id" null="0" autoincrement="1"><datatype>integer</datatype></row><row name="project" null="0" autoincrement="0"><datatype>string</datatype></row><row name="agencies" null="1" autoincrement="0"><datatype>string</datatype></row><key type="PRIMARY" name=""><part>id</part></key></table><table x="618" y="19" name="people_categories"><row name="id" null="0" autoincrement="1"><datatype>integer</datatype></row><row name="code" null="0" autoincrement="0"><datatype>string</datatype></row><row name="category" null="0" autoincrement="0"><datatype>string</datatype></row><row name="definition" null="1" autoincrement="0"><datatype>string</datatype></row><key type="PRIMARY" name=""><part>id</part></key></table><table x="452" y="71" name="history"><row name="id" null="0" autoincrement="1"><datatype>integer</datatype></row><row name="id_people" null="0" autoincrement="0"><datatype>integer</datatype><relation table="people" row="id" /></row><row name="id_teams" null="0" autoincrement="0"><datatype>integer</datatype><relation table="teams" row="id" /></row><row name="id_projects" null="0" autoincrement="0"><datatype>integer</datatype><relation table="projects" row="id" /></row><row name="id_people_categories" null="0" autoincrement="0"><datatype>integer</datatype><relation table="people_categories" row="id" /></row><row name="id_fundings" null="0" autoincrement="0"><datatype>integer</datatype><relation table="fundings" row="id" /></row><row name="id_events" null="0" autoincrement="0"><datatype>integer</datatype><relation table="events" row="id" /></row><row name="start_date" null="0" autoincrement="0"><datatype>date</datatype></row><row name="end_date" null="1" autoincrement="0"><datatype>date</datatype></row><row name="percentage" null="1" autoincrement="0"><datatype>integer</datatype></row><row name="note" null="0" autoincrement="0"><datatype>text</datatype></row><row name="data" null="1" autoincrement="0"><datatype>string</datatype></row><key type="PRIMARY" name=""><part>id</part></key></table><table x="633" y="149" name="fundings"><row name="id" null="0" autoincrement="1"><datatype>integer</datatype></row><row name="agency" null="0" autoincrement="0"><datatype>string</datatype></row><row name="definition" null="1" autoincrement="0"><datatype>text</datatype></row><key type="PRIMARY" name=""><part>id</part></key></table><table x="638" y="266" name="events"><row name="id" null="0" autoincrement="1"><datatype>integer</datatype></row><row name="event" null="0" autoincrement="0"><datatype>string</datatype></row><row name="definitiion" null="1" autoincrement="0"><datatype>text</datatype></row><row name="data" null="1" autoincrement="0"><datatype>text</datatype></row><key type="PRIMARY" name=""><part>id</part></key></table><table x="807" y="23" name="lists"><row name="id" null="0" autoincrement="1"><datatype>integer</datatype></row><row name="name" null="0" autoincrement="0"><datatype>string</datatype></row><row name="title" null="1" autoincrement="0"><datatype>string</datatype></row><row name="conditions" null="1" autoincrement="0"><datatype>text</datatype></row><row name="group_field" null="1" autoincrement="0"><datatype>string</datatype></row><row name="sorters" null="1" autoincrement="0"><datatype>integer</datatype></row><row name="columns" null="0" autoincrement="0"><datatype>text</datatype></row><row name="features" null="1" autoincrement="0"><datatype>text</datatype></row><row name="definition" null="1" autoincrement="0"><datatype>text</datatype></row><key type="PRIMARY" name=""><part>id</part></key></table><table x="903" y="22" name="metrics"><row name="id" null="0" autoincrement="1"><datatype>integer</datatype></row><row name="name" null="0" autoincrement="0"><datatype>string</datatype></row><row name="title" null="1" autoincrement="0"><datatype>string</datatype></row><row name="conditions" null="1" autoincrement="0"><datatype>text</datatype></row><row name="field_vertical" null="1" autoincrement="0"><datatype>string</datatype></row><row name="field_horizontal" null="0" autoincrement="0"><datatype>string</datatype></row><row name="metric" null="0" autoincrement="0"><datatype>string</datatype></row><row name="definition" null="1" autoincrement="0"><datatype>text</datatype></row><key type="PRIMARY" name=""><part>id</part></key></table><table x="906" y="211" name="graphs"><row name="id" null="0" autoincrement="1"><datatype>integer</datatype></row><row name="name" null="0" autoincrement="0"><datatype>string</datatype></row><row name="title" null="1" autoincrement="0"><datatype>string</datatype></row><row name="conditions" null="1" autoincrement="0"><datatype>text</datatype></row><row name="field_horizontal" null="0" autoincrement="0"><datatype>string</datatype></row><row name="field_stacked" null="1" autoincrement="0"><datatype>string</datatype></row><row name="metric_vertical" null="0" autoincrement="0"><datatype>text</datatype></row><row name="definition" null="1" autoincrement="0"><datatype>text</datatype></row><key type="PRIMARY" name=""><part>id</part></key></table></sql>
\ No newline at end of file
</datatypes><table x="303" y="21" name="people"><row name="id" null="0" autoincrement="1"><datatype>integer</datatype></row><row name="first_name" null="0" autoincrement="0"><datatype>string</datatype></row><row name="last_name" null="0" autoincrement="0"><datatype>string</datatype></row><row name="initials" null="0" autoincrement="0"><datatype>string</datatype></row><row name="birth_date" null="1" autoincrement="0"><datatype>date</datatype></row><row name="note" null="1" autoincrement="0"><datatype>text</datatype></row><key type="PRIMARY" name=""><part>id</part></key></table><table x="302" y="174" name="teams"><row name="id" null="0" autoincrement="1"><datatype>integer</datatype></row><row name="team" null="0" autoincrement="0"><datatype>string</datatype></row><row name="domain" null="1" autoincrement="0"><datatype>string</datatype></row><key type="PRIMARY" name=""><part>id</part></key></table><table x="303" y="285" name="projects"><row name="id" null="0" autoincrement="1"><datatype>integer</datatype></row><row name="project" null="0" autoincrement="0"><datatype>string</datatype></row><row name="agencies" null="1" autoincrement="0"><datatype>string</datatype></row><key type="PRIMARY" name=""><part>id</part></key></table><table x="618" y="19" name="people_categories"><row name="id" null="0" autoincrement="1"><datatype>integer</datatype></row><row name="code" null="0" autoincrement="0"><datatype>string</datatype></row><row name="category" null="0" autoincrement="0"><datatype>string</datatype></row><row name="definition" null="1" autoincrement="0"><datatype>string</datatype></row><key type="PRIMARY" name=""><part>id</part></key></table><table x="452" y="71" name="history"><row name="id" null="0" autoincrement="1"><datatype>integer</datatype></row><row name="id_people" null="0" autoincrement="0"><datatype>integer</datatype><relation table="people" row="id" /></row><row name="id_teams" null="0" autoincrement="0"><datatype>integer</datatype><relation table="teams" row="id" /></row><row name="id_projects" null="0" autoincrement="0"><datatype>integer</datatype><relation table="projects" row="id" /></row><row name="id_people_categories" null="0" autoincrement="0"><datatype>integer</datatype><relation table="people_categories" row="id" /></row><row name="id_fundings" null="0" autoincrement="0"><datatype>integer</datatype><relation table="fundings" row="id" /></row><row name="id_events" null="0" autoincrement="0"><datatype>integer</datatype><relation table="events" row="id" /></row><row name="start_date" null="0" autoincrement="0"><datatype>date</datatype></row><row name="end_date" null="1" autoincrement="0"><datatype>date</datatype></row><row name="percentage" null="1" autoincrement="0"><datatype>integer</datatype></row><row name="note" null="0" autoincrement="0"><datatype>text</datatype></row><row name="data" null="1" autoincrement="0"><datatype>string</datatype></row><key type="PRIMARY" name=""><part>id</part></key></table><table x="633" y="149" name="fundings"><row name="id" null="0" autoincrement="1"><datatype>integer</datatype></row><row name="agency" null="0" autoincrement="0"><datatype>string</datatype></row><row name="definition" null="1" autoincrement="0"><datatype>text</datatype></row><key type="PRIMARY" name=""><part>id</part></key></table><table x="638" y="266" name="events"><row name="id" null="0" autoincrement="1"><datatype>integer</datatype></row><row name="event" null="0" autoincrement="0"><datatype>string</datatype></row><row name="definitiion" null="1" autoincrement="0"><datatype>text</datatype></row><row name="data" null="1" autoincrement="0"><datatype>text</datatype></row><key type="PRIMARY" name=""><part>id</part></key></table><table x="807" y="23" name="lists"><row name="id" null="0" autoincrement="1"><datatype>integer</datatype></row><row name="name" null="0" autoincrement="0"><datatype>string</datatype></row><row name="title" null="1" autoincrement="0"><datatype>string</datatype></row><row name="conditions" null="1" autoincrement="0"><datatype>text</datatype></row><row name="group_field" null="1" autoincrement="0"><datatype>string</datatype></row><row name="sorters" null="1" autoincrement="0"><datatype>integer</datatype></row><row name="columns" null="0" autoincrement="0"><datatype>text</datatype></row><row name="features" null="1" autoincrement="0"><datatype>text</datatype></row><row name="definition" null="1" autoincrement="0"><datatype>text</datatype></row><key type="PRIMARY" name=""><part>id</part></key></table><table x="903" y="22" name="metrics"><row name="id" null="0" autoincrement="1"><datatype>integer</datatype></row><row name="name" null="0" autoincrement="0"><datatype>string</datatype></row><row name="title" null="1" autoincrement="0"><datatype>string</datatype></row><row name="conditions" null="1" autoincrement="0"><datatype>text</datatype></row><row name="field_vertical" null="1" autoincrement="0"><datatype>string</datatype></row><row name="field_horizontal" null="0" autoincrement="0"><datatype>string</datatype></row><row name="metric" null="0" autoincrement="0"><datatype>string</datatype></row><row name="definition" null="1" autoincrement="0"><datatype>text</datatype></row><key type="PRIMARY" name=""><part>id</part></key></table><table x="906" y="211" name="graphs"><row name="id" null="0" autoincrement="1"><datatype>integer</datatype></row><row name="name" null="0" autoincrement="0"><datatype>string</datatype></row><row name="title" null="1" autoincrement="0"><datatype>string</datatype></row><row name="conditions" null="1" autoincrement="0"><datatype>text</datatype></row><row name="field_horizontal" null="0" autoincrement="0"><datatype>string</datatype></row><row name="field_stacked" null="1" autoincrement="0"><datatype>string</datatype></row><row name="metric_vertical" null="0" autoincrement="0"><datatype>text</datatype></row><row name="definition" null="1" autoincrement="0"><datatype>text</datatype></row><key type="PRIMARY" name=""><part>id</part></key></table><table x="778" y="235" name="metrics1d"><row name="id" null="0" autoincrement="1"><datatype>integer</datatype></row><row name="name" null="0" autoincrement="0"><datatype>string</datatype></row><row name="title" null="1" autoincrement="0"><datatype>string</datatype></row><row name="conditions" null="1" autoincrement="0"><datatype>text</datatype></row><row name="columns" null="0" autoincrement="0"><datatype>text</datatype></row><row name="definition" null="1" autoincrement="0"><datatype>text</datatype></row><key type="PRIMARY" name=""><part>id</part></key></table></sql>
\ No newline at end of file
......@@ -5,8 +5,8 @@ Appendix C: Column configuration
List
----
The configuration parameter for the List column are those of the
``Ext.grid.column.Column`` class. The most important one are listed in the next
The configuration parameter for the List column are those of the
``Ext.grid.column.Column`` class. The most important one are listed in the next
sections. Those marked with a (*) are mandatory.
all columns
......@@ -17,14 +17,14 @@ all columns
* -
-
-
-
* - ``align``
-
- Possible values are: ``left``, ``center``, and ``right``.
* - ``columnWidth``