aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeremy Kerr <jk@ozlabs.org>2009-01-29 17:38:46 +1100
committerJeremy Kerr <jk@ozlabs.org>2009-01-29 17:38:46 +1100
commitc105cb0f107a7459abc8c33988d2da24582a7a5a (patch)
treeb45da7063fc8a4598e169b61d475d6a915e5641e
parent6eb48bb0ca07765185fc21015fe815be18282f07 (diff)
downloadpatchwork-c105cb0f107a7459abc8c33988d2da24582a7a5a.tar
patchwork-c105cb0f107a7459abc8c33988d2da24582a7a5a.tar.gz
Initial bundle reordering support
todo: * implement ajax reorder api * finish migration script * order patches in bundle view Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
-rw-r--r--apps/patchwork/models.py18
-rw-r--r--htdocs/js/bundle.js41
l---------htdocs/js/jquery-1.2.6.js1
l---------htdocs/js/jquery.tablednd_0_5.js1
-rw-r--r--lib/sql/migration/005-bundle-patch-ordering.sql9
-rw-r--r--templates/patchwork/bundle.html11
-rw-r--r--templates/patchwork/patch-list.html152
7 files changed, 158 insertions, 75 deletions
diff --git a/apps/patchwork/models.py b/apps/patchwork/models.py
index 162fa21..d0c2a6e 100644
--- a/apps/patchwork/models.py
+++ b/apps/patchwork/models.py
@@ -289,12 +289,20 @@ class Bundle(models.Model):
owner = models.ForeignKey(User)
project = models.ForeignKey(Project)
name = models.CharField(max_length = 50, null = False, blank = False)
- patches = models.ManyToManyField(Patch)
+ patches = models.ManyToManyField(Patch, through = 'BundlePatch')
public = models.BooleanField(default = False)
def n_patches(self):
return self.patches.all().count()
+ def append_patch(self, patch):
+ # todo: use the aggregate queries in django 1.1
+ orders = BundlePatch.objects.filter(bundle = self).values('order')
+ max_order = max([ v for (k, v) in orders])
+
+ bp = BundlePatch.objects.create(bundle = self, patch = patch, order = max_order + 1)
+ bp.save()
+
class Meta:
unique_together = [('owner', 'name')]
@@ -313,6 +321,14 @@ class Bundle(models.Model):
return '\n'.join([p.mbox().as_string(True) \
for p in self.patches.all()])
+class BundlePatch(models.Model):
+ patch = models.ForeignKey(Patch)
+ bundle = models.ForeignKey(Bundle)
+ order = models.IntegerField()
+
+ class Meta:
+ unique_together = [('bundle', 'patch'), ('bundle', 'order')]
+
class UserPersonConfirmation(models.Model):
user = models.ForeignKey(User)
email = models.CharField(max_length = 200)
diff --git a/htdocs/js/bundle.js b/htdocs/js/bundle.js
new file mode 100644
index 0000000..dc4fb9c
--- /dev/null
+++ b/htdocs/js/bundle.js
@@ -0,0 +1,41 @@
+function parse_patch_id(id_str)
+{
+ var i;
+
+ i = id_str.indexOf(':');
+ if (i == -1)
+ return null;
+
+ return id_str.substring(i + 1);
+}
+
+function bundle_handle_drop(table, row)
+{
+ var relative, relation, current;
+ var relative_id, current_id;
+
+ current = $(row);
+ relative = $(current).prev();
+ relation = 'after';
+
+ /* if we have no previous row, position ourselves before the next
+ * row instead */
+ if (!relative.length) {
+ relative = current.next();
+ relation = 'before';
+
+ if (!relative)
+ return;
+ }
+
+ current_id = parse_patch_id(current.attr('id'));
+ relative_id = parse_patch_id(relative.attr('id'));
+
+ alert("put patch " + current_id + " " + relation + " " + relative_id);
+}
+
+$(document).ready(function() {
+ $("#patchlist").tableDnD({
+ onDrop: bundle_handle_drop
+ });
+});
diff --git a/htdocs/js/jquery-1.2.6.js b/htdocs/js/jquery-1.2.6.js
new file mode 120000
index 0000000..cb24de6
--- /dev/null
+++ b/htdocs/js/jquery-1.2.6.js
@@ -0,0 +1 @@
+../../lib/packages/jquery/jquery-1.2.6.js \ No newline at end of file
diff --git a/htdocs/js/jquery.tablednd_0_5.js b/htdocs/js/jquery.tablednd_0_5.js
new file mode 120000
index 0000000..5918e24
--- /dev/null
+++ b/htdocs/js/jquery.tablednd_0_5.js
@@ -0,0 +1 @@
+../../lib/packages/jquery/jquery.tablednd_0_5.js \ No newline at end of file
diff --git a/lib/sql/migration/005-bundle-patch-ordering.sql b/lib/sql/migration/005-bundle-patch-ordering.sql
new file mode 100644
index 0000000..9f5bcf3
--- /dev/null
+++ b/lib/sql/migration/005-bundle-patch-ordering.sql
@@ -0,0 +1,9 @@
+BEGIN;
+ALTER TABLE patchwork_bundle_patches RENAME TO patchwork_bundlepatch;
+ALTER TABLE patchwork_bundlepatch ADD COLUMN "order" INTEGER NULL;
+UPDATE patchwork_bundlepatch SET "order" =
+ (SELECT COALESCE(max("order"), 0) + 1 FROM patchwork_bundlepatch AS p2
+ WHERE p2.bundle_id = patchwork_bundlepatch.bundle_id);
+ALTER TABLE patchwork_bundlepatch ALTER COLUMN "order" SET NOT NULL;
+ALTER TABLE patchwork_bundlepatch ADD UNIQUE("bundle_id", "order");
+COMMIT;
diff --git a/templates/patchwork/bundle.html b/templates/patchwork/bundle.html
index 68bf570..d9a2785 100644
--- a/templates/patchwork/bundle.html
+++ b/templates/patchwork/bundle.html
@@ -2,6 +2,17 @@
{% load person %}
+{% block headers %}
+ <script language="JavaScript" type="text/javascript"
+ src="/js/jquery-1.2.6.js">
+ </script>
+ <script language="JavaScript" type="text/javascript"
+ src="/js/jquery.tablednd_0_5.js">
+ </script>
+ <script language="JavaScript" type="text/javascript"
+ src="/js/bundle.js">
+ </script>
+{% endblock %}
{% block title %}{{project.name}}{% endblock %}
{% block heading %}bundle: {{bundle.name}}{% endblock %}
diff --git a/templates/patchwork/patch-list.html b/templates/patchwork/patch-list.html
index 4c6b8a5..5518805 100644
--- a/templates/patchwork/patch-list.html
+++ b/templates/patchwork/patch-list.html
@@ -22,84 +22,87 @@
<form method="post">
<input type="hidden" name="form" value="patchlistform"/>
<input type="hidden" name="project" value="{{project.id}}"/>
-<table class="patchlist">
- <tr>
- {% if user.is_authenticated %}
- <th>
- <input type="checkbox" onChange="select_all(this)"/>
- </th>
- {% endif %}
+<table class="patchlist" id="patchlist">
+ <thead>
+ <tr>
+ {% if user.is_authenticated %}
+ <th>
+ <input type="checkbox" onChange="select_all(this)"/>
+ </th>
+ {% endif %}
+
+ <th>
+ {% ifequal order.name "name" %}
+ <a class="colactive"
+ href="{% listurl order=order.reversed_name %}"><img
+ src="/images/16-arrow-{% if order.reversed %}up{% else %}down{%endif%}.png"
+ width="16" height="16"
+ ></a> <a class="colactive"
+ href="{% listurl order=order.reversed_name %}">Patch</a>
+ {% else %}
+ <a class="colinactive" href="{% listurl order="name" %}">Patch</a>
+ {% endifequal %}
+ </th>
+
+ <th>
+ {% ifequal order.name "date" %}
+ <a class="colactive"
+ href="{% listurl order=order.reversed_name %}"><img
+ src="/images/16-arrow-{% if order.reversed %}up{% else %}down{%endif%}.png"
+ width="16" height="16"
+ ></a> <a class="colactive"
+ href="{% listurl order=order.reversed_name %}">Date</a>
+ {% else %}
+ <a class="colinactive" href="{% listurl order="date" %}">Date</a>
+ {% endifequal %}
+ </th>
+
+ <th>
+ {% ifequal order.name "submitter" %}
+ <a class="colactive"
+ href="{% listurl order=order.reversed_name %}"><img
+ src="/images/16-arrow-{% if order.reversed %}up{% else %}down{%endif%}.png"
+ width="16" height="16"
+ ></a> <a class="colactive"
+ href="{% listurl order=order.reversed_name %}">Submitter</a>
+ {% else %}
+ <a class="colinactive" href="{% listurl order="submitter" %}">Submitter</a>
+ {% endifequal %}
+ </th>
+
+ <th>
+ {% ifequal order.name "delegate" %}
+ <a class="colactive"
+ href="{% listurl order=order.reversed_name %}"><img
+ src="/images/16-arrow-{% if order.reversed %}up{% else %}down{%endif%}.png"
+ width="16" height="16"
+ ></a> <a class="colactive"
+ href="{% listurl order=order.reversed_name %}">Delegate</a>
+ {% else %}
+ <a class="colinactive" href="{% listurl order="delegate" %}">Delegate</a>
+ {% endifequal %}
+ </th>
+
+ <th>
+ {% ifequal order.name "state" %}
+ <a class="colactive"
+ href="{% listurl order=order.reversed_name %}"><img
+ src="/images/16-arrow-{% if order.reversed %}up{% else %}down{%endif%}.png"
+ width="16" height="16"
+ ></a> <a class="colactive"
+ href="{% listurl order=order.reversed_name %}">State</a>
+ {% else %}
+ <a class="colinactive" href="{% listurl order="state" %}">State</a>
+ {% endifequal %}
+ </th>
- <th>
- {% ifequal order.name "name" %}
- <a class="colactive"
- href="{% listurl order=order.reversed_name %}"><img
- src="/images/16-arrow-{% if order.reversed %}up{% else %}down{%endif%}.png"
- width="16" height="16"
- ></a> <a class="colactive"
- href="{% listurl order=order.reversed_name %}">Patch</a>
- {% else %}
- <a class="colinactive" href="{% listurl order="name" %}">Patch</a>
- {% endifequal %}
- </th>
-
- <th>
- {% ifequal order.name "date" %}
- <a class="colactive"
- href="{% listurl order=order.reversed_name %}"><img
- src="/images/16-arrow-{% if order.reversed %}up{% else %}down{%endif%}.png"
- width="16" height="16"
- ></a> <a class="colactive"
- href="{% listurl order=order.reversed_name %}">Date</a>
- {% else %}
- <a class="colinactive" href="{% listurl order="date" %}">Date</a>
- {% endifequal %}
- </th>
-
- <th>
- {% ifequal order.name "submitter" %}
- <a class="colactive"
- href="{% listurl order=order.reversed_name %}"><img
- src="/images/16-arrow-{% if order.reversed %}up{% else %}down{%endif%}.png"
- width="16" height="16"
- ></a> <a class="colactive"
- href="{% listurl order=order.reversed_name %}">Submitter</a>
- {% else %}
- <a class="colinactive" href="{% listurl order="submitter" %}">Submitter</a>
- {% endifequal %}
- </th>
-
- <th>
- {% ifequal order.name "delegate" %}
- <a class="colactive"
- href="{% listurl order=order.reversed_name %}"><img
- src="/images/16-arrow-{% if order.reversed %}up{% else %}down{%endif%}.png"
- width="16" height="16"
- ></a> <a class="colactive"
- href="{% listurl order=order.reversed_name %}">Delegate</a>
- {% else %}
- <a class="colinactive" href="{% listurl order="delegate" %}">Delegate</a>
- {% endifequal %}
- </th>
-
- <th>
- {% ifequal order.name "state" %}
- <a class="colactive"
- href="{% listurl order=order.reversed_name %}"><img
- src="/images/16-arrow-{% if order.reversed %}up{% else %}down{%endif%}.png"
- width="16" height="16"
- ></a> <a class="colactive"
- href="{% listurl order=order.reversed_name %}">State</a>
- {% else %}
- <a class="colinactive" href="{% listurl order="state" %}">State</a>
- {% endifequal %}
- </th>
-
- </tr>
+ </tr>
+ </thead>
{% if page %}
+ <tbody>
{% for patch in page.object_list %}
- <tr class="{% cycle 'odd' 'even' %}">
+ <tr id="patch_row:{{patch.id}}" class="{% cycle 'odd' 'even' %}">
{% if user.is_authenticated %}
<td>
<input type="checkbox" name="patch_id:{{patch.id}}"/>
@@ -113,6 +116,7 @@
<td>{{ patch.state }}</td>
</tr>
{% endfor %}
+ </tbody>
</table>
{% include "patchwork/pagination.html" %}