Merge lp:~stevanr/lava-dashboard/image-report-editor-backend into lp:lava-dashboard

Proposed by Stevan Radaković
Status: Merged
Merged at revision: 416
Proposed branch: lp:~stevanr/lava-dashboard/image-report-editor-backend
Merge into: lp:lava-dashboard
Diff against target: 456 lines (+440/-0)
2 files modified
dashboard_app/migrations/0030_auto__add_imagecharttestcase__add_imagereport__add_imagecharttestrun__.py (+345/-0)
dashboard_app/models.py (+95/-0)
To merge this branch: bzr merge lp:~stevanr/lava-dashboard/image-report-editor-backend
Reviewer Review Type Date Requested Status
Antonio Terceiro Approve
Review via email: mp+183469@code.launchpad.net

Description of the change

Add models and migration file for Image report editor feature, based on this db model draft - http://people.linaro.org/~stevan.radakovic/image_report_db.png

To post a comment you must log in.
Revision history for this message
Antonio Terceiro (terceiro) wrote :

I don't see anything wrong with the code

 review approve

It would be nice to understand the proposed design, though, so that I can
better review the next merges that will come ... is there a high level
description somewhere?

review: Approve
Revision history for this message
Stevan Radaković (stevanr) wrote :

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== added file 'dashboard_app/migrations/0030_auto__add_imagecharttestcase__add_imagereport__add_imagecharttestrun__.py'
--- dashboard_app/migrations/0030_auto__add_imagecharttestcase__add_imagereport__add_imagecharttestrun__.py 1970-01-01 00:00:00 +0000
+++ dashboard_app/migrations/0030_auto__add_imagecharttestcase__add_imagereport__add_imagecharttestrun__.py 2013-09-02 13:57:25 +0000
@@ -0,0 +1,345 @@
1# -*- coding: utf-8 -*-
2import datetime
3from south.db import db
4from south.v2 import SchemaMigration
5from django.db import models
6
7
8class Migration(SchemaMigration):
9
10 def forwards(self, orm):
11 # Adding model 'ImageChartTestCase'
12 db.create_table('dashboard_app_imagecharttestcase', (
13 ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
14 ('image_chart', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['dashboard_app.ImageReportChart'])),
15 ('test_case', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['dashboard_app.TestCase'])),
16 ('name', self.gf('django.db.models.fields.CharField')(max_length=200)),
17 ))
18 db.send_create_signal('dashboard_app', ['ImageChartTestCase'])
19
20 # Adding model 'ImageReport'
21 db.create_table('dashboard_app_imagereport', (
22 ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
23 ('name', self.gf('django.db.models.fields.SlugField')(unique=True, max_length=1024)),
24 ('description', self.gf('django.db.models.fields.TextField')(null=True, blank=True)),
25 ))
26 db.send_create_signal('dashboard_app', ['ImageReport'])
27
28 # Adding model 'ImageChartTestRun'
29 db.create_table('dashboard_app_imagecharttestrun', (
30 ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
31 ('image_chart', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['dashboard_app.ImageReportChart'])),
32 ('test_run', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['dashboard_app.TestRun'])),
33 ('name', self.gf('django.db.models.fields.CharField')(max_length=200)),
34 ))
35 db.send_create_signal('dashboard_app', ['ImageChartTestRun'])
36
37 # Adding model 'ImageReportChart'
38 db.create_table('dashboard_app_imagereportchart', (
39 ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
40 ('name', self.gf('django.db.models.fields.CharField')(max_length=100)),
41 ('image_report', self.gf('django.db.models.fields.related.ForeignKey')(default=None, to=orm['dashboard_app.ImageReport'])),
42 ('chart_type', self.gf('django.db.models.fields.CharField')(max_length=20)),
43 ('representation', self.gf('django.db.models.fields.CharField')(max_length=20)),
44 ('target_goal', self.gf('django.db.models.fields.DecimalField')(null=True, max_digits=10, decimal_places=5, blank=True)),
45 ('is_interactive', self.gf('django.db.models.fields.BooleanField')(default=False)),
46 ('is_data_table_visible', self.gf('django.db.models.fields.BooleanField')(default=False)),
47 ))
48 db.send_create_signal('dashboard_app', ['ImageReportChart'])
49
50
51 def backwards(self, orm):
52 # Deleting model 'ImageChartTestCase'
53 db.delete_table('dashboard_app_imagecharttestcase')
54
55 # Deleting model 'ImageReport'
56 db.delete_table('dashboard_app_imagereport')
57
58 # Deleting model 'ImageChartTestRun'
59 db.delete_table('dashboard_app_imagecharttestrun')
60
61 # Deleting model 'ImageReportChart'
62 db.delete_table('dashboard_app_imagereportchart')
63
64
65 models = {
66 'auth.group': {
67 'Meta': {'object_name': 'Group'},
68 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
69 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
70 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
71 },
72 'auth.permission': {
73 'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'},
74 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
75 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
76 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
77 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
78 },
79 'auth.user': {
80 'Meta': {'object_name': 'User'},
81 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
82 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
83 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
84 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}),
85 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
86 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
87 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
88 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
89 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
90 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
91 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
92 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}),
93 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
94 },
95 'contenttypes.contenttype': {
96 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
97 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
98 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
99 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
100 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
101 },
102 'dashboard_app.attachment': {
103 'Meta': {'object_name': 'Attachment'},
104 'content': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'null': 'True'}),
105 'content_filename': ('django.db.models.fields.CharField', [], {'max_length': '256'}),
106 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
107 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
108 'mime_type': ('django.db.models.fields.CharField', [], {'max_length': '64'}),
109 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}),
110 'public_url': ('django.db.models.fields.URLField', [], {'max_length': '512', 'blank': 'True'})
111 },
112 'dashboard_app.bundle': {
113 'Meta': {'ordering': "['-uploaded_on']", 'object_name': 'Bundle'},
114 '_gz_content': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'null': 'True', 'db_column': "'gz_content'"}),
115 '_raw_content': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'null': 'True', 'db_column': "'content'"}),
116 'bundle_stream': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'bundles'", 'to': "orm['dashboard_app.BundleStream']"}),
117 'content_filename': ('django.db.models.fields.CharField', [], {'max_length': '256'}),
118 'content_sha1': ('django.db.models.fields.CharField', [], {'max_length': '40', 'unique': 'True', 'null': 'True'}),
119 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
120 'is_deserialized': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
121 'uploaded_by': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'uploaded_bundles'", 'null': 'True', 'to': "orm['auth.User']"}),
122 'uploaded_on': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.utcnow'})
123 },
124 'dashboard_app.bundledeserializationerror': {
125 'Meta': {'object_name': 'BundleDeserializationError'},
126 'bundle': ('django.db.models.fields.related.OneToOneField', [], {'related_name': "'deserialization_error'", 'unique': 'True', 'primary_key': 'True', 'to': "orm['dashboard_app.Bundle']"}),
127 'error_message': ('django.db.models.fields.CharField', [], {'max_length': '1024'}),
128 'traceback': ('django.db.models.fields.TextField', [], {'max_length': '32768'})
129 },
130 'dashboard_app.bundlestream': {
131 'Meta': {'object_name': 'BundleStream'},
132 'group': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.Group']", 'null': 'True', 'blank': 'True'}),
133 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
134 'is_anonymous': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
135 'is_public': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
136 'name': ('django.db.models.fields.CharField', [], {'max_length': '64', 'blank': 'True'}),
137 'pathname': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '128'}),
138 'slug': ('django.db.models.fields.CharField', [], {'max_length': '64', 'blank': 'True'}),
139 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']", 'null': 'True', 'blank': 'True'})
140 },
141 'dashboard_app.hardwaredevice': {
142 'Meta': {'object_name': 'HardwareDevice'},
143 'description': ('django.db.models.fields.CharField', [], {'max_length': '256'}),
144 'device_type': ('django.db.models.fields.CharField', [], {'max_length': '32'}),
145 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'})
146 },
147 'dashboard_app.image': {
148 'Meta': {'object_name': 'Image'},
149 'filter': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'+'", 'null': 'True', 'to': "orm['dashboard_app.TestRunFilter']"}),
150 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
151 'name': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '1024'})
152 },
153 'dashboard_app.imagecharttestcase': {
154 'Meta': {'object_name': 'ImageChartTestCase'},
155 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
156 'image_chart': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['dashboard_app.ImageReportChart']"}),
157 'name': ('django.db.models.fields.CharField', [], {'max_length': '200'}),
158 'test_case': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['dashboard_app.TestCase']"})
159 },
160 'dashboard_app.imagecharttestrun': {
161 'Meta': {'object_name': 'ImageChartTestRun'},
162 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
163 'image_chart': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['dashboard_app.ImageReportChart']"}),
164 'name': ('django.db.models.fields.CharField', [], {'max_length': '200'}),
165 'test_run': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['dashboard_app.TestRun']"})
166 },
167 'dashboard_app.imagereport': {
168 'Meta': {'object_name': 'ImageReport'},
169 'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
170 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
171 'name': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '1024'})
172 },
173 'dashboard_app.imagereportchart': {
174 'Meta': {'object_name': 'ImageReportChart'},
175 'chart_type': ('django.db.models.fields.CharField', [], {'max_length': '20'}),
176 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
177 'image_report': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'to': "orm['dashboard_app.ImageReport']"}),
178 'is_data_table_visible': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
179 'is_interactive': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
180 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
181 'representation': ('django.db.models.fields.CharField', [], {'max_length': '20'}),
182 'target_goal': ('django.db.models.fields.DecimalField', [], {'null': 'True', 'max_digits': '10', 'decimal_places': '5', 'blank': 'True'}),
183 'test_cases': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['dashboard_app.TestCase']", 'through': "orm['dashboard_app.ImageChartTestCase']", 'symmetrical': 'False'}),
184 'test_runs': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['dashboard_app.TestRun']", 'through': "orm['dashboard_app.ImageChartTestRun']", 'symmetrical': 'False'})
185 },
186 'dashboard_app.imageset': {
187 'Meta': {'object_name': 'ImageSet'},
188 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
189 'images': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['dashboard_app.Image']", 'symmetrical': 'False'}),
190 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '1024'})
191 },
192 'dashboard_app.launchpadbug': {
193 'Meta': {'object_name': 'LaunchpadBug'},
194 'bug_id': ('django.db.models.fields.PositiveIntegerField', [], {'unique': 'True'}),
195 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
196 'test_runs': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'launchpad_bugs'", 'symmetrical': 'False', 'to': "orm['dashboard_app.TestRun']"})
197 },
198 'dashboard_app.namedattribute': {
199 'Meta': {'unique_together': "(('object_id', 'name'),)", 'object_name': 'NamedAttribute'},
200 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
201 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
202 'name': ('django.db.models.fields.TextField', [], {}),
203 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}),
204 'value': ('django.db.models.fields.TextField', [], {})
205 },
206 'dashboard_app.pmqabundlestream': {
207 'Meta': {'object_name': 'PMQABundleStream'},
208 'bundle_stream': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'+'", 'to': "orm['dashboard_app.BundleStream']"}),
209 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'})
210 },
211 'dashboard_app.softwarepackage': {
212 'Meta': {'unique_together': "(('name', 'version'),)", 'object_name': 'SoftwarePackage'},
213 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
214 'name': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
215 'version': ('django.db.models.fields.CharField', [], {'max_length': '128'})
216 },
217 'dashboard_app.softwarepackagescratch': {
218 'Meta': {'object_name': 'SoftwarePackageScratch'},
219 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
220 'name': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
221 'version': ('django.db.models.fields.CharField', [], {'max_length': '128'})
222 },
223 'dashboard_app.softwaresource': {
224 'Meta': {'object_name': 'SoftwareSource'},
225 'branch_revision': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
226 'branch_url': ('django.db.models.fields.CharField', [], {'max_length': '256'}),
227 'branch_vcs': ('django.db.models.fields.CharField', [], {'max_length': '10'}),
228 'commit_timestamp': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
229 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
230 'project_name': ('django.db.models.fields.CharField', [], {'max_length': '32'})
231 },
232 'dashboard_app.tag': {
233 'Meta': {'object_name': 'Tag'},
234 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
235 'name': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '256'})
236 },
237 'dashboard_app.test': {
238 'Meta': {'object_name': 'Test'},
239 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
240 'name': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'blank': 'True'}),
241 'test_id': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '1024'})
242 },
243 'dashboard_app.testcase': {
244 'Meta': {'unique_together': "(('test', 'test_case_id'),)", 'object_name': 'TestCase'},
245 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
246 'name': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
247 'test': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'test_cases'", 'to': "orm['dashboard_app.Test']"}),
248 'test_case_id': ('django.db.models.fields.TextField', [], {}),
249 'units': ('django.db.models.fields.TextField', [], {'blank': 'True'})
250 },
251 'dashboard_app.testdefinition': {
252 'Meta': {'object_name': 'TestDefinition'},
253 'content': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
254 'description': ('django.db.models.fields.TextField', [], {}),
255 'environment': ('django.db.models.fields.CharField', [], {'max_length': '256'}),
256 'format': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
257 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
258 'location': ('django.db.models.fields.CharField', [], {'default': "'LOCAL'", 'max_length': '64'}),
259 'mime_type': ('django.db.models.fields.CharField', [], {'default': "'text/plain'", 'max_length': '64'}),
260 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '512'}),
261 'target_dev_types': ('django.db.models.fields.CharField', [], {'max_length': '512'}),
262 'target_os': ('django.db.models.fields.CharField', [], {'max_length': '512'}),
263 'url': ('django.db.models.fields.CharField', [], {'max_length': '1024'}),
264 'version': ('django.db.models.fields.CharField', [], {'max_length': '256'})
265 },
266 'dashboard_app.testresult': {
267 'Meta': {'ordering': "('_order',)", 'object_name': 'TestResult'},
268 '_order': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
269 'filename': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'null': 'True', 'blank': 'True'}),
270 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
271 'lineno': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}),
272 'measurement': ('django.db.models.fields.DecimalField', [], {'null': 'True', 'max_digits': '20', 'decimal_places': '10', 'blank': 'True'}),
273 'message': ('django.db.models.fields.TextField', [], {'max_length': '1024', 'null': 'True', 'blank': 'True'}),
274 'microseconds': ('django.db.models.fields.BigIntegerField', [], {'null': 'True', 'blank': 'True'}),
275 'relative_index': ('django.db.models.fields.PositiveIntegerField', [], {}),
276 'result': ('django.db.models.fields.PositiveSmallIntegerField', [], {}),
277 'test_case': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'test_results'", 'null': 'True', 'to': "orm['dashboard_app.TestCase']"}),
278 'test_run': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'test_results'", 'to': "orm['dashboard_app.TestRun']"}),
279 'timestamp': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'})
280 },
281 'dashboard_app.testrun': {
282 'Meta': {'ordering': "['-import_assigned_date']", 'object_name': 'TestRun'},
283 'analyzer_assigned_date': ('django.db.models.fields.DateTimeField', [], {}),
284 'analyzer_assigned_uuid': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '36'}),
285 'bundle': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'test_runs'", 'to': "orm['dashboard_app.Bundle']"}),
286 'devices': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'test_runs'", 'blank': 'True', 'to': "orm['dashboard_app.HardwareDevice']"}),
287 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
288 'import_assigned_date': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
289 'microseconds': ('django.db.models.fields.BigIntegerField', [], {'null': 'True', 'blank': 'True'}),
290 'packages': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'test_runs'", 'blank': 'True', 'to': "orm['dashboard_app.SoftwarePackage']"}),
291 'sources': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'test_runs'", 'blank': 'True', 'to': "orm['dashboard_app.SoftwareSource']"}),
292 'sw_image_desc': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}),
293 'tags': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'test_runs'", 'blank': 'True', 'to': "orm['dashboard_app.Tag']"}),
294 'test': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'test_runs'", 'to': "orm['dashboard_app.Test']"}),
295 'time_check_performed': ('django.db.models.fields.BooleanField', [], {'default': 'False'})
296 },
297 'dashboard_app.testrundenormalization': {
298 'Meta': {'object_name': 'TestRunDenormalization'},
299 'count_fail': ('django.db.models.fields.PositiveIntegerField', [], {}),
300 'count_pass': ('django.db.models.fields.PositiveIntegerField', [], {}),
301 'count_skip': ('django.db.models.fields.PositiveIntegerField', [], {}),
302 'count_unknown': ('django.db.models.fields.PositiveIntegerField', [], {}),
303 'test_run': ('django.db.models.fields.related.OneToOneField', [], {'related_name': "'denormalization'", 'unique': 'True', 'primary_key': 'True', 'to': "orm['dashboard_app.TestRun']"})
304 },
305 'dashboard_app.testrunfilter': {
306 'Meta': {'unique_together': "(('owner', 'name'),)", 'object_name': 'TestRunFilter'},
307 'build_number_attribute': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'null': 'True', 'blank': 'True'}),
308 'bundle_streams': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['dashboard_app.BundleStream']", 'symmetrical': 'False'}),
309 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
310 'name': ('django.db.models.fields.SlugField', [], {'max_length': '1024'}),
311 'owner': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}),
312 'public': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
313 'uploaded_by': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'+'", 'null': 'True', 'to': "orm['auth.User']"})
314 },
315 'dashboard_app.testrunfilterattribute': {
316 'Meta': {'object_name': 'TestRunFilterAttribute'},
317 'filter': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'attributes'", 'to': "orm['dashboard_app.TestRunFilter']"}),
318 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
319 'name': ('django.db.models.fields.CharField', [], {'max_length': '1024'}),
320 'value': ('django.db.models.fields.CharField', [], {'max_length': '1024'})
321 },
322 'dashboard_app.testrunfiltersubscription': {
323 'Meta': {'unique_together': "(('user', 'filter'),)", 'object_name': 'TestRunFilterSubscription'},
324 'filter': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['dashboard_app.TestRunFilter']"}),
325 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
326 'level': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
327 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"})
328 },
329 'dashboard_app.testrunfiltertest': {
330 'Meta': {'object_name': 'TestRunFilterTest'},
331 'filter': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'tests'", 'to': "orm['dashboard_app.TestRunFilter']"}),
332 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
333 'index': ('django.db.models.fields.PositiveIntegerField', [], {}),
334 'test': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'+'", 'to': "orm['dashboard_app.Test']"})
335 },
336 'dashboard_app.testrunfiltertestcase': {
337 'Meta': {'object_name': 'TestRunFilterTestCase'},
338 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
339 'index': ('django.db.models.fields.PositiveIntegerField', [], {}),
340 'test': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'cases'", 'to': "orm['dashboard_app.TestRunFilterTest']"}),
341 'test_case': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'+'", 'to': "orm['dashboard_app.TestCase']"})
342 }
343 }
344
345 complete_apps = ['dashboard_app']
0\ No newline at end of file346\ No newline at end of file
1347
=== modified file 'dashboard_app/models.py'
--- dashboard_app/models.py 2013-04-01 08:50:05 +0000
+++ dashboard_app/models.py 2013-09-02 13:57:25 +0000
@@ -1523,6 +1523,101 @@
1523 return self.name1523 return self.name
15241524
15251525
1526class ImageReport(models.Model):
1527
1528 name = models.SlugField(max_length=1024, unique=True)
1529
1530 description = models.TextField(blank=True, null=True)
1531
1532 def __unicode__(self):
1533 return self.name
1534
1535
1536# Chart types
1537CHART_TYPES = ((r'pass/fail', 'Pass/Fail'),
1538 (r'measurement', 'Measurement'))
1539# Chart representation
1540REPRESENTATION_TYPES = ((r'lines', 'Lines'),
1541 (r'bars', 'Bars'))
1542
1543
1544class ImageReportChart(models.Model):
1545
1546 name = models.CharField(max_length=100)
1547
1548 image_report = models.ForeignKey(
1549 ImageReport,
1550 default=None,
1551 null=False,
1552 on_delete=models.CASCADE)
1553
1554 test_runs = models.ManyToManyField(
1555 TestRun,
1556 through='ImageChartTestRun')
1557
1558 test_cases = models.ManyToManyField(
1559 TestCase,
1560 through='ImageChartTestCase')
1561
1562 chart_type = models.CharField(
1563 max_length=20,
1564 choices=CHART_TYPES,
1565 verbose_name='Chart type')
1566
1567 representation = models.CharField(
1568 max_length=20,
1569 choices=REPRESENTATION_TYPES,
1570 verbose_name='Representation type')
1571
1572 target_goal = models.DecimalField(
1573 blank = True,
1574 decimal_places = 5,
1575 max_digits = 10,
1576 null = True,
1577 verbose_name = 'Target goal')
1578
1579 is_interactive = models.BooleanField(
1580 default=False,
1581 verbose_name='Chart is interactive')
1582
1583 is_data_table_visible = models.BooleanField(
1584 default=False,
1585 verbose_name='Data table is visible')
1586
1587 def __unicode__(self):
1588 return self.name
1589
1590
1591class ImageChartTestRun(models.Model):
1592
1593 image_chart = models.ForeignKey(
1594 ImageReportChart,
1595 null=False,
1596 on_delete=models.CASCADE)
1597
1598 test_run = models.ForeignKey(
1599 TestRun,
1600 null=False,
1601 on_delete=models.CASCADE)
1602
1603 name = models.CharField(max_length=200)
1604
1605
1606class ImageChartTestCase(models.Model):
1607
1608 image_chart = models.ForeignKey(
1609 ImageReportChart,
1610 null=False,
1611 on_delete=models.CASCADE)
1612
1613 test_case = models.ForeignKey(
1614 TestCase,
1615 null=False,
1616 on_delete=models.CASCADE)
1617
1618 name = models.CharField(max_length=200)
1619
1620
1526class LaunchpadBug(models.Model):1621class LaunchpadBug(models.Model):
15271622
1528 bug_id = models.PositiveIntegerField(unique=True)1623 bug_id = models.PositiveIntegerField(unique=True)

Subscribers

People subscribed via source and target branches