Commit 38507bec619ea90526fcc03a9933e6108114494e
1 parent
00247e8c
Exists in
master
and in
39 other branches
Fixed proxy migration
Signed-off-by : Alex Campelo <chevalier.beaumont@gmail.com> Signed-off-by: Gustavo Jaruga <darksshades@gmail.com>
Showing
1 changed file
with
171 additions
and
2 deletions
Show diff stats
src/proxy/migrations/0001_initial.py
| 1 | # -*- coding: utf-8 -*- | 1 | # -*- coding: utf-8 -*- |
| 2 | import datetime | 2 | import datetime |
| 3 | +from django.db import connections | ||
| 3 | from south.db import db | 4 | from south.db import db |
| 4 | from south.v2 import SchemaMigration | 5 | from south.v2 import SchemaMigration |
| 5 | from django.db import models | 6 | from django.db import models |
| @@ -8,10 +9,177 @@ from django.db import models | @@ -8,10 +9,177 @@ from django.db import models | ||
| 8 | class Migration(SchemaMigration): | 9 | class Migration(SchemaMigration): |
| 9 | 10 | ||
| 10 | def forwards(self, orm): | 11 | def forwards(self, orm): |
| 12 | + connection = connections['trac'] | ||
| 13 | + | ||
| 14 | + cursor = connection.cursor() | ||
| 15 | + cursor.execute(''' | ||
| 16 | + CREATE OR REPLACE VIEW wiki_view AS SELECT | ||
| 17 | + wiki.name AS name, | ||
| 18 | + (SELECT wiki2.text FROM wiki AS wiki2 WHERE wiki2.name = wiki.name | ||
| 19 | + AND wiki2.version = MAX(wiki.version)) AS wiki_text, | ||
| 20 | + (SELECT wiki3.author FROM wiki AS wiki3 WHERE wiki3.name = wiki.name | ||
| 21 | + AND wiki3.version = 1) AS author, | ||
| 22 | + string_agg(DISTINCT wiki.author, ', ') AS collaborators, | ||
| 23 | + TIMESTAMP WITH TIME ZONE 'epoch' + (MAX(wiki.time)/1000000) * INTERVAL '1s' AS created, | ||
| 24 | + TIMESTAMP WITH TIME ZONE 'epoch' + (MIN(wiki.time)/1000000) * INTERVAL '1s' AS modified | ||
| 25 | + FROM wiki | ||
| 26 | + GROUP BY wiki.name; | ||
| 27 | + | ||
| 28 | + CREATE OR REPLACE VIEW ticket_view AS SELECT | ||
| 29 | + ticket.id AS id, | ||
| 30 | + ticket.summary as summary, | ||
| 31 | + ticket.description as description, | ||
| 32 | + ticket.milestone as milestone, | ||
| 33 | + ticket.priority as priority, | ||
| 34 | + ticket.component as component, | ||
| 35 | + ticket.version as version, | ||
| 36 | + ticket.severity as severity, | ||
| 37 | + ticket.reporter as reporter, | ||
| 38 | + ticket.reporter as author, | ||
| 39 | + ticket.status as status, | ||
| 40 | + ticket.keywords as keywords, | ||
| 41 | + (SELECT | ||
| 42 | + string_agg(DISTINCT ticket_change.author, ', ') | ||
| 43 | + FROM ticket_change WHERE ticket_change.ticket = ticket.id | ||
| 44 | + GROUP BY ticket_change.ticket) as collaborators, | ||
| 45 | + TIMESTAMP WITH TIME ZONE 'epoch' + (time/1000000)* INTERVAL '1s' AS created, | ||
| 46 | + TIMESTAMP WITH TIME ZONE 'epoch' + (changetime/1000000) * INTERVAL '1s' AS modified | ||
| 47 | + FROM ticket; | ||
| 48 | + | ||
| 49 | + CREATE OR REPLACE VIEW revision_view AS SELECT | ||
| 50 | + revision.rev, | ||
| 51 | + revision.author, | ||
| 52 | + revision.message, | ||
| 53 | + repository.value AS repository_name, | ||
| 54 | + TIMESTAMP WITH TIME ZONE 'epoch' + (revision.time/1000000) * INTERVAL '1s' AS created | ||
| 55 | + FROM revision | ||
| 56 | + INNER JOIN repository ON( | ||
| 57 | + repository.id = revision.repos | ||
| 58 | + AND repository.name = 'name' | ||
| 59 | + AND repository.value != '' | ||
| 60 | + ); | ||
| 61 | + ''') | ||
| 62 | + cursor.execute(''' | ||
| 63 | +CREATE OR REPLACE VIEW revision_view AS SELECT | ||
| 64 | +revision.rev, | ||
| 65 | +revision.author, | ||
| 66 | +revision.message, | ||
| 67 | +repository.value AS repository_name, | ||
| 68 | +TIMESTAMP WITH TIME ZONE 'epoch' + (revision.time/1000000) * INTERVAL '1s' AS created, | ||
| 69 | +CONCAT(revision.repos, '-', revision.rev) AS key | ||
| 70 | +FROM revision | ||
| 71 | +INNER JOIN repository ON( | ||
| 72 | +repository.id = revision.repos | ||
| 73 | +AND repository.name = 'name' | ||
| 74 | +AND repository.value != '' | ||
| 75 | +); | ||
| 76 | +''') | ||
| 77 | + cursor.execute(''' | ||
| 78 | +CREATE OR REPLACE VIEW attachment_view AS SELECT | ||
| 79 | +CONCAT(attachment.type, '/' , attachment.id, '/', attachment.filename) AS url, | ||
| 80 | +attachment.type AS used_by, | ||
| 81 | +attachment.filename AS filename, | ||
| 82 | +attachment.id as attach_id, | ||
| 83 | +(SELECT LOWER(SUBSTRING(attachment.filename FROM '\.(\w+)$'))) AS mimetype, | ||
| 84 | +attachment.author AS author, | ||
| 85 | +attachment.description AS description, | ||
| 86 | +attachment.size AS size, | ||
| 87 | +TIMESTAMP WITH TIME ZONE 'epoch' + (attachment.time/1000000)* INTERVAL '1s' AS created | ||
| 88 | +FROM attachment; | ||
| 89 | +''') | ||
| 90 | + cursor.execute(''' | ||
| 91 | +CREATE OR REPLACE VIEW wiki_view AS SELECT | ||
| 92 | +wiki.name AS name, | ||
| 93 | +(SELECT wiki2.text FROM wiki AS wiki2 WHERE wiki2.name = wiki.name | ||
| 94 | +AND wiki2.version = MAX(wiki.version)) AS wiki_text, | ||
| 95 | +(SELECT wiki3.author FROM wiki AS wiki3 WHERE wiki3.name = wiki.name | ||
| 96 | +AND wiki3.version = 1) AS author, | ||
| 97 | +string_agg(DISTINCT wiki.author, ', ') AS collaborators, | ||
| 98 | +TIMESTAMP WITH TIME ZONE 'epoch' + (MIN(wiki.time)/1000000) * INTERVAL '1s' AS created, | ||
| 99 | +TIMESTAMP WITH TIME ZONE 'epoch' + (MAX(wiki.time)/1000000) * INTERVAL '1s' AS modified | ||
| 100 | +FROM wiki | ||
| 101 | +GROUP BY wiki.name; | ||
| 102 | +''') | ||
| 103 | + cursor.execute(''' | ||
| 104 | +CREATE OR REPLACE VIEW wiki_view AS SELECT | ||
| 105 | +wiki.name AS name, | ||
| 106 | +(SELECT wiki2.text FROM wiki AS wiki2 WHERE wiki2.name = wiki.name | ||
| 107 | +AND wiki2.version = MAX(wiki.version)) AS wiki_text, | ||
| 108 | +(SELECT wiki3.author FROM wiki AS wiki3 WHERE wiki3.name = wiki.name | ||
| 109 | +AND wiki3.version = 1) AS author, | ||
| 110 | +string_agg(DISTINCT wiki.author, ', ') AS collaborators, | ||
| 111 | +TIMESTAMP WITH TIME ZONE 'epoch' + (MIN(wiki.time)/1000000) * INTERVAL '1s' AS created, | ||
| 112 | +TIMESTAMP WITH TIME ZONE 'epoch' + (MAX(wiki.time)/1000000) * INTERVAL '1s' AS modified, | ||
| 113 | +(SELECT wiki4.author FROM wiki AS wiki4 WHERE wiki4.name = wiki.name | ||
| 114 | +AND wiki4.version = MAX(wiki.version)) AS modified_by | ||
| 115 | +FROM wiki | ||
| 116 | +GROUP BY wiki.name; | ||
| 117 | + | ||
| 118 | +CREATE OR REPLACE VIEW ticket_view AS SELECT | ||
| 119 | +ticket.id AS id, | ||
| 120 | +ticket.summary as summary, | ||
| 121 | +ticket.description as description, | ||
| 122 | +ticket.milestone as milestone, | ||
| 123 | +ticket.priority as priority, | ||
| 124 | +ticket.component as component, | ||
| 125 | +ticket.version as version, | ||
| 126 | +ticket.severity as severity, | ||
| 127 | +ticket.reporter as reporter, | ||
| 128 | +ticket.reporter as author, | ||
| 129 | +ticket.status as status, | ||
| 130 | +ticket.keywords as keywords, | ||
| 131 | +(SELECT | ||
| 132 | +string_agg(DISTINCT ticket_change.author, ', ') | ||
| 133 | +FROM ticket_change WHERE ticket_change.ticket = ticket.id | ||
| 134 | +GROUP BY ticket_change.ticket) as collaborators, | ||
| 135 | +TIMESTAMP WITH TIME ZONE 'epoch' + (time/1000000)* INTERVAL '1s' AS created, | ||
| 136 | +TIMESTAMP WITH TIME ZONE 'epoch' + (changetime/1000000) * INTERVAL '1s' AS modified, | ||
| 137 | +(SELECT | ||
| 138 | +ticket_change.author | ||
| 139 | +FROM ticket_change | ||
| 140 | +WHERE ticket_change.ticket = ticket.id | ||
| 141 | +AND ticket_change.time = ticket.changetime | ||
| 142 | +LIMIT 1 | ||
| 143 | +) AS modified_by | ||
| 144 | +FROM ticket; | ||
| 145 | +''') | ||
| 146 | + cursor.execute(''' | ||
| 147 | +CREATE OR REPLACE VIEW ticket_collab_count_view AS | ||
| 148 | +SELECT | ||
| 149 | +COALESCE (t1.author, t2.author) as author, | ||
| 150 | +(COALESCE(t1.count, 0) + COALESCE(t2.count, 0)) as count | ||
| 151 | +FROM | ||
| 152 | +(SELECT author, count(*) as count | ||
| 153 | +FROM ticket_change | ||
| 154 | +GROUP BY author | ||
| 155 | +ORDER BY author | ||
| 156 | +) AS t1 | ||
| 157 | +FULL OUTER JOIN | ||
| 158 | +(SELECT reporter as author, count(*) as count | ||
| 159 | +FROM ticket | ||
| 160 | +GROUP BY reporter | ||
| 161 | +ORDER BY reporter | ||
| 162 | +) AS t2 | ||
| 163 | +ON t1.author = t2.author; | ||
| 164 | + | ||
| 165 | +CREATE OR REPLACE VIEW wiki_collab_count_view AS | ||
| 166 | +SELECT author, count(*) from wiki GROUP BY author; | ||
| 167 | +''') | ||
| 168 | + | ||
| 11 | pass | 169 | pass |
| 12 | 170 | ||
| 13 | def backwards(self, orm): | 171 | def backwards(self, orm): |
| 14 | - pass | 172 | + connection = connections['trac'] |
| 173 | + | ||
| 174 | + cursor = connection.cursor() | ||
| 175 | + cursor.execute(''' | ||
| 176 | +DROP VIEW IF EXISTS revision_view; | ||
| 177 | +DROP VIEW IF EXISTS ticket_view; | ||
| 178 | +DROP VIEW IF EXISTS wiki_view; | ||
| 179 | +''') | ||
| 180 | + cursor.execute('DROP VIEW IF EXISTS attachment_view;') | ||
| 181 | + | ||
| 182 | + pass | ||
| 15 | 183 | ||
| 16 | models = { | 184 | models = { |
| 17 | u'proxy.attachment': { | 185 | u'proxy.attachment': { |
| @@ -76,4 +244,5 @@ class Migration(SchemaMigration): | @@ -76,4 +244,5 @@ class Migration(SchemaMigration): | ||
| 76 | } | 244 | } |
| 77 | } | 245 | } |
| 78 | 246 | ||
| 79 | - complete_apps = ['proxy'] | ||
| 80 | \ No newline at end of file | 247 | \ No newline at end of file |
| 248 | + complete_apps = ['proxy'] | ||
| 249 | + symmetrical = True |