[PATCH 04/10] models: Add 'status' model

Stephen Finucane stephen.finucane at intel.com
Wed Jul 29 18:58:42 AEST 2015


From: Stephen Finucane <stephenfinucane at hotmail.com>

This will represent the status of a patch. This includes a suitable
migration and admin view.

Signed-off-by: Stephen Finucane <stephenfinucane at hotmail.com>
---
 lib/sql/grant-all.mysql.sql                   |  5 +--
 lib/sql/grant-all.postgres.sql                | 11 ++++---
 lib/sql/migration/016-add-status-model.sql    |  6 ++++
 patchwork/admin.py                            | 11 ++++++-
 patchwork/migrations/0003_add_status_model.py | 33 +++++++++++++++++++
 patchwork/models.py                           | 46 +++++++++++++++++++++++++++
 6 files changed, 105 insertions(+), 7 deletions(-)
 create mode 100644 lib/sql/migration/016-add-status-model.sql
 create mode 100644 patchwork/migrations/0003_add_status_model.py

diff --git a/lib/sql/grant-all.mysql.sql b/lib/sql/grant-all.mysql.sql
index 6a3d547..ab65457 100644
--- a/lib/sql/grant-all.mysql.sql
+++ b/lib/sql/grant-all.mysql.sql
@@ -25,15 +25,16 @@ GRANT SELECT, UPDATE, INSERT, DELETE ON patchwork_emailoptout TO 'www-data'@loca
 GRANT SELECT, UPDATE, INSERT, DELETE ON patchwork_patchchangenotification TO 'www-data'@localhost;
 GRANT SELECT, UPDATE, INSERT, DELETE ON patchwork_tag TO 'www-data'@localhost;
 GRANT SELECT, UPDATE, INSERT, DELETE ON patchwork_patchtag TO 'www-data'@localhost;
+GRANT SELECT, UPDATE, INSERT, DELETE ON patchwork_status TO 'www-data'@localhost;
 
--- allow the mail user (in this case, 'nobody') to add patches
+-- allow the mail user (in this case, 'nobody') to add patches and statuses
 GRANT INSERT, SELECT ON patchwork_patch TO 'nobody'@localhost;
 GRANT INSERT, SELECT ON patchwork_comment TO 'nobody'@localhost;
 GRANT INSERT, SELECT ON patchwork_person TO 'nobody'@localhost;
+GRANT INSERT, SELECT ON patchwork_status TO 'nobody'@localhost;
 GRANT INSERT, SELECT, UPDATE, DELETE ON patchwork_patchtag TO 'nobody'@localhost;
 GRANT SELECT ON	patchwork_project TO 'nobody'@localhost;
 GRANT SELECT ON patchwork_state TO 'nobody'@localhost;
 GRANT SELECT ON patchwork_tag TO 'nobody'@localhost;
 
 COMMIT;
-
diff --git a/lib/sql/grant-all.postgres.sql b/lib/sql/grant-all.postgres.sql
index 477e10a..204eca0 100644
--- a/lib/sql/grant-all.postgres.sql
+++ b/lib/sql/grant-all.postgres.sql
@@ -25,7 +25,8 @@ GRANT SELECT, UPDATE, INSERT, DELETE ON
 	patchwork_emailoptout,
 	patchwork_patchchangenotification,
 	patchwork_tag,
-	patchwork_patchtag
+	patchwork_patchtag,
+	patchwork_status
 TO "www-data";
 GRANT SELECT, UPDATE ON
 	auth_group_id_seq,
@@ -49,13 +50,15 @@ GRANT SELECT, UPDATE ON
 	patchwork_userprofile_maintainer_projects_id_seq,
 	patchwork_tag_id_seq,
 	patchwork_patchtag_id_seq
+	patchwork_status_id_seq
 TO "www-data";
 
 -- allow the mail user (in this case, 'nobody') to add patches
 GRANT INSERT, SELECT ON
 	patchwork_patch,
 	patchwork_comment,
-	patchwork_person
+	patchwork_person,
+	patchwork_status
 TO "nobody";
 GRANT INSERT, SELECT, UPDATE, DELETE ON
 	patchwork_patchtag
@@ -69,8 +72,8 @@ GRANT UPDATE, SELECT ON
 	patchwork_patch_id_seq,
 	patchwork_person_id_seq,
 	patchwork_comment_id_seq,
-	patchwork_patchtag_id_seq
+	patchwork_patchtag_id_seq,
+	patchwork_status_id_seq
 TO "nobody";
 
 COMMIT;
-
diff --git a/lib/sql/migration/016-add-status-model.sql b/lib/sql/migration/016-add-status-model.sql
new file mode 100644
index 0000000..aa116c6
--- /dev/null
+++ b/lib/sql/migration/016-add-status-model.sql
@@ -0,0 +1,6 @@
+BEGIN;
+CREATE TABLE `patchwork_status` (`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, `date` datetime NOT NULL, `state` smallint NOT NULL, `target_url` varchar(200) NULL, `description` longtext NULL, `context` varchar(255) NULL, `patch_id` integer NOT NULL, `user_id` integer NOT NULL);
+ALTER TABLE `patchwork_status` ADD CONSTRAINT `patchwork_status_patch_id_32968640b7a49ecf_fk_patchwork_patch_id` FOREIGN KEY (`patch_id`) REFERENCES `patchwork_patch` (`id`);
+ALTER TABLE `patchwork_status` ADD CONSTRAINT `patchwork_status_user_id_72be31b021e2a9db_fk_auth_user_id` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`);
+
+COMMIT;
diff --git a/patchwork/admin.py b/patchwork/admin.py
index 04a8ff8..749e358 100644
--- a/patchwork/admin.py
+++ b/patchwork/admin.py
@@ -20,7 +20,7 @@
 from django.contrib import admin
 
 from patchwork.models import (
-    Project, Person, UserProfile, State, Patch, Comment, Bundle, Tag)
+    Project, Person, UserProfile, State, Patch, Comment, Bundle, Tag, Status)
 
 
 class ProjectAdmin(admin.ModelAdmin):
@@ -74,6 +74,15 @@ class CommentAdmin(admin.ModelAdmin):
 admin.site.register(Comment, CommentAdmin)
 
 
+class StatusAdmin(admin.ModelAdmin):
+    list_display = ('patch', 'user', 'state', 'target_url',
+                    'description', 'context')
+    exclude = ('date', )
+    search_fields = ('patch__name', 'project__name')
+    date_hierarchy = 'date'
+admin.site.register(Status, StatusAdmin)
+
+
 class BundleAdmin(admin.ModelAdmin):
     list_display = ('name', 'owner', 'project', 'public')
     list_filter = ('public', 'project')
diff --git a/patchwork/migrations/0003_add_status_model.py b/patchwork/migrations/0003_add_status_model.py
new file mode 100644
index 0000000..2659210
--- /dev/null
+++ b/patchwork/migrations/0003_add_status_model.py
@@ -0,0 +1,33 @@
+# -*- coding: utf-8 -*-
+from __future__ import unicode_literals
+
+from django.db import models, migrations
+import datetime
+from django.conf import settings
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        migrations.swappable_dependency(settings.AUTH_USER_MODEL),
+        ('patchwork', '0002_fix_patch_state_default_values'),
+    ]
+
+    operations = [
+        migrations.CreateModel(
+            name='Status',
+            fields=[
+                ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
+                ('date', models.DateTimeField(default=datetime.datetime.now)),
+                ('state', models.SmallIntegerField(default=0, help_text=b'The state of the status.', choices=[(0, b'pending'), (1, b'success'), (2, b'warning'), (3, b'fail')])),
+                ('target_url', models.URLField(help_text=b'The target URL to associate with this status. This should be specific to the patch.', null=True, blank=True)),
+                ('description', models.TextField(help_text=b'A brief description of the status.', null=True, blank=True)),
+                ('context', models.CharField(default=b'default', max_length=255, null=True, help_text=b'A label to discern status from statuses of other systems.', blank=True)),
+                ('patch', models.ForeignKey(to='patchwork.Patch')),
+                ('user', models.ForeignKey(to=settings.AUTH_USER_MODEL)),
+            ],
+            options={
+                'verbose_name_plural': 'statuses',
+            },
+        ),
+    ]
diff --git a/patchwork/models.py b/patchwork/models.py
index eb9a700..ef5f13c 100644
--- a/patchwork/models.py
+++ b/patchwork/models.py
@@ -1,5 +1,6 @@
 # Patchwork - automated patch tracking system
 # Copyright (C) 2008 Jeremy Kerr <jk at ozlabs.org>
+# Copyright (C) 2015 Intel Corporation
 #
 # This file is part of the Patchwork package.
 #
@@ -414,6 +415,51 @@ class BundlePatch(models.Model):
         ordering = ['order']
 
 
+class Status(models.Model):
+    """Status for a patch.
+
+    Statuses define a state for patches. This is useful, for example,
+    when using a continuous integration (CI) system to test patches.
+    """
+    STATE_PENDING = 0
+    STATE_SUCCESS = 1
+    STATE_WARNING = 2
+    STATE_FAIL = 3
+    STATE_CHOICES = (
+        (STATE_PENDING, 'pending'),
+        (STATE_SUCCESS, 'success'),
+        (STATE_WARNING, 'warning'),
+        (STATE_FAIL, 'fail'),
+    )
+
+    patch = models.ForeignKey(Patch)
+    user = models.ForeignKey(User)
+    date = models.DateTimeField(default=datetime.datetime.now)
+
+    state = models.SmallIntegerField(
+        choices=STATE_CHOICES, default=STATE_PENDING,
+        help_text='The state of the status.')
+    target_url = models.URLField(
+        blank=True, null=True,
+        help_text='The target URL to associate with this status. This should'
+        ' be specific to the patch.')
+    description = models.TextField(
+        blank=True, null=True, help_text='A brief description of the status.')
+    context = models.CharField(
+        max_length=255, default='default', blank=True, null=True,
+        help_text='A label to discern status from statuses of other systems.')
+
+    def __repr__(self):
+        return "<Status id='%d' context='%s' state='%s'" % (
+            self.id, self.context, self.get_state_display())
+
+    def __unicode__(self):
+        return ('%s (%s)' % (self.context, self.get_state_display()))
+
+    class Meta:
+        verbose_name_plural = 'statuses'
+
+
 class EmailConfirmation(models.Model):
     validity = datetime.timedelta(days=settings.CONFIRMATION_VALIDITY_DAYS)
     type = models.CharField(max_length=20, choices=[
-- 
2.0.0



More information about the Patchwork mailing list