=== modified file 'dashboard_app/admin.py'
@@ -47,7 +47,6 @@
TestRunFilter,
TestRunFilterAttribute,
TestRunFilterSubscription,
- TestingEffort,
)
@@ -179,10 +178,6 @@
inlines = [NamedAttributeInline]
-class TestingEffortAdmin(admin.ModelAdmin):
- list_display = ('__unicode__', 'project')
-
-
class ImageAdmin(admin.ModelAdmin):
save_as = True
@@ -226,4 +221,3 @@
admin.site.register(TestRunFilter, TestRunFilterAdmin)
admin.site.register(TestRunFilterSubscription)
admin.site.register(Tag)
-admin.site.register(TestingEffort, TestingEffortAdmin)
=== modified file 'dashboard_app/extension.py'
@@ -36,37 +36,29 @@
return "dashboard_app.views.index"
def get_menu(self):
+ from django.conf import settings
from django.core.urlresolvers import reverse
+
menu = super(DashboardExtension, self).get_menu()
- menu.sub_menu = [
- Menu("About", reverse(self.main_view_name)),
- Menu("Testing Efforts", reverse("dashboard_app.views.testing_effort_list")),
- Menu("Bundle Streams", reverse("dashboard_app.views.bundle_stream_list")),
- Menu("Tests", reverse("dashboard_app.views.test_list")),
- Menu("Data Views", reverse("dashboard_app.views.data_view_list")),
- Menu("Reports", reverse("dashboard_app.views.report_list")),
- Menu("Image Reports", reverse("dashboard_app.views.images.image_report_list")),
- Menu("Filters", reverse("dashboard_app.views.filters.views.filters_list")),
- ]
+ subm = []
+ menu.sub_menu = subm
+ subm.append(Menu("Image Reports", reverse("dashboard_app.views.images.image_report_list")))
+ subm.append(Menu("Filters", reverse("dashboard_app.views.filters.views.filters_list")))
+ subm.append(Menu("Bundle Streams", reverse("dashboard_app.views.bundle_stream_list")))
+ if not settings.DATAVIEW_HIDE:
+ subm.append(Menu("Data Views", reverse("dashboard_app.views.data_view_list")))
+ if not settings.DATAREPORTS_HIDE:
+ subm.append(Menu("Reports", reverse("dashboard_app.views.report_list")))
+
return menu
@property
- def front_page_template(self):
- return "dashboard_app/front_page_snippet.html"
-
- def get_front_page_context(self):
- from dashboard_app.models import DataReport
- return {
- 'report_list': DataReport.repository.filter(front_page=True),
- }
-
- @property
def description(self):
return "Validation Dashboard"
@property
def version(self):
- import dashboard_app
+ import dashboard_app
import versiontools
return versiontools.format_version(dashboard_app.__version__, hint=dashboard_app)
@@ -91,8 +83,12 @@
def contribute_to_settings_ex(self, settings_module, settings_object):
settings_module['DATAVIEW_DIRS'] = settings_object._settings.get(
"DATAVIEW_DIRS", [])
+ settings_module['DATAVIEW_HIDE'] = settings_object._settings.get(
+ "DATAVIEW_HIDE", False)
settings_module['DATAREPORT_DIRS'] = settings_object._settings.get(
"DATAREPORT_DIRS", [])
+ settings_module['DATAREPORTS_HIDE'] = settings_object._settings.get(
+ "DATAREPORTS_HIDE", False)
# Enable constrained dataview database if requested
if settings_object._settings.get("use_dataview_database"):
=== removed file 'dashboard_app/forms.py'
@@ -1,26 +0,0 @@
-from django import forms
-from django.contrib.auth.models import Group
-from django.core.exceptions import ValidationError
-from django.utils.translation import ugettext as _
-
-from lava_projects.models import Project
-from dashboard_app.models import TestingEffort
-
-
-class TestingEffortForm(forms.Form):
-
- name = forms.CharField(
- label=_(u"Name"),
- max_length=100)
-
- description = forms.CharField(
- required=False,
- widget=forms.widgets.Textarea(),
- label=_(u"Description"),
- help_text=_(u"Description of this testing effort"))
-
- tags = forms.CharField(
- required=False,
- label=_(u"Tags"),
- max_length=1024,
- help_text=_(u"Tags, separated by whitespace or commas"))
=== added file 'dashboard_app/migrations/0027_auto__del_testingeffort.py'
@@ -0,0 +1,269 @@
+# -*- coding: utf-8 -*-
+import datetime
+from south.db import db
+from south.v2 import SchemaMigration
+from django.db import models
+
+
+class Migration(SchemaMigration):
+
+ def forwards(self, orm):
+ # Deleting model 'TestingEffort'
+ db.delete_table('dashboard_app_testingeffort')
+
+ # Removing M2M table for field tags on 'TestingEffort'
+ db.delete_table('dashboard_app_testingeffort_tags')
+
+
+ def backwards(self, orm):
+ # Adding model 'TestingEffort'
+ db.create_table('dashboard_app_testingeffort', (
+ ('description', self.gf('django.db.models.fields.TextField')()),
+ ('project', self.gf('django.db.models.fields.related.ForeignKey')(related_name='testing_efforts', to=orm['lava_projects.Project'])),
+ ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+ ('name', self.gf('django.db.models.fields.CharField')(max_length=100)),
+ ))
+ db.send_create_signal('dashboard_app', ['TestingEffort'])
+
+ # Adding M2M table for field tags on 'TestingEffort'
+ db.create_table('dashboard_app_testingeffort_tags', (
+ ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
+ ('testingeffort', models.ForeignKey(orm['dashboard_app.testingeffort'], null=False)),
+ ('tag', models.ForeignKey(orm['dashboard_app.tag'], null=False))
+ ))
+ db.create_unique('dashboard_app_testingeffort_tags', ['testingeffort_id', 'tag_id'])
+
+
+ models = {
+ 'auth.group': {
+ 'Meta': {'object_name': 'Group'},
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
+ 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
+ },
+ 'auth.permission': {
+ 'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'},
+ 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
+ },
+ 'auth.user': {
+ 'Meta': {'object_name': 'User'},
+ 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+ 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
+ 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
+ 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+ 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+ 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
+ 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+ 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}),
+ 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
+ },
+ 'contenttypes.contenttype': {
+ 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
+ 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
+ },
+ 'dashboard_app.attachment': {
+ 'Meta': {'object_name': 'Attachment'},
+ 'content': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'null': 'True'}),
+ 'content_filename': ('django.db.models.fields.CharField', [], {'max_length': '256'}),
+ 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'mime_type': ('django.db.models.fields.CharField', [], {'max_length': '64'}),
+ 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}),
+ 'public_url': ('django.db.models.fields.URLField', [], {'max_length': '512', 'blank': 'True'})
+ },
+ 'dashboard_app.bundle': {
+ 'Meta': {'ordering': "['-uploaded_on']", 'object_name': 'Bundle'},
+ '_gz_content': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'null': 'True', 'db_column': "'gz_content'"}),
+ '_raw_content': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'null': 'True', 'db_column': "'content'"}),
+ 'bundle_stream': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'bundles'", 'to': "orm['dashboard_app.BundleStream']"}),
+ 'content_filename': ('django.db.models.fields.CharField', [], {'max_length': '256'}),
+ 'content_sha1': ('django.db.models.fields.CharField', [], {'max_length': '40', 'unique': 'True', 'null': 'True'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'is_deserialized': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'uploaded_by': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'uploaded_bundles'", 'null': 'True', 'to': "orm['auth.User']"}),
+ 'uploaded_on': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.utcnow'})
+ },
+ 'dashboard_app.bundledeserializationerror': {
+ 'Meta': {'object_name': 'BundleDeserializationError'},
+ 'bundle': ('django.db.models.fields.related.OneToOneField', [], {'related_name': "'deserialization_error'", 'unique': 'True', 'primary_key': 'True', 'to': "orm['dashboard_app.Bundle']"}),
+ 'error_message': ('django.db.models.fields.CharField', [], {'max_length': '1024'}),
+ 'traceback': ('django.db.models.fields.TextField', [], {'max_length': '32768'})
+ },
+ 'dashboard_app.bundlestream': {
+ 'Meta': {'object_name': 'BundleStream'},
+ 'group': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.Group']", 'null': 'True', 'blank': 'True'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'is_anonymous': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'is_public': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '64', 'blank': 'True'}),
+ 'pathname': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '128'}),
+ 'slug': ('django.db.models.fields.CharField', [], {'max_length': '64', 'blank': 'True'}),
+ 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']", 'null': 'True', 'blank': 'True'})
+ },
+ 'dashboard_app.hardwaredevice': {
+ 'Meta': {'object_name': 'HardwareDevice'},
+ 'description': ('django.db.models.fields.CharField', [], {'max_length': '256'}),
+ 'device_type': ('django.db.models.fields.CharField', [], {'max_length': '32'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'})
+ },
+ 'dashboard_app.image': {
+ 'Meta': {'object_name': 'Image'},
+ 'filter': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'+'", 'null': 'True', 'to': "orm['dashboard_app.TestRunFilter']"}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '1024'})
+ },
+ 'dashboard_app.imageset': {
+ 'Meta': {'object_name': 'ImageSet'},
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'images': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['dashboard_app.Image']", 'symmetrical': 'False'}),
+ 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '1024'})
+ },
+ 'dashboard_app.launchpadbug': {
+ 'Meta': {'object_name': 'LaunchpadBug'},
+ 'bug_id': ('django.db.models.fields.PositiveIntegerField', [], {'unique': 'True'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'test_runs': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'launchpad_bugs'", 'symmetrical': 'False', 'to': "orm['dashboard_app.TestRun']"})
+ },
+ 'dashboard_app.namedattribute': {
+ 'Meta': {'unique_together': "(('object_id', 'name'),)", 'object_name': 'NamedAttribute'},
+ 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.TextField', [], {}),
+ 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}),
+ 'value': ('django.db.models.fields.TextField', [], {})
+ },
+ 'dashboard_app.pmqabundlestream': {
+ 'Meta': {'object_name': 'PMQABundleStream'},
+ 'bundle_stream': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'+'", 'to': "orm['dashboard_app.BundleStream']"}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'})
+ },
+ 'dashboard_app.softwarepackage': {
+ 'Meta': {'unique_together': "(('name', 'version'),)", 'object_name': 'SoftwarePackage'},
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+ 'version': ('django.db.models.fields.CharField', [], {'max_length': '128'})
+ },
+ 'dashboard_app.softwarepackagescratch': {
+ 'Meta': {'object_name': 'SoftwarePackageScratch'},
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+ 'version': ('django.db.models.fields.CharField', [], {'max_length': '128'})
+ },
+ 'dashboard_app.softwaresource': {
+ 'Meta': {'object_name': 'SoftwareSource'},
+ 'branch_revision': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+ 'branch_url': ('django.db.models.fields.CharField', [], {'max_length': '256'}),
+ 'branch_vcs': ('django.db.models.fields.CharField', [], {'max_length': '10'}),
+ 'commit_timestamp': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'project_name': ('django.db.models.fields.CharField', [], {'max_length': '32'})
+ },
+ 'dashboard_app.tag': {
+ 'Meta': {'object_name': 'Tag'},
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '256'})
+ },
+ 'dashboard_app.test': {
+ 'Meta': {'object_name': 'Test'},
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '64', 'blank': 'True'}),
+ 'test_id': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '64'})
+ },
+ 'dashboard_app.testcase': {
+ 'Meta': {'unique_together': "(('test', 'test_case_id'),)", 'object_name': 'TestCase'},
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+ 'test': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'test_cases'", 'to': "orm['dashboard_app.Test']"}),
+ 'test_case_id': ('django.db.models.fields.TextField', [], {}),
+ 'units': ('django.db.models.fields.TextField', [], {'blank': 'True'})
+ },
+ 'dashboard_app.testresult': {
+ 'Meta': {'ordering': "('_order',)", 'object_name': 'TestResult'},
+ '_order': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+ 'filename': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'null': 'True', 'blank': 'True'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'lineno': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}),
+ 'measurement': ('django.db.models.fields.DecimalField', [], {'null': 'True', 'max_digits': '20', 'decimal_places': '10', 'blank': 'True'}),
+ 'message': ('django.db.models.fields.TextField', [], {'max_length': '1024', 'null': 'True', 'blank': 'True'}),
+ 'microseconds': ('django.db.models.fields.BigIntegerField', [], {'null': 'True', 'blank': 'True'}),
+ 'relative_index': ('django.db.models.fields.PositiveIntegerField', [], {}),
+ 'result': ('django.db.models.fields.PositiveSmallIntegerField', [], {}),
+ 'test_case': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'test_results'", 'null': 'True', 'to': "orm['dashboard_app.TestCase']"}),
+ 'test_run': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'test_results'", 'to': "orm['dashboard_app.TestRun']"}),
+ 'timestamp': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'})
+ },
+ 'dashboard_app.testrun': {
+ 'Meta': {'ordering': "['-import_assigned_date']", 'object_name': 'TestRun'},
+ 'analyzer_assigned_date': ('django.db.models.fields.DateTimeField', [], {}),
+ 'analyzer_assigned_uuid': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '36'}),
+ 'bundle': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'test_runs'", 'to': "orm['dashboard_app.Bundle']"}),
+ 'devices': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'test_runs'", 'blank': 'True', 'to': "orm['dashboard_app.HardwareDevice']"}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'import_assigned_date': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
+ 'microseconds': ('django.db.models.fields.BigIntegerField', [], {'null': 'True', 'blank': 'True'}),
+ 'packages': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'test_runs'", 'blank': 'True', 'to': "orm['dashboard_app.SoftwarePackage']"}),
+ 'sources': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'test_runs'", 'blank': 'True', 'to': "orm['dashboard_app.SoftwareSource']"}),
+ 'sw_image_desc': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}),
+ 'tags': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'test_runs'", 'blank': 'True', 'to': "orm['dashboard_app.Tag']"}),
+ 'test': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'test_runs'", 'to': "orm['dashboard_app.Test']"}),
+ 'time_check_performed': ('django.db.models.fields.BooleanField', [], {'default': 'False'})
+ },
+ 'dashboard_app.testrundenormalization': {
+ 'Meta': {'object_name': 'TestRunDenormalization'},
+ 'count_fail': ('django.db.models.fields.PositiveIntegerField', [], {}),
+ 'count_pass': ('django.db.models.fields.PositiveIntegerField', [], {}),
+ 'count_skip': ('django.db.models.fields.PositiveIntegerField', [], {}),
+ 'count_unknown': ('django.db.models.fields.PositiveIntegerField', [], {}),
+ 'test_run': ('django.db.models.fields.related.OneToOneField', [], {'related_name': "'denormalization'", 'unique': 'True', 'primary_key': 'True', 'to': "orm['dashboard_app.TestRun']"})
+ },
+ 'dashboard_app.testrunfilter': {
+ 'Meta': {'unique_together': "(('owner', 'name'),)", 'object_name': 'TestRunFilter'},
+ 'build_number_attribute': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'null': 'True', 'blank': 'True'}),
+ 'bundle_streams': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['dashboard_app.BundleStream']", 'symmetrical': 'False'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.SlugField', [], {'max_length': '1024'}),
+ 'owner': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}),
+ 'public': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'uploaded_by': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'+'", 'null': 'True', 'to': "orm['auth.User']"})
+ },
+ 'dashboard_app.testrunfilterattribute': {
+ 'Meta': {'object_name': 'TestRunFilterAttribute'},
+ 'filter': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'attributes'", 'to': "orm['dashboard_app.TestRunFilter']"}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '1024'}),
+ 'value': ('django.db.models.fields.CharField', [], {'max_length': '1024'})
+ },
+ 'dashboard_app.testrunfiltersubscription': {
+ 'Meta': {'unique_together': "(('user', 'filter'),)", 'object_name': 'TestRunFilterSubscription'},
+ 'filter': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['dashboard_app.TestRunFilter']"}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'level': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+ 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"})
+ },
+ 'dashboard_app.testrunfiltertest': {
+ 'Meta': {'object_name': 'TestRunFilterTest'},
+ 'filter': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'tests'", 'to': "orm['dashboard_app.TestRunFilter']"}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'index': ('django.db.models.fields.PositiveIntegerField', [], {}),
+ 'test': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'+'", 'to': "orm['dashboard_app.Test']"})
+ },
+ 'dashboard_app.testrunfiltertestcase': {
+ 'Meta': {'object_name': 'TestRunFilterTestCase'},
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'index': ('django.db.models.fields.PositiveIntegerField', [], {}),
+ 'test': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'cases'", 'to': "orm['dashboard_app.TestRunFilterTest']"}),
+ 'test_case': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'+'", 'to': "orm['dashboard_app.TestCase']"})
+ }
+ }
+
+ complete_apps = ['dashboard_app']
\ No newline at end of file
=== modified file 'dashboard_app/models.py'
@@ -51,7 +51,6 @@
from django.utils.translation import ungettext
from django_restricted_resource.models import RestrictedResource
-from lava_projects.models import Project
from linaro_dashboard_bundle.io import DocumentIO
from dashboard_app.helpers import BundleDeserializer
@@ -1374,14 +1373,12 @@
return Template(self._get_raw_html())
def _get_html_template_context(self):
- from django.conf import settings
return Context({
"API_URL": reverse("dashboard_app.views.dashboard_xml_rpc_handler"),
"STATIC_URL": settings.STATIC_URL
})
def get_html(self):
- from django.conf import settings
DEBUG = getattr(settings, "DEBUG", False)
if self._html is None or DEBUG is True:
template = self._get_html_template()
@@ -1428,42 +1425,6 @@
return self.name
-class TestingEffort(models.Model):
- """
- A collaborative effort to test something.
-
- Uses tags to associate with test runs.
- """
- project = models.ForeignKey(
- Project,
- related_name="testing_efforts")
-
- name = models.CharField(
- verbose_name=_(u"Name"),
- max_length=100)
-
- description = models.TextField(
- verbose_name=_(u"Description"),
- help_text=_(u"Description of this testing effort"))
-
- tags = models.ManyToManyField(
- Tag,
- verbose_name=_(u"Tags"),
- related_name="testing_efforts")
-
- def __unicode__(self):
- return self.name
-
- @models.permalink
- def get_absolute_url(self):
- return ("dashboard_app.views.testing_effort_detail", [self.pk])
-
- def get_test_runs(self):
- return TestRun.objects.order_by(
- ).filter(
- tags__in=self.tags.all())
-
-
class Image(models.Model):
name = models.SlugField(max_length=1024, unique=True)
=== removed file 'dashboard_app/templates/dashboard_app/api.html'
@@ -1,30 +0,0 @@
-{% extends "dashboard_app/_content.html" %}
-{% load markup %}
-{% load i18n %}
-
-
-{% block title %}
-{{ block.super }} | {% trans "Dashboard" %} | {% trans "API Help (deprecated)" %}
-{% endblock %}
-
-
-{% block extrahead %}
-{{ block.super }}
-<script type="text/javascript" src="{{ STATIC_URL }}lava-server/js/jquery-1.5.1.min.js"></script>
-<script type="text/javascript" src="{{ STATIC_URL }}lava-server/js/jquery-ui-1.8.12.custom.min.js"></script>
-<link rel="stylesheet" type="text/css" href="{{ STATIC_URL }}lava-server/css/Aristo/jquery-ui-1.8.7.custom.css"/>
-{% endblock %}
-
-
-{% block breadcrumbs %}
-<li><a href="{% url dashboard_app.views.index %}">{% trans "Dashboard" %}</a></li>
-<li><a href="{% url dashboard_app.views.dashboard_xml_rpc_handler %}">{% trans "API Help (deprecated)" %}</a></li>
-{% endblock %}
-
-
-{% block content %}
-<h2>Depracation notice</h2>
-<p>Dashboard has a separate, deprecated, XML-RPC handler. You should refrain
-from using it. Instead please see the <a href="{% url lava.api_help %}"
- >LAVA Server API Help</a> which provides API services to all services</p>
-{% endblock %}
=== removed file 'dashboard_app/templates/dashboard_app/front_page_snippet.html'
@@ -1,13 +0,0 @@
-<!--[if IE]><script type="text/javascript" src="{{ STATIC_URL }}dashboard_app/js/excanvas.min.js"></script><![endif]-->
-<script type="text/javascript" src="{{ STATIC_URL }}dashboard_app/js/jquery.rpc.js"></script>
-<script type="text/javascript" src="{{ STATIC_URL }}dashboard_app/js/jquery.flot.min.js"></script>
-<script type="text/javascript" src="{{ STATIC_URL }}dashboard_app/js/jquery.dashboard.js"></script>
-{% include "dashboard_app/_extrahead.html" %}
-
-{% for report in report_list %}
-<h4>{{ report }}</h4>
-{{ report.get_html|safe }}
-{% empty %}
-<p>Currently no reports are configured for
-display on the front page</p>
-{% endfor %}
=== modified file 'dashboard_app/templates/dashboard_app/index.html'
@@ -6,53 +6,30 @@
<p>The <em>Validation Dashboard</em> is your window to
test results, regardless of how your run your tests you
can upload the results here and analyze them with simple
-built-in reports as well as arbitrary custom reports and
-data mining queries.</p>
-
-<h2>Key Features</h2>
-<ul>
- <li>Online repository of test results, with simple to use, web APIs and
- command line tools for uploading test results.</li>
- <li>Test results are packaged in documents (bundles) that you can easily sync
- across systems, model is similar to the one used by git</li>
- <li>Test results can refer to software and hardware context so that you know
- exactly what software and hardware combination fails</li>
- <li>Data mining and reporting allows users to create custom tailored reports
- based on the data in the system</li>
- <li>Distributed work-flow model, with some data privacy out of the box, fully
- private installation can be deployed in minutes.</li>
-</ul>
-
-<h2>Documentation & Get Started</h2>
-<p>To get started quickly follow the link below, if you feel that an important
-content is missing please <a
- href="https://bugs.launchpad.net/lava-dashboard/+filebug"
- >report a bug</a> or <a
- href="https://answers.launchpad.net/lava-dashboard/+addquestion"
- >ask a question</a>. Please make sure to report dashboard version (you are
-currently using version {{lava.extensions.as_mapping.dashboard_app.version}})</p>
-<p>All documentation is hosted on <a
- href="http://readthedocs.org/docs/lava-dashboard/en/latest/">ReadTheDocs.org</a>.</p>
-
-<h3>Developers</h3>
-<ul>
- <li>How to put test results of my test suite into the Dashboard?</li>
- <li>How to integrate my testing toolkit with the Dashboard?</li>
- <li>How to allow users of my application to send anonymous qualitative and
- quantitative (tests and benchmarks) data from their systems?</li>
-</ul>
-
-<h3>Managers</h3>
-<ul>
- <li>What kind of reporting features are available out of the box?</li>
- <li>How to create additional reports?</li>
- <li>What kind of data is available in the system</li>
-</ul>
-
-<h3>System Administrators</h3>
-<ul>
- <li>System requirements</li>
- <li>How to deploy or upgrade the dashboard?</li>
- <li>How to backup and restore the data</li>
-</ul>
+built-in views. Additionally, you can export data view
+the <a href="{% url lava.api_help %}">XML-RPC API</a>
+to build your own customized reports.</p>
+
+<h2>Getting Started</h2>
+
+<p>The dashboard stores results of tests in <em>bundles</em>. These
+bundles are then grouped by a thing called <em>bundle streams</em>.
+You can drill down by viewing the
+<a href="{% url dashboard_app.views.bundle_stream_list %}">bundle stream list</a>.
+However, that view can present too much data.</p>
+
+<p>There are two good ways to limit the data in order to see the
+results you are interested in</p>
+
+<h3>Filters</h3>
+<p><a href="{% url dashboard_app.views.filters.views.filters_list %}">Filters</a>
+allow you to create your own list of criteria for what you'd like to look at.
+These can be created as "public" so others can use them, or private so only
+you can see them.</p>
+
+<h3>Image Reports</h3>
+<p><a href="{% url dashboard_app.views.images.image_report_list %}">Image Reports</a>
+are a feature built on top of filters, that allow a nice view of daily jobs
+that are being run in LAVA.</p>
+
{% endblock %}
=== removed file 'dashboard_app/templates/dashboard_app/test_detail.html'
@@ -1,46 +0,0 @@
-{% extends "dashboard_app/_content.html" %}
-{% load i18n %}
-
-
-{% block content %}
-<script type="text/javascript" charset="utf-8">
- $(document).ready(function() {
- oTable = $('#test_cases').dataTable({
- bJQueryUI: true,
- sPaginationType: "full_numbers",
- aLengthMenu: [[10, 25, 50, -1], [10, 25, 50, "All"]],
- });
- });
-</script>
-<table class="demo_jui display" id="test_cases">
- <thead>
- <tr>
- <th>ID</th>
- <th>Name</th>
- <th>Units</th>
- <th>Total Results</th>
- <th>Total Failures</th>
- </tr>
- </thead>
- <tbody>
- {% for test_case in test.test_cases.all %}
- <tr>
- <td>{{ test_case.test_case_id }}</td>
- <td>{{ test_case.name|default:"<i>not set</i>" }}</td>
- <td>{{ test_case.units|default:"<i>not set</i>" }}</td>
- <td>{{ test_case.test_results.all.count }}</td>
- <td>{{ test_case.count_failures }}</td>
- </tr>
- {% endfor %}
- {% if test.count_results_without_test_case %}
- <tr>
- <td><em>Results without test case</em></td>
- <td><em>N/A</em></td>
- <td><em>N/A</em></td>
- <td>{{ test.count_results_without_test_case }}</td>
- <td>{{ test.count_failures_without_test_case }}</td>
- </tr>
- {% endif %}
- </tbody>
-</table>
-{% endblock %}
=== removed file 'dashboard_app/templates/dashboard_app/test_list.html'
@@ -1,34 +0,0 @@
-{% extends "dashboard_app/_content.html" %}
-{% load i18n %}
-
-
-{% block content %}
-<script type="text/javascript" charset="utf-8">
- $(document).ready(function() {
- oTable = $('#tests').dataTable({
- "bJQueryUI": true,
- "bPaginate": false,
- });
- });
-</script>
-<table class="demo_jui display" id="tests">
- <thead>
- <tr>
- <th>ID</th>
- <th>Name</th>
- <th>Test Cases</th>
- <th>Test Runs</th>
- </tr>
- </thead>
- <tbody>
- {% for test in test_list %}
- <tr>
- <td><a href="{{ test.get_absolute_url }}">{{ test.test_id }}</a></td>
- <td>{{ test.name|default:"<i>not set</i>" }}</td>
- <td>{{ test.test_cases.all.count }}</td>
- <td>{{ test.test_runs.all.count }}</td>
- </tr>
- {% endfor %}
- </tbody>
-</table>
-{% endblock %}
=== removed file 'dashboard_app/templates/dashboard_app/testing_effort_detail.html'
@@ -1,118 +0,0 @@
-{% extends "dashboard_app/_content_with_sidebar.html" %}
-{% load humanize %}
-{% load markup %}
-{% load i18n %}
-
-
-{% block extrahead %}
-{{ block.super }}
-<!--[if IE]><script type="text/javascript" src="{{ STATIC_URL }}dashboard_app/js/excanvas.min.js"></script><![endif]-->
-<script type="text/javascript" src="{{ STATIC_URL }}dashboard_app/js/jquery.flot.min.js"></script>
-<script type="text/javascript" src="{{ STATIC_URL }}dashboard_app/js/jquery.flot.stack.min.js"></script>
-<script type="text/javascript" src="{{ STATIC_URL }}dashboard_app/js/jquery.flot.axislabels.js"></script>
-{% endblock %}
-
-
-{% block sidebar %}
-<h3>Administration</h3>
-{% if belongs_to_user %}
-<ul>
- <li><a href="{% url dashboard_app.views.testing_effort_update effort.pk %}">Update this effort</a>
-</ul>
-{% else %}
-<p>You cannot make any changes to this testing effort. Only the owner of the
-<a href="{{ effort.project.get_absolute_url }}">{{ effort.project }}</a> can do
-this.</p>
-{% endif %}
-
-<h3>Tags</h3>
-<p class="help_text">The concept of <q>testing efforts</q> is based on using
-tags to associate test runs with a common goal or task. This testing effort
-will list any test runs that have <strong>any</strong> of the following tags
-present.</p>
-<ul>
- {% for tag in effort.tags.all %}
- <li>{{ tag }}</li>
- {% empty %}
- <em>This testing effort has not defined any tags yet, tests
- runs will not show up unless this is done</em>
- {% endfor %}
-</ul>
-{% endblock %}
-
-
-{% block content %}
-<style type="text/css">
- .result_pass {
- background-color: #3aad3a;
- }
-
- .result_fail {
- background-color: #ff3800;
- }
-
- .result_skip {
- background-color: yellow;
- }
-
- .result_unknown {
- background-color: #aaad9c;
- }
-
- .helper {
- float: left;
- height: 1em;
- margin-left: 1px;
- }
-
- table.special {
- border-collapse: collapse;
- width: 100%;
- }
-
- table.special th {
- text-align: left;
- border-bottom: 1px solid #333;
- padding: 2pt;
- }
-</style>
-<h2>About {{ effort.name }}</h2>
-{{ effort.description|markdown }}
-<h2>Tests related to this effort</h2>
-<p>The following tests contain one of the tags associated with this effort</p>
-<table class="special">
- {% regroup test_run_list|dictsortreversed:"analyzer_assigned_date" by analyzer_assigned_date|date:"Y-m-d" as test_run_cluster_list %}
- {% for test_run_cluster in test_run_cluster_list %}
- <tr>
- <th colspan="2">Tests ran on {{ test_run_cluster.grouper }}</th>
- <th>Pass</th>
- <th>Fail</th>
- <th>Skip</th>
- <th>Unknown</th>
- </tr>
- {% for test_run in test_run_cluster.list %}
- <tr>
- <td><a href="{{ test_run.get_absolute_url }}">{{ test_run.test }}</a></td>
- {% with test_run.denormalization as denormalization %}
- <td>
- {% spaceless %}
- <div class="result_pass helper"
- style="width: {% widthratio denormalization.count_pass denormalization.count_all 500 %}px;"></div>
- <div class="result_fail helper"
- style="width: {% widthratio denormalization.count_fail denormalization.count_all 500 %}px;"></div>
- <div class="result_skip helper"
- style="width: {% widthratio denormalization.count_skip denormalization.count_all 500 %}px;"></div>
- <div class="result_unknown helper"
- style="width: {% widthratio denormalization.count_unknown denormalization.count_all 500 %}px;"></div>
- {% endspaceless %}
- </td>
- <td>{{ denormalization.count_pass }}</td>
- <td>{{ denormalization.count_fail }}</td>
- <td>{{ denormalization.count_skip }}</td>
- <td>{{ denormalization.count_unknown }}</td>
- {% endwith %}
- </tr>
- {% endfor %}
- {% endfor %}
-</table>
-{% endblock %}
=== removed file 'dashboard_app/templates/dashboard_app/testing_effort_form.html'
@@ -1,61 +0,0 @@
-{% extends "dashboard_app/_content_with_sidebar.html" %}
-{% comment %}
-This template is a candidate for lava-server/form.html (generic form template)
-To make it work sensibly we need to move javascript and theme code to widgets
-and start using proper widget media references
-{% endcomment %}
-{% load humanize %}
-{% load markup %}
-{% load i18n %}
-
-
-{% block extrahead %}
-{{ block.super }}
-<script type="text/javascript" src="{{ STATIC_URL }}lava_markitup/jquery.markitup.js"></script>
-<script type="text/javascript" src="{{ STATIC_URL }}lava_markitup/sets/markdown/set.js"></script>
-<link rel="stylesheet" type="text/css" href="{{ STATIC_URL }}lava_markitup/skins/simple/style.css"/>
-<link rel="stylesheet" type="text/css" href="{{ STATIC_URL }}lava_markitup/sets/markdown/style.css"/>
-{% endblock %}
-
-
-{% block content %}
-<style type="text/css">
- iframe { border: 1px dotted #333; }
-</style>
-<form method="post" action="">
- {% block form_header %}
- {% endblock %}
- {% csrf_token %}
- <table class="form_helper">
- {% for field in form %}
- {% block form_field %}
- <tr>
- <th><label for="{{ field.id_for_label }}">{{ field.label }}</label></th>
- <td>
- {% if field.errors %}
- <div class="ui-state-error">
- {{ field.errors }}
- {{ field }}
- </div>
- {% else %}
- {{ field }}
- {% endif %}
- <p class='help_text'>{{ field.help_text }}</p>
- </td>
- </tr>
- {% endblock %}
- {% endfor %}
- </table>
- {% block form_footer %}
- <h2>Continue</h2>
- <input type="submit" value="Save"/>
- {% endblock %}
-</form>
-<script type="text/javascript">
- mySettings.previewParserPath = "{% url lava.markitup.markdown %}";
- $(document).ready(function() {
- $("input[type=submit]").button();
- $("#id_description").markItUp(mySettings);
- });
-</script>
-{% endblock %}
=== removed file 'dashboard_app/templates/dashboard_app/testing_effort_list.html'
@@ -1,19 +0,0 @@
-{% extends "dashboard_app/_content.html" %}
-{% load humanize %}
-{% load markup %}
-{% load i18n %}
-
-
-{% block content %}
-<h2>Testing efforts</h2>
-{% regroup effort_list by project as effort_group_list %}
-{% for effort_group in effort_group_list %}
-<h3>In project <a href="{{ effort_group.grouper.get_absolute_url }}">{{ effort_group.grouper }}</a></h3>
-<dl>
- {% for effort in effort_group.list %}
- <dt><a href="{{ effort.get_absolute_url }}">{{ effort }}</a></dt>
- <dd>{{ effort.description|markdown }}</dd>
- {% endfor %}
-</dl>
-{% endfor %}
-{% endblock %}
=== modified file 'dashboard_app/urls.py'
@@ -21,9 +21,6 @@
"""
from django.conf.urls.defaults import *
-from dashboard_app.xmlrpc import legacy_mapper
-import linaro_django_xmlrpc.views
-
urlpatterns = patterns(
'dashboard_app.views',
url(r'^$', 'index'),
@@ -32,8 +29,6 @@
url(r'^data-views/(?P<name>[a-zA-Z0-9-_]+)/$', 'data_view_detail'),
url(r'^reports/$', 'report_list'),
url(r'^reports/(?P<name>[a-zA-Z0-9-_]+)/$', 'report_detail'),
- url(r'^tests/$', 'test_list'),
- url(r'^tests/(?P<test_id>[^/]+)/$', 'test_detail'),
url(r'^filters/$', 'filters.views.filters_list'),
url(r'^filters/\+add$', 'filters.views.filter_add'),
url(r'^filters/\+add-preview-json$', 'filters.views.filter_preview_json'),
@@ -46,16 +41,6 @@
url(r'^filters/~(?P<username>[a-zA-Z0-9-_]+)/(?P<name>[a-zA-Z0-9-_]+)/\+subscribe$', 'filters.views.filter_subscribe'),
url(r'^filters/~(?P<username>[a-zA-Z0-9-_]+)/(?P<name>[a-zA-Z0-9-_]+)/\+delete$', 'filters.views.filter_delete'),
url(r'^filters/~(?P<username>[a-zA-Z0-9-_]+)/(?P<name>[a-zA-Z0-9-_]+)/\+compare/(?P<tag1>[a-zA-Z0-9-_: .]+)/(?P<tag2>[a-zA-Z0-9-_: .]+)$', 'filters.views.compare_matches'),
- url(r'^xml-rpc/$', linaro_django_xmlrpc.views.handler,
- name='dashboard_app.views.dashboard_xml_rpc_handler',
- kwargs={
- 'mapper': legacy_mapper,
- 'help_view': 'dashboard_app.views.dashboard_xml_rpc_help'}),
- url(r'^xml-rpc/help/$', linaro_django_xmlrpc.views.help,
- name='dashboard_app.views.dashboard_xml_rpc_help',
- kwargs={
- 'mapper': legacy_mapper,
- 'template_name': 'dashboard_app/api.html'}),
url(r'^streams/$', 'bundle_stream_list'),
url(r'^streams/json$', 'bundle_stream_list_json'),
url(r'^streams(?P<pathname>/[a-zA-Z0-9/._-]+)bundles/$', 'bundle_list'),
@@ -77,10 +62,6 @@
url(r'^permalink/test-result/(?P<analyzer_assigned_uuid>[a-zA-Z0-9-]+)/(?P<relative_index>[0-9]+)/(?P<trailing>.*)$', 'redirect_to_test_result'),
url(r'^permalink/bundle/(?P<content_sha1>[0-9a-z]+)/$', 'redirect_to_bundle'),
url(r'^permalink/bundle/(?P<content_sha1>[0-9a-z]+)/(?P<trailing>.*)$', 'redirect_to_bundle'),
- url(r'^efforts/$', 'testing_effort_list'),
- url(r'^efforts/(?P<pk>[0-9]+)/$', 'testing_effort_detail'),
- url(r'^efforts/(?P<pk>[0-9]+)/update/$', 'testing_effort_update'),
- url(r'^efforts/(?P<project_identifier>[a-z0-9-]+)/\+new/$', 'testing_effort_create'),
url(r'^image-reports/$', 'images.image_report_list'),
url(r'^pmqa$', 'pmqa.pmqa_view'),
url(r'^pmqa(?P<pathname>/[a-zA-Z0-9/._-]+/)(?P<device_type>[a-zA-Z0-9-_]+)$', 'pmqa.pmqa_filter_view'),
=== modified file 'dashboard_app/views/__init__.py'
@@ -60,7 +60,6 @@
Test,
TestResult,
TestRun,
- TestingEffort,
)
@@ -639,32 +638,6 @@
}, RequestContext(request))
-@BreadCrumb("Tests", parent=index)
-def test_list(request):
- return object_list(
- request,
- queryset=Test.objects.all(),
- template_name="dashboard_app/test_list.html",
- template_object_name="test",
- extra_context={
- 'bread_crumb_trail': BreadCrumbTrail.leading_to(test_list)
- })
-
-
-@BreadCrumb("Details of {test_id}", parent=test_list, needs=['test_id'])
-def test_detail(request, test_id):
- return object_detail(
- request,
- queryset=Test.objects.all(),
- slug=test_id,
- slug_field="test_id",
- template_name="dashboard_app/test_detail.html",
- template_object_name="test",
- extra_context={
- 'bread_crumb_trail': BreadCrumbTrail.leading_to(test_detail, test_id=test_id)
- })
-
-
def redirect_to(request, object, trailing):
url = object.get_absolute_url() + trailing
qs = request.META.get('QUERY_STRING')
@@ -700,128 +673,3 @@
request.user,
content_sha1=content_sha1)
return redirect_to(request, bundle, trailing)
-
-
-@BreadCrumb("Testing efforts", parent=index)
-def testing_effort_list(request):
- return render_to_response(
- "dashboard_app/testing_effort_list.html", {
- 'effort_list': TestingEffort.objects.all(
- ).order_by('name'),
- 'bread_crumb_trail': BreadCrumbTrail.leading_to(
- testing_effort_list),
- }, RequestContext(request))
-
-
-@BreadCrumb(
- "{effort}",
- parent=testing_effort_list,
- needs=["pk"])
-def testing_effort_detail(request, pk):
- effort = get_object_or_404(TestingEffort, pk=pk)
- return render_to_response(
- "dashboard_app/testing_effort_detail.html", {
- 'effort': effort,
- 'belongs_to_user': effort.project.is_owned_by(request.user),
- 'test_run_list': effort.get_test_runs(
- ).select_related(
- 'denormalization',
- 'bundle',
- 'bundle__bundle_stream',
- 'test',
- ),
- 'bread_crumb_trail': BreadCrumbTrail.leading_to(
- testing_effort_detail,
- effort=effort,
- pk=pk),
- }, RequestContext(request))
-
-
-from lava_projects.models import Project
-from lava_projects.views import project_detail
-from dashboard_app.forms import TestingEffortForm
-
-
-@BreadCrumb(
- "Start a new test effort",
- parent=project_detail,
- needs=["project_identifier"])
-@login_required
-def testing_effort_create(request, project_identifier):
- project = get_object_or_404(Project, identifier=project_identifier)
- if request.method == 'POST':
- form = TestingEffortForm(request.POST)
- # Check the form
- if form.is_valid():
- # And make a project instance
- effort = TestingEffort.objects.create(
- name=form.cleaned_data['name'],
- description=form.cleaned_data['description'],
- project=project)
- # Create all the required tags
- effort.tags = [
- Tag.objects.get_or_create(name=tag_name)[0]
- for tag_name in re.split("[, ]+", form.cleaned_data["tags"])
- if tag_name != ""]
- return HttpResponseRedirect(effort.get_absolute_url())
- else:
- form = TestingEffortForm()
- # Render to template
- template_name = "dashboard_app/testing_effort_form.html"
- t = loader.get_template(template_name)
- c = RequestContext(request, {
- 'form': form,
- 'bread_crumb_trail': BreadCrumbTrail.leading_to(
- testing_effort_create,
- project=project,
- project_identifier=project.identifier)
- })
- return HttpResponse(t.render(c))
-
-
-@BreadCrumb(
- "Update",
- parent=testing_effort_detail,
- needs=["pk"])
-@login_required
-def testing_effort_update(request, pk):
- try:
- effort = TestingEffort.objects.get(pk=pk)
- except TestingEffort.DoesNotExist:
- raise Http404()
- if not effort.project.is_owned_by(request.user):
- return HttpResponse("not allowed")
- if request.method == 'POST':
- form = TestingEffortForm(request.POST)
- # Check the form
- if form.is_valid():
- # And update the effort object
- effort.name=form.cleaned_data['name']
- effort.description=form.cleaned_data['description']
- # As well as tags
- effort.tags = [
- Tag.objects.get_or_create(name=tag_name)[0]
- for tag_name in re.split("[, ]+", form.cleaned_data["tags"])
- if tag_name != ""]
- # Save the changes
- effort.save()
- return HttpResponseRedirect(effort.get_absolute_url())
- else:
- form = TestingEffortForm(initial={
- 'name': effort.name,
- 'description': effort.description,
- 'tags': " ".join([tag.name for tag in effort.tags.order_by('name').all()])
- })
- # Render to template
- template_name = "dashboard_app/testing_effort_form.html"
- t = loader.get_template(template_name)
- c = RequestContext(request, {
- 'form': form,
- 'effort': effort,
- 'bread_crumb_trail': BreadCrumbTrail.leading_to(
- testing_effort_update,
- effort=effort,
- pk=effort.pk)
- })
- return HttpResponse(t.render(c))
-