feeder: import formdata evolutions in evolution* tables (fixes #13028)

This commit is contained in:
Benjamin Dauvergne 2016-11-10 11:24:04 +01:00
parent 688a2f0319
commit 42753c1de3
1 changed files with 65 additions and 1 deletions

View File

@ -64,6 +64,7 @@ class WcsOlapFeeder(object):
'form_table': 'formdef',
'generic_formdata_table': 'formdata',
'generic_status_table': 'status',
'generic_evolution_table': 'evolution',
'year_table': 'year',
'month_table': 'month',
'day_table': 'day',
@ -377,6 +378,16 @@ class WcsOlapFeeder(object):
for at, comment in self.comments.iteritems():
self.ex('COMMENT ON COLUMN {generic_formdata_table}.%s IS %%s' % at, vars=(comment,))
self.ex('COMMENT ON TABLE {generic_formdata_table} IS %s', vars=(u'tous les formulaires',))
# evolutions
self.create_table('{generic_evolution_table}', [
['id', 'serial primary key'],
['generic_status_id', 'smallint REFERENCES {generic_status_table} (id)'],
['formdata_id', 'integer'], # "REFERENCES {generic_formdata_table} (id)" is impossible because FK constraints do not work on inherited tables
['time', 'timestamp'],
['date', 'date'],
['hour_id', 'smallint REFERENCES {hour_table} (id)'],
])
self.ex('COMMENT ON TABLE {generic_evolution_table} IS %s', vars=(u'evolution générique',))
def feed(self):
try:
@ -436,6 +447,10 @@ class WcsFormdefFeeder(object):
def status_table_name(self):
return self.hash_table_name('status_%s' % self.formdef.slug.replace('-', '_'))
@property
def evolution_table_name(self):
return self.hash_table_name('evolution_%s' % self.formdef.slug.replace('-', '_'))
def __getattr__(self, name):
return getattr(self.olap_feeder, name)
@ -518,6 +533,16 @@ class WcsFormdefFeeder(object):
constraint = '%s_fk_constraint FOREIGN KEY (%s) %s' % (name, name, _type[i:])
self.ex('ALTER TABLE {formdata_table} ADD CONSTRAINT %s' % constraint)
self.ex('ALTER TABLE {formdata_table} ADD PRIMARY KEY (id)')
# table des evolutions
self.create_table('{evolution_table}', [
['id', 'serial primary key'],
['status_id', 'smallint REFERENCES {status_table} (id)'],
['formdata_id', 'integer REFERENCES {formdata_table} (id)'],
['time', 'timestamp'],
['date', 'date'],
['hour_id', 'smallint REFERENCES {hour_table} (id)'],
])
self.ex('COMMENT ON TABLE {evolution_table} IS %s', vars=(u'evolution des demandes %s' % self.formdef.schema.name,))
def insert_item_value(self, field, value):
table_name = self.hash_table_name('{formdata_table}_field_%s' % field.varname)
@ -606,12 +631,50 @@ class WcsFormdefFeeder(object):
tpl = '(' + ', '.join(['%s'] * len(self.columns[1:])) + ')'
value = self.cur.mogrify(tpl, [row[column] for column in self.columns[1:]])
values.append(value)
# inert evolutions
generic_evolution = []
evolution = []
last_status = None
for evo in data.evolution:
if not evo.status:
continue
status_id = self.status_mapping[data.workflow.status.id]
generic_status_id = self.generic_status(
data.formdef.schema.workflow.statuses_map[evo.status])
if status == last_status:
continue
generic_evolution.append(
[0, generic_status_id, evo.time, evo.time.date(), evo.time.hour])
evolution.append(
[0, status_id, evo.time, evo.time.date(), evo.time.hour])
last_status = status
generic_evolution_values.append(generic_evolution)
evolution_values.append(evolution)
if not values:
self.logger.warning('no data')
return
self.ex('INSERT INTO {formdata_table} (%s) VALUES %s' % (
self.ex('INSERT INTO {formdata_table} (%s) VALUES %s RETURNING id' % (
', '.join(self.columns[1:]), # skip the id column
', '.join(values)))
# insert generic evolutions
generic_evolutions = []
ids = list(self.cur.fetchall())
for evos, (formdata_id,) in zip(generic_evolution_values, ids):
for row in evos:
row[0] = formdata_id
generic_evolutions.append(tuple(row))
self.ex('INSERT INTO {generic_evolution_table} (%s) VALUES %s' % (
', '.join(['formdata_id', 'generic_status_id', 'time', 'date', 'hour_id']),
', '.join(['%s'] * len(generic_evolutions))), vars=generic_evolutions)
# insert evolutions
evolutions = []
for evos, (formdata_id,) in zip(evolution_values, ids):
for row in evos:
row[0] = formdata_id
evolutions.append(tuple(row))
self.ex('INSERT INTO {evolution_table} (%s) VALUES %s' % (
', '.join(['formdata_id', 'status_id', 'time', 'date', 'hour_id']),
', '.join(['%s'] * len(generic_evolutions))), vars=generic_evolutions)
def get_first_agent_in_evolution(self, formdata):
for evo in formdata.evolution:
@ -622,6 +685,7 @@ class WcsFormdefFeeder(object):
self.olap_feeder.ctx.push({
'formdata_table': self.table_name,
'status_table': self.status_table_name,
'evolution_table': self.evolution_table_name
})
# create cube