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')]
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)
--- /dev/null
+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
+ });
+});
<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}}"/>
<td>{{ patch.state }}</td>
</tr>
{% endfor %}
+ </tbody>
</table>
{% include "patchwork/pagination.html" %}