diff --git a/src/proxy/migrations/0001_initial.py b/src/proxy/migrations/0001_initial.py index c3c0aa2..6b2355f 100644 --- a/src/proxy/migrations/0001_initial.py +++ b/src/proxy/migrations/0001_initial.py @@ -1,5 +1,6 @@ # -*- coding: utf-8 -*- import datetime +from django.db import connections from south.db import db from south.v2 import SchemaMigration from django.db import models @@ -8,10 +9,177 @@ from django.db import models class Migration(SchemaMigration): def forwards(self, orm): + connection = connections['trac'] + + cursor = connection.cursor() + cursor.execute(''' + CREATE OR REPLACE VIEW wiki_view AS SELECT + wiki.name AS name, + (SELECT wiki2.text FROM wiki AS wiki2 WHERE wiki2.name = wiki.name + AND wiki2.version = MAX(wiki.version)) AS wiki_text, + (SELECT wiki3.author FROM wiki AS wiki3 WHERE wiki3.name = wiki.name + AND wiki3.version = 1) AS author, + string_agg(DISTINCT wiki.author, ', ') AS collaborators, + TIMESTAMP WITH TIME ZONE 'epoch' + (MAX(wiki.time)/1000000) * INTERVAL '1s' AS created, + TIMESTAMP WITH TIME ZONE 'epoch' + (MIN(wiki.time)/1000000) * INTERVAL '1s' AS modified + FROM wiki + GROUP BY wiki.name; + + CREATE OR REPLACE VIEW ticket_view AS SELECT + ticket.id AS id, + ticket.summary as summary, + ticket.description as description, + ticket.milestone as milestone, + ticket.priority as priority, + ticket.component as component, + ticket.version as version, + ticket.severity as severity, + ticket.reporter as reporter, + ticket.reporter as author, + ticket.status as status, + ticket.keywords as keywords, + (SELECT + string_agg(DISTINCT ticket_change.author, ', ') + FROM ticket_change WHERE ticket_change.ticket = ticket.id + GROUP BY ticket_change.ticket) as collaborators, + TIMESTAMP WITH TIME ZONE 'epoch' + (time/1000000)* INTERVAL '1s' AS created, + TIMESTAMP WITH TIME ZONE 'epoch' + (changetime/1000000) * INTERVAL '1s' AS modified + FROM ticket; + + CREATE OR REPLACE VIEW revision_view AS SELECT + revision.rev, + revision.author, + revision.message, + repository.value AS repository_name, + TIMESTAMP WITH TIME ZONE 'epoch' + (revision.time/1000000) * INTERVAL '1s' AS created + FROM revision + INNER JOIN repository ON( + repository.id = revision.repos + AND repository.name = 'name' + AND repository.value != '' + ); + ''') + cursor.execute(''' +CREATE OR REPLACE VIEW revision_view AS SELECT +revision.rev, +revision.author, +revision.message, +repository.value AS repository_name, +TIMESTAMP WITH TIME ZONE 'epoch' + (revision.time/1000000) * INTERVAL '1s' AS created, +CONCAT(revision.repos, '-', revision.rev) AS key +FROM revision +INNER JOIN repository ON( +repository.id = revision.repos +AND repository.name = 'name' +AND repository.value != '' +); +''') + cursor.execute(''' +CREATE OR REPLACE VIEW attachment_view AS SELECT +CONCAT(attachment.type, '/' , attachment.id, '/', attachment.filename) AS url, +attachment.type AS used_by, +attachment.filename AS filename, +attachment.id as attach_id, +(SELECT LOWER(SUBSTRING(attachment.filename FROM '\.(\w+)$'))) AS mimetype, +attachment.author AS author, +attachment.description AS description, +attachment.size AS size, +TIMESTAMP WITH TIME ZONE 'epoch' + (attachment.time/1000000)* INTERVAL '1s' AS created +FROM attachment; +''') + cursor.execute(''' +CREATE OR REPLACE VIEW wiki_view AS SELECT +wiki.name AS name, +(SELECT wiki2.text FROM wiki AS wiki2 WHERE wiki2.name = wiki.name +AND wiki2.version = MAX(wiki.version)) AS wiki_text, +(SELECT wiki3.author FROM wiki AS wiki3 WHERE wiki3.name = wiki.name +AND wiki3.version = 1) AS author, +string_agg(DISTINCT wiki.author, ', ') AS collaborators, +TIMESTAMP WITH TIME ZONE 'epoch' + (MIN(wiki.time)/1000000) * INTERVAL '1s' AS created, +TIMESTAMP WITH TIME ZONE 'epoch' + (MAX(wiki.time)/1000000) * INTERVAL '1s' AS modified +FROM wiki +GROUP BY wiki.name; +''') + cursor.execute(''' +CREATE OR REPLACE VIEW wiki_view AS SELECT +wiki.name AS name, +(SELECT wiki2.text FROM wiki AS wiki2 WHERE wiki2.name = wiki.name +AND wiki2.version = MAX(wiki.version)) AS wiki_text, +(SELECT wiki3.author FROM wiki AS wiki3 WHERE wiki3.name = wiki.name +AND wiki3.version = 1) AS author, +string_agg(DISTINCT wiki.author, ', ') AS collaborators, +TIMESTAMP WITH TIME ZONE 'epoch' + (MIN(wiki.time)/1000000) * INTERVAL '1s' AS created, +TIMESTAMP WITH TIME ZONE 'epoch' + (MAX(wiki.time)/1000000) * INTERVAL '1s' AS modified, +(SELECT wiki4.author FROM wiki AS wiki4 WHERE wiki4.name = wiki.name +AND wiki4.version = MAX(wiki.version)) AS modified_by +FROM wiki +GROUP BY wiki.name; + +CREATE OR REPLACE VIEW ticket_view AS SELECT +ticket.id AS id, +ticket.summary as summary, +ticket.description as description, +ticket.milestone as milestone, +ticket.priority as priority, +ticket.component as component, +ticket.version as version, +ticket.severity as severity, +ticket.reporter as reporter, +ticket.reporter as author, +ticket.status as status, +ticket.keywords as keywords, +(SELECT +string_agg(DISTINCT ticket_change.author, ', ') +FROM ticket_change WHERE ticket_change.ticket = ticket.id +GROUP BY ticket_change.ticket) as collaborators, +TIMESTAMP WITH TIME ZONE 'epoch' + (time/1000000)* INTERVAL '1s' AS created, +TIMESTAMP WITH TIME ZONE 'epoch' + (changetime/1000000) * INTERVAL '1s' AS modified, +(SELECT +ticket_change.author +FROM ticket_change +WHERE ticket_change.ticket = ticket.id +AND ticket_change.time = ticket.changetime +LIMIT 1 +) AS modified_by +FROM ticket; +''') + cursor.execute(''' +CREATE OR REPLACE VIEW ticket_collab_count_view AS +SELECT +COALESCE (t1.author, t2.author) as author, +(COALESCE(t1.count, 0) + COALESCE(t2.count, 0)) as count +FROM +(SELECT author, count(*) as count +FROM ticket_change +GROUP BY author +ORDER BY author +) AS t1 +FULL OUTER JOIN +(SELECT reporter as author, count(*) as count +FROM ticket +GROUP BY reporter +ORDER BY reporter +) AS t2 +ON t1.author = t2.author; + +CREATE OR REPLACE VIEW wiki_collab_count_view AS +SELECT author, count(*) from wiki GROUP BY author; +''') + pass def backwards(self, orm): - pass + connection = connections['trac'] + + cursor = connection.cursor() + cursor.execute(''' +DROP VIEW IF EXISTS revision_view; +DROP VIEW IF EXISTS ticket_view; +DROP VIEW IF EXISTS wiki_view; +''') + cursor.execute('DROP VIEW IF EXISTS attachment_view;') + + pass models = { u'proxy.attachment': { @@ -76,4 +244,5 @@ class Migration(SchemaMigration): } } - complete_apps = ['proxy'] \ No newline at end of file + complete_apps = ['proxy'] + symmetrical = True -- libgit2 0.21.2