feeder: import formdata evolutions in evolution* tables (fixes #13028)
This commit is contained in:
parent
688a2f0319
commit
42753c1de3
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue