Commit 5699b533 authored by LE GAC Renaud's avatar LE GAC Renaud
Browse files

Refactor the table metrics as metrics2d.

parent c06436bc
......@@ -76,7 +76,7 @@ def list():
return dict(cfg_store=json.dumps(store), view=grid)
def metric1D():
def metric_1d():
"""One dimension metric renders by an C{App.grid.Panel}.
The controller extracts the configuration of the metric
......@@ -87,7 +87,7 @@ def metric1D():
and send using the baseParams techniques.
"""
ui_table = virtdb.metric_selector_1D
ui_table = virtdb.metric_selector_1d
selector = MySelector(ui_table, exclude_fields=('metric',))
# build report and extract the configuration
......@@ -102,7 +102,7 @@ def metric1D():
return dict(cfg_store=json.dumps(store), view=grid)
def metric2D():
def metric_2d():
"""Two dimensions metric renders by an C{Ext.grid.Panel}.
The controller extracts the configuration of the metric
......@@ -115,15 +115,12 @@ def metric2D():
"""
ui_table = virtdb.metric_selector_2D
ui_table = virtdb.metric_selector_2d
selector = MySelector(ui_table, exclude_fields=('metric',))
# build report and extract the configuration
# for the Ext.data.Store and the App.grid.Panel
config = db.metrics[request.vars.id_metrics]
config.field_z = 'people.id'
config.metric = 'size'
config = db.metrics2d[request.vars.id_metrics]
report = Metric2D(config, selector)
store = report.to_store()
grid = report.to_grid()
......
......@@ -18,7 +18,7 @@
'agencies': 'agences',
'Agency': 'Agence',
'Aggregate': 'Agréger',
'Aggregation Z': 'Aggregation Z',
'Aggregation Z': 'Agréger (z)',
'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.',
'Are you sure you want to delete this object?': 'Are you sure you want to delete this object?',
......@@ -147,8 +147,8 @@
'Group': 'Groupe',
'Group by': 'Grouper par',
'Group Field': 'Group Field',
'Group Field X': 'Group Field X',
'Group Field Y': 'Group Field Y',
'Group Field X': 'Groupe (x)',
'Group Field Y': 'Groupe (y)',
'Group ID': 'Group ID',
'Group uniquely assigned to user %(id)s': 'Group uniquely assigned to user %(id)s',
'Groupby': 'Groupby',
......@@ -216,7 +216,7 @@
'Metric / year / category': 'Métrique / année / catégorie',
'Metric / year / quality': 'Métrique / année / qualité',
"Metric are computed for each value of that field. It can be any field of the history table including those of the foreign tables, the individual property of the history.data dictionary or 'year'": "Les métriques sont calculé pour chaque valeur de ce champ. C'est un champ de la table historique en incluant tous les champs des tables étrangères, les clés du dictionaire history.data ou 'year'",
'Metric Field Z': 'Champ métrique (z)',
'Metric Field Z': 'Métrique (z)',
'Metric people per category': 'Nb. de personnes par catégorie',
'Metric people per quality': 'Nb. personnes par qualité',
'Metric people per team': 'Nb. de personnes par équipe',
......
......@@ -60,8 +60,8 @@ tables = ['auth_group',
'graphs',
'history',
'lists',
'metrics',
'metrics1d',
'metrics2d',
'people',
'people_categories',
'projects',
......
# -*- coding: utf-8 -*-
""" metrics
"""
tp_conditions = \
T("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.")
tp_fields = \
T("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.")
db.define_table("metrics",
Field("name", "string", length=255, notnull=True, unique=True),
Field("title", "string", length=255),
Field("conditions", "text", comment=tp_conditions),
Field("field_vertical", "string", length=255, notnull=True, comment=tp_fields),
Field("field_horizontal", "string", length=255, comment=tp_fields),
Field("metric", "string", length=255),
Field("definition", "text"),
migrate="metrics.table")
db.metrics.metric.requires = IS_IN_SET(('count', 'sum_fte'))
\ No newline at end of file
# -*- coding: utf-8 -*-
""" metrics
"""
tp_agg = \
T("The aggregation function applies on the metric field. "
"It is computed on the subset of row having a given values for "
"the group_field x and y.")
db.define_table("metrics2d",
Field("name", "string", length=255, notnull=True, unique=True),
Field("title", "string", length=255),
Field("conditions", "text", comment=tp_conditions),
Field("group_field_x", "string", length=255, notnull=True, comment=tp_fields),
Field("group_field_y", "string", length=255, notnull=True, comment=tp_fields),
Field("metric_field_z", "string", length=255, notnull=True, comment=tp_fields),
Field("aggregation_z", "string", length=255, notnull=True, comment=tp_agg),
Field("definition", "text"),
migrate="metrics2d.table")
# -*- coding: utf-8 -*-
""" metrics
""" metrics2d
"""
table = "metrics2d"
#-------------------------------------------------------------------------------
#
# FIELDS CONFIGURATiON
#
#-------------------------------------------------------------------------------
fieldsModifier = dbui.FieldsModifier('metrics')
fieldsModifier = dbui.FieldsModifier(table)
fieldsModifier.configure_field('conditions', height=110)
fieldsModifier.configure_field('definition', height=110)
......@@ -17,7 +18,7 @@ fieldsModifier.configure_field('definition', height=110)
# FORM CONFIGURATiON
#
#-------------------------------------------------------------------------------
formModifier = dbui.FormModifier('metrics')
formModifier = dbui.FormModifier(table)
formModifier.merge_fields('name',
'title',
......@@ -25,10 +26,11 @@ formModifier.merge_fields('name',
'conditions',
title=T('General'))
formModifier.merge_fields('field_vertical',
'field_horizontal',
'metric',
title=T('Count by'))
formModifier.merge_fields('group_field_x',
'group_field_y',
'metric_field_z',
'aggregation_z',
title=T('Aggregate'))
formModifier.set_mapper(dbui.map_tabpanel)
formModifier.configure(width=450)
......@@ -38,12 +40,13 @@ formModifier.configure(width=450)
# GRID CONFIGURATiON
#
#-------------------------------------------------------------------------------
gridModifier = dbui.GridModifier('metrics')
gridModifier = dbui.GridModifier(table)
gridModifier.configure_column('name', width=30)
gridModifier.hide_columns('conditions',
'field_vertical',
'field_horizontal',
'metric',
gridModifier.hide_columns('aggregation_z',
'conditions',
'group_field_x',
'group_field_y',
'metric_field_z',
'title')
#-------------------------------------------------------------------------------
......@@ -51,5 +54,5 @@ gridModifier.hide_columns('conditions',
# STORE CONFIGURATiON
#
#-------------------------------------------------------------------------------
storeModifier = dbui.StoreModifier('metrics')
storeModifier.orderby(db.metrics.name)
\ No newline at end of file
storeModifier = dbui.StoreModifier(table)
storeModifier.orderby(db.metrics2d.name)
\ No newline at end of file
# -*- coding: utf-8 -*-
""" metric_selector_1D
""" metric_selector_1d
"""
virtdb.define_table('metric_selector_1D',
virtdb.define_table('metric_selector_1d',
Field('year_start', 'integer', default=year),
Field('year_end', 'integer'),
Field('id_teams', 'reference teams', label=T('Team')),
......@@ -10,18 +10,18 @@ virtdb.define_table('metric_selector_1D',
Field('id_people_categories', 'reference people_categories', label= T("Quality")),
Field('id_projects', 'reference projects', label=T('Project')))
virtdb.metric_selector_1D.category.requires = IS_IN_SET(PEOPLE_CATEGORIES)
virtdb.metric_selector_1D.id_people_categories.requires = IS_IN_DB(db, 'people_categories.code')
virtdb.metric_selector_1d.category.requires = IS_IN_SET(PEOPLE_CATEGORIES)
virtdb.metric_selector_1d.id_people_categories.requires = IS_IN_DB(db, 'people_categories.code')
virtdb.metric_selector_1D.id_projects.requires = IS_IN_DB(db, 'projects.project')
virtdb.metric_selector_1D.id_teams.requires = IS_IN_DB(db, 'teams.team')
virtdb.metric_selector_1d.id_projects.requires = IS_IN_DB(db, 'projects.project')
virtdb.metric_selector_1d.id_teams.requires = IS_IN_DB(db, 'teams.team')
#-------------------------------------------------------------------------------
#
# FIELDS CONFIGURATiON
#
#-------------------------------------------------------------------------------
fieldsModifier = dbui.FieldsModifier('metric_selector_1D')
fieldsModifier = dbui.FieldsModifier('metric_selector_1d')
fieldsModifier.configure_field('year_start', flex=1)
fieldsModifier.configure_field('year_end', flex=1)
fieldsModifier.merge_fields('year_start', 'year_end', fieldLabel=T('Period'))
......
# -*- coding: utf-8 -*-
""" metric_selector_2D
""" metric_selector_2d
"""
virtdb.define_table('metric_selector_2D',
virtdb.define_table('metric_selector_2d',
Field('year_start', 'integer', default=year),
Field('year_end', 'integer'),
Field('id_teams', 'reference teams', label=T('Team')),
Field('category', 'string'),
Field('id_people_categories', 'reference people_categories', label= T("Quality")),
Field('id_projects', 'reference projects', label=T('Project')),
Field('metric', 'string'))
Field('id_projects', 'reference projects', label=T('Project')))
virtdb.metric_selector_2D.category.requires = IS_IN_SET(PEOPLE_CATEGORIES)
virtdb.metric_selector_2D.id_people_categories.requires = IS_IN_DB(db, 'people_categories.code')
virtdb.metric_selector_2d.category.requires = IS_IN_SET(PEOPLE_CATEGORIES)
virtdb.metric_selector_2d.id_people_categories.requires = IS_IN_DB(db, 'people_categories.code')
virtdb.metric_selector_2D.id_projects.requires = IS_IN_DB(db, 'projects.project')
virtdb.metric_selector_2D.id_teams.requires = IS_IN_DB(db, 'teams.team')
virtdb.metric_selector_2D.metric.requires = IS_IN_SET(('count', 'sum_fte'))
virtdb.metric_selector_2d.id_projects.requires = IS_IN_DB(db, 'projects.project')
virtdb.metric_selector_2d.id_teams.requires = IS_IN_DB(db, 'teams.team')
#-------------------------------------------------------------------------------
#
# FIELDS CONFIGURATiON
#
#-------------------------------------------------------------------------------
fieldsModifier = dbui.FieldsModifier('metric_selector_2D')
fieldsModifier = dbui.FieldsModifier('metric_selector_2d')
fieldsModifier.configure_field('year_start', flex=1)
fieldsModifier.configure_field('year_end', flex=1)
fieldsModifier.merge_fields('year_start', 'year_end', fieldLabel=T('Period'))
......
......@@ -70,7 +70,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 metrics 2D'), to_grid('metrics2d'))
cfgNode.add_child(T('The graphs'), to_grid('graphs'))
#-------------------------------------------------------------------------------
......@@ -118,24 +118,23 @@ for row in db(db.lists.id > 0).select(orderby=db.lists.name):
metricNode = Node(T('The metrics'))
for row in db(db.metrics1d.id > 0).select(orderby=db.metrics1d.name):
leaf = PanelWithUrlSelector(virtdb.metric_selector_1D,
baseUrl=URL('report', 'metric1D'),
leaf = PanelWithUrlSelector(virtdb.metric_selector_1d,
baseUrl=URL('report', 'metric_1d'),
baseParams={'id_metrics': row.id})
metricNode.add_child(row.name, leaf)
for row in db(db.metrics.id > 0).select(orderby=db.metrics.name):
for row in db(db.metrics2d.id > 0).select(orderby=db.metrics2d.name):
if not row.field_horizontal:
continue
leaf = PanelWithUrlSelector(virtdb.metric_selector_2D,
baseUrl=URL('report', 'metric2D'),
leaf = PanelWithUrlSelector(virtdb.metric_selector_2d,
baseUrl=URL('report', 'metric_2d'),
baseParams={'id_metrics': row.id})
metricNode.add_child(row.name, leaf)
metricNode.sort_children()
#-------------------------------------------------------------------------------
#
# GRAPH
......
......@@ -612,14 +612,10 @@ class Metric2D(BaseReport):
config = self.config
selector = self.selector
# the year can be on the horizontal or vertical axis
# rotate to have year always along the horizontal axis
# reverse operation will be performed at the end
if map_y[0] == "year":
map_y = map_x
map_x = ("year", '', '')
if map_x[0] == "year":
# the year axis is on
# scan the database and compute virtual field on the year basis
is_year = [True for el in (map_x, map_y, map_z) if el[0] == 'year']
if is_year:
for year in selector.get_years():
selector.set_year(year)
......@@ -642,11 +638,23 @@ class Metric2D(BaseReport):
"""
config = self.config
address_x = config.field_horizontal
address_y = config.field_vertical
address_z = config.field_z
address_x = config.group_field_x
address_y = config.group_field_y
address_z = config.metric_field_z
aggregate = config.aggregation_z
# metric
metric = {}
metric[address_z] = aggregate
# split the database field in tablename, fieldname, keyname
# the year can be on the horizontal or vertical axis
# rotate to have year always along the horizontal axis
# reverse operation will be performed at the end
if address_y == 'year':
address_y, address_x = address_x, 'year'
# split the database field in (tablename, fieldname, keyname)
map_x = split_dbfield(address_x)
map_y = split_dbfield(address_y)
map_z = split_dbfield(address_z)
......@@ -656,13 +664,9 @@ class Metric2D(BaseReport):
df = pd.DataFrame(data, columns=[address_x, address_y, address_z])
# remove duplicate entries
if config.metric in ('count', 'size'):
if aggregate in ('count', 'size'):
df = df.drop_duplicates()
# metric
metric = {}
metric[address_z] = config.metric
# group the data
df = df.groupby([address_x, address_y])
df = df.agg(metric)
......@@ -671,7 +675,7 @@ class Metric2D(BaseReport):
df = df.unstack(level=0)
# rotate the data frame when year is along the y-axis
if address_y == 'year':
if config.group_field_y == 'year':
df = df.T
# data frame is persistent
......@@ -683,7 +687,7 @@ class Metric2D(BaseReport):
"""
df = self.df
name = self.config.field_vertical.replace('.', '')
name = self.config.group_field_y.replace('.', '')
# idr is the index of the row either a tuple or a string
# row is a dictionary containing row values
......@@ -705,17 +709,20 @@ class Metric2D(BaseReport):
"""
df = self.df
store = self._store
# first column is for the grouped values of the vertical field
name = self.config.field_vertical.replace('.', '')
di = dict(name=name, type='string')
self._store.fields.append(di)
index_group_y = self.config.group_field_y.replace('.', '')
di = dict(name=index_group_y, type='string')
store.fields.append(di)
# one column per grouped value of the horizontal field
# the column identifier is a tuple (adress_z, group_x)
for name in self._columns:
di = dict(name=name, type='number')
self._store.fields.append(di)
for index in self._columns:
di = dict(name=index, type='number')
store.fields.append(di)
store.sorters = [index_group_y]
def to_grid(self):
......@@ -727,7 +734,7 @@ class Metric2D(BaseReport):
"""
config = self.config
address_y = config.field_vertical
address_y = config.group_field_y
map_y = split_dbfield(address_y)
text_y = (map_y[2] if map_y[2] else map_y[1])
......
......@@ -179,16 +179,16 @@ class MySelector(SelectorActiveItems):
"""
value = 0.
if self.period_start and self.period_end:
if self._period_start and self._period_end:
start = max(self.period_start, row.history.start_date)
start = max(self._period_start, row.history.start_date)
end = self.period_end
end = self._period_end
if row.history.end_date:
end = min(self.period_end, row.history.end_date)
end = min(self._period_end, row.history.end_date)
x = (end - start).days
y = (self.period_end - self.period_start).days
y = (self._period_end - self._period_start).days
value = float(x) / float(y)
return value
......
static/docs/database.png

94.5 KB | W: | H:

static/docs/database.png

98.9 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><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
</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="806" y="19" 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="18" name="metrics2d"><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_x" null="0" autoincrement="0"><datatype>string</datatype></row><row name="group_field_y" null="0" autoincrement="0"><datatype>string</datatype></row><row name="metric_field_z" null="0" autoincrement="0"><datatype>string</datatype></row><row name="aggregate_z" 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="909" y="224" 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="777" y="225" 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="group_field" null="1" autoincrement="0"><datatype>string</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
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