Merge lp:~cjohnston/qa-dashboard/migrating-away into lp:qa-dashboard

Proposed by Chris Johnston
Status: Superseded
Proposed branch: lp:~cjohnston/qa-dashboard/migrating-away
Merge into: lp:qa-dashboard
Diff against target: 3929 lines (+1021/-2542)
44 files modified
bootspeed/api.py (+1/-2)
bootspeed/models.py (+1/-1)
common/helpers.py (+42/-0)
common/migrations/0001_create_common_app.py (+20/-0)
common/migrations/0002_add_bug_model.py (+42/-0)
common/models.py (+35/-1)
common/views.py (+20/-1)
dashboard/migrations/0001_initial.py (+0/-179)
dashboard/migrations/0002_auto__add_field_run_internal__add_field_bug_internal__add_field_build_.py (+0/-133)
dashboard/migrations/0003_auto__add_field_run_publish__add_field_bug_publish__add_field_build_pu.py (+0/-138)
dashboard/migrations/0004_auto__add_kernel__add_sruresult__add_sruresultlog.py (+0/-208)
dashboard/migrations/0005_auto__add_field_kernel_job_type.py (+0/-148)
dashboard/migrations/0006_auto__add_field_sruresult_kernel_version.py (+0/-149)
dashboard/migrations/0007_auto__add_field_kernel_version__del_field_sruresult_kernel_version.py (+0/-155)
dashboard/migrations/0008_auto__add_imageresult__add_machine__add_image.py (+0/-238)
dashboard/migrations/0009_auto__add_unique_machine_name__add_unique_image_release_arch_variant_b.py (+0/-195)
dashboard/migrations/0010_auto__add_unique_image_md5.py (+0/-189)
dashboard/migrations/0011_removing_bootspeed.py (+0/-203)
dashboard/migrations/0012_change_skip_to_error.py (+0/-143)
dashboard/migrations/__init__.py (+0/-15)
dashboard/views/__init__.py (+0/-21)
dashboard/views/api/__init__.py (+0/-35)
dashboard/views/sru.py (+0/-142)
qa_dashboard/settings.py (+2/-1)
qa_dashboard/urls.py (+31/-26)
smoke/api.py (+1/-2)
smoke/forms.py (+0/-15)
smoke/management/__init__.py (+0/-28)
smoke/management/commands/jenkins_pull.py (+4/-4)
smoke/migrations/0001_create_smoke_app.py (+184/-0)
smoke/migrations/0002_remove_bug_model.py (+98/-0)
smoke/models.py (+3/-163)
smoke/utah_parser.py (+15/-0)
smoke/utah_utils.py (+2/-2)
smoke/views.py (+2/-2)
sru/__init__.py (+14/-0)
sru/forms.py (+33/-0)
sru/management/__init__.py (+14/-0)
sru/management/commands/__init__.py (+14/-0)
sru/management/commands/jenkins_pull_sru.py (+3/-3)
sru/migrations/0001_create_sru_app.py (+140/-0)
sru/models.py (+144/-0)
sru/tests.py (+14/-0)
sru/views.py (+142/-0)
To merge this branch: bzr merge lp:~cjohnston/qa-dashboard/migrating-away
Reviewer Review Type Date Requested Status
QA Dashboard Developers Pending
Review via email: mp+140798@code.launchpad.net

This proposal has been superseded by a proposal from 2012-12-20.

Commit message

Separates code out into sru and smoke apps, plus moves common items to common app.

Description of the change

* Moves helpers, index, DasboardBaseModel and Bug to common app
* Creates SRU app
* Moves SRU related code/models/views to SRU app
* Creates smoke app
* Moves smoke related code/models/views to smoke app
* Updates urls
* Removes dashboard app

REQUIRED:
./manage.py syncdb
./manage.py migrate common 0001 --fake
./manage.py migrate common 0002 --fake
./manage.py migrate smoke 0001 --fake
./manage.py migrate smoke 0002 --fake
./manage.py migrate sru 0001 --fake

I'm not quite at 4,000 lines, let me come up with something else to add. :-)

To post a comment you must log in.
204. By Chris Johnston

Removes dashboard app

205. By Chris Johnston

Move sru templates to sru app

206. By Chris Johnston

I guess fixing imports is good too

207. By Chris Johnston

Fixes clear_items

208. By Chris Johnston

Updates list_items

209. By Chris Johnston

Oops.. we use smoke now

Unmerged revisions

209. By Chris Johnston

Oops.. we use smoke now

208. By Chris Johnston

Updates list_items

207. By Chris Johnston

Fixes clear_items

206. By Chris Johnston

I guess fixing imports is good too

205. By Chris Johnston

Move sru templates to sru app

204. By Chris Johnston

Removes dashboard app

203. By Chris Johnston

Move bug model to common

202. By Chris Johnston

Oops.. smoke API

201. By Chris Johnston

Fix urls

200. By Chris Johnston

More cleanup

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'bootspeed/api.py'
2--- bootspeed/api.py 2012-12-13 23:57:52 +0000
3+++ bootspeed/api.py 2012-12-20 01:49:23 +0000
4@@ -17,8 +17,7 @@
5 from django.views.decorators.http import require_GET
6 from django.shortcuts import get_object_or_404
7
8-###Move to common
9-from dashboard.utils import (
10+from common.utils import (
11 JSONResponse,
12 MySerializer,
13 )
14
15=== modified file 'bootspeed/models.py'
16--- bootspeed/models.py 2012-12-13 02:32:26 +0000
17+++ bootspeed/models.py 2012-12-20 01:49:23 +0000
18@@ -17,7 +17,7 @@
19 import math
20
21 from django.db import models
22-from dashboard.models import DashboardBaseModel
23+from common.models import DashboardBaseModel
24
25
26 # Bootspeed Models
27
28=== added file 'common/helpers.py'
29--- common/helpers.py 1970-01-01 00:00:00 +0000
30+++ common/helpers.py 2012-12-20 01:49:23 +0000
31@@ -0,0 +1,42 @@
32+# QA Dashboard
33+# Copyright 2012 Canonical Ltd.
34+
35+# This program is free software: you can redistribute it and/or modify it
36+# under the terms of the GNU Affero General Public License version 3, as published
37+# by the Free Software Foundation.
38+
39+# This program is distributed in the hope that it will be useful, but
40+# WITHOUT ANY WARRANTY; without even the implied warranties of
41+# MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
42+# PURPOSE. See the GNU Affero General Public License for more details.
43+
44+# You should have received a copy of the GNU Affero General Public License along
45+# with this program. If not, see <http://www.gnu.org/licenses/>.
46+
47+import json
48+import urllib2
49+
50+BUILD_COUNT_MAX=20 # XXX: DEBUG
51+JOB_COUNT_MAX=20 # XXX: DEBUG
52+DEBUG_LIMITS=False
53+
54+def jenkins_get(loc, as_json=True):
55+ req = urllib2.Request(loc)
56+ response = ''
57+ try_count = 0
58+
59+ while try_count < 5:
60+ try:
61+ f = urllib2.urlopen(req)
62+ response = f.read()
63+ f.close()
64+ break
65+ except urllib2.HTTPError:
66+ try_count += 1
67+ except urllib2.URLError as e:
68+ try_count += 1
69+
70+ if response != '' and as_json:
71+ return json.loads(response)
72+ else:
73+ return response
74
75=== added directory 'common/migrations'
76=== added file 'common/migrations/0001_create_common_app.py'
77--- common/migrations/0001_create_common_app.py 1970-01-01 00:00:00 +0000
78+++ common/migrations/0001_create_common_app.py 2012-12-20 01:49:23 +0000
79@@ -0,0 +1,20 @@
80+# -*- coding: utf-8 -*-
81+import datetime
82+from south.db import db
83+from south.v2 import SchemaMigration
84+from django.db import models
85+
86+
87+class Migration(SchemaMigration):
88+
89+ def forwards(self, orm):
90+ pass
91+
92+ def backwards(self, orm):
93+ pass
94+
95+ models = {
96+
97+ }
98+
99+ complete_apps = ['common']
100\ No newline at end of file
101
102=== added file 'common/migrations/0002_add_bug_model.py'
103--- common/migrations/0002_add_bug_model.py 1970-01-01 00:00:00 +0000
104+++ common/migrations/0002_add_bug_model.py 2012-12-20 01:49:23 +0000
105@@ -0,0 +1,42 @@
106+# -*- coding: utf-8 -*-
107+import datetime
108+from south.db import db
109+from south.v2 import SchemaMigration
110+from django.db import models
111+
112+
113+class Migration(SchemaMigration):
114+
115+ def forwards(self, orm):
116+ # Adding model 'Bug'
117+ db.create_table('bugs', (
118+ ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
119+ ('created_at', self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, blank=True)),
120+ ('updated_at', self.gf('django.db.models.fields.DateTimeField')(auto_now=True, blank=True)),
121+ ('internal', self.gf('django.db.models.fields.BooleanField')(default=True)),
122+ ('publish', self.gf('django.db.models.fields.BooleanField')(default=True)),
123+ ('bug_no', self.gf('django.db.models.fields.CharField')(max_length=255)),
124+ ('status', self.gf('django.db.models.fields.CharField')(max_length=255)),
125+ ))
126+ db.send_create_signal('common', ['Bug'])
127+
128+
129+ def backwards(self, orm):
130+ # Deleting model 'Bug'
131+ db.delete_table('bugs')
132+
133+
134+ models = {
135+ 'common.bug': {
136+ 'Meta': {'object_name': 'Bug', 'db_table': "'bugs'"},
137+ 'bug_no': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
138+ 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
139+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
140+ 'internal': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
141+ 'publish': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
142+ 'status': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
143+ 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'})
144+ }
145+ }
146+
147+ complete_apps = ['common']
148\ No newline at end of file
149
150=== added file 'common/migrations/__init__.py'
151=== modified file 'common/models.py'
152--- common/models.py 2012-12-02 02:51:10 +0000
153+++ common/models.py 2012-12-20 01:49:23 +0000
154@@ -13,4 +13,38 @@
155 # You should have received a copy of the GNU Affero General Public License along
156 # with this program. If not, see <http://www.gnu.org/licenses/>.
157
158-
159+from django.db import models
160+import datetime
161+
162+
163+class DashboardBaseModel(models.Model):
164+ """
165+ Common base class that provides fields needed on every model.
166+ """
167+ class Meta:
168+ abstract = True
169+
170+ created_at = models.DateTimeField(auto_now_add = True)
171+ updated_at = models.DateTimeField(auto_now = True)
172+ internal = models.BooleanField(default=True)
173+ publish = models.BooleanField(default=True)
174+
175+
176+class Bug(DashboardBaseModel):
177+ class Meta:
178+ db_table = 'bugs'
179+ bug_no = models.CharField(max_length=255)
180+ status = models.CharField(max_length=255)
181+
182+ def __unicode__(self):
183+ return self.bug_no
184+
185+ @property
186+ def debug_str(self):
187+ return "{}-{}-{}-{}-{}".format(
188+ self.id,
189+ self.bug_no,
190+ self.status,
191+ self.created_at,
192+ self.updated_at,
193+ )
194
195=== renamed file 'dashboard/utils.py' => 'common/utils.py'
196=== modified file 'common/views.py'
197--- common/views.py 2012-12-02 02:51:10 +0000
198+++ common/views.py 2012-12-20 01:49:23 +0000
199@@ -13,4 +13,23 @@
200 # You should have received a copy of the GNU Affero General Public License along
201 # with this program. If not, see <http://www.gnu.org/licenses/>.
202
203-# Create your views here.
204+from django.views.decorators.http import require_GET
205+from django.shortcuts import redirect, render_to_response
206+import json
207+
208+from django.views.decorators.csrf import csrf_exempt
209+from django.views.decorators.http import (
210+ require_GET,
211+ )
212+
213+from common.utils import (
214+ JSONResponse,
215+ )
216+
217+@require_GET
218+def index(request):
219+ return redirect('smoke/raring/flat/')
220+
221+@require_GET
222+def api_help(request):
223+ return render_to_response('api_help.html')
224
225=== removed directory 'dashboard'
226=== removed directory 'dashboard/migrations'
227=== removed file 'dashboard/migrations/0001_initial.py'
228--- dashboard/migrations/0001_initial.py 2012-12-02 02:51:10 +0000
229+++ dashboard/migrations/0001_initial.py 1970-01-01 00:00:00 +0000
230@@ -1,179 +0,0 @@
231-# QA Dashboard
232-# Copyright 2012 Canonical Ltd.
233-
234-# This program is free software: you can redistribute it and/or modify it
235-# under the terms of the GNU Affero General Public License version 3, as published
236-# by the Free Software Foundation.
237-
238-# This program is distributed in the hope that it will be useful, but
239-# WITHOUT ANY WARRANTY; without even the implied warranties of
240-# MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
241-# PURPOSE. See the GNU Affero General Public License for more details.
242-
243-# You should have received a copy of the GNU Affero General Public License along
244-# with this program. If not, see <http://www.gnu.org/licenses/>.
245-
246-# -*- coding: utf-8 -*-
247-import datetime
248-from south.db import db
249-from south.v2 import SchemaMigration
250-from django.db import models
251-
252-
253-class Migration(SchemaMigration):
254-
255- def forwards(self, orm):
256- # Adding model 'Bug'
257- db.create_table('bugs', (
258- ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
259- ('bug_no', self.gf('django.db.models.fields.CharField')(max_length=255)),
260- ('status', self.gf('django.db.models.fields.CharField')(max_length=255)),
261- ('created_at', self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, blank=True)),
262- ('updated_at', self.gf('django.db.models.fields.DateTimeField')(auto_now=True, blank=True)),
263- ))
264- db.send_create_signal('dashboard', ['Bug'])
265-
266- # Adding model 'ResultLog'
267- db.create_table('result_logs', (
268- ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
269- ('display_name', self.gf('django.db.models.fields.CharField')(max_length=255, null=True)),
270- ('path', self.gf('django.db.models.fields.TextField')()),
271- ('result', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['dashboard.Result'])),
272- ('remote_url', self.gf('django.db.models.fields.URLField')(max_length=200)),
273- ('created_at', self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, blank=True)),
274- ('updated_at', self.gf('django.db.models.fields.DateTimeField')(auto_now=True, blank=True)),
275- ))
276- db.send_create_signal('dashboard', ['ResultLog'])
277-
278- # Adding model 'Run'
279- db.create_table('runs', (
280- ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
281- ('build_no', self.gf('django.db.models.fields.CharField')(max_length=200, db_index=True)),
282- ('release', self.gf('django.db.models.fields.CharField')(max_length=200, db_index=True)),
283- ('flavor', self.gf('django.db.models.fields.CharField')(max_length=200, db_index=True)),
284- ('test_type', self.gf('django.db.models.fields.IntegerField')(null=True)),
285- ('ran_at', self.gf('django.db.models.fields.DateTimeField')()),
286- ('created_at', self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, blank=True)),
287- ('updated_at', self.gf('django.db.models.fields.DateTimeField')(auto_now=True, blank=True)),
288- ))
289- db.send_create_signal('dashboard', ['Run'])
290-
291- # Adding model 'Build'
292- db.create_table('builds', (
293- ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
294- ('run', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['dashboard.Run'])),
295- ('name', self.gf('django.db.models.fields.CharField')(max_length=200, null=True)),
296- ('flavor', self.gf('django.db.models.fields.CharField')(max_length=200)),
297- ('variant', self.gf('django.db.models.fields.CharField')(max_length=200)),
298- ('arch', self.gf('django.db.models.fields.CharField')(max_length=200)),
299- ('created_at', self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, blank=True)),
300- ('updated_at', self.gf('django.db.models.fields.DateTimeField')(auto_now=True, blank=True)),
301- ))
302- db.send_create_signal('dashboard', ['Build'])
303-
304- # Adding model 'Result'
305- db.create_table('results', (
306- ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
307- ('build', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['dashboard.Build'])),
308- ('name', self.gf('django.db.models.fields.CharField')(max_length=255)),
309- ('jenkins_build', self.gf('django.db.models.fields.CharField')(max_length=255)),
310- ('jenkins_url', self.gf('django.db.models.fields.URLField')(max_length=200)),
311- ('fail_count', self.gf('django.db.models.fields.IntegerField')()),
312- ('skip_count', self.gf('django.db.models.fields.IntegerField')()),
313- ('pass_count', self.gf('django.db.models.fields.IntegerField')()),
314- ('total_count', self.gf('django.db.models.fields.IntegerField')()),
315- ('ran_at', self.gf('django.db.models.fields.DateTimeField')()),
316- ('created_at', self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, blank=True)),
317- ('updated_at', self.gf('django.db.models.fields.DateTimeField')(auto_now=True, blank=True)),
318- ))
319- db.send_create_signal('dashboard', ['Result'])
320-
321- # Adding M2M table for field bugs on 'Result'
322- db.create_table('results_bugs', (
323- ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
324- ('result', models.ForeignKey(orm['dashboard.result'], null=False)),
325- ('bug', models.ForeignKey(orm['dashboard.bug'], null=False))
326- ))
327- db.create_unique('results_bugs', ['result_id', 'bug_id'])
328-
329-
330- def backwards(self, orm):
331- # Deleting model 'Bug'
332- db.delete_table('bugs')
333-
334- # Deleting model 'ResultLog'
335- db.delete_table('result_logs')
336-
337- # Deleting model 'Run'
338- db.delete_table('runs')
339-
340- # Deleting model 'Build'
341- db.delete_table('builds')
342-
343- # Deleting model 'Result'
344- db.delete_table('results')
345-
346- # Removing M2M table for field bugs on 'Result'
347- db.delete_table('results_bugs')
348-
349-
350- models = {
351- 'dashboard.bug': {
352- 'Meta': {'object_name': 'Bug', 'db_table': "'bugs'"},
353- 'bug_no': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
354- 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
355- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
356- 'status': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
357- 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'})
358- },
359- 'dashboard.build': {
360- 'Meta': {'object_name': 'Build', 'db_table': "'builds'"},
361- 'arch': ('django.db.models.fields.CharField', [], {'max_length': '200'}),
362- 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
363- 'flavor': ('django.db.models.fields.CharField', [], {'max_length': '200'}),
364- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
365- 'name': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True'}),
366- 'run': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['dashboard.Run']"}),
367- 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
368- 'variant': ('django.db.models.fields.CharField', [], {'max_length': '200'})
369- },
370- 'dashboard.result': {
371- 'Meta': {'object_name': 'Result', 'db_table': "'results'"},
372- 'bugs': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['dashboard.Bug']", 'symmetrical': 'False'}),
373- 'build': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['dashboard.Build']"}),
374- 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
375- 'fail_count': ('django.db.models.fields.IntegerField', [], {}),
376- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
377- 'jenkins_build': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
378- 'jenkins_url': ('django.db.models.fields.URLField', [], {'max_length': '200'}),
379- 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
380- 'pass_count': ('django.db.models.fields.IntegerField', [], {}),
381- 'ran_at': ('django.db.models.fields.DateTimeField', [], {}),
382- 'skip_count': ('django.db.models.fields.IntegerField', [], {}),
383- 'total_count': ('django.db.models.fields.IntegerField', [], {}),
384- 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'})
385- },
386- 'dashboard.resultlog': {
387- 'Meta': {'object_name': 'ResultLog', 'db_table': "'result_logs'"},
388- 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
389- 'display_name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True'}),
390- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
391- 'path': ('django.db.models.fields.TextField', [], {}),
392- 'remote_url': ('django.db.models.fields.URLField', [], {'max_length': '200'}),
393- 'result': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['dashboard.Result']"}),
394- 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'})
395- },
396- 'dashboard.run': {
397- 'Meta': {'object_name': 'Run', 'db_table': "'runs'"},
398- 'build_no': ('django.db.models.fields.CharField', [], {'max_length': '200', 'db_index': 'True'}),
399- 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
400- 'flavor': ('django.db.models.fields.CharField', [], {'max_length': '200', 'db_index': 'True'}),
401- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
402- 'ran_at': ('django.db.models.fields.DateTimeField', [], {}),
403- 'release': ('django.db.models.fields.CharField', [], {'max_length': '200', 'db_index': 'True'}),
404- 'test_type': ('django.db.models.fields.IntegerField', [], {'null': 'True'}),
405- 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'})
406- }
407- }
408-
409- complete_apps = ['dashboard']
410\ No newline at end of file
411
412=== removed file 'dashboard/migrations/0002_auto__add_field_run_internal__add_field_bug_internal__add_field_build_.py'
413--- dashboard/migrations/0002_auto__add_field_run_internal__add_field_bug_internal__add_field_build_.py 2012-12-02 02:51:10 +0000
414+++ dashboard/migrations/0002_auto__add_field_run_internal__add_field_bug_internal__add_field_build_.py 1970-01-01 00:00:00 +0000
415@@ -1,133 +0,0 @@
416-# QA Dashboard
417-# Copyright 2012 Canonical Ltd.
418-
419-# This program is free software: you can redistribute it and/or modify it
420-# under the terms of the GNU Affero General Public License version 3, as published
421-# by the Free Software Foundation.
422-
423-# This program is distributed in the hope that it will be useful, but
424-# WITHOUT ANY WARRANTY; without even the implied warranties of
425-# MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
426-# PURPOSE. See the GNU Affero General Public License for more details.
427-
428-# You should have received a copy of the GNU Affero General Public License along
429-# with this program. If not, see <http://www.gnu.org/licenses/>.
430-
431-# -*- coding: utf-8 -*-
432-import datetime
433-from south.db import db
434-from south.v2 import SchemaMigration
435-from django.db import models
436-
437-
438-class Migration(SchemaMigration):
439-
440- def forwards(self, orm):
441- # Adding field 'Run.internal'
442- db.add_column('runs', 'internal',
443- self.gf('django.db.models.fields.BooleanField')(default=True),
444- keep_default=False)
445-
446- # Adding field 'Bug.internal'
447- db.add_column('bugs', 'internal',
448- self.gf('django.db.models.fields.BooleanField')(default=True),
449- keep_default=False)
450-
451- # Adding field 'Build.internal'
452- db.add_column('builds', 'internal',
453- self.gf('django.db.models.fields.BooleanField')(default=True),
454- keep_default=False)
455-
456- # Adding field 'ResultLog.internal'
457- db.add_column('result_logs', 'internal',
458- self.gf('django.db.models.fields.BooleanField')(default=True),
459- keep_default=False)
460-
461- # Adding field 'Result.internal'
462- db.add_column('results', 'internal',
463- self.gf('django.db.models.fields.BooleanField')(default=True),
464- keep_default=False)
465-
466-
467- def backwards(self, orm):
468- # Deleting field 'Run.internal'
469- db.delete_column('runs', 'internal')
470-
471- # Deleting field 'Bug.internal'
472- db.delete_column('bugs', 'internal')
473-
474- # Deleting field 'Build.internal'
475- db.delete_column('builds', 'internal')
476-
477- # Deleting field 'ResultLog.internal'
478- db.delete_column('result_logs', 'internal')
479-
480- # Deleting field 'Result.internal'
481- db.delete_column('results', 'internal')
482-
483-
484- models = {
485- 'dashboard.bug': {
486- 'Meta': {'object_name': 'Bug', 'db_table': "'bugs'"},
487- 'bug_no': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
488- 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
489- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
490- 'internal': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
491- 'status': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
492- 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'})
493- },
494- 'dashboard.build': {
495- 'Meta': {'object_name': 'Build', 'db_table': "'builds'"},
496- 'arch': ('django.db.models.fields.CharField', [], {'max_length': '200'}),
497- 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
498- 'flavor': ('django.db.models.fields.CharField', [], {'max_length': '200'}),
499- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
500- 'internal': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
501- 'name': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True'}),
502- 'run': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['dashboard.Run']"}),
503- 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
504- 'variant': ('django.db.models.fields.CharField', [], {'max_length': '200'})
505- },
506- 'dashboard.result': {
507- 'Meta': {'object_name': 'Result', 'db_table': "'results'"},
508- 'bugs': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['dashboard.Bug']", 'symmetrical': 'False'}),
509- 'build': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['dashboard.Build']"}),
510- 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
511- 'fail_count': ('django.db.models.fields.IntegerField', [], {}),
512- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
513- 'internal': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
514- 'jenkins_build': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
515- 'jenkins_url': ('django.db.models.fields.URLField', [], {'max_length': '200'}),
516- 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
517- 'pass_count': ('django.db.models.fields.IntegerField', [], {}),
518- 'ran_at': ('django.db.models.fields.DateTimeField', [], {}),
519- 'skip_count': ('django.db.models.fields.IntegerField', [], {}),
520- 'total_count': ('django.db.models.fields.IntegerField', [], {}),
521- 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'})
522- },
523- 'dashboard.resultlog': {
524- 'Meta': {'object_name': 'ResultLog', 'db_table': "'result_logs'"},
525- 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
526- 'display_name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True'}),
527- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
528- 'internal': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
529- 'path': ('django.db.models.fields.TextField', [], {}),
530- 'remote_url': ('django.db.models.fields.URLField', [], {'max_length': '200'}),
531- 'result': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['dashboard.Result']"}),
532- 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'})
533- },
534- 'dashboard.run': {
535- 'Meta': {'object_name': 'Run', 'db_table': "'runs'"},
536- 'build_no': ('django.db.models.fields.CharField', [], {'max_length': '200', 'db_index': 'True'}),
537- 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
538- 'flavor': ('django.db.models.fields.CharField', [], {'max_length': '200', 'db_index': 'True'}),
539- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
540- 'internal': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
541- 'ran_at': ('django.db.models.fields.DateTimeField', [], {}),
542- 'release': ('django.db.models.fields.CharField', [], {'max_length': '200', 'db_index': 'True'}),
543- 'test_type': ('django.db.models.fields.IntegerField', [], {'null': 'True'}),
544- 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'})
545- }
546- }
547-
548- complete_apps = ['dashboard']
549\ No newline at end of file
550
551=== removed file 'dashboard/migrations/0003_auto__add_field_run_publish__add_field_bug_publish__add_field_build_pu.py'
552--- dashboard/migrations/0003_auto__add_field_run_publish__add_field_bug_publish__add_field_build_pu.py 2012-12-02 02:51:10 +0000
553+++ dashboard/migrations/0003_auto__add_field_run_publish__add_field_bug_publish__add_field_build_pu.py 1970-01-01 00:00:00 +0000
554@@ -1,138 +0,0 @@
555-# QA Dashboard
556-# Copyright 2012 Canonical Ltd.
557-
558-# This program is free software: you can redistribute it and/or modify it
559-# under the terms of the GNU Affero General Public License version 3, as published
560-# by the Free Software Foundation.
561-
562-# This program is distributed in the hope that it will be useful, but
563-# WITHOUT ANY WARRANTY; without even the implied warranties of
564-# MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
565-# PURPOSE. See the GNU Affero General Public License for more details.
566-
567-# You should have received a copy of the GNU Affero General Public License along
568-# with this program. If not, see <http://www.gnu.org/licenses/>.
569-
570-# -*- coding: utf-8 -*-
571-import datetime
572-from south.db import db
573-from south.v2 import SchemaMigration
574-from django.db import models
575-
576-
577-class Migration(SchemaMigration):
578-
579- def forwards(self, orm):
580- # Adding field 'Run.publish'
581- db.add_column('runs', 'publish',
582- self.gf('django.db.models.fields.BooleanField')(default=True),
583- keep_default=False)
584-
585- # Adding field 'Bug.publish'
586- db.add_column('bugs', 'publish',
587- self.gf('django.db.models.fields.BooleanField')(default=True),
588- keep_default=False)
589-
590- # Adding field 'Build.publish'
591- db.add_column('builds', 'publish',
592- self.gf('django.db.models.fields.BooleanField')(default=True),
593- keep_default=False)
594-
595- # Adding field 'ResultLog.publish'
596- db.add_column('result_logs', 'publish',
597- self.gf('django.db.models.fields.BooleanField')(default=True),
598- keep_default=False)
599-
600- # Adding field 'Result.publish'
601- db.add_column('results', 'publish',
602- self.gf('django.db.models.fields.BooleanField')(default=True),
603- keep_default=False)
604-
605-
606- def backwards(self, orm):
607- # Deleting field 'Run.publish'
608- db.delete_column('runs', 'publish')
609-
610- # Deleting field 'Bug.publish'
611- db.delete_column('bugs', 'publish')
612-
613- # Deleting field 'Build.publish'
614- db.delete_column('builds', 'publish')
615-
616- # Deleting field 'ResultLog.publish'
617- db.delete_column('result_logs', 'publish')
618-
619- # Deleting field 'Result.publish'
620- db.delete_column('results', 'publish')
621-
622-
623- models = {
624- 'dashboard.bug': {
625- 'Meta': {'object_name': 'Bug', 'db_table': "'bugs'"},
626- 'bug_no': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
627- 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
628- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
629- 'internal': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
630- 'publish': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
631- 'status': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
632- 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'})
633- },
634- 'dashboard.build': {
635- 'Meta': {'object_name': 'Build', 'db_table': "'builds'"},
636- 'arch': ('django.db.models.fields.CharField', [], {'max_length': '200'}),
637- 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
638- 'flavor': ('django.db.models.fields.CharField', [], {'max_length': '200'}),
639- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
640- 'internal': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
641- 'name': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True'}),
642- 'publish': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
643- 'run': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['dashboard.Run']"}),
644- 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
645- 'variant': ('django.db.models.fields.CharField', [], {'max_length': '200'})
646- },
647- 'dashboard.result': {
648- 'Meta': {'object_name': 'Result', 'db_table': "'results'"},
649- 'bugs': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['dashboard.Bug']", 'symmetrical': 'False'}),
650- 'build': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['dashboard.Build']"}),
651- 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
652- 'fail_count': ('django.db.models.fields.IntegerField', [], {}),
653- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
654- 'internal': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
655- 'jenkins_build': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
656- 'jenkins_url': ('django.db.models.fields.URLField', [], {'max_length': '200'}),
657- 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
658- 'pass_count': ('django.db.models.fields.IntegerField', [], {}),
659- 'publish': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
660- 'ran_at': ('django.db.models.fields.DateTimeField', [], {}),
661- 'skip_count': ('django.db.models.fields.IntegerField', [], {}),
662- 'total_count': ('django.db.models.fields.IntegerField', [], {}),
663- 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'})
664- },
665- 'dashboard.resultlog': {
666- 'Meta': {'object_name': 'ResultLog', 'db_table': "'result_logs'"},
667- 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
668- 'display_name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True'}),
669- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
670- 'internal': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
671- 'path': ('django.db.models.fields.TextField', [], {}),
672- 'publish': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
673- 'remote_url': ('django.db.models.fields.URLField', [], {'max_length': '200'}),
674- 'result': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['dashboard.Result']"}),
675- 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'})
676- },
677- 'dashboard.run': {
678- 'Meta': {'object_name': 'Run', 'db_table': "'runs'"},
679- 'build_no': ('django.db.models.fields.CharField', [], {'max_length': '200', 'db_index': 'True'}),
680- 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
681- 'flavor': ('django.db.models.fields.CharField', [], {'max_length': '200', 'db_index': 'True'}),
682- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
683- 'internal': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
684- 'publish': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
685- 'ran_at': ('django.db.models.fields.DateTimeField', [], {}),
686- 'release': ('django.db.models.fields.CharField', [], {'max_length': '200', 'db_index': 'True'}),
687- 'test_type': ('django.db.models.fields.IntegerField', [], {'null': 'True'}),
688- 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'})
689- }
690- }
691-
692- complete_apps = ['dashboard']
693\ No newline at end of file
694
695=== removed file 'dashboard/migrations/0004_auto__add_kernel__add_sruresult__add_sruresultlog.py'
696--- dashboard/migrations/0004_auto__add_kernel__add_sruresult__add_sruresultlog.py 2012-12-02 02:51:10 +0000
697+++ dashboard/migrations/0004_auto__add_kernel__add_sruresult__add_sruresultlog.py 1970-01-01 00:00:00 +0000
698@@ -1,208 +0,0 @@
699-# QA Dashboard
700-# Copyright 2012 Canonical Ltd.
701-
702-# This program is free software: you can redistribute it and/or modify it
703-# under the terms of the GNU Affero General Public License version 3, as published
704-# by the Free Software Foundation.
705-
706-# This program is distributed in the hope that it will be useful, but
707-# WITHOUT ANY WARRANTY; without even the implied warranties of
708-# MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
709-# PURPOSE. See the GNU Affero General Public License for more details.
710-
711-# You should have received a copy of the GNU Affero General Public License along
712-# with this program. If not, see <http://www.gnu.org/licenses/>.
713-
714-# encoding: utf-8
715-import datetime
716-from south.db import db
717-from south.v2 import SchemaMigration
718-from django.db import models
719-
720-class Migration(SchemaMigration):
721-
722- def forwards(self, orm):
723-
724- # Adding model 'Kernel'
725- db.create_table('kernels', (
726- ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
727- ('created_at', self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, blank=True)),
728- ('updated_at', self.gf('django.db.models.fields.DateTimeField')(auto_now=True, blank=True)),
729- ('internal', self.gf('django.db.models.fields.BooleanField')(default=True)),
730- ('publish', self.gf('django.db.models.fields.BooleanField')(default=True)),
731- ('release', self.gf('django.db.models.fields.CharField')(max_length=100)),
732- ('variant', self.gf('django.db.models.fields.CharField')(max_length=100)),
733- ('arch', self.gf('django.db.models.fields.CharField')(max_length=100)),
734- ('gpu', self.gf('django.db.models.fields.CharField')(max_length=100)),
735- ))
736- db.send_create_signal('dashboard', ['Kernel'])
737-
738- # Adding model 'SRUResult'
739- db.create_table('sru_results', (
740- ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
741- ('created_at', self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, blank=True)),
742- ('updated_at', self.gf('django.db.models.fields.DateTimeField')(auto_now=True, blank=True)),
743- ('internal', self.gf('django.db.models.fields.BooleanField')(default=True)),
744- ('publish', self.gf('django.db.models.fields.BooleanField')(default=True)),
745- ('kernel', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['dashboard.Kernel'])),
746- ('jenkins_build', self.gf('django.db.models.fields.CharField')(max_length=255)),
747- ('jenkins_url', self.gf('django.db.models.fields.URLField')(max_length=200)),
748- ('name', self.gf('django.db.models.fields.CharField')(max_length=255)),
749- ('pass_count', self.gf('django.db.models.fields.IntegerField')()),
750- ('fail_count', self.gf('django.db.models.fields.IntegerField')()),
751- ('skip_count', self.gf('django.db.models.fields.IntegerField')()),
752- ('total_count', self.gf('django.db.models.fields.IntegerField')()),
753- ('ran_at', self.gf('django.db.models.fields.DateTimeField')()),
754- ))
755- db.send_create_signal('dashboard', ['SRUResult'])
756-
757- # Adding M2M table for field bugs on 'SRUResult'
758- db.create_table('sru_results_bugs', (
759- ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
760- ('sruresult', models.ForeignKey(orm['dashboard.sruresult'], null=False)),
761- ('bug', models.ForeignKey(orm['dashboard.bug'], null=False))
762- ))
763- db.create_unique('sru_results_bugs', ['sruresult_id', 'bug_id'])
764-
765- # Adding model 'SRUResultLog'
766- db.create_table('sru_result_logs', (
767- ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
768- ('created_at', self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, blank=True)),
769- ('updated_at', self.gf('django.db.models.fields.DateTimeField')(auto_now=True, blank=True)),
770- ('internal', self.gf('django.db.models.fields.BooleanField')(default=True)),
771- ('publish', self.gf('django.db.models.fields.BooleanField')(default=True)),
772- ('display_name', self.gf('django.db.models.fields.CharField')(max_length=255, null=True)),
773- ('path', self.gf('django.db.models.fields.TextField')()),
774- ('sru_result', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['dashboard.SRUResult'])),
775- ('remote_url', self.gf('django.db.models.fields.URLField')(max_length=200)),
776- ))
777- db.send_create_signal('dashboard', ['SRUResultLog'])
778-
779-
780- def backwards(self, orm):
781-
782- # Deleting model 'Kernel'
783- db.delete_table('kernels')
784-
785- # Deleting model 'SRUResult'
786- db.delete_table('sru_results')
787-
788- # Removing M2M table for field bugs on 'SRUResult'
789- db.delete_table('sru_results_bugs')
790-
791- # Deleting model 'SRUResultLog'
792- db.delete_table('sru_result_logs')
793-
794-
795- models = {
796- 'dashboard.bug': {
797- 'Meta': {'object_name': 'Bug', 'db_table': "'bugs'"},
798- 'bug_no': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
799- 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
800- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
801- 'internal': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
802- 'publish': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
803- 'status': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
804- 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'})
805- },
806- 'dashboard.build': {
807- 'Meta': {'object_name': 'Build', 'db_table': "'builds'"},
808- 'arch': ('django.db.models.fields.CharField', [], {'max_length': '200'}),
809- 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
810- 'flavor': ('django.db.models.fields.CharField', [], {'max_length': '200'}),
811- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
812- 'internal': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
813- 'name': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True'}),
814- 'publish': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
815- 'run': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['dashboard.Run']"}),
816- 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
817- 'variant': ('django.db.models.fields.CharField', [], {'max_length': '200'})
818- },
819- 'dashboard.kernel': {
820- 'Meta': {'object_name': 'Kernel', 'db_table': "'kernels'"},
821- 'arch': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
822- 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
823- 'gpu': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
824- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
825- 'internal': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
826- 'publish': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
827- 'release': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
828- 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
829- 'variant': ('django.db.models.fields.CharField', [], {'max_length': '100'})
830- },
831- 'dashboard.result': {
832- 'Meta': {'object_name': 'Result', 'db_table': "'results'"},
833- 'bugs': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['dashboard.Bug']", 'symmetrical': 'False'}),
834- 'build': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['dashboard.Build']"}),
835- 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
836- 'fail_count': ('django.db.models.fields.IntegerField', [], {}),
837- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
838- 'internal': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
839- 'jenkins_build': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
840- 'jenkins_url': ('django.db.models.fields.URLField', [], {'max_length': '200'}),
841- 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
842- 'pass_count': ('django.db.models.fields.IntegerField', [], {}),
843- 'publish': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
844- 'ran_at': ('django.db.models.fields.DateTimeField', [], {}),
845- 'skip_count': ('django.db.models.fields.IntegerField', [], {}),
846- 'total_count': ('django.db.models.fields.IntegerField', [], {}),
847- 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'})
848- },
849- 'dashboard.resultlog': {
850- 'Meta': {'object_name': 'ResultLog', 'db_table': "'result_logs'"},
851- 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
852- 'display_name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True'}),
853- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
854- 'internal': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
855- 'path': ('django.db.models.fields.TextField', [], {}),
856- 'publish': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
857- 'remote_url': ('django.db.models.fields.URLField', [], {'max_length': '200'}),
858- 'result': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['dashboard.Result']"}),
859- 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'})
860- },
861- 'dashboard.run': {
862- 'Meta': {'object_name': 'Run', 'db_table': "'runs'"},
863- 'build_no': ('django.db.models.fields.CharField', [], {'max_length': '200', 'db_index': 'True'}),
864- 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
865- 'flavor': ('django.db.models.fields.CharField', [], {'max_length': '200', 'db_index': 'True'}),
866- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
867- 'internal': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
868- 'publish': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
869- 'ran_at': ('django.db.models.fields.DateTimeField', [], {}),
870- 'release': ('django.db.models.fields.CharField', [], {'max_length': '200', 'db_index': 'True'}),
871- 'test_type': ('django.db.models.fields.IntegerField', [], {'null': 'True'}),
872- 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'})
873- },
874- 'dashboard.sruresult': {
875- 'Meta': {'object_name': 'SRUResult', 'db_table': "'sru_results'"},
876- 'bugs': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['dashboard.Bug']", 'symmetrical': 'False'}),
877- 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
878- 'fail_count': ('django.db.models.fields.IntegerField', [], {}),
879- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
880- 'internal': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
881- 'jenkins_build': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
882- 'jenkins_url': ('django.db.models.fields.URLField', [], {'max_length': '200'}),
883- 'kernel': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['dashboard.Kernel']"}),
884- 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
885- 'pass_count': ('django.db.models.fields.IntegerField', [], {}),
886- 'publish': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
887- 'ran_at': ('django.db.models.fields.DateTimeField', [], {}),
888- 'skip_count': ('django.db.models.fields.IntegerField', [], {}),
889- 'total_count': ('django.db.models.fields.IntegerField', [], {}),
890- 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'})
891- },
892- 'dashboard.sruresultlog': {
893- 'Meta': {'object_name': 'SRUResultLog', 'db_table': "'sru_result_logs'"},
894- 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
895- 'display_name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True'}),
896- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
897- 'internal': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
898- 'path': ('django.db.models.fields.TextField', [], {}),
899- 'publish': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
900- 'remote_url': ('django.db.models.fields.URLField', [], {'max_length': '200'}),
901- 'sru_result': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['dashboard.SRUResult']"}),
902- 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'})
903- }
904- }
905-
906- complete_apps = ['dashboard']
907
908=== removed file 'dashboard/migrations/0005_auto__add_field_kernel_job_type.py'
909--- dashboard/migrations/0005_auto__add_field_kernel_job_type.py 2012-12-02 02:51:10 +0000
910+++ dashboard/migrations/0005_auto__add_field_kernel_job_type.py 1970-01-01 00:00:00 +0000
911@@ -1,148 +0,0 @@
912-# QA Dashboard
913-# Copyright 2012 Canonical Ltd.
914-
915-# This program is free software: you can redistribute it and/or modify it
916-# under the terms of the GNU Affero General Public License version 3, as published
917-# by the Free Software Foundation.
918-
919-# This program is distributed in the hope that it will be useful, but
920-# WITHOUT ANY WARRANTY; without even the implied warranties of
921-# MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
922-# PURPOSE. See the GNU Affero General Public License for more details.
923-
924-# You should have received a copy of the GNU Affero General Public License along
925-# with this program. If not, see <http://www.gnu.org/licenses/>.
926-
927-# encoding: utf-8
928-import datetime
929-from south.db import db
930-from south.v2 import SchemaMigration
931-from django.db import models
932-
933-class Migration(SchemaMigration):
934-
935- def forwards(self, orm):
936-
937- # Adding field 'Kernel.job_type'
938- db.add_column('kernels', 'job_type', self.gf('django.db.models.fields.CharField')(default='sru_kernel', max_length=100), keep_default=False)
939-
940-
941- def backwards(self, orm):
942-
943- # Deleting field 'Kernel.job_type'
944- db.delete_column('kernels', 'job_type')
945-
946-
947- models = {
948- 'dashboard.bug': {
949- 'Meta': {'object_name': 'Bug', 'db_table': "'bugs'"},
950- 'bug_no': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
951- 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
952- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
953- 'internal': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
954- 'publish': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
955- 'status': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
956- 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'})
957- },
958- 'dashboard.build': {
959- 'Meta': {'object_name': 'Build', 'db_table': "'builds'"},
960- 'arch': ('django.db.models.fields.CharField', [], {'max_length': '200'}),
961- 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
962- 'flavor': ('django.db.models.fields.CharField', [], {'max_length': '200'}),
963- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
964- 'internal': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
965- 'name': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True'}),
966- 'publish': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
967- 'run': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['dashboard.Run']"}),
968- 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
969- 'variant': ('django.db.models.fields.CharField', [], {'max_length': '200'})
970- },
971- 'dashboard.kernel': {
972- 'Meta': {'object_name': 'Kernel', 'db_table': "'kernels'"},
973- 'arch': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
974- 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
975- 'gpu': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
976- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
977- 'internal': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
978- 'job_type': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
979- 'publish': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
980- 'release': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
981- 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
982- 'variant': ('django.db.models.fields.CharField', [], {'max_length': '100'})
983- },
984- 'dashboard.result': {
985- 'Meta': {'object_name': 'Result', 'db_table': "'results'"},
986- 'bugs': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['dashboard.Bug']", 'symmetrical': 'False'}),
987- 'build': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['dashboard.Build']"}),
988- 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
989- 'fail_count': ('django.db.models.fields.IntegerField', [], {}),
990- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
991- 'internal': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
992- 'jenkins_build': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
993- 'jenkins_url': ('django.db.models.fields.URLField', [], {'max_length': '200'}),
994- 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
995- 'pass_count': ('django.db.models.fields.IntegerField', [], {}),
996- 'publish': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
997- 'ran_at': ('django.db.models.fields.DateTimeField', [], {}),
998- 'skip_count': ('django.db.models.fields.IntegerField', [], {}),
999- 'total_count': ('django.db.models.fields.IntegerField', [], {}),
1000- 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'})
1001- },
1002- 'dashboard.resultlog': {
1003- 'Meta': {'object_name': 'ResultLog', 'db_table': "'result_logs'"},
1004- 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
1005- 'display_name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True'}),
1006- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
1007- 'internal': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
1008- 'path': ('django.db.models.fields.TextField', [], {}),
1009- 'publish': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
1010- 'remote_url': ('django.db.models.fields.URLField', [], {'max_length': '200'}),
1011- 'result': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['dashboard.Result']"}),
1012- 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'})
1013- },
1014- 'dashboard.run': {
1015- 'Meta': {'object_name': 'Run', 'db_table': "'runs'"},
1016- 'build_no': ('django.db.models.fields.CharField', [], {'max_length': '200', 'db_index': 'True'}),
1017- 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
1018- 'flavor': ('django.db.models.fields.CharField', [], {'max_length': '200', 'db_index': 'True'}),
1019- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
1020- 'internal': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
1021- 'publish': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
1022- 'ran_at': ('django.db.models.fields.DateTimeField', [], {}),
1023- 'release': ('django.db.models.fields.CharField', [], {'max_length': '200', 'db_index': 'True'}),
1024- 'test_type': ('django.db.models.fields.IntegerField', [], {'null': 'True'}),
1025- 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'})
1026- },
1027- 'dashboard.sruresult': {
1028- 'Meta': {'object_name': 'SRUResult', 'db_table': "'sru_results'"},
1029- 'bugs': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['dashboard.Bug']", 'symmetrical': 'False'}),
1030- 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
1031- 'fail_count': ('django.db.models.fields.IntegerField', [], {}),
1032- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
1033- 'internal': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
1034- 'jenkins_build': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
1035- 'jenkins_url': ('django.db.models.fields.URLField', [], {'max_length': '200'}),
1036- 'kernel': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['dashboard.Kernel']"}),
1037- 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
1038- 'pass_count': ('django.db.models.fields.IntegerField', [], {}),
1039- 'publish': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
1040- 'ran_at': ('django.db.models.fields.DateTimeField', [], {}),
1041- 'skip_count': ('django.db.models.fields.IntegerField', [], {}),
1042- 'total_count': ('django.db.models.fields.IntegerField', [], {}),
1043- 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'})
1044- },
1045- 'dashboard.sruresultlog': {
1046- 'Meta': {'object_name': 'SRUResultLog', 'db_table': "'sru_result_logs'"},
1047- 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
1048- 'display_name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True'}),
1049- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
1050- 'internal': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
1051- 'path': ('django.db.models.fields.TextField', [], {}),
1052- 'publish': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
1053- 'remote_url': ('django.db.models.fields.URLField', [], {'max_length': '200'}),
1054- 'sru_result': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['dashboard.SRUResult']"}),
1055- 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'})
1056- }
1057- }
1058-
1059- complete_apps = ['dashboard']
1060
1061=== removed file 'dashboard/migrations/0006_auto__add_field_sruresult_kernel_version.py'
1062--- dashboard/migrations/0006_auto__add_field_sruresult_kernel_version.py 2012-12-02 02:51:10 +0000
1063+++ dashboard/migrations/0006_auto__add_field_sruresult_kernel_version.py 1970-01-01 00:00:00 +0000
1064@@ -1,149 +0,0 @@
1065-# QA Dashboard
1066-# Copyright 2012 Canonical Ltd.
1067-
1068-# This program is free software: you can redistribute it and/or modify it
1069-# under the terms of the GNU Affero General Public License version 3, as published
1070-# by the Free Software Foundation.
1071-
1072-# This program is distributed in the hope that it will be useful, but
1073-# WITHOUT ANY WARRANTY; without even the implied warranties of
1074-# MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
1075-# PURPOSE. See the GNU Affero General Public License for more details.
1076-
1077-# You should have received a copy of the GNU Affero General Public License along
1078-# with this program. If not, see <http://www.gnu.org/licenses/>.
1079-
1080-# encoding: utf-8
1081-import datetime
1082-from south.db import db
1083-from south.v2 import SchemaMigration
1084-from django.db import models
1085-
1086-class Migration(SchemaMigration):
1087-
1088- def forwards(self, orm):
1089-
1090- # Adding field 'SRUResult.kernel_version'
1091- db.add_column('sru_results', 'kernel_version', self.gf('django.db.models.fields.CharField')(default='Unknown', max_length=100), keep_default=False)
1092-
1093-
1094- def backwards(self, orm):
1095-
1096- # Deleting field 'SRUResult.kernel_version'
1097- db.delete_column('sru_results', 'kernel_version')
1098-
1099-
1100- models = {
1101- 'dashboard.bug': {
1102- 'Meta': {'object_name': 'Bug', 'db_table': "'bugs'"},
1103- 'bug_no': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
1104- 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
1105- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
1106- 'internal': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
1107- 'publish': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
1108- 'status': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
1109- 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'})
1110- },
1111- 'dashboard.build': {
1112- 'Meta': {'object_name': 'Build', 'db_table': "'builds'"},
1113- 'arch': ('django.db.models.fields.CharField', [], {'max_length': '200'}),
1114- 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
1115- 'flavor': ('django.db.models.fields.CharField', [], {'max_length': '200'}),
1116- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
1117- 'internal': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
1118- 'name': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True'}),
1119- 'publish': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
1120- 'run': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['dashboard.Run']"}),
1121- 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
1122- 'variant': ('django.db.models.fields.CharField', [], {'max_length': '200'})
1123- },
1124- 'dashboard.kernel': {
1125- 'Meta': {'object_name': 'Kernel', 'db_table': "'kernels'"},
1126- 'arch': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
1127- 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
1128- 'gpu': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
1129- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
1130- 'internal': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
1131- 'job_type': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
1132- 'publish': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
1133- 'release': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
1134- 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
1135- 'variant': ('django.db.models.fields.CharField', [], {'max_length': '100'})
1136- },
1137- 'dashboard.result': {
1138- 'Meta': {'object_name': 'Result', 'db_table': "'results'"},
1139- 'bugs': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['dashboard.Bug']", 'symmetrical': 'False'}),
1140- 'build': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['dashboard.Build']"}),
1141- 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
1142- 'fail_count': ('django.db.models.fields.IntegerField', [], {}),
1143- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
1144- 'internal': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
1145- 'jenkins_build': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
1146- 'jenkins_url': ('django.db.models.fields.URLField', [], {'max_length': '200'}),
1147- 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
1148- 'pass_count': ('django.db.models.fields.IntegerField', [], {}),
1149- 'publish': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
1150- 'ran_at': ('django.db.models.fields.DateTimeField', [], {}),
1151- 'skip_count': ('django.db.models.fields.IntegerField', [], {}),
1152- 'total_count': ('django.db.models.fields.IntegerField', [], {}),
1153- 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'})
1154- },
1155- 'dashboard.resultlog': {
1156- 'Meta': {'object_name': 'ResultLog', 'db_table': "'result_logs'"},
1157- 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
1158- 'display_name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True'}),
1159- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
1160- 'internal': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
1161- 'path': ('django.db.models.fields.TextField', [], {}),
1162- 'publish': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
1163- 'remote_url': ('django.db.models.fields.URLField', [], {'max_length': '200'}),
1164- 'result': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['dashboard.Result']"}),
1165- 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'})
1166- },
1167- 'dashboard.run': {
1168- 'Meta': {'object_name': 'Run', 'db_table': "'runs'"},
1169- 'build_no': ('django.db.models.fields.CharField', [], {'max_length': '200', 'db_index': 'True'}),
1170- 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
1171- 'flavor': ('django.db.models.fields.CharField', [], {'max_length': '200', 'db_index': 'True'}),
1172- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
1173- 'internal': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
1174- 'publish': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
1175- 'ran_at': ('django.db.models.fields.DateTimeField', [], {}),
1176- 'release': ('django.db.models.fields.CharField', [], {'max_length': '200', 'db_index': 'True'}),
1177- 'test_type': ('django.db.models.fields.IntegerField', [], {'null': 'True'}),
1178- 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'})
1179- },
1180- 'dashboard.sruresult': {
1181- 'Meta': {'object_name': 'SRUResult', 'db_table': "'sru_results'"},
1182- 'bugs': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['dashboard.Bug']", 'symmetrical': 'False'}),
1183- 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
1184- 'fail_count': ('django.db.models.fields.IntegerField', [], {}),
1185- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
1186- 'internal': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
1187- 'jenkins_build': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
1188- 'jenkins_url': ('django.db.models.fields.URLField', [], {'max_length': '200'}),
1189- 'kernel': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['dashboard.Kernel']"}),
1190- 'kernel_version': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
1191- 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
1192- 'pass_count': ('django.db.models.fields.IntegerField', [], {}),
1193- 'publish': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
1194- 'ran_at': ('django.db.models.fields.DateTimeField', [], {}),
1195- 'skip_count': ('django.db.models.fields.IntegerField', [], {}),
1196- 'total_count': ('django.db.models.fields.IntegerField', [], {}),
1197- 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'})
1198- },
1199- 'dashboard.sruresultlog': {
1200- 'Meta': {'object_name': 'SRUResultLog', 'db_table': "'sru_result_logs'"},
1201- 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
1202- 'display_name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True'}),
1203- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
1204- 'internal': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
1205- 'path': ('django.db.models.fields.TextField', [], {}),
1206- 'publish': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
1207- 'remote_url': ('django.db.models.fields.URLField', [], {'max_length': '200'}),
1208- 'sru_result': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['dashboard.SRUResult']"}),
1209- 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'})
1210- }
1211- }
1212-
1213- complete_apps = ['dashboard']
1214
1215=== removed file 'dashboard/migrations/0007_auto__add_field_kernel_version__del_field_sruresult_kernel_version.py'
1216--- dashboard/migrations/0007_auto__add_field_kernel_version__del_field_sruresult_kernel_version.py 2012-12-02 02:51:10 +0000
1217+++ dashboard/migrations/0007_auto__add_field_kernel_version__del_field_sruresult_kernel_version.py 1970-01-01 00:00:00 +0000
1218@@ -1,155 +0,0 @@
1219-# QA Dashboard
1220-# Copyright 2012 Canonical Ltd.
1221-
1222-# This program is free software: you can redistribute it and/or modify it
1223-# under the terms of the GNU Affero General Public License version 3, as published
1224-# by the Free Software Foundation.
1225-
1226-# This program is distributed in the hope that it will be useful, but
1227-# WITHOUT ANY WARRANTY; without even the implied warranties of
1228-# MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
1229-# PURPOSE. See the GNU Affero General Public License for more details.
1230-
1231-# You should have received a copy of the GNU Affero General Public License along
1232-# with this program. If not, see <http://www.gnu.org/licenses/>.
1233-
1234-# encoding: utf-8
1235-import datetime
1236-from south.db import db
1237-from south.v2 import SchemaMigration
1238-from django.db import models
1239-
1240-class Migration(SchemaMigration):
1241-
1242- def forwards(self, orm):
1243-
1244- # Adding field 'Kernel.version'
1245- db.add_column('kernels', 'version', self.gf('django.db.models.fields.CharField')(default='Unknown', max_length=100), keep_default=False)
1246-
1247- # Deleting field 'SRUResult.kernel_version'
1248- db.delete_column('sru_results', 'kernel_version')
1249-
1250-
1251- def backwards(self, orm):
1252-
1253- # Deleting field 'Kernel.version'
1254- db.delete_column('kernels', 'version')
1255-
1256- # Adding field 'SRUResult.kernel_version'
1257- db.add_column('sru_results', 'kernel_version', self.gf('django.db.models.fields.CharField')(default='Unknown', max_length=100), keep_default=False)
1258-
1259-
1260- models = {
1261- 'dashboard.bug': {
1262- 'Meta': {'object_name': 'Bug', 'db_table': "'bugs'"},
1263- 'bug_no': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
1264- 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
1265- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
1266- 'internal': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
1267- 'publish': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
1268- 'status': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
1269- 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'})
1270- },
1271- 'dashboard.build': {
1272- 'Meta': {'object_name': 'Build', 'db_table': "'builds'"},
1273- 'arch': ('django.db.models.fields.CharField', [], {'max_length': '200'}),
1274- 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
1275- 'flavor': ('django.db.models.fields.CharField', [], {'max_length': '200'}),
1276- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
1277- 'internal': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
1278- 'name': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True'}),
1279- 'publish': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
1280- 'run': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['dashboard.Run']"}),
1281- 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
1282- 'variant': ('django.db.models.fields.CharField', [], {'max_length': '200'})
1283- },
1284- 'dashboard.kernel': {
1285- 'Meta': {'object_name': 'Kernel', 'db_table': "'kernels'"},
1286- 'arch': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
1287- 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
1288- 'gpu': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
1289- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
1290- 'internal': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
1291- 'job_type': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
1292- 'publish': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
1293- 'release': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
1294- 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
1295- 'variant': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
1296- 'version': ('django.db.models.fields.CharField', [], {'max_length': '100'})
1297- },
1298- 'dashboard.result': {
1299- 'Meta': {'object_name': 'Result', 'db_table': "'results'"},
1300- 'bugs': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['dashboard.Bug']", 'symmetrical': 'False'}),
1301- 'build': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['dashboard.Build']"}),
1302- 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
1303- 'fail_count': ('django.db.models.fields.IntegerField', [], {}),
1304- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
1305- 'internal': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
1306- 'jenkins_build': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
1307- 'jenkins_url': ('django.db.models.fields.URLField', [], {'max_length': '200'}),
1308- 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
1309- 'pass_count': ('django.db.models.fields.IntegerField', [], {}),
1310- 'publish': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
1311- 'ran_at': ('django.db.models.fields.DateTimeField', [], {}),
1312- 'skip_count': ('django.db.models.fields.IntegerField', [], {}),
1313- 'total_count': ('django.db.models.fields.IntegerField', [], {}),
1314- 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'})
1315- },
1316- 'dashboard.resultlog': {
1317- 'Meta': {'object_name': 'ResultLog', 'db_table': "'result_logs'"},
1318- 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
1319- 'display_name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True'}),
1320- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
1321- 'internal': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
1322- 'path': ('django.db.models.fields.TextField', [], {}),
1323- 'publish': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
1324- 'remote_url': ('django.db.models.fields.URLField', [], {'max_length': '200'}),
1325- 'result': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['dashboard.Result']"}),
1326- 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'})
1327- },
1328- 'dashboard.run': {
1329- 'Meta': {'object_name': 'Run', 'db_table': "'runs'"},
1330- 'build_no': ('django.db.models.fields.CharField', [], {'max_length': '200', 'db_index': 'True'}),
1331- 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
1332- 'flavor': ('django.db.models.fields.CharField', [], {'max_length': '200', 'db_index': 'True'}),
1333- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
1334- 'internal': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
1335- 'publish': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
1336- 'ran_at': ('django.db.models.fields.DateTimeField', [], {}),
1337- 'release': ('django.db.models.fields.CharField', [], {'max_length': '200', 'db_index': 'True'}),
1338- 'test_type': ('django.db.models.fields.IntegerField', [], {'null': 'True'}),
1339- 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'})
1340- },
1341- 'dashboard.sruresult': {
1342- 'Meta': {'object_name': 'SRUResult', 'db_table': "'sru_results'"},
1343- 'bugs': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['dashboard.Bug']", 'symmetrical': 'False'}),
1344- 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
1345- 'fail_count': ('django.db.models.fields.IntegerField', [], {}),
1346- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
1347- 'internal': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
1348- 'jenkins_build': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
1349- 'jenkins_url': ('django.db.models.fields.URLField', [], {'max_length': '200'}),
1350- 'kernel': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['dashboard.Kernel']"}),
1351- 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
1352- 'pass_count': ('django.db.models.fields.IntegerField', [], {}),
1353- 'publish': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
1354- 'ran_at': ('django.db.models.fields.DateTimeField', [], {}),
1355- 'skip_count': ('django.db.models.fields.IntegerField', [], {}),
1356- 'total_count': ('django.db.models.fields.IntegerField', [], {}),
1357- 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'})
1358- },
1359- 'dashboard.sruresultlog': {
1360- 'Meta': {'object_name': 'SRUResultLog', 'db_table': "'sru_result_logs'"},
1361- 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
1362- 'display_name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True'}),
1363- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
1364- 'internal': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
1365- 'path': ('django.db.models.fields.TextField', [], {}),
1366- 'publish': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
1367- 'remote_url': ('django.db.models.fields.URLField', [], {'max_length': '200'}),
1368- 'sru_result': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['dashboard.SRUResult']"}),
1369- 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'})
1370- }
1371- }
1372-
1373- complete_apps = ['dashboard']
1374
1375=== removed file 'dashboard/migrations/0008_auto__add_imageresult__add_machine__add_image.py'
1376--- dashboard/migrations/0008_auto__add_imageresult__add_machine__add_image.py 2012-12-02 02:51:10 +0000
1377+++ dashboard/migrations/0008_auto__add_imageresult__add_machine__add_image.py 1970-01-01 00:00:00 +0000
1378@@ -1,238 +0,0 @@
1379-# QA Dashboard
1380-# Copyright 2012 Canonical Ltd.
1381-
1382-# This program is free software: you can redistribute it and/or modify it
1383-# under the terms of the GNU Affero General Public License version 3, as published
1384-# by the Free Software Foundation.
1385-
1386-# This program is distributed in the hope that it will be useful, but
1387-# WITHOUT ANY WARRANTY; without even the implied warranties of
1388-# MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
1389-# PURPOSE. See the GNU Affero General Public License for more details.
1390-
1391-# You should have received a copy of the GNU Affero General Public License along
1392-# with this program. If not, see <http://www.gnu.org/licenses/>.
1393-
1394-# encoding: utf-8
1395-import datetime
1396-from south.db import db
1397-from south.v2 import SchemaMigration
1398-from django.db import models
1399-
1400-class Migration(SchemaMigration):
1401-
1402- def forwards(self, orm):
1403-
1404- # Adding model 'ImageResult'
1405- db.create_table('images_results', (
1406- ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
1407- ('created_at', self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, blank=True)),
1408- ('updated_at', self.gf('django.db.models.fields.DateTimeField')(auto_now=True, blank=True)),
1409- ('internal', self.gf('django.db.models.fields.BooleanField')(default=True)),
1410- ('publish', self.gf('django.db.models.fields.BooleanField')(default=True)),
1411- ('image', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['dashboard.Image'])),
1412- ('machine', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['dashboard.Machine'])),
1413- ('ran_at', self.gf('django.db.models.fields.DateTimeField')()),
1414- ('kernel_init', self.gf('django.db.models.fields.FloatField')()),
1415- ('kernel', self.gf('django.db.models.fields.FloatField')()),
1416- ('plumbing', self.gf('django.db.models.fields.FloatField')()),
1417- ('xorg', self.gf('django.db.models.fields.FloatField')()),
1418- ('desktop', self.gf('django.db.models.fields.FloatField')()),
1419- ('boot', self.gf('django.db.models.fields.FloatField')()),
1420- ))
1421- db.send_create_signal('dashboard', ['ImageResult'])
1422-
1423- # Adding model 'Machine'
1424- db.create_table('machines', (
1425- ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
1426- ('created_at', self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, blank=True)),
1427- ('updated_at', self.gf('django.db.models.fields.DateTimeField')(auto_now=True, blank=True)),
1428- ('internal', self.gf('django.db.models.fields.BooleanField')(default=True)),
1429- ('publish', self.gf('django.db.models.fields.BooleanField')(default=True)),
1430- ('name', self.gf('django.db.models.fields.CharField')(max_length=200)),
1431- ('mac_address', self.gf('django.db.models.fields.CharField')(max_length=200)),
1432- ))
1433- db.send_create_signal('dashboard', ['Machine'])
1434-
1435- # Adding model 'Image'
1436- db.create_table('images', (
1437- ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
1438- ('created_at', self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, blank=True)),
1439- ('updated_at', self.gf('django.db.models.fields.DateTimeField')(auto_now=True, blank=True)),
1440- ('internal', self.gf('django.db.models.fields.BooleanField')(default=True)),
1441- ('publish', self.gf('django.db.models.fields.BooleanField')(default=True)),
1442- ('release', self.gf('django.db.models.fields.CharField')(max_length=200)),
1443- ('variant', self.gf('django.db.models.fields.CharField')(max_length=200)),
1444- ('arch', self.gf('django.db.models.fields.CharField')(max_length=200)),
1445- ('md5', self.gf('django.db.models.fields.CharField')(max_length=200)),
1446- ('build_number', self.gf('django.db.models.fields.CharField')(max_length=50)),
1447- ))
1448- db.send_create_signal('dashboard', ['Image'])
1449-
1450-
1451- def backwards(self, orm):
1452-
1453- # Deleting model 'ImageResult'
1454- db.delete_table('images_results')
1455-
1456- # Deleting model 'Machine'
1457- db.delete_table('machines')
1458-
1459- # Deleting model 'Image'
1460- db.delete_table('images')
1461-
1462-
1463- models = {
1464- 'dashboard.bug': {
1465- 'Meta': {'object_name': 'Bug', 'db_table': "'bugs'"},
1466- 'bug_no': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
1467- 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
1468- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
1469- 'internal': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
1470- 'publish': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
1471- 'status': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
1472- 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'})
1473- },
1474- 'dashboard.build': {
1475- 'Meta': {'object_name': 'Build', 'db_table': "'builds'"},
1476- 'arch': ('django.db.models.fields.CharField', [], {'max_length': '200'}),
1477- 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
1478- 'flavor': ('django.db.models.fields.CharField', [], {'max_length': '200'}),
1479- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
1480- 'internal': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
1481- 'name': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True'}),
1482- 'publish': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
1483- 'run': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['dashboard.Run']"}),
1484- 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
1485- 'variant': ('django.db.models.fields.CharField', [], {'max_length': '200'})
1486- },
1487- 'dashboard.image': {
1488- 'Meta': {'object_name': 'Image', 'db_table': "'images'"},
1489- 'arch': ('django.db.models.fields.CharField', [], {'max_length': '200'}),
1490- 'build_number': ('django.db.models.fields.CharField', [], {'max_length': '50'}),
1491- 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
1492- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
1493- 'internal': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
1494- 'md5': ('django.db.models.fields.CharField', [], {'max_length': '200'}),
1495- 'publish': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
1496- 'release': ('django.db.models.fields.CharField', [], {'max_length': '200'}),
1497- 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
1498- 'variant': ('django.db.models.fields.CharField', [], {'max_length': '200'})
1499- },
1500- 'dashboard.imageresult': {
1501- 'Meta': {'object_name': 'ImageResult', 'db_table': "'images_results'"},
1502- 'boot': ('django.db.models.fields.FloatField', [], {}),
1503- 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
1504- 'desktop': ('django.db.models.fields.FloatField', [], {}),
1505- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
1506- 'image': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['dashboard.Image']"}),
1507- 'internal': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
1508- 'kernel': ('django.db.models.fields.FloatField', [], {}),
1509- 'kernel_init': ('django.db.models.fields.FloatField', [], {}),
1510- 'machine': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['dashboard.Machine']"}),
1511- 'plumbing': ('django.db.models.fields.FloatField', [], {}),
1512- 'publish': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
1513- 'ran_at': ('django.db.models.fields.DateTimeField', [], {}),
1514- 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
1515- 'xorg': ('django.db.models.fields.FloatField', [], {})
1516- },
1517- 'dashboard.kernel': {
1518- 'Meta': {'object_name': 'Kernel', 'db_table': "'kernels'"},
1519- 'arch': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
1520- 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
1521- 'gpu': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
1522- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
1523- 'internal': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
1524- 'job_type': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
1525- 'publish': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
1526- 'release': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
1527- 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
1528- 'variant': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
1529- 'version': ('django.db.models.fields.CharField', [], {'max_length': '100'})
1530- },
1531- 'dashboard.machine': {
1532- 'Meta': {'object_name': 'Machine', 'db_table': "'machines'"},
1533- 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
1534- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
1535- 'internal': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
1536- 'mac_address': ('django.db.models.fields.CharField', [], {'max_length': '200'}),
1537- 'name': ('django.db.models.fields.CharField', [], {'max_length': '200'}),
1538- 'publish': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
1539- 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'})
1540- },
1541- 'dashboard.result': {
1542- 'Meta': {'object_name': 'Result', 'db_table': "'results'"},
1543- 'bugs': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['dashboard.Bug']", 'symmetrical': 'False'}),
1544- 'build': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['dashboard.Build']"}),
1545- 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
1546- 'fail_count': ('django.db.models.fields.IntegerField', [], {}),
1547- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
1548- 'internal': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
1549- 'jenkins_build': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
1550- 'jenkins_url': ('django.db.models.fields.URLField', [], {'max_length': '200'}),
1551- 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
1552- 'pass_count': ('django.db.models.fields.IntegerField', [], {}),
1553- 'publish': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
1554- 'ran_at': ('django.db.models.fields.DateTimeField', [], {}),
1555- 'skip_count': ('django.db.models.fields.IntegerField', [], {}),
1556- 'total_count': ('django.db.models.fields.IntegerField', [], {}),
1557- 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'})
1558- },
1559- 'dashboard.resultlog': {
1560- 'Meta': {'object_name': 'ResultLog', 'db_table': "'result_logs'"},
1561- 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
1562- 'display_name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True'}),
1563- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
1564- 'internal': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
1565- 'path': ('django.db.models.fields.TextField', [], {}),
1566- 'publish': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
1567- 'remote_url': ('django.db.models.fields.URLField', [], {'max_length': '200'}),
1568- 'result': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['dashboard.Result']"}),
1569- 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'})
1570- },
1571- 'dashboard.run': {
1572- 'Meta': {'object_name': 'Run', 'db_table': "'runs'"},
1573- 'build_no': ('django.db.models.fields.CharField', [], {'max_length': '200', 'db_index': 'True'}),
1574- 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
1575- 'flavor': ('django.db.models.fields.CharField', [], {'max_length': '200', 'db_index': 'True'}),
1576- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
1577- 'internal': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
1578- 'publish': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
1579- 'ran_at': ('django.db.models.fields.DateTimeField', [], {}),
1580- 'release': ('django.db.models.fields.CharField', [], {'max_length': '200', 'db_index': 'True'}),
1581- 'test_type': ('django.db.models.fields.IntegerField', [], {'null': 'True'}),
1582- 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'})
1583- },
1584- 'dashboard.sruresult': {
1585- 'Meta': {'object_name': 'SRUResult', 'db_table': "'sru_results'"},
1586- 'bugs': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['dashboard.Bug']", 'symmetrical': 'False'}),
1587- 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
1588- 'fail_count': ('django.db.models.fields.IntegerField', [], {}),
1589- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
1590- 'internal': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
1591- 'jenkins_build': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
1592- 'jenkins_url': ('django.db.models.fields.URLField', [], {'max_length': '200'}),
1593- 'kernel': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['dashboard.Kernel']"}),
1594- 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
1595- 'pass_count': ('django.db.models.fields.IntegerField', [], {}),
1596- 'publish': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
1597- 'ran_at': ('django.db.models.fields.DateTimeField', [], {}),
1598- 'skip_count': ('django.db.models.fields.IntegerField', [], {}),
1599- 'total_count': ('django.db.models.fields.IntegerField', [], {}),
1600- 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'})
1601- },
1602- 'dashboard.sruresultlog': {
1603- 'Meta': {'object_name': 'SRUResultLog', 'db_table': "'sru_result_logs'"},
1604- 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
1605- 'display_name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True'}),
1606- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
1607- 'internal': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
1608- 'path': ('django.db.models.fields.TextField', [], {}),
1609- 'publish': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
1610- 'remote_url': ('django.db.models.fields.URLField', [], {'max_length': '200'}),
1611- 'sru_result': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['dashboard.SRUResult']"}),
1612- 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'})
1613- }
1614- }
1615-
1616- complete_apps = ['dashboard']
1617
1618=== removed file 'dashboard/migrations/0009_auto__add_unique_machine_name__add_unique_image_release_arch_variant_b.py'
1619--- dashboard/migrations/0009_auto__add_unique_machine_name__add_unique_image_release_arch_variant_b.py 2012-12-02 02:51:10 +0000
1620+++ dashboard/migrations/0009_auto__add_unique_machine_name__add_unique_image_release_arch_variant_b.py 1970-01-01 00:00:00 +0000
1621@@ -1,195 +0,0 @@
1622-# QA Dashboard
1623-# Copyright 2012 Canonical Ltd.
1624-
1625-# This program is free software: you can redistribute it and/or modify it
1626-# under the terms of the GNU Affero General Public License version 3, as published
1627-# by the Free Software Foundation.
1628-
1629-# This program is distributed in the hope that it will be useful, but
1630-# WITHOUT ANY WARRANTY; without even the implied warranties of
1631-# MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
1632-# PURPOSE. See the GNU Affero General Public License for more details.
1633-
1634-# You should have received a copy of the GNU Affero General Public License along
1635-# with this program. If not, see <http://www.gnu.org/licenses/>.
1636-
1637-# encoding: utf-8
1638-import datetime
1639-from south.db import db
1640-from south.v2 import SchemaMigration
1641-from django.db import models
1642-
1643-class Migration(SchemaMigration):
1644-
1645- def forwards(self, orm):
1646-
1647- # Adding unique constraint on 'Machine', fields ['name']
1648- db.create_unique('machines', ['name'])
1649-
1650- # Adding unique constraint on 'Image', fields ['release', 'arch', 'variant', 'build_number']
1651- db.create_unique('images', ['release', 'arch', 'variant', 'build_number'])
1652-
1653-
1654- def backwards(self, orm):
1655-
1656- # Removing unique constraint on 'Image', fields ['release', 'arch', 'variant', 'build_number']
1657- db.delete_unique('images', ['release', 'arch', 'variant', 'build_number'])
1658-
1659- # Removing unique constraint on 'Machine', fields ['name']
1660- db.delete_unique('machines', ['name'])
1661-
1662-
1663- models = {
1664- 'dashboard.bug': {
1665- 'Meta': {'object_name': 'Bug', 'db_table': "'bugs'"},
1666- 'bug_no': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
1667- 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
1668- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
1669- 'internal': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
1670- 'publish': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
1671- 'status': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
1672- 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'})
1673- },
1674- 'dashboard.build': {
1675- 'Meta': {'object_name': 'Build', 'db_table': "'builds'"},
1676- 'arch': ('django.db.models.fields.CharField', [], {'max_length': '200'}),
1677- 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
1678- 'flavor': ('django.db.models.fields.CharField', [], {'max_length': '200'}),
1679- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
1680- 'internal': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
1681- 'name': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True'}),
1682- 'publish': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
1683- 'run': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['dashboard.Run']"}),
1684- 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
1685- 'variant': ('django.db.models.fields.CharField', [], {'max_length': '200'})
1686- },
1687- 'dashboard.image': {
1688- 'Meta': {'unique_together': "(('release', 'variant', 'arch', 'build_number'),)", 'object_name': 'Image', 'db_table': "'images'"},
1689- 'arch': ('django.db.models.fields.CharField', [], {'max_length': '200'}),
1690- 'build_number': ('django.db.models.fields.CharField', [], {'max_length': '50'}),
1691- 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
1692- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
1693- 'internal': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
1694- 'md5': ('django.db.models.fields.CharField', [], {'max_length': '200'}),
1695- 'publish': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
1696- 'release': ('django.db.models.fields.CharField', [], {'max_length': '200'}),
1697- 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
1698- 'variant': ('django.db.models.fields.CharField', [], {'max_length': '200'})
1699- },
1700- 'dashboard.imageresult': {
1701- 'Meta': {'object_name': 'ImageResult', 'db_table': "'images_results'"},
1702- 'boot': ('django.db.models.fields.FloatField', [], {}),
1703- 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
1704- 'desktop': ('django.db.models.fields.FloatField', [], {}),
1705- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
1706- 'image': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['dashboard.Image']"}),
1707- 'internal': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
1708- 'kernel': ('django.db.models.fields.FloatField', [], {}),
1709- 'kernel_init': ('django.db.models.fields.FloatField', [], {}),
1710- 'machine': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['dashboard.Machine']"}),
1711- 'plumbing': ('django.db.models.fields.FloatField', [], {}),
1712- 'publish': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
1713- 'ran_at': ('django.db.models.fields.DateTimeField', [], {}),
1714- 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
1715- 'xorg': ('django.db.models.fields.FloatField', [], {})
1716- },
1717- 'dashboard.kernel': {
1718- 'Meta': {'object_name': 'Kernel', 'db_table': "'kernels'"},
1719- 'arch': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
1720- 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
1721- 'gpu': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
1722- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
1723- 'internal': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
1724- 'job_type': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
1725- 'publish': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
1726- 'release': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
1727- 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
1728- 'variant': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
1729- 'version': ('django.db.models.fields.CharField', [], {'max_length': '100'})
1730- },
1731- 'dashboard.machine': {
1732- 'Meta': {'object_name': 'Machine', 'db_table': "'machines'"},
1733- 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
1734- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
1735- 'internal': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
1736- 'mac_address': ('django.db.models.fields.CharField', [], {'max_length': '200'}),
1737- 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '200'}),
1738- 'publish': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
1739- 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'})
1740- },
1741- 'dashboard.result': {
1742- 'Meta': {'object_name': 'Result', 'db_table': "'results'"},
1743- 'bugs': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['dashboard.Bug']", 'symmetrical': 'False'}),
1744- 'build': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['dashboard.Build']"}),
1745- 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
1746- 'fail_count': ('django.db.models.fields.IntegerField', [], {}),
1747- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
1748- 'internal': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
1749- 'jenkins_build': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
1750- 'jenkins_url': ('django.db.models.fields.URLField', [], {'max_length': '200'}),
1751- 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
1752- 'pass_count': ('django.db.models.fields.IntegerField', [], {}),
1753- 'publish': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
1754- 'ran_at': ('django.db.models.fields.DateTimeField', [], {}),
1755- 'skip_count': ('django.db.models.fields.IntegerField', [], {}),
1756- 'total_count': ('django.db.models.fields.IntegerField', [], {}),
1757- 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'})
1758- },
1759- 'dashboard.resultlog': {
1760- 'Meta': {'object_name': 'ResultLog', 'db_table': "'result_logs'"},
1761- 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
1762- 'display_name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True'}),
1763- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
1764- 'internal': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
1765- 'path': ('django.db.models.fields.TextField', [], {}),
1766- 'publish': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
1767- 'remote_url': ('django.db.models.fields.URLField', [], {'max_length': '200'}),
1768- 'result': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['dashboard.Result']"}),
1769- 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'})
1770- },
1771- 'dashboard.run': {
1772- 'Meta': {'object_name': 'Run', 'db_table': "'runs'"},
1773- 'build_no': ('django.db.models.fields.CharField', [], {'max_length': '200', 'db_index': 'True'}),
1774- 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
1775- 'flavor': ('django.db.models.fields.CharField', [], {'max_length': '200', 'db_index': 'True'}),
1776- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
1777- 'internal': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
1778- 'publish': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
1779- 'ran_at': ('django.db.models.fields.DateTimeField', [], {}),
1780- 'release': ('django.db.models.fields.CharField', [], {'max_length': '200', 'db_index': 'True'}),
1781- 'test_type': ('django.db.models.fields.IntegerField', [], {'null': 'True'}),
1782- 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'})
1783- },
1784- 'dashboard.sruresult': {
1785- 'Meta': {'object_name': 'SRUResult', 'db_table': "'sru_results'"},
1786- 'bugs': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['dashboard.Bug']", 'symmetrical': 'False'}),
1787- 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
1788- 'fail_count': ('django.db.models.fields.IntegerField', [], {}),
1789- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
1790- 'internal': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
1791- 'jenkins_build': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
1792- 'jenkins_url': ('django.db.models.fields.URLField', [], {'max_length': '200'}),
1793- 'kernel': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['dashboard.Kernel']"}),
1794- 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
1795- 'pass_count': ('django.db.models.fields.IntegerField', [], {}),
1796- 'publish': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
1797- 'ran_at': ('django.db.models.fields.DateTimeField', [], {}),
1798- 'skip_count': ('django.db.models.fields.IntegerField', [], {}),
1799- 'total_count': ('django.db.models.fields.IntegerField', [], {}),
1800- 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'})
1801- },
1802- 'dashboard.sruresultlog': {
1803- 'Meta': {'object_name': 'SRUResultLog', 'db_table': "'sru_result_logs'"},
1804- 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
1805- 'display_name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True'}),
1806- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
1807- 'internal': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
1808- 'path': ('django.db.models.fields.TextField', [], {}),
1809- 'publish': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
1810- 'remote_url': ('django.db.models.fields.URLField', [], {'max_length': '200'}),
1811- 'sru_result': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['dashboard.SRUResult']"}),
1812- 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'})
1813- }
1814- }
1815-
1816- complete_apps = ['dashboard']
1817
1818=== removed file 'dashboard/migrations/0010_auto__add_unique_image_md5.py'
1819--- dashboard/migrations/0010_auto__add_unique_image_md5.py 2012-12-02 02:51:10 +0000
1820+++ dashboard/migrations/0010_auto__add_unique_image_md5.py 1970-01-01 00:00:00 +0000
1821@@ -1,189 +0,0 @@
1822-# QA Dashboard
1823-# Copyright 2012 Canonical Ltd.
1824-
1825-# This program is free software: you can redistribute it and/or modify it
1826-# under the terms of the GNU Affero General Public License version 3, as published
1827-# by the Free Software Foundation.
1828-
1829-# This program is distributed in the hope that it will be useful, but
1830-# WITHOUT ANY WARRANTY; without even the implied warranties of
1831-# MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
1832-# PURPOSE. See the GNU Affero General Public License for more details.
1833-
1834-# You should have received a copy of the GNU Affero General Public License along
1835-# with this program. If not, see <http://www.gnu.org/licenses/>.
1836-
1837-# encoding: utf-8
1838-import datetime
1839-from south.db import db
1840-from south.v2 import SchemaMigration
1841-from django.db import models
1842-
1843-class Migration(SchemaMigration):
1844-
1845- def forwards(self, orm):
1846-
1847- # Adding unique constraint on 'Image', fields ['md5']
1848- db.create_unique('images', ['md5'])
1849-
1850-
1851- def backwards(self, orm):
1852-
1853- # Removing unique constraint on 'Image', fields ['md5']
1854- db.delete_unique('images', ['md5'])
1855-
1856-
1857- models = {
1858- 'dashboard.bug': {
1859- 'Meta': {'object_name': 'Bug', 'db_table': "'bugs'"},
1860- 'bug_no': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
1861- 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
1862- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
1863- 'internal': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
1864- 'publish': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
1865- 'status': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
1866- 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'})
1867- },
1868- 'dashboard.build': {
1869- 'Meta': {'object_name': 'Build', 'db_table': "'builds'"},
1870- 'arch': ('django.db.models.fields.CharField', [], {'max_length': '200'}),
1871- 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
1872- 'flavor': ('django.db.models.fields.CharField', [], {'max_length': '200'}),
1873- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
1874- 'internal': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
1875- 'name': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True'}),
1876- 'publish': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
1877- 'run': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['dashboard.Run']"}),
1878- 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
1879- 'variant': ('django.db.models.fields.CharField', [], {'max_length': '200'})
1880- },
1881- 'dashboard.image': {
1882- 'Meta': {'unique_together': "(('release', 'variant', 'arch', 'build_number'),)", 'object_name': 'Image', 'db_table': "'images'"},
1883- 'arch': ('django.db.models.fields.CharField', [], {'max_length': '200'}),
1884- 'build_number': ('django.db.models.fields.CharField', [], {'max_length': '50'}),
1885- 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
1886- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
1887- 'internal': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
1888- 'md5': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '200'}),
1889- 'publish': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
1890- 'release': ('django.db.models.fields.CharField', [], {'max_length': '200'}),
1891- 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
1892- 'variant': ('django.db.models.fields.CharField', [], {'max_length': '200'})
1893- },
1894- 'dashboard.imageresult': {
1895- 'Meta': {'object_name': 'ImageResult', 'db_table': "'images_results'"},
1896- 'boot': ('django.db.models.fields.FloatField', [], {}),
1897- 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
1898- 'desktop': ('django.db.models.fields.FloatField', [], {}),
1899- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
1900- 'image': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['dashboard.Image']"}),
1901- 'internal': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
1902- 'kernel': ('django.db.models.fields.FloatField', [], {}),
1903- 'kernel_init': ('django.db.models.fields.FloatField', [], {}),
1904- 'machine': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['dashboard.Machine']"}),
1905- 'plumbing': ('django.db.models.fields.FloatField', [], {}),
1906- 'publish': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
1907- 'ran_at': ('django.db.models.fields.DateTimeField', [], {}),
1908- 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
1909- 'xorg': ('django.db.models.fields.FloatField', [], {})
1910- },
1911- 'dashboard.kernel': {
1912- 'Meta': {'object_name': 'Kernel', 'db_table': "'kernels'"},
1913- 'arch': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
1914- 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
1915- 'gpu': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
1916- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
1917- 'internal': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
1918- 'job_type': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
1919- 'publish': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
1920- 'release': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
1921- 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
1922- 'variant': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
1923- 'version': ('django.db.models.fields.CharField', [], {'max_length': '100'})
1924- },
1925- 'dashboard.machine': {
1926- 'Meta': {'object_name': 'Machine', 'db_table': "'machines'"},
1927- 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
1928- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
1929- 'internal': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
1930- 'mac_address': ('django.db.models.fields.CharField', [], {'max_length': '200'}),
1931- 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '200'}),
1932- 'publish': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
1933- 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'})
1934- },
1935- 'dashboard.result': {
1936- 'Meta': {'object_name': 'Result', 'db_table': "'results'"},
1937- 'bugs': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['dashboard.Bug']", 'symmetrical': 'False'}),
1938- 'build': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['dashboard.Build']"}),
1939- 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
1940- 'fail_count': ('django.db.models.fields.IntegerField', [], {}),
1941- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
1942- 'internal': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
1943- 'jenkins_build': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
1944- 'jenkins_url': ('django.db.models.fields.URLField', [], {'max_length': '200'}),
1945- 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
1946- 'pass_count': ('django.db.models.fields.IntegerField', [], {}),
1947- 'publish': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
1948- 'ran_at': ('django.db.models.fields.DateTimeField', [], {}),
1949- 'skip_count': ('django.db.models.fields.IntegerField', [], {}),
1950- 'total_count': ('django.db.models.fields.IntegerField', [], {}),
1951- 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'})
1952- },
1953- 'dashboard.resultlog': {
1954- 'Meta': {'object_name': 'ResultLog', 'db_table': "'result_logs'"},
1955- 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
1956- 'display_name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True'}),
1957- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
1958- 'internal': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
1959- 'path': ('django.db.models.fields.TextField', [], {}),
1960- 'publish': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
1961- 'remote_url': ('django.db.models.fields.URLField', [], {'max_length': '200'}),
1962- 'result': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['dashboard.Result']"}),
1963- 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'})
1964- },
1965- 'dashboard.run': {
1966- 'Meta': {'object_name': 'Run', 'db_table': "'runs'"},
1967- 'build_no': ('django.db.models.fields.CharField', [], {'max_length': '200', 'db_index': 'True'}),
1968- 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
1969- 'flavor': ('django.db.models.fields.CharField', [], {'max_length': '200', 'db_index': 'True'}),
1970- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
1971- 'internal': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
1972- 'publish': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
1973- 'ran_at': ('django.db.models.fields.DateTimeField', [], {}),
1974- 'release': ('django.db.models.fields.CharField', [], {'max_length': '200', 'db_index': 'True'}),
1975- 'test_type': ('django.db.models.fields.IntegerField', [], {'null': 'True'}),
1976- 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'})
1977- },
1978- 'dashboard.sruresult': {
1979- 'Meta': {'object_name': 'SRUResult', 'db_table': "'sru_results'"},
1980- 'bugs': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['dashboard.Bug']", 'symmetrical': 'False'}),
1981- 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
1982- 'fail_count': ('django.db.models.fields.IntegerField', [], {}),
1983- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
1984- 'internal': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
1985- 'jenkins_build': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
1986- 'jenkins_url': ('django.db.models.fields.URLField', [], {'max_length': '200'}),
1987- 'kernel': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['dashboard.Kernel']"}),
1988- 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
1989- 'pass_count': ('django.db.models.fields.IntegerField', [], {}),
1990- 'publish': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
1991- 'ran_at': ('django.db.models.fields.DateTimeField', [], {}),
1992- 'skip_count': ('django.db.models.fields.IntegerField', [], {}),
1993- 'total_count': ('django.db.models.fields.IntegerField', [], {}),
1994- 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'})
1995- },
1996- 'dashboard.sruresultlog': {
1997- 'Meta': {'object_name': 'SRUResultLog', 'db_table': "'sru_result_logs'"},
1998- 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
1999- 'display_name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True'}),
2000- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
2001- 'internal': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
2002- 'path': ('django.db.models.fields.TextField', [], {}),
2003- 'publish': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
2004- 'remote_url': ('django.db.models.fields.URLField', [], {'max_length': '200'}),
2005- 'sru_result': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['dashboard.SRUResult']"}),
2006- 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'})
2007- }
2008- }
2009-
2010- complete_apps = ['dashboard']
2011
2012=== removed file 'dashboard/migrations/0011_removing_bootspeed.py'
2013--- dashboard/migrations/0011_removing_bootspeed.py 2012-12-02 02:51:10 +0000
2014+++ dashboard/migrations/0011_removing_bootspeed.py 1970-01-01 00:00:00 +0000
2015@@ -1,203 +0,0 @@
2016-# QA Dashboard
2017-# Copyright 2012 Canonical Ltd.
2018-
2019-# This program is free software: you can redistribute it and/or modify it
2020-# under the terms of the GNU Affero General Public License version 3, as published
2021-# by the Free Software Foundation.
2022-
2023-# This program is distributed in the hope that it will be useful, but
2024-# WITHOUT ANY WARRANTY; without even the implied warranties of
2025-# MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
2026-# PURPOSE. See the GNU Affero General Public License for more details.
2027-
2028-# You should have received a copy of the GNU Affero General Public License along
2029-# with this program. If not, see <http://www.gnu.org/licenses/>.
2030-
2031-# -*- coding: utf-8 -*-
2032-import datetime
2033-from south.db import db
2034-from south.v2 import SchemaMigration
2035-from django.db import models
2036-
2037-
2038-class Migration(SchemaMigration):
2039-
2040- def forwards(self, orm):
2041- # Removing unique constraint on 'Image', fields ['release', 'variant', 'arch', 'build_number']
2042- db.delete_unique('images', ['release', 'variant', 'arch', 'build_number'])
2043-
2044- # Deleting model 'ImageResult'
2045- db.delete_table('images_results')
2046-
2047- # Deleting model 'Machine'
2048- db.delete_table('machines')
2049-
2050- # Deleting model 'Image'
2051- db.delete_table('images')
2052-
2053-
2054- def backwards(self, orm):
2055- # Adding model 'ImageResult'
2056- db.create_table('images_results', (
2057- ('kernel', self.gf('django.db.models.fields.FloatField')()),
2058- ('image', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['dashboard.Image'])),
2059- ('updated_at', self.gf('django.db.models.fields.DateTimeField')(auto_now=True, blank=True)),
2060- ('xorg', self.gf('django.db.models.fields.FloatField')()),
2061- ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
2062- ('ran_at', self.gf('django.db.models.fields.DateTimeField')()),
2063- ('created_at', self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, blank=True)),
2064- ('kernel_init', self.gf('django.db.models.fields.FloatField')()),
2065- ('boot', self.gf('django.db.models.fields.FloatField')()),
2066- ('publish', self.gf('django.db.models.fields.BooleanField')(default=True)),
2067- ('desktop', self.gf('django.db.models.fields.FloatField')()),
2068- ('machine', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['dashboard.Machine'])),
2069- ('internal', self.gf('django.db.models.fields.BooleanField')(default=True)),
2070- ('plumbing', self.gf('django.db.models.fields.FloatField')()),
2071- ))
2072- db.send_create_signal('dashboard', ['ImageResult'])
2073-
2074- # Adding model 'Machine'
2075- db.create_table('machines', (
2076- ('name', self.gf('django.db.models.fields.CharField')(max_length=200, unique=True)),
2077- ('internal', self.gf('django.db.models.fields.BooleanField')(default=True)),
2078- ('mac_address', self.gf('django.db.models.fields.CharField')(max_length=200)),
2079- ('created_at', self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, blank=True)),
2080- ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
2081- ('publish', self.gf('django.db.models.fields.BooleanField')(default=True)),
2082- ('updated_at', self.gf('django.db.models.fields.DateTimeField')(auto_now=True, blank=True)),
2083- ))
2084- db.send_create_signal('dashboard', ['Machine'])
2085-
2086- # Adding model 'Image'
2087- db.create_table('images', (
2088- ('variant', self.gf('django.db.models.fields.CharField')(max_length=200)),
2089- ('updated_at', self.gf('django.db.models.fields.DateTimeField')(auto_now=True, blank=True)),
2090- ('arch', self.gf('django.db.models.fields.CharField')(max_length=200)),
2091- ('internal', self.gf('django.db.models.fields.BooleanField')(default=True)),
2092- ('md5', self.gf('django.db.models.fields.CharField')(max_length=200, unique=True)),
2093- ('build_number', self.gf('django.db.models.fields.CharField')(max_length=50)),
2094- ('created_at', self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, blank=True)),
2095- ('publish', self.gf('django.db.models.fields.BooleanField')(default=True)),
2096- ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
2097- ('release', self.gf('django.db.models.fields.CharField')(max_length=200)),
2098- ))
2099- db.send_create_signal('dashboard', ['Image'])
2100-
2101- # Adding unique constraint on 'Image', fields ['release', 'variant', 'arch', 'build_number']
2102- db.create_unique('images', ['release', 'variant', 'arch', 'build_number'])
2103-
2104-
2105- models = {
2106- 'dashboard.bug': {
2107- 'Meta': {'object_name': 'Bug', 'db_table': "'bugs'"},
2108- 'bug_no': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
2109- 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
2110- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
2111- 'internal': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
2112- 'publish': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
2113- 'status': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
2114- 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'})
2115- },
2116- 'dashboard.build': {
2117- 'Meta': {'object_name': 'Build', 'db_table': "'builds'"},
2118- 'arch': ('django.db.models.fields.CharField', [], {'max_length': '200'}),
2119- 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
2120- 'flavor': ('django.db.models.fields.CharField', [], {'max_length': '200'}),
2121- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
2122- 'internal': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
2123- 'name': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True'}),
2124- 'publish': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
2125- 'run': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['dashboard.Run']"}),
2126- 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
2127- 'variant': ('django.db.models.fields.CharField', [], {'max_length': '200'})
2128- },
2129- 'dashboard.kernel': {
2130- 'Meta': {'object_name': 'Kernel', 'db_table': "'kernels'"},
2131- 'arch': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
2132- 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
2133- 'gpu': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
2134- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
2135- 'internal': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
2136- 'job_type': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
2137- 'publish': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
2138- 'release': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
2139- 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
2140- 'variant': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
2141- 'version': ('django.db.models.fields.CharField', [], {'max_length': '100'})
2142- },
2143- 'dashboard.result': {
2144- 'Meta': {'object_name': 'Result', 'db_table': "'results'"},
2145- 'bugs': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['dashboard.Bug']", 'symmetrical': 'False'}),
2146- 'build': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['dashboard.Build']"}),
2147- 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
2148- 'fail_count': ('django.db.models.fields.IntegerField', [], {}),
2149- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
2150- 'internal': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
2151- 'jenkins_build': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
2152- 'jenkins_url': ('django.db.models.fields.URLField', [], {'max_length': '200'}),
2153- 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
2154- 'pass_count': ('django.db.models.fields.IntegerField', [], {}),
2155- 'publish': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
2156- 'ran_at': ('django.db.models.fields.DateTimeField', [], {}),
2157- 'skip_count': ('django.db.models.fields.IntegerField', [], {}),
2158- 'total_count': ('django.db.models.fields.IntegerField', [], {}),
2159- 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'})
2160- },
2161- 'dashboard.resultlog': {
2162- 'Meta': {'object_name': 'ResultLog', 'db_table': "'result_logs'"},
2163- 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
2164- 'display_name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True'}),
2165- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
2166- 'internal': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
2167- 'path': ('django.db.models.fields.TextField', [], {}),
2168- 'publish': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
2169- 'remote_url': ('django.db.models.fields.URLField', [], {'max_length': '200'}),
2170- 'result': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['dashboard.Result']"}),
2171- 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'})
2172- },
2173- 'dashboard.run': {
2174- 'Meta': {'object_name': 'Run', 'db_table': "'runs'"},
2175- 'build_no': ('django.db.models.fields.CharField', [], {'max_length': '200', 'db_index': 'True'}),
2176- 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
2177- 'flavor': ('django.db.models.fields.CharField', [], {'max_length': '200', 'db_index': 'True'}),
2178- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
2179- 'internal': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
2180- 'publish': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
2181- 'ran_at': ('django.db.models.fields.DateTimeField', [], {}),
2182- 'release': ('django.db.models.fields.CharField', [], {'max_length': '200', 'db_index': 'True'}),
2183- 'test_type': ('django.db.models.fields.IntegerField', [], {'null': 'True'}),
2184- 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'})
2185- },
2186- 'dashboard.sruresult': {
2187- 'Meta': {'object_name': 'SRUResult', 'db_table': "'sru_results'"},
2188- 'bugs': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['dashboard.Bug']", 'symmetrical': 'False'}),
2189- 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
2190- 'fail_count': ('django.db.models.fields.IntegerField', [], {}),
2191- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
2192- 'internal': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
2193- 'jenkins_build': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
2194- 'jenkins_url': ('django.db.models.fields.URLField', [], {'max_length': '200'}),
2195- 'kernel': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['dashboard.Kernel']"}),
2196- 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
2197- 'pass_count': ('django.db.models.fields.IntegerField', [], {}),
2198- 'publish': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
2199- 'ran_at': ('django.db.models.fields.DateTimeField', [], {}),
2200- 'skip_count': ('django.db.models.fields.IntegerField', [], {}),
2201- 'total_count': ('django.db.models.fields.IntegerField', [], {}),
2202- 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'})
2203- },
2204- 'dashboard.sruresultlog': {
2205- 'Meta': {'object_name': 'SRUResultLog', 'db_table': "'sru_result_logs'"},
2206- 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
2207- 'display_name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True'}),
2208- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
2209- 'internal': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
2210- 'path': ('django.db.models.fields.TextField', [], {}),
2211- 'publish': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
2212- 'remote_url': ('django.db.models.fields.URLField', [], {'max_length': '200'}),
2213- 'sru_result': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['dashboard.SRUResult']"}),
2214- 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'})
2215- }
2216- }
2217-
2218- complete_apps = ['dashboard']
2219\ No newline at end of file
2220
2221=== removed file 'dashboard/migrations/0012_change_skip_to_error.py'
2222--- dashboard/migrations/0012_change_skip_to_error.py 2012-12-05 22:24:13 +0000
2223+++ dashboard/migrations/0012_change_skip_to_error.py 1970-01-01 00:00:00 +0000
2224@@ -1,143 +0,0 @@
2225-# -*- coding: utf-8 -*-
2226-import datetime
2227-from south.db import db
2228-from south.v2 import SchemaMigration
2229-from django.db import models
2230-
2231-
2232-class Migration(SchemaMigration):
2233-
2234- def forwards(self, orm):
2235- # Deleting field 'Result.skip_count'
2236- db.delete_column('results', 'skip_count')
2237-
2238- # Adding field 'Result.error_count'
2239- db.add_column('results', 'error_count',
2240- self.gf('django.db.models.fields.IntegerField')(default=0),
2241- keep_default=False)
2242-
2243-
2244- def backwards(self, orm):
2245- # Adding field 'Result.skip_count'
2246- db.add_column('results', 'skip_count',
2247- self.gf('django.db.models.fields.IntegerField')(default=0),
2248- keep_default=False)
2249-
2250- # Deleting field 'Result.error_count'
2251- db.delete_column('results', 'error_count')
2252-
2253-
2254- models = {
2255- 'dashboard.bug': {
2256- 'Meta': {'object_name': 'Bug', 'db_table': "'bugs'"},
2257- 'bug_no': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
2258- 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
2259- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
2260- 'internal': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
2261- 'publish': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
2262- 'status': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
2263- 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'})
2264- },
2265- 'dashboard.build': {
2266- 'Meta': {'object_name': 'Build', 'db_table': "'builds'"},
2267- 'arch': ('django.db.models.fields.CharField', [], {'max_length': '200'}),
2268- 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
2269- 'flavor': ('django.db.models.fields.CharField', [], {'max_length': '200'}),
2270- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
2271- 'internal': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
2272- 'name': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True'}),
2273- 'publish': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
2274- 'run': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['dashboard.Run']"}),
2275- 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
2276- 'variant': ('django.db.models.fields.CharField', [], {'max_length': '200'})
2277- },
2278- 'dashboard.kernel': {
2279- 'Meta': {'object_name': 'Kernel', 'db_table': "'kernels'"},
2280- 'arch': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
2281- 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
2282- 'gpu': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
2283- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
2284- 'internal': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
2285- 'job_type': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
2286- 'publish': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
2287- 'release': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
2288- 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
2289- 'variant': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
2290- 'version': ('django.db.models.fields.CharField', [], {'max_length': '100'})
2291- },
2292- 'dashboard.result': {
2293- 'Meta': {'object_name': 'Result', 'db_table': "'results'"},
2294- 'bugs': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['dashboard.Bug']", 'symmetrical': 'False'}),
2295- 'build': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['dashboard.Build']"}),
2296- 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
2297- 'error_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
2298- 'fail_count': ('django.db.models.fields.IntegerField', [], {}),
2299- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
2300- 'internal': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
2301- 'jenkins_build': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
2302- 'jenkins_url': ('django.db.models.fields.URLField', [], {'max_length': '200'}),
2303- 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
2304- 'pass_count': ('django.db.models.fields.IntegerField', [], {}),
2305- 'publish': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
2306- 'ran_at': ('django.db.models.fields.DateTimeField', [], {}),
2307- 'total_count': ('django.db.models.fields.IntegerField', [], {}),
2308- 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'})
2309- },
2310- 'dashboard.resultlog': {
2311- 'Meta': {'object_name': 'ResultLog', 'db_table': "'result_logs'"},
2312- 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
2313- 'display_name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True'}),
2314- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
2315- 'internal': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
2316- 'path': ('django.db.models.fields.TextField', [], {}),
2317- 'publish': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
2318- 'remote_url': ('django.db.models.fields.URLField', [], {'max_length': '200'}),
2319- 'result': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['dashboard.Result']"}),
2320- 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'})
2321- },
2322- 'dashboard.run': {
2323- 'Meta': {'object_name': 'Run', 'db_table': "'runs'"},
2324- 'build_no': ('django.db.models.fields.CharField', [], {'max_length': '200', 'db_index': 'True'}),
2325- 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
2326- 'flavor': ('django.db.models.fields.CharField', [], {'max_length': '200', 'db_index': 'True'}),
2327- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
2328- 'internal': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
2329- 'publish': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
2330- 'ran_at': ('django.db.models.fields.DateTimeField', [], {}),
2331- 'release': ('django.db.models.fields.CharField', [], {'max_length': '200', 'db_index': 'True'}),
2332- 'test_type': ('django.db.models.fields.IntegerField', [], {'null': 'True'}),
2333- 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'})
2334- },
2335- 'dashboard.sruresult': {
2336- 'Meta': {'object_name': 'SRUResult', 'db_table': "'sru_results'"},
2337- 'bugs': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['dashboard.Bug']", 'symmetrical': 'False'}),
2338- 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
2339- 'fail_count': ('django.db.models.fields.IntegerField', [], {}),
2340- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
2341- 'internal': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
2342- 'jenkins_build': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
2343- 'jenkins_url': ('django.db.models.fields.URLField', [], {'max_length': '200'}),
2344- 'kernel': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['dashboard.Kernel']"}),
2345- 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
2346- 'pass_count': ('django.db.models.fields.IntegerField', [], {}),
2347- 'publish': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
2348- 'ran_at': ('django.db.models.fields.DateTimeField', [], {}),
2349- 'skip_count': ('django.db.models.fields.IntegerField', [], {}),
2350- 'total_count': ('django.db.models.fields.IntegerField', [], {}),
2351- 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'})
2352- },
2353- 'dashboard.sruresultlog': {
2354- 'Meta': {'object_name': 'SRUResultLog', 'db_table': "'sru_result_logs'"},
2355- 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
2356- 'display_name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True'}),
2357- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
2358- 'internal': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
2359- 'path': ('django.db.models.fields.TextField', [], {}),
2360- 'publish': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
2361- 'remote_url': ('django.db.models.fields.URLField', [], {'max_length': '200'}),
2362- 'sru_result': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['dashboard.SRUResult']"}),
2363- 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'})
2364- }
2365- }
2366-
2367- complete_apps = ['dashboard']
2368\ No newline at end of file
2369
2370=== removed file 'dashboard/migrations/__init__.py'
2371--- dashboard/migrations/__init__.py 2012-12-02 02:51:10 +0000
2372+++ dashboard/migrations/__init__.py 1970-01-01 00:00:00 +0000
2373@@ -1,15 +0,0 @@
2374-# QA Dashboard
2375-# Copyright 2012 Canonical Ltd.
2376-
2377-# This program is free software: you can redistribute it and/or modify it
2378-# under the terms of the GNU Affero General Public License version 3, as published
2379-# by the Free Software Foundation.
2380-
2381-# This program is distributed in the hope that it will be useful, but
2382-# WITHOUT ANY WARRANTY; without even the implied warranties of
2383-# MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
2384-# PURPOSE. See the GNU Affero General Public License for more details.
2385-
2386-# You should have received a copy of the GNU Affero General Public License along
2387-# with this program. If not, see <http://www.gnu.org/licenses/>.
2388-
2389
2390=== removed directory 'dashboard/views'
2391=== removed file 'dashboard/views/__init__.py'
2392--- dashboard/views/__init__.py 2012-12-04 22:45:22 +0000
2393+++ dashboard/views/__init__.py 1970-01-01 00:00:00 +0000
2394@@ -1,21 +0,0 @@
2395-# QA Dashboard
2396-# Copyright 2012 Canonical Ltd.
2397-
2398-# This program is free software: you can redistribute it and/or modify it
2399-# under the terms of the GNU Affero General Public License version 3, as published
2400-# by the Free Software Foundation.
2401-
2402-# This program is distributed in the hope that it will be useful, but
2403-# WITHOUT ANY WARRANTY; without even the implied warranties of
2404-# MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
2405-# PURPOSE. See the GNU Affero General Public License for more details.
2406-
2407-# You should have received a copy of the GNU Affero General Public License along
2408-# with this program. If not, see <http://www.gnu.org/licenses/>.
2409-
2410-from django.views.decorators.http import require_GET
2411-from django.shortcuts import redirect
2412-
2413-@require_GET
2414-def index(request):
2415- return redirect('smoke/raring/flat/')
2416
2417=== removed directory 'dashboard/views/api'
2418=== removed file 'dashboard/views/api/__init__.py'
2419--- dashboard/views/api/__init__.py 2012-12-13 02:03:19 +0000
2420+++ dashboard/views/api/__init__.py 1970-01-01 00:00:00 +0000
2421@@ -1,35 +0,0 @@
2422-# QA Dashboard
2423-# Copyright 2012 Canonical Ltd.
2424-
2425-# This program is free software: you can redistribute it and/or modify it
2426-# under the terms of the GNU Affero General Public License version 3, as published
2427-# by the Free Software Foundation.
2428-
2429-# This program is distributed in the hope that it will be useful, but
2430-# WITHOUT ANY WARRANTY; without even the implied warranties of
2431-# MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
2432-# PURPOSE. See the GNU Affero General Public License for more details.
2433-
2434-# You should have received a copy of the GNU Affero General Public License along
2435-# with this program. If not, see <http://www.gnu.org/licenses/>.
2436-
2437-import json
2438-
2439-from django.shortcuts import render_to_response
2440-from django.views.decorators.csrf import csrf_exempt
2441-from django.views.decorators.http import (
2442- require_GET,
2443- )
2444-
2445-from dashboard.forms import (
2446- ResultSmokeAddForm,
2447- ResultKernelSRUAddForm,
2448- BugForm,
2449- )
2450-from dashboard.utils import (
2451- JSONResponse,
2452- )
2453-
2454-@require_GET
2455-def api_help(request):
2456- return render_to_response('api_help.html')
2457
2458=== removed file 'dashboard/views/sru.py'
2459--- dashboard/views/sru.py 2012-12-14 23:59:31 +0000
2460+++ dashboard/views/sru.py 1970-01-01 00:00:00 +0000
2461@@ -1,142 +0,0 @@
2462-# QA Dashboard
2463-# Copyright 2012 Canonical Ltd.
2464-
2465-# This program is free software: you can redistribute it and/or modify it
2466-# under the terms of the GNU Affero General Public License version 3, as published
2467-# by the Free Software Foundation.
2468-
2469-# This program is distributed in the hope that it will be useful, but
2470-# WITHOUT ANY WARRANTY; without even the implied warranties of
2471-# MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
2472-# PURPOSE. See the GNU Affero General Public License for more details.
2473-
2474-# You should have received a copy of the GNU Affero General Public License along
2475-# with this program. If not, see <http://www.gnu.org/licenses/>.
2476-
2477-from django.shortcuts import render_to_response
2478-from django.views.decorators.http import require_GET
2479-from django.db.models import Sum, F
2480-from django.template import RequestContext
2481-
2482-from dashboard.models import Kernel
2483-from dashboard.utils import (
2484- JSONResponse,
2485- MySerializer,
2486- get_verbose,
2487- )
2488-
2489-def _get_kernel_names():
2490- kernels = []
2491- for kernel in Kernel.objects.values('variant').distinct().exclude(publish=False).order_by('variant'):
2492- kernels.append(kernel['variant'])
2493-
2494- return kernels
2495-
2496-def _get_kernel_releases():
2497- releases = []
2498- for kernel in Kernel.objects.values('release').distinct().exclude(publish=False).order_by('-release'):
2499- releases.append(kernel['release'])
2500-
2501- return releases
2502-
2503-@require_GET
2504-def api_overview(request, release='', version=''):
2505- kernels = Kernel.objects.all()
2506-
2507- if release != '':
2508- kernels = kernels.filter(release=release)
2509-
2510- if version != '':
2511- kernels = kernels.filter(version=version)
2512-
2513- serializer = MySerializer(use_extra_fields=get_verbose(request, True))
2514- data = serializer.serialize(kernels)
2515-
2516- return JSONResponse(data)
2517-
2518-@require_GET
2519-def overview(request, release=''):
2520- data = {}
2521- data['kernel_names'] = _get_kernel_names()
2522- data['releases'] = _get_kernel_releases()
2523- data['kernels'] = []
2524- data['show_unknown'] = True
2525-
2526- show_unknown = request.GET.get('show_unknown')
2527-
2528- kernels = Kernel.objects.all()
2529-
2530- if show_unknown is None or show_unknown != "1":
2531- data['show_unknown'] = False
2532- kernels = kernels.exclude(version__startswith="Unknown")
2533-
2534- if release != '':
2535- kernels = kernels.filter(release=release)
2536-
2537- kernel_data = {}
2538- for kernel in kernels:
2539- version = kernel.version
2540- if version not in kernel_data:
2541- kernel_data[version] = {
2542- 'version': version,
2543- 'pass_count': 0,
2544- 'fail_count': 0,
2545- 'skip_count': 0,
2546- 'total_count': 0,
2547- 'bug_count': 0,
2548- }
2549-
2550- kernel_data[version]['pass_count'] += kernel.pass_count
2551- kernel_data[version]['skip_count'] += kernel.skip_count
2552- kernel_data[version]['fail_count'] += kernel.fail_count
2553- kernel_data[version]['total_count'] += kernel.total_count
2554- kernel_data[version]['bug_count'] += kernel.bug_count
2555- kernel_data[version]['release'] = kernel.release
2556- kernel_data[version]['last_run_date'] = kernel.last_run_date
2557-
2558-
2559- for k,v in kernel_data.iteritems():
2560- if v['total_count'] == 0:
2561- v['pass_rate'] = 0
2562- else:
2563- v['pass_rate'] = v['pass_count'] * 1.0 / v['total_count']
2564-
2565- v['pass_rate_pct'] = "{:<.2%}".format(v['pass_rate'])
2566-
2567- data['kernels'].append(v)
2568-
2569- return render_to_response('sru/overview.html', data, RequestContext(request))
2570-
2571-@require_GET
2572-def overview_kernel(request, release=None, kernel_version=None):
2573- kernels = Kernel.objects.filter(version=kernel_version).select_related()
2574-
2575- data = {
2576- 'kernels': kernels,
2577- 'kernel_version': kernel_version,
2578- 'release': release
2579- }
2580-
2581- totals = {
2582- 'skip_count': 0,
2583- 'pass_count': 0,
2584- 'fail_count': 0,
2585- 'total_count': 0,
2586- 'pass_rate': 0.0,
2587- }
2588-
2589- for k in kernels:
2590- totals['skip_count'] += k.skip_count
2591- totals['pass_count'] += k.pass_count
2592- totals['fail_count'] += k.fail_count
2593- totals['total_count'] += k.total_count
2594-
2595- if totals['total_count'] == 0:
2596- totals['pass_rate'] = 0.0
2597- else:
2598- totals['pass_rate'] = totals['pass_count'] * 1.0 / totals['total_count']
2599- totals['pass_rate_pct'] = "{:.2%}".format(totals['pass_rate'])
2600-
2601- data['totals'] = totals
2602-
2603- return render_to_response('sru/overview_kernel.html', data, RequestContext(request))
2604
2605=== modified file 'qa_dashboard/settings.py'
2606--- qa_dashboard/settings.py 2012-12-14 23:59:31 +0000
2607+++ qa_dashboard/settings.py 2012-12-20 01:49:23 +0000
2608@@ -142,9 +142,10 @@
2609 'django.contrib.sessions',
2610 'django.contrib.staticfiles',
2611 'django_tables2',
2612- 'dashboard',
2613 'bootspeed',
2614 'common',
2615+ 'smoke',
2616+ 'sru',
2617 'south',
2618 )
2619
2620
2621=== modified file 'qa_dashboard/urls.py'
2622--- qa_dashboard/urls.py 2012-12-13 03:33:47 +0000
2623+++ qa_dashboard/urls.py 2012-12-20 01:49:23 +0000
2624@@ -17,33 +17,38 @@
2625
2626 from django.conf.urls.defaults import patterns, url
2627
2628-urlpatterns = patterns('dashboard.views',
2629+urlpatterns = patterns('common.views',
2630 url(r'^$', 'index', name='index'),
2631- url(r'^smoke/(?P<release>\w+)/$', 'smoke.overview', name='smoke_overview'),
2632- url(r'^smoke/(?P<release>\w+)/flat/$', 'smoke.overview', dict(is_flat=True), name='flat'),
2633- url(r'^smoke/(?P<release>\w+)/run/(?P<run_id>\d+)/$', 'smoke.build_overview', name='build_overview'),
2634- url(r'^smoke/(?P<release>\w+)/run/(?P<run_id>\d+)/pie/$', 'smoke.build_pie', name='build_pie'),
2635- url(r'^smoke/(?P<release>\w+)/run/(?P<run_id>\d+)/image/(?P<image_id>\d+)/$', 'smoke.results', name='smoke_results'),
2636- url(r'^smoke/(?P<release>\w+)/run/(?P<run_id>\d+)/image/(?P<image_id>\d+)/pie/$', 'smoke.results_pie', name='results_pie'),
2637- url(r'^smoke/(?P<release>\w+)/run/(?P<run_id>\d+)/image/(?P<image_id>\d+)/logs/(?P<result_id>\d+)/$', 'smoke.results_logs', name='results_logs'),
2638- url(r'^api/stats/$', 'api.smoke.api_stats'),
2639- url(r'^api/stats/(?P<release>\w+)/$', 'api.smoke.api_stats'),
2640- url(r'^api/smoke/(?P<release>\w+)/run/$', 'api.smoke.api_runs'),
2641- url(r'^api/smoke/run/$', 'api.smoke.api_runs'),
2642- url(r'^api/smoke/run/(?P<run_id>\d+)/$', 'api.smoke.api_run'),
2643- url(r'^api/smoke/run/(?P<run_id>\d+)/image/$', 'api.smoke.api_images'),
2644- url(r'^api/smoke/run/(?P<run_id>\d+)/image/(?P<image_id>\d+)/$', 'api.smoke.api_image'),
2645- url(r'^api/smoke/run/(?P<run_id>\d+)/image/(?P<image_id>\d+)/result/$', 'api.smoke.api_results'),
2646- url(r'^api/smoke/run/(?P<run_id>\d+)/image/(?P<image_id>\d+)/result/(?P<result_id>\d+)/$', 'api.smoke.api_result'),
2647- url(r'^sru/$', 'sru.overview', name='sru'),
2648- url(r'^sru/(?P<release>\w+)/$', 'sru.overview', name='sru_overview'),
2649- url(r'^sru/(?P<release>\w+)/version/(?P<kernel_version>[^/]+)/$', 'sru.overview_kernel', name='sru_overview_kernel'),
2650- url(r'^api/sru/$', 'sru.api_overview'),
2651- url(r'^api/sru/(?P<release>\w+)/$', 'sru.api_overview'),
2652- url(r'^api/sru/(?P<release>\w+)/(?P<version>[^/]+)/$', 'sru.api_overview'),
2653- url(r'^api/help/$', 'api.api_help', name='api_help'),
2654-)
2655-
2656+ url(r'^api/help/$', 'api_help', name='api_help'),
2657+)
2658+
2659+urlpatterns += patterns('smoke.views',
2660+ url(r'^smoke/(?P<release>\w+)/$', 'overview', name='smoke_overview'),
2661+ url(r'^smoke/(?P<release>\w+)/flat/$', 'overview', dict(is_flat=True), name='flat'),
2662+ url(r'^smoke/(?P<release>\w+)/run/(?P<run_id>\d+)/$', 'build_overview', name='build_overview'),
2663+ url(r'^smoke/(?P<release>\w+)/run/(?P<run_id>\d+)/pie/$', 'build_pie', name='build_pie'),
2664+ url(r'^smoke/(?P<release>\w+)/run/(?P<run_id>\d+)/image/(?P<image_id>\d+)/$', 'results', name='smoke_results'),
2665+ url(r'^smoke/(?P<release>\w+)/run/(?P<run_id>\d+)/image/(?P<image_id>\d+)/pie/$', 'results_pie', name='results_pie'),
2666+ url(r'^smoke/(?P<release>\w+)/run/(?P<run_id>\d+)/image/(?P<image_id>\d+)/logs/(?P<result_id>\d+)/$', 'results_logs', name='results_logs'),
2667+)
2668+
2669+urlpatterns += patterns('smoke.api',
2670+ url(r'^api/stats/$', 'api_stats'),
2671+ url(r'^api/stats/(?P<release>\w+)/$', 'api_stats'),
2672+ url(r'^api/smoke/(?P<release>\w+)/run/$', 'api_runs'),
2673+ url(r'^api/smoke/run/$', 'api_runs'),
2674+ url(r'^api/smoke/run/(?P<run_id>\d+)/$', 'api_run'),
2675+ url(r'^api/smoke/run/(?P<run_id>\d+)/image/$', 'api_images'),
2676+ url(r'^api/smoke/run/(?P<run_id>\d+)/image/(?P<image_id>\d+)/$', 'api_image'),
2677+ url(r'^api/smoke/run/(?P<run_id>\d+)/image/(?P<image_id>\d+)/result/$', 'api_results'),
2678+ url(r'^api/smoke/run/(?P<run_id>\d+)/image/(?P<image_id>\d+)/result/(?P<result_id>\d+)/$', 'api_result'),
2679+)
2680+
2681+urlpatterns += patterns('sru.views',
2682+ url(r'^sru/$', 'overview', name='sru'),
2683+ url(r'^sru/(?P<release>\w+)/$', 'overview', name='sru_overview'),
2684+ url(r'^sru/(?P<release>\w+)/version/(?P<kernel_version>[^/]+)/$', 'overview_kernel', name='sru_overview_kernel'),
2685+)
2686 urlpatterns += patterns('bootspeed.views',
2687 url(r'^bootspeed/$', 'arch_overview', name='bootspeed_arch'),
2688 url(r'^bootspeed/arch/(?P<arch>\w+)/$', 'arch_overview', name='bootspeed_arch_overview'),
2689
2690=== added directory 'smoke'
2691=== renamed file 'dashboard/NOTES' => 'smoke/NOTES'
2692=== renamed file 'dashboard/__init__.py' => 'smoke/__init__.py'
2693=== renamed file 'dashboard/views/api/smoke.py' => 'smoke/api.py'
2694--- dashboard/views/api/smoke.py 2012-12-13 02:03:19 +0000
2695+++ smoke/api.py 2012-12-20 01:49:23 +0000
2696@@ -23,7 +23,6 @@
2697
2698 from dashboard.forms import (
2699 ResultSmokeAddForm,
2700- ResultKernelSRUAddForm,
2701 BugForm,
2702 )
2703
2704@@ -35,7 +34,7 @@
2705 ResultLog,
2706 )
2707
2708-from dashboard.utils import (
2709+from common.utils import (
2710 get_smoke_data,
2711 JSONResponse,
2712 MySerializer,
2713
2714=== renamed file 'dashboard/forms.py' => 'smoke/forms.py'
2715--- dashboard/forms.py 2012-12-05 22:05:06 +0000
2716+++ smoke/forms.py 2012-12-20 01:49:23 +0000
2717@@ -24,21 +24,6 @@
2718 model = Result
2719 fields = ['name']
2720
2721-class ResultKernelSRUAddForm(forms.Form):
2722- build_no = forms.CharField(max_length=200)
2723- job_type = forms.CharField(max_length=200)
2724- flavor = forms.CharField(max_length=200)
2725- release = forms.CharField(max_length=200)
2726- variant = forms.CharField(max_length=200)
2727- arch = forms.CharField(max_length=200)
2728- version = forms.CharField(max_length=200)
2729- build_name = forms.CharField(max_length=200)
2730- ran_at = forms.DateTimeField()
2731-
2732- pass_count = forms.IntegerField()
2733- fail_count = forms.IntegerField()
2734- skip_count = forms.IntegerField()
2735-
2736 class ResultSmokeAddForm(forms.Form):
2737 # Needed for Run class
2738 build_no = forms.CharField(max_length=200)
2739
2740=== renamed directory 'dashboard/management' => 'smoke/management'
2741=== modified file 'smoke/management/__init__.py'
2742--- dashboard/management/__init__.py 2012-12-02 02:51:10 +0000
2743+++ smoke/management/__init__.py 2012-12-20 01:49:23 +0000
2744@@ -12,31 +12,3 @@
2745
2746 # You should have received a copy of the GNU Affero General Public License along
2747 # with this program. If not, see <http://www.gnu.org/licenses/>.
2748-
2749-import json
2750-import urllib2
2751-
2752-BUILD_COUNT_MAX=20 # XXX: DEBUG
2753-JOB_COUNT_MAX=20 # XXX: DEBUG
2754-DEBUG_LIMITS=False
2755-
2756-def jenkins_get(loc, as_json=True):
2757- req = urllib2.Request(loc)
2758- response = ''
2759- try_count = 0
2760-
2761- while try_count < 5:
2762- try:
2763- f = urllib2.urlopen(req)
2764- response = f.read()
2765- f.close()
2766- break
2767- except urllib2.HTTPError:
2768- try_count += 1
2769- except urllib2.URLError as e:
2770- try_count += 1
2771-
2772- if response != '' and as_json:
2773- return json.loads(response)
2774- else:
2775- return response
2776
2777=== modified file 'smoke/management/commands/jenkins_pull.py'
2778--- dashboard/management/commands/jenkins_pull.py 2012-12-14 15:36:30 +0000
2779+++ smoke/management/commands/jenkins_pull.py 2012-12-20 01:49:23 +0000
2780@@ -24,27 +24,27 @@
2781
2782 from optparse import make_option
2783
2784-from dashboard.models import (
2785+from smoke.models import (
2786 Bug,
2787 Build,
2788 Result,
2789 ResultLog,
2790 Run,
2791 )
2792-from dashboard.management import (
2793+from common.helpers import (
2794 jenkins_get,
2795 BUILD_COUNT_MAX,
2796 JOB_COUNT_MAX,
2797 DEBUG_LIMITS,
2798 )
2799
2800-from dashboard.utah_utils import process_smoke_log
2801+from smoke.utah_utils import process_smoke_log
2802
2803 #l = logging.getLogger('django.db.backends')
2804 #l.setLevel(logging.DEBUG)
2805 #l.addHandler(logging.StreamHandler())
2806
2807-from dashboard.utils import regexes
2808+from common.utils import regexes
2809
2810 def _get_utah_logs(artifacts):
2811 """
2812
2813=== added directory 'smoke/migrations'
2814=== added file 'smoke/migrations/0001_create_smoke_app.py'
2815--- smoke/migrations/0001_create_smoke_app.py 1970-01-01 00:00:00 +0000
2816+++ smoke/migrations/0001_create_smoke_app.py 2012-12-20 01:49:23 +0000
2817@@ -0,0 +1,184 @@
2818+# -*- coding: utf-8 -*-
2819+import datetime
2820+from south.db import db
2821+from south.v2 import SchemaMigration
2822+from django.db import models
2823+
2824+
2825+class Migration(SchemaMigration):
2826+
2827+ def forwards(self, orm):
2828+ # Adding model 'Bug'
2829+ db.create_table('bugs', (
2830+ ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
2831+ ('created_at', self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, blank=True)),
2832+ ('updated_at', self.gf('django.db.models.fields.DateTimeField')(auto_now=True, blank=True)),
2833+ ('internal', self.gf('django.db.models.fields.BooleanField')(default=True)),
2834+ ('publish', self.gf('django.db.models.fields.BooleanField')(default=True)),
2835+ ('bug_no', self.gf('django.db.models.fields.CharField')(max_length=255)),
2836+ ('status', self.gf('django.db.models.fields.CharField')(max_length=255)),
2837+ ))
2838+ db.send_create_signal('smoke', ['Bug'])
2839+
2840+ # Adding model 'ResultLog'
2841+ db.create_table('result_logs', (
2842+ ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
2843+ ('created_at', self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, blank=True)),
2844+ ('updated_at', self.gf('django.db.models.fields.DateTimeField')(auto_now=True, blank=True)),
2845+ ('internal', self.gf('django.db.models.fields.BooleanField')(default=True)),
2846+ ('publish', self.gf('django.db.models.fields.BooleanField')(default=True)),
2847+ ('display_name', self.gf('django.db.models.fields.CharField')(max_length=255, null=True)),
2848+ ('path', self.gf('django.db.models.fields.TextField')()),
2849+ ('result', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['smoke.Result'])),
2850+ ('remote_url', self.gf('django.db.models.fields.URLField')(max_length=200)),
2851+ ))
2852+ db.send_create_signal('smoke', ['ResultLog'])
2853+
2854+ # Adding model 'Run'
2855+ db.create_table('runs', (
2856+ ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
2857+ ('created_at', self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, blank=True)),
2858+ ('updated_at', self.gf('django.db.models.fields.DateTimeField')(auto_now=True, blank=True)),
2859+ ('internal', self.gf('django.db.models.fields.BooleanField')(default=True)),
2860+ ('publish', self.gf('django.db.models.fields.BooleanField')(default=True)),
2861+ ('build_no', self.gf('django.db.models.fields.CharField')(max_length=200, db_index=True)),
2862+ ('release', self.gf('django.db.models.fields.CharField')(max_length=200, db_index=True)),
2863+ ('flavor', self.gf('django.db.models.fields.CharField')(max_length=200, db_index=True)),
2864+ ('test_type', self.gf('django.db.models.fields.IntegerField')(null=True)),
2865+ ('ran_at', self.gf('django.db.models.fields.DateTimeField')()),
2866+ ))
2867+ db.send_create_signal('smoke', ['Run'])
2868+
2869+ # Adding model 'Build'
2870+ db.create_table('builds', (
2871+ ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
2872+ ('created_at', self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, blank=True)),
2873+ ('updated_at', self.gf('django.db.models.fields.DateTimeField')(auto_now=True, blank=True)),
2874+ ('internal', self.gf('django.db.models.fields.BooleanField')(default=True)),
2875+ ('publish', self.gf('django.db.models.fields.BooleanField')(default=True)),
2876+ ('run', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['smoke.Run'])),
2877+ ('name', self.gf('django.db.models.fields.CharField')(max_length=200, null=True)),
2878+ ('flavor', self.gf('django.db.models.fields.CharField')(max_length=200)),
2879+ ('variant', self.gf('django.db.models.fields.CharField')(max_length=200)),
2880+ ('arch', self.gf('django.db.models.fields.CharField')(max_length=200)),
2881+ ))
2882+ db.send_create_signal('smoke', ['Build'])
2883+
2884+ # Adding model 'Result'
2885+ db.create_table('results', (
2886+ ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
2887+ ('created_at', self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, blank=True)),
2888+ ('updated_at', self.gf('django.db.models.fields.DateTimeField')(auto_now=True, blank=True)),
2889+ ('internal', self.gf('django.db.models.fields.BooleanField')(default=True)),
2890+ ('publish', self.gf('django.db.models.fields.BooleanField')(default=True)),
2891+ ('build', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['smoke.Build'])),
2892+ ('name', self.gf('django.db.models.fields.CharField')(max_length=255)),
2893+ ('jenkins_build', self.gf('django.db.models.fields.CharField')(max_length=255)),
2894+ ('jenkins_url', self.gf('django.db.models.fields.URLField')(max_length=200)),
2895+ ('fail_count', self.gf('django.db.models.fields.IntegerField')()),
2896+ ('error_count', self.gf('django.db.models.fields.IntegerField')(default=0)),
2897+ ('pass_count', self.gf('django.db.models.fields.IntegerField')()),
2898+ ('total_count', self.gf('django.db.models.fields.IntegerField')()),
2899+ ('ran_at', self.gf('django.db.models.fields.DateTimeField')()),
2900+ ))
2901+ db.send_create_signal('smoke', ['Result'])
2902+
2903+ # Adding M2M table for field bugs on 'Result'
2904+ db.create_table('results_bugs', (
2905+ ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
2906+ ('result', models.ForeignKey(orm['smoke.result'], null=False)),
2907+ ('bug', models.ForeignKey(orm['smoke.bug'], null=False))
2908+ ))
2909+ db.create_unique('results_bugs', ['result_id', 'bug_id'])
2910+
2911+
2912+ def backwards(self, orm):
2913+ # Deleting model 'Bug'
2914+ db.delete_table('bugs')
2915+
2916+ # Deleting model 'ResultLog'
2917+ db.delete_table('result_logs')
2918+
2919+ # Deleting model 'Run'
2920+ db.delete_table('runs')
2921+
2922+ # Deleting model 'Build'
2923+ db.delete_table('builds')
2924+
2925+ # Deleting model 'Result'
2926+ db.delete_table('results')
2927+
2928+ # Removing M2M table for field bugs on 'Result'
2929+ db.delete_table('results_bugs')
2930+
2931+
2932+ models = {
2933+ 'smoke.bug': {
2934+ 'Meta': {'object_name': 'Bug', 'db_table': "'bugs'"},
2935+ 'bug_no': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
2936+ 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
2937+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
2938+ 'internal': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
2939+ 'publish': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
2940+ 'status': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
2941+ 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'})
2942+ },
2943+ 'smoke.build': {
2944+ 'Meta': {'object_name': 'Build', 'db_table': "'builds'"},
2945+ 'arch': ('django.db.models.fields.CharField', [], {'max_length': '200'}),
2946+ 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
2947+ 'flavor': ('django.db.models.fields.CharField', [], {'max_length': '200'}),
2948+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
2949+ 'internal': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
2950+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True'}),
2951+ 'publish': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
2952+ 'run': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['smoke.Run']"}),
2953+ 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
2954+ 'variant': ('django.db.models.fields.CharField', [], {'max_length': '200'})
2955+ },
2956+ 'smoke.result': {
2957+ 'Meta': {'object_name': 'Result', 'db_table': "'results'"},
2958+ 'bugs': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['smoke.Bug']", 'symmetrical': 'False'}),
2959+ 'build': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['smoke.Build']"}),
2960+ 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
2961+ 'error_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
2962+ 'fail_count': ('django.db.models.fields.IntegerField', [], {}),
2963+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
2964+ 'internal': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
2965+ 'jenkins_build': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
2966+ 'jenkins_url': ('django.db.models.fields.URLField', [], {'max_length': '200'}),
2967+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
2968+ 'pass_count': ('django.db.models.fields.IntegerField', [], {}),
2969+ 'publish': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
2970+ 'ran_at': ('django.db.models.fields.DateTimeField', [], {}),
2971+ 'total_count': ('django.db.models.fields.IntegerField', [], {}),
2972+ 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'})
2973+ },
2974+ 'smoke.resultlog': {
2975+ 'Meta': {'object_name': 'ResultLog', 'db_table': "'result_logs'"},
2976+ 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
2977+ 'display_name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True'}),
2978+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
2979+ 'internal': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
2980+ 'path': ('django.db.models.fields.TextField', [], {}),
2981+ 'publish': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
2982+ 'remote_url': ('django.db.models.fields.URLField', [], {'max_length': '200'}),
2983+ 'result': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['smoke.Result']"}),
2984+ 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'})
2985+ },
2986+ 'smoke.run': {
2987+ 'Meta': {'object_name': 'Run', 'db_table': "'runs'"},
2988+ 'build_no': ('django.db.models.fields.CharField', [], {'max_length': '200', 'db_index': 'True'}),
2989+ 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
2990+ 'flavor': ('django.db.models.fields.CharField', [], {'max_length': '200', 'db_index': 'True'}),
2991+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
2992+ 'internal': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
2993+ 'publish': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
2994+ 'ran_at': ('django.db.models.fields.DateTimeField', [], {}),
2995+ 'release': ('django.db.models.fields.CharField', [], {'max_length': '200', 'db_index': 'True'}),
2996+ 'test_type': ('django.db.models.fields.IntegerField', [], {'null': 'True'}),
2997+ 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'})
2998+ }
2999+ }
3000+
3001+ complete_apps = ['smoke']
3002\ No newline at end of file
3003
3004=== added file 'smoke/migrations/0002_remove_bug_model.py'
3005--- smoke/migrations/0002_remove_bug_model.py 1970-01-01 00:00:00 +0000
3006+++ smoke/migrations/0002_remove_bug_model.py 2012-12-20 01:49:23 +0000
3007@@ -0,0 +1,98 @@
3008+# -*- coding: utf-8 -*-
3009+import datetime
3010+from south.db import db
3011+from south.v2 import SchemaMigration
3012+from django.db import models
3013+
3014+
3015+class Migration(SchemaMigration):
3016+
3017+ def forwards(self, orm):
3018+ # Deleting model 'Bug'
3019+ db.delete_table('bugs')
3020+
3021+
3022+ def backwards(self, orm):
3023+ # Adding model 'Bug'
3024+ db.create_table('bugs', (
3025+ ('status', self.gf('django.db.models.fields.CharField')(max_length=255)),
3026+ ('internal', self.gf('django.db.models.fields.BooleanField')(default=True)),
3027+ ('updated_at', self.gf('django.db.models.fields.DateTimeField')(auto_now=True, blank=True)),
3028+ ('bug_no', self.gf('django.db.models.fields.CharField')(max_length=255)),
3029+ ('created_at', self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, blank=True)),
3030+ ('publish', self.gf('django.db.models.fields.BooleanField')(default=True)),
3031+ ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
3032+ ))
3033+ db.send_create_signal('smoke', ['Bug'])
3034+
3035+
3036+ models = {
3037+ 'common.bug': {
3038+ 'Meta': {'object_name': 'Bug', 'db_table': "'bugs'"},
3039+ 'bug_no': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
3040+ 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
3041+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
3042+ 'internal': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
3043+ 'publish': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
3044+ 'status': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
3045+ 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'})
3046+ },
3047+ 'smoke.build': {
3048+ 'Meta': {'object_name': 'Build', 'db_table': "'builds'"},
3049+ 'arch': ('django.db.models.fields.CharField', [], {'max_length': '200'}),
3050+ 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
3051+ 'flavor': ('django.db.models.fields.CharField', [], {'max_length': '200'}),
3052+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
3053+ 'internal': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
3054+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True'}),
3055+ 'publish': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
3056+ 'run': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['smoke.Run']"}),
3057+ 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
3058+ 'variant': ('django.db.models.fields.CharField', [], {'max_length': '200'})
3059+ },
3060+ 'smoke.result': {
3061+ 'Meta': {'object_name': 'Result', 'db_table': "'results'"},
3062+ 'bugs': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['common.Bug']", 'symmetrical': 'False'}),
3063+ 'build': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['smoke.Build']"}),
3064+ 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
3065+ 'error_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
3066+ 'fail_count': ('django.db.models.fields.IntegerField', [], {}),
3067+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
3068+ 'internal': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
3069+ 'jenkins_build': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
3070+ 'jenkins_url': ('django.db.models.fields.URLField', [], {'max_length': '200'}),
3071+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
3072+ 'pass_count': ('django.db.models.fields.IntegerField', [], {}),
3073+ 'publish': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
3074+ 'ran_at': ('django.db.models.fields.DateTimeField', [], {}),
3075+ 'total_count': ('django.db.models.fields.IntegerField', [], {}),
3076+ 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'})
3077+ },
3078+ 'smoke.resultlog': {
3079+ 'Meta': {'object_name': 'ResultLog', 'db_table': "'result_logs'"},
3080+ 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
3081+ 'display_name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True'}),
3082+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
3083+ 'internal': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
3084+ 'path': ('django.db.models.fields.TextField', [], {}),
3085+ 'publish': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
3086+ 'remote_url': ('django.db.models.fields.URLField', [], {'max_length': '200'}),
3087+ 'result': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['smoke.Result']"}),
3088+ 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'})
3089+ },
3090+ 'smoke.run': {
3091+ 'Meta': {'object_name': 'Run', 'db_table': "'runs'"},
3092+ 'build_no': ('django.db.models.fields.CharField', [], {'max_length': '200', 'db_index': 'True'}),
3093+ 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
3094+ 'flavor': ('django.db.models.fields.CharField', [], {'max_length': '200', 'db_index': 'True'}),
3095+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
3096+ 'internal': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
3097+ 'publish': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
3098+ 'ran_at': ('django.db.models.fields.DateTimeField', [], {}),
3099+ 'release': ('django.db.models.fields.CharField', [], {'max_length': '200', 'db_index': 'True'}),
3100+ 'test_type': ('django.db.models.fields.IntegerField', [], {'null': 'True'}),
3101+ 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'})
3102+ }
3103+ }
3104+
3105+ complete_apps = ['smoke']
3106\ No newline at end of file
3107
3108=== added file 'smoke/migrations/__init__.py'
3109=== renamed file 'dashboard/models.py' => 'smoke/models.py'
3110--- dashboard/models.py 2012-12-06 20:00:30 +0000
3111+++ smoke/models.py 2012-12-20 01:49:23 +0000
3112@@ -16,40 +16,9 @@
3113 from django.db import models
3114 import datetime
3115
3116-class DashboardBaseModel(models.Model):
3117- """
3118- Common base class that provides fields needed on every model.
3119- """
3120- class Meta:
3121- abstract = True
3122-
3123- created_at = models.DateTimeField(auto_now_add = True)
3124- updated_at = models.DateTimeField(auto_now = True)
3125- internal = models.BooleanField(default=True)
3126- publish = models.BooleanField(default=True)
3127-
3128-class Bug(DashboardBaseModel):
3129- class Meta:
3130- db_table = 'bugs'
3131- bug_no = models.CharField(max_length=255)
3132- status = models.CharField(max_length=255)
3133-
3134- def __unicode__(self):
3135- return self.bug_no
3136-
3137- @property
3138- def debug_str(self):
3139- return "{}-{}-{}-{}-{}".format(
3140- self.id,
3141- self.bug_no,
3142- self.status,
3143- self.created_at,
3144- self.updated_at,
3145- )
3146-
3147-###
3148-# Smoke
3149-###
3150+from common.models import DashboardBaseModel, Bug
3151+
3152+
3153 class ResultLog(DashboardBaseModel):
3154 class Meta:
3155 db_table = 'result_logs'
3156@@ -265,132 +234,3 @@
3157 @property
3158 def log_count(self):
3159 return self.resultlog_set.count()
3160-
3161-###
3162-# Kernel SRU
3163-###
3164-
3165-class Kernel(DashboardBaseModel):
3166- class Meta:
3167- db_table = "kernels"
3168-
3169- job_type = models.CharField(max_length=100)
3170- release = models.CharField(max_length=100)
3171- variant = models.CharField(max_length=100)
3172- arch = models.CharField(max_length=100)
3173- gpu = models.CharField(max_length=100)
3174- version = models.CharField(max_length=100)
3175-
3176- # Used by MySerializer to add property fields to the JSON representation
3177- # of an instance of this class.
3178- extra_fields = [
3179- 'pass_count',
3180- 'skip_count',
3181- 'fail_count',
3182- 'total_count',
3183- 'pass_rate',
3184- 'pass_rate_pct',
3185- 'bug_count',
3186- 'log_count',
3187- ]
3188-
3189- def debug_str(self):
3190- return "{}-{}-{}-{}".format(
3191- self.release,
3192- self.variant,
3193- self.arch,
3194- self.gpu,
3195- )
3196-
3197- @property
3198- def name(self):
3199- return "{}-{}".format(self.release, self.variant)
3200-
3201- @property
3202- def total_count(self):
3203- return self.sruresult_set.aggregate(models.Sum('total_count'))['total_count__sum'] or 0
3204-
3205- @property
3206- def pass_count(self):
3207- return self.sruresult_set.aggregate(models.Sum('pass_count'))['pass_count__sum'] or 0
3208-
3209- @property
3210- def fail_count(self):
3211- return self.sruresult_set.aggregate(models.Sum('fail_count'))['fail_count__sum'] or 0
3212-
3213- @property
3214- def skip_count(self):
3215- return self.sruresult_set.aggregate(models.Sum('skip_count'))['skip_count__sum'] or 0
3216-
3217- @property
3218- def pass_rate(self):
3219- return self.pass_count*1.0 / self.total_count if self.total_count > 0 else 0
3220-
3221- @property
3222- def pass_rate_pct(self):
3223- return "%d%%" % int(self.pass_rate*100)
3224-
3225- @property
3226- def bug_count(self):
3227- return self.sruresult_set.annotate(num_bugs=models.Count('bugs')).aggregate(models.Sum('num_bugs'))['num_bugs__sum'] or 0
3228-
3229- @property
3230- def log_count(self):
3231- return self.sruresultlog_set.count()
3232-
3233- @property
3234- def last_run_date(self):
3235- return self.sruresult_set.aggregate(models.Max('ran_at'))['ran_at__max'].strftime("%Y-%m-%d %H:%M")
3236-
3237-# XXX: refactor this and Result
3238-class SRUResult(DashboardBaseModel):
3239- class Meta:
3240- db_table = 'sru_results'
3241-
3242- kernel = models.ForeignKey(Kernel)
3243- bugs = models.ManyToManyField(Bug)
3244-
3245- jenkins_build = models.CharField(max_length=255)
3246- jenkins_url = models.URLField()
3247- name = models.CharField(max_length=255)
3248- pass_count = models.IntegerField()
3249- fail_count = models.IntegerField()
3250- skip_count = models.IntegerField()
3251- total_count = models.IntegerField()
3252- ran_at = models.DateTimeField('date run')
3253-
3254- # Used by MySerializer to add property fields to the JSON representation
3255- # of an instance of this class.
3256- extra_fields = [
3257- 'pass_rate',
3258- 'pass_rate_pct',
3259- 'bug_count',
3260- 'log_count',
3261- ]
3262-
3263- @property
3264- def pass_rate(self):
3265- return self.pass_count*1.0 / self.total_count if self.total_count > 0 else 0
3266-
3267- @property
3268- def pass_rate_pct(self):
3269- return "%d%%" % int(self.pass_rate*100)
3270-
3271- @property
3272- def bug_count(self):
3273- return self.bugs.count()
3274-
3275- @property
3276- def log_count(self):
3277- return self.resultlog_set.count()
3278-
3279-class SRUResultLog(DashboardBaseModel):
3280- class Meta:
3281- db_table = 'sru_result_logs'
3282- display_name = models.CharField(max_length=255, null = True)
3283- path = models.TextField()
3284- sru_result = models.ForeignKey('SRUResult')
3285- remote_url = models.URLField()
3286-
3287- def __unicode__(self):
3288- return self.path
3289
3290=== renamed directory 'dashboard/templates' => 'smoke/templates'
3291=== renamed directory 'dashboard/templatetags' => 'smoke/templatetags'
3292=== renamed file 'dashboard/tests.py' => 'smoke/tests.py'
3293=== renamed file 'dashboard/utah_parser.py' => 'smoke/utah_parser.py'
3294--- dashboard/utah_parser.py 2012-12-13 23:48:40 +0000
3295+++ smoke/utah_parser.py 2012-12-20 01:49:23 +0000
3296@@ -1,3 +1,18 @@
3297+# QA Dashboard
3298+# Copyright 2012 Canonical Ltd.
3299+
3300+# This program is free software: you can redistribute it and/or modify it
3301+# under the terms of the GNU Affero General Public License version 3, as published
3302+# by the Free Software Foundation.
3303+
3304+# This program is distributed in the hope that it will be useful, but
3305+# WITHOUT ANY WARRANTY; without even the implied warranties of
3306+# MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
3307+# PURPOSE. See the GNU Affero General Public License for more details.
3308+
3309+# You should have received a copy of the GNU Affero General Public License along
3310+# with this program. If not, see <http://www.gnu.org/licenses/>.
3311+
3312 """UTAH Client log parser."""
3313 import argparse
3314 import urllib2
3315
3316=== renamed file 'dashboard/utah_utils.py' => 'smoke/utah_utils.py'
3317--- dashboard/utah_utils.py 2012-12-14 14:02:04 +0000
3318+++ smoke/utah_utils.py 2012-12-20 01:49:23 +0000
3319@@ -19,8 +19,8 @@
3320
3321 import logging
3322
3323-from dashboard.utah_parser import UTAHParser, ParserError
3324-from dashboard.models import (
3325+from smoke.utah_parser import UTAHParser, ParserError
3326+from smoke.models import (
3327 Build,
3328 Run,
3329 Result,
3330
3331=== renamed file 'dashboard/views/smoke.py' => 'smoke/views.py'
3332--- dashboard/views/smoke.py 2012-12-14 23:59:31 +0000
3333+++ smoke/views.py 2012-12-20 01:49:23 +0000
3334@@ -41,10 +41,10 @@
3335
3336 from dashboard.forms import (
3337 ResultSmokeAddForm,
3338- ResultKernelSRUAddForm,
3339 BugForm,
3340 )
3341-from dashboard.utils import (
3342+
3343+from common.utils import (
3344 get_smoke_data,
3345 require_API_TOKEN,
3346 JSONResponse,
3347
3348=== added directory 'sru'
3349=== added file 'sru/__init__.py'
3350--- sru/__init__.py 1970-01-01 00:00:00 +0000
3351+++ sru/__init__.py 2012-12-20 01:49:23 +0000
3352@@ -0,0 +1,14 @@
3353+# QA Dashboard
3354+# Copyright 2012 Canonical Ltd.
3355+
3356+# This program is free software: you can redistribute it and/or modify it
3357+# under the terms of the GNU Affero General Public License version 3, as published
3358+# by the Free Software Foundation.
3359+
3360+# This program is distributed in the hope that it will be useful, but
3361+# WITHOUT ANY WARRANTY; without even the implied warranties of
3362+# MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
3363+# PURPOSE. See the GNU Affero General Public License for more details.
3364+
3365+# You should have received a copy of the GNU Affero General Public License along
3366+# with this program. If not, see <http://www.gnu.org/licenses/>.
3367
3368=== added file 'sru/forms.py'
3369--- sru/forms.py 1970-01-01 00:00:00 +0000
3370+++ sru/forms.py 2012-12-20 01:49:23 +0000
3371@@ -0,0 +1,33 @@
3372+# QA Dashboard
3373+# Copyright 2012 Canonical Ltd.
3374+
3375+# This program is free software: you can redistribute it and/or modify it
3376+# under the terms of the GNU Affero General Public License version 3, as published
3377+# by the Free Software Foundation.
3378+
3379+# This program is distributed in the hope that it will be useful, but
3380+# WITHOUT ANY WARRANTY; without even the implied warranties of
3381+# MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
3382+# PURPOSE. See the GNU Affero General Public License for more details.
3383+
3384+# You should have received a copy of the GNU Affero General Public License along
3385+# with this program. If not, see <http://www.gnu.org/licenses/>.
3386+
3387+# Make sure field lengths match those in dashboard/models.py
3388+
3389+from django import forms
3390+
3391+class ResultKernelSRUAddForm(forms.Form):
3392+ build_no = forms.CharField(max_length=200)
3393+ job_type = forms.CharField(max_length=200)
3394+ flavor = forms.CharField(max_length=200)
3395+ release = forms.CharField(max_length=200)
3396+ variant = forms.CharField(max_length=200)
3397+ arch = forms.CharField(max_length=200)
3398+ version = forms.CharField(max_length=200)
3399+ build_name = forms.CharField(max_length=200)
3400+ ran_at = forms.DateTimeField()
3401+
3402+ pass_count = forms.IntegerField()
3403+ fail_count = forms.IntegerField()
3404+ skip_count = forms.IntegerField()
3405
3406=== added directory 'sru/management'
3407=== added file 'sru/management/__init__.py'
3408--- sru/management/__init__.py 1970-01-01 00:00:00 +0000
3409+++ sru/management/__init__.py 2012-12-20 01:49:23 +0000
3410@@ -0,0 +1,14 @@
3411+# QA Dashboard
3412+# Copyright 2012 Canonical Ltd.
3413+
3414+# This program is free software: you can redistribute it and/or modify it
3415+# under the terms of the GNU Affero General Public License version 3, as published
3416+# by the Free Software Foundation.
3417+
3418+# This program is distributed in the hope that it will be useful, but
3419+# WITHOUT ANY WARRANTY; without even the implied warranties of
3420+# MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
3421+# PURPOSE. See the GNU Affero General Public License for more details.
3422+
3423+# You should have received a copy of the GNU Affero General Public License along
3424+# with this program. If not, see <http://www.gnu.org/licenses/>.
3425
3426=== added directory 'sru/management/commands'
3427=== added file 'sru/management/commands/__init__.py'
3428--- sru/management/commands/__init__.py 1970-01-01 00:00:00 +0000
3429+++ sru/management/commands/__init__.py 2012-12-20 01:49:23 +0000
3430@@ -0,0 +1,14 @@
3431+# QA Dashboard
3432+# Copyright 2012 Canonical Ltd.
3433+
3434+# This program is free software: you can redistribute it and/or modify it
3435+# under the terms of the GNU Affero General Public License version 3, as published
3436+# by the Free Software Foundation.
3437+
3438+# This program is distributed in the hope that it will be useful, but
3439+# WITHOUT ANY WARRANTY; without even the implied warranties of
3440+# MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
3441+# PURPOSE. See the GNU Affero General Public License for more details.
3442+
3443+# You should have received a copy of the GNU Affero General Public License along
3444+# with this program. If not, see <http://www.gnu.org/licenses/>.
3445
3446=== renamed file 'dashboard/management/commands/jenkins_pull_sru.py' => 'sru/management/commands/jenkins_pull_sru.py'
3447--- dashboard/management/commands/jenkins_pull_sru.py 2012-12-14 15:36:30 +0000
3448+++ sru/management/commands/jenkins_pull_sru.py 2012-12-20 01:49:23 +0000
3449@@ -19,14 +19,14 @@
3450 from optparse import make_option
3451 from django.core.management.base import BaseCommand, CommandError
3452
3453-from dashboard.management import (
3454+from common.helpers import (
3455 jenkins_get,
3456 BUILD_COUNT_MAX,
3457 JOB_COUNT_MAX,
3458 DEBUG_LIMITS,
3459 )
3460-from dashboard.utils import regexes
3461-from dashboard.models import (
3462+from common.utils import regexes
3463+from sru.models import (
3464 Kernel,
3465 SRUResult,
3466 SRUResultLog,
3467
3468=== added directory 'sru/migrations'
3469=== added file 'sru/migrations/0001_create_sru_app.py'
3470--- sru/migrations/0001_create_sru_app.py 1970-01-01 00:00:00 +0000
3471+++ sru/migrations/0001_create_sru_app.py 2012-12-20 01:49:23 +0000
3472@@ -0,0 +1,140 @@
3473+# -*- coding: utf-8 -*-
3474+import datetime
3475+from south.db import db
3476+from south.v2 import SchemaMigration
3477+from django.db import models
3478+
3479+
3480+class Migration(SchemaMigration):
3481+
3482+ def forwards(self, orm):
3483+ # Adding model 'Kernel'
3484+ db.create_table('kernels', (
3485+ ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
3486+ ('created_at', self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, blank=True)),
3487+ ('updated_at', self.gf('django.db.models.fields.DateTimeField')(auto_now=True, blank=True)),
3488+ ('internal', self.gf('django.db.models.fields.BooleanField')(default=True)),
3489+ ('publish', self.gf('django.db.models.fields.BooleanField')(default=True)),
3490+ ('job_type', self.gf('django.db.models.fields.CharField')(max_length=100)),
3491+ ('release', self.gf('django.db.models.fields.CharField')(max_length=100)),
3492+ ('variant', self.gf('django.db.models.fields.CharField')(max_length=100)),
3493+ ('arch', self.gf('django.db.models.fields.CharField')(max_length=100)),
3494+ ('gpu', self.gf('django.db.models.fields.CharField')(max_length=100)),
3495+ ('version', self.gf('django.db.models.fields.CharField')(max_length=100)),
3496+ ))
3497+ db.send_create_signal('sru', ['Kernel'])
3498+
3499+ # Adding model 'SRUResult'
3500+ db.create_table('sru_results', (
3501+ ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
3502+ ('created_at', self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, blank=True)),
3503+ ('updated_at', self.gf('django.db.models.fields.DateTimeField')(auto_now=True, blank=True)),
3504+ ('internal', self.gf('django.db.models.fields.BooleanField')(default=True)),
3505+ ('publish', self.gf('django.db.models.fields.BooleanField')(default=True)),
3506+ ('kernel', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['sru.Kernel'])),
3507+ ('jenkins_build', self.gf('django.db.models.fields.CharField')(max_length=255)),
3508+ ('jenkins_url', self.gf('django.db.models.fields.URLField')(max_length=200)),
3509+ ('name', self.gf('django.db.models.fields.CharField')(max_length=255)),
3510+ ('pass_count', self.gf('django.db.models.fields.IntegerField')()),
3511+ ('fail_count', self.gf('django.db.models.fields.IntegerField')()),
3512+ ('skip_count', self.gf('django.db.models.fields.IntegerField')()),
3513+ ('total_count', self.gf('django.db.models.fields.IntegerField')()),
3514+ ('ran_at', self.gf('django.db.models.fields.DateTimeField')()),
3515+ ))
3516+ db.send_create_signal('sru', ['SRUResult'])
3517+
3518+ # Adding M2M table for field bugs on 'SRUResult'
3519+ db.create_table('sru_results_bugs', (
3520+ ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
3521+ ('sruresult', models.ForeignKey(orm['sru.sruresult'], null=False)),
3522+ ('bug', models.ForeignKey(orm['dashboard.bug'], null=False))
3523+ ))
3524+ db.create_unique('sru_results_bugs', ['sruresult_id', 'bug_id'])
3525+
3526+ # Adding model 'SRUResultLog'
3527+ db.create_table('sru_result_logs', (
3528+ ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
3529+ ('created_at', self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, blank=True)),
3530+ ('updated_at', self.gf('django.db.models.fields.DateTimeField')(auto_now=True, blank=True)),
3531+ ('internal', self.gf('django.db.models.fields.BooleanField')(default=True)),
3532+ ('publish', self.gf('django.db.models.fields.BooleanField')(default=True)),
3533+ ('display_name', self.gf('django.db.models.fields.CharField')(max_length=255, null=True)),
3534+ ('path', self.gf('django.db.models.fields.TextField')()),
3535+ ('sru_result', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['sru.SRUResult'])),
3536+ ('remote_url', self.gf('django.db.models.fields.URLField')(max_length=200)),
3537+ ))
3538+ db.send_create_signal('sru', ['SRUResultLog'])
3539+
3540+
3541+ def backwards(self, orm):
3542+ # Deleting model 'Kernel'
3543+ db.delete_table('kernels')
3544+
3545+ # Deleting model 'SRUResult'
3546+ db.delete_table('sru_results')
3547+
3548+ # Removing M2M table for field bugs on 'SRUResult'
3549+ db.delete_table('sru_results_bugs')
3550+
3551+ # Deleting model 'SRUResultLog'
3552+ db.delete_table('sru_result_logs')
3553+
3554+
3555+ models = {
3556+ 'dashboard.bug': {
3557+ 'Meta': {'object_name': 'Bug', 'db_table': "'bugs'"},
3558+ 'bug_no': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
3559+ 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
3560+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
3561+ 'internal': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
3562+ 'publish': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
3563+ 'status': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
3564+ 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'})
3565+ },
3566+ 'sru.kernel': {
3567+ 'Meta': {'object_name': 'Kernel', 'db_table': "'kernels'"},
3568+ 'arch': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
3569+ 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
3570+ 'gpu': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
3571+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
3572+ 'internal': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
3573+ 'job_type': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
3574+ 'publish': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
3575+ 'release': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
3576+ 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
3577+ 'variant': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
3578+ 'version': ('django.db.models.fields.CharField', [], {'max_length': '100'})
3579+ },
3580+ 'sru.sruresult': {
3581+ 'Meta': {'object_name': 'SRUResult', 'db_table': "'sru_results'"},
3582+ 'bugs': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['dashboard.Bug']", 'symmetrical': 'False'}),
3583+ 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
3584+ 'fail_count': ('django.db.models.fields.IntegerField', [], {}),
3585+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
3586+ 'internal': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
3587+ 'jenkins_build': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
3588+ 'jenkins_url': ('django.db.models.fields.URLField', [], {'max_length': '200'}),
3589+ 'kernel': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['sru.Kernel']"}),
3590+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
3591+ 'pass_count': ('django.db.models.fields.IntegerField', [], {}),
3592+ 'publish': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
3593+ 'ran_at': ('django.db.models.fields.DateTimeField', [], {}),
3594+ 'skip_count': ('django.db.models.fields.IntegerField', [], {}),
3595+ 'total_count': ('django.db.models.fields.IntegerField', [], {}),
3596+ 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'})
3597+ },
3598+ 'sru.sruresultlog': {
3599+ 'Meta': {'object_name': 'SRUResultLog', 'db_table': "'sru_result_logs'"},
3600+ 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
3601+ 'display_name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True'}),
3602+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
3603+ 'internal': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
3604+ 'path': ('django.db.models.fields.TextField', [], {}),
3605+ 'publish': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
3606+ 'remote_url': ('django.db.models.fields.URLField', [], {'max_length': '200'}),
3607+ 'sru_result': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['sru.SRUResult']"}),
3608+ 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'})
3609+ }
3610+ }
3611+
3612+ complete_apps = ['sru']
3613\ No newline at end of file
3614
3615=== added file 'sru/migrations/__init__.py'
3616=== added file 'sru/models.py'
3617--- sru/models.py 1970-01-01 00:00:00 +0000
3618+++ sru/models.py 2012-12-20 01:49:23 +0000
3619@@ -0,0 +1,144 @@
3620+# QA Dashboard
3621+# Copyright 2012 Canonical Ltd.
3622+
3623+# This program is free software: you can redistribute it and/or modify it
3624+# under the terms of the GNU Affero General Public License version 3, as published
3625+# by the Free Software Foundation.
3626+
3627+# This program is distributed in the hope that it will be useful, but
3628+# WITHOUT ANY WARRANTY; without even the implied warranties of
3629+# MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
3630+# PURPOSE. See the GNU Affero General Public License for more details.
3631+
3632+# You should have received a copy of the GNU Affero General Public License along
3633+# with this program. If not, see <http://www.gnu.org/licenses/>.
3634+
3635+from django.db import models
3636+import datetime
3637+
3638+from common.models import DashboardBaseModel, Bug
3639+
3640+class Kernel(DashboardBaseModel):
3641+ class Meta:
3642+ db_table = "kernels"
3643+
3644+ job_type = models.CharField(max_length=100)
3645+ release = models.CharField(max_length=100)
3646+ variant = models.CharField(max_length=100)
3647+ arch = models.CharField(max_length=100)
3648+ gpu = models.CharField(max_length=100)
3649+ version = models.CharField(max_length=100)
3650+
3651+ # Used by MySerializer to add property fields to the JSON representation
3652+ # of an instance of this class.
3653+ extra_fields = [
3654+ 'pass_count',
3655+ 'skip_count',
3656+ 'fail_count',
3657+ 'total_count',
3658+ 'pass_rate',
3659+ 'pass_rate_pct',
3660+ 'bug_count',
3661+ 'log_count',
3662+ ]
3663+
3664+ def debug_str(self):
3665+ return "{}-{}-{}-{}".format(
3666+ self.release,
3667+ self.variant,
3668+ self.arch,
3669+ self.gpu,
3670+ )
3671+
3672+ @property
3673+ def name(self):
3674+ return "{}-{}".format(self.release, self.variant)
3675+
3676+ @property
3677+ def total_count(self):
3678+ return self.sruresult_set.aggregate(models.Sum('total_count'))['total_count__sum'] or 0
3679+
3680+ @property
3681+ def pass_count(self):
3682+ return self.sruresult_set.aggregate(models.Sum('pass_count'))['pass_count__sum'] or 0
3683+
3684+ @property
3685+ def fail_count(self):
3686+ return self.sruresult_set.aggregate(models.Sum('fail_count'))['fail_count__sum'] or 0
3687+
3688+ @property
3689+ def skip_count(self):
3690+ return self.sruresult_set.aggregate(models.Sum('skip_count'))['skip_count__sum'] or 0
3691+
3692+ @property
3693+ def pass_rate(self):
3694+ return self.pass_count*1.0 / self.total_count if self.total_count > 0 else 0
3695+
3696+ @property
3697+ def pass_rate_pct(self):
3698+ return "%d%%" % int(self.pass_rate*100)
3699+
3700+ @property
3701+ def bug_count(self):
3702+ return self.sruresult_set.annotate(num_bugs=models.Count('bugs')).aggregate(models.Sum('num_bugs'))['num_bugs__sum'] or 0
3703+
3704+ @property
3705+ def log_count(self):
3706+ return self.sruresultlog_set.count()
3707+
3708+ @property
3709+ def last_run_date(self):
3710+ return self.sruresult_set.aggregate(models.Max('ran_at'))['ran_at__max'].strftime("%Y-%m-%d %H:%M")
3711+
3712+# XXX: refactor this and Result
3713+class SRUResult(DashboardBaseModel):
3714+ class Meta:
3715+ db_table = 'sru_results'
3716+
3717+ kernel = models.ForeignKey(Kernel)
3718+ bugs = models.ManyToManyField(Bug, related_name='sruresult_bugs')
3719+
3720+ jenkins_build = models.CharField(max_length=255)
3721+ jenkins_url = models.URLField()
3722+ name = models.CharField(max_length=255)
3723+ pass_count = models.IntegerField()
3724+ fail_count = models.IntegerField()
3725+ skip_count = models.IntegerField()
3726+ total_count = models.IntegerField()
3727+ ran_at = models.DateTimeField('date run')
3728+
3729+ # Used by MySerializer to add property fields to the JSON representation
3730+ # of an instance of this class.
3731+ extra_fields = [
3732+ 'pass_rate',
3733+ 'pass_rate_pct',
3734+ 'bug_count',
3735+ 'log_count',
3736+ ]
3737+
3738+ @property
3739+ def pass_rate(self):
3740+ return self.pass_count*1.0 / self.total_count if self.total_count > 0 else 0
3741+
3742+ @property
3743+ def pass_rate_pct(self):
3744+ return "%d%%" % int(self.pass_rate*100)
3745+
3746+ @property
3747+ def bug_count(self):
3748+ return self.bugs.count()
3749+
3750+ @property
3751+ def log_count(self):
3752+ return self.resultlog_set.count()
3753+
3754+class SRUResultLog(DashboardBaseModel):
3755+ class Meta:
3756+ db_table = 'sru_result_logs'
3757+ display_name = models.CharField(max_length=255, null = True)
3758+ path = models.TextField()
3759+ sru_result = models.ForeignKey('SRUResult')
3760+ remote_url = models.URLField()
3761+
3762+ def __unicode__(self):
3763+ return self.path
3764
3765=== added file 'sru/tests.py'
3766--- sru/tests.py 1970-01-01 00:00:00 +0000
3767+++ sru/tests.py 2012-12-20 01:49:23 +0000
3768@@ -0,0 +1,14 @@
3769+# QA Dashboard
3770+# Copyright 2012 Canonical Ltd.
3771+
3772+# This program is free software: you can redistribute it and/or modify it
3773+# under the terms of the GNU Affero General Public License version 3, as published
3774+# by the Free Software Foundation.
3775+
3776+# This program is distributed in the hope that it will be useful, but
3777+# WITHOUT ANY WARRANTY; without even the implied warranties of
3778+# MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
3779+# PURPOSE. See the GNU Affero General Public License for more details.
3780+
3781+# You should have received a copy of the GNU Affero General Public License along
3782+# with this program. If not, see <http://www.gnu.org/licenses/>.
3783
3784=== added file 'sru/views.py'
3785--- sru/views.py 1970-01-01 00:00:00 +0000
3786+++ sru/views.py 2012-12-20 01:49:23 +0000
3787@@ -0,0 +1,142 @@
3788+# QA Dashboard
3789+# Copyright 2012 Canonical Ltd.
3790+
3791+# This program is free software: you can redistribute it and/or modify it
3792+# under the terms of the GNU Affero General Public License version 3, as published
3793+# by the Free Software Foundation.
3794+
3795+# This program is distributed in the hope that it will be useful, but
3796+# WITHOUT ANY WARRANTY; without even the implied warranties of
3797+# MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
3798+# PURPOSE. See the GNU Affero General Public License for more details.
3799+
3800+# You should have received a copy of the GNU Affero General Public License along
3801+# with this program. If not, see <http://www.gnu.org/licenses/>.
3802+
3803+from django.shortcuts import render_to_response
3804+from django.views.decorators.http import require_GET
3805+from django.db.models import Sum, F
3806+from django.template import RequestContext
3807+
3808+from sru.models import Kernel
3809+from common.utils import (
3810+ JSONResponse,
3811+ MySerializer,
3812+ get_verbose,
3813+ )
3814+
3815+def _get_kernel_names():
3816+ kernels = []
3817+ for kernel in Kernel.objects.values('variant').distinct().exclude(publish=False).order_by('variant'):
3818+ kernels.append(kernel['variant'])
3819+
3820+ return kernels
3821+
3822+def _get_kernel_releases():
3823+ releases = []
3824+ for kernel in Kernel.objects.values('release').distinct().exclude(publish=False).order_by('-release'):
3825+ releases.append(kernel['release'])
3826+
3827+ return releases
3828+
3829+@require_GET
3830+def api_overview(request, release='', version=''):
3831+ kernels = Kernel.objects.all()
3832+
3833+ if release != '':
3834+ kernels = kernels.filter(release=release)
3835+
3836+ if version != '':
3837+ kernels = kernels.filter(version=version)
3838+
3839+ serializer = MySerializer(use_extra_fields=get_verbose(request, True))
3840+ data = serializer.serialize(kernels)
3841+
3842+ return JSONResponse(data)
3843+
3844+@require_GET
3845+def overview(request, release=''):
3846+ data = {}
3847+ data['kernel_names'] = _get_kernel_names()
3848+ data['releases'] = _get_kernel_releases()
3849+ data['kernels'] = []
3850+ data['show_unknown'] = True
3851+
3852+ show_unknown = request.GET.get('show_unknown')
3853+
3854+ kernels = Kernel.objects.all()
3855+
3856+ if show_unknown is None or show_unknown != "1":
3857+ data['show_unknown'] = False
3858+ kernels = kernels.exclude(version__startswith="Unknown")
3859+
3860+ if release != '':
3861+ kernels = kernels.filter(release=release)
3862+
3863+ kernel_data = {}
3864+ for kernel in kernels:
3865+ version = kernel.version
3866+ if version not in kernel_data:
3867+ kernel_data[version] = {
3868+ 'version': version,
3869+ 'pass_count': 0,
3870+ 'fail_count': 0,
3871+ 'skip_count': 0,
3872+ 'total_count': 0,
3873+ 'bug_count': 0,
3874+ }
3875+
3876+ kernel_data[version]['pass_count'] += kernel.pass_count
3877+ kernel_data[version]['skip_count'] += kernel.skip_count
3878+ kernel_data[version]['fail_count'] += kernel.fail_count
3879+ kernel_data[version]['total_count'] += kernel.total_count
3880+ kernel_data[version]['bug_count'] += kernel.bug_count
3881+ kernel_data[version]['release'] = kernel.release
3882+ kernel_data[version]['last_run_date'] = kernel.last_run_date
3883+
3884+
3885+ for k,v in kernel_data.iteritems():
3886+ if v['total_count'] == 0:
3887+ v['pass_rate'] = 0
3888+ else:
3889+ v['pass_rate'] = v['pass_count'] * 1.0 / v['total_count']
3890+
3891+ v['pass_rate_pct'] = "{:<.2%}".format(v['pass_rate'])
3892+
3893+ data['kernels'].append(v)
3894+
3895+ return render_to_response('sru/overview.html', data, RequestContext(request))
3896+
3897+@require_GET
3898+def overview_kernel(request, release=None, kernel_version=None):
3899+ kernels = Kernel.objects.filter(version=kernel_version).select_related()
3900+
3901+ data = {
3902+ 'kernels': kernels,
3903+ 'kernel_version': kernel_version,
3904+ 'release': release
3905+ }
3906+
3907+ totals = {
3908+ 'skip_count': 0,
3909+ 'pass_count': 0,
3910+ 'fail_count': 0,
3911+ 'total_count': 0,
3912+ 'pass_rate': 0.0,
3913+ }
3914+
3915+ for k in kernels:
3916+ totals['skip_count'] += k.skip_count
3917+ totals['pass_count'] += k.pass_count
3918+ totals['fail_count'] += k.fail_count
3919+ totals['total_count'] += k.total_count
3920+
3921+ if totals['total_count'] == 0:
3922+ totals['pass_rate'] = 0.0
3923+ else:
3924+ totals['pass_rate'] = totals['pass_count'] * 1.0 / totals['total_count']
3925+ totals['pass_rate_pct'] = "{:.2%}".format(totals['pass_rate'])
3926+
3927+ data['totals'] = totals
3928+
3929+ return render_to_response('sru/overview_kernel.html', data, RequestContext(request))

Subscribers

People subscribed via source and target branches