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