Commit 38507bec619ea90526fcc03a9933e6108114494e

Authored by Al Campelo
1 parent 00247e8c

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 1 # -*- coding: utf-8 -*-
2 2 import datetime
  3 +from django.db import connections
3 4 from south.db import db
4 5 from south.v2 import SchemaMigration
5 6 from django.db import models
... ... @@ -8,10 +9,177 @@ from django.db import models
8 9 class Migration(SchemaMigration):
9 10  
10 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 169 pass
12 170  
13 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 184 models = {
17 185 u'proxy.attachment': {
... ... @@ -76,4 +244,5 @@ class Migration(SchemaMigration):
76 244 }
77 245 }
78 246  
79   - complete_apps = ['proxy']
80 247 \ No newline at end of file
  248 + complete_apps = ['proxy']
  249 + symmetrical = True
... ...