diff --git a/sites/scrapy.org/site/apps/link/models.py b/sites/scrapy.org/site/apps/link/models.py
index 747992185..47c3f8626 100644
--- a/sites/scrapy.org/site/apps/link/models.py
+++ b/sites/scrapy.org/site/apps/link/models.py
@@ -36,8 +36,6 @@ class Link(models.Model):
text = models.CharField(_("text"), max_length=1024, core=True, blank=False)
address = models.CharField(_("address"), max_length=1024, core=True,
blank=False)
- group = models.ManyToManyField(Group, verbose_name=_("group"), blank=True,
- null=False)
# automatic dates
created = models.DateTimeField(core=True, editable=False)
@@ -58,4 +56,44 @@ class Link(models.Model):
class Admin:
list_display = ("text", "address",)
- list_filter = ("group", )
+
+
+class GroupLink(models.Model):
+ group = models.ForeignKey(Group, core=True, null=False, blank=False)
+ link = models.ForeignKey(Link, core=True, null=False, blank=False)
+ position = models.IntegerField(_("position"), core=True, default=0)
+
+ # automatic dates
+ created = models.DateTimeField(core=True, editable=False)
+ updated = models.DateTimeField(core=True, editable=False)
+
+ def position_up(self):
+ self.position += 1
+ self.save()
+
+ def position_down(self):
+ self.position -= 1
+ self.save()
+
+ def save(self):
+ if not self.id:
+ self.created = datetime.now()
+ self.updated = datetime.now()
+ super(GroupLink, self).save()
+
+ # ugly, but django-admin isn't very versatile right now
+ def position_link(self):
+ return _("%(position)s (Up" \
+ " | Down)") % \
+ { "position": self.position, "id": self.id }
+ position_link.short_description = u"order"
+ position_link.allow_tags = True
+
+ class Admin:
+ list_display = ("group", "link", "position_link")
+ list_filter = ("group",)
+
+ class Meta:
+ verbose_name = _("group link")
+ verbose_name_plural = _("group links")
+ ordering = [ "position", ]
diff --git a/sites/scrapy.org/site/apps/link/templatetags/link_tags.py b/sites/scrapy.org/site/apps/link/templatetags/link_tags.py
index c8e89d6ea..aaafbc7f3 100644
--- a/sites/scrapy.org/site/apps/link/templatetags/link_tags.py
+++ b/sites/scrapy.org/site/apps/link/templatetags/link_tags.py
@@ -2,7 +2,7 @@ from django import template
from lib.templatetags import *
-from link.models import Group
+from link.models import GroupLink
register = template.Library()
@@ -27,6 +27,5 @@ class LoadLinksNode(template.Node):
self.var_name = var_name
def render(self, context):
- group = Group.objects.get(slug=self.slug)
- context[self.var_name] = group and group.link_set.all() or []
+ context[self.var_name] = GroupLink.objects.filter(group__slug=self.slug)
return ''
diff --git a/sites/scrapy.org/site/apps/link/urls.py b/sites/scrapy.org/site/apps/link/urls.py
new file mode 100644
index 000000000..66ae7a0c3
--- /dev/null
+++ b/sites/scrapy.org/site/apps/link/urls.py
@@ -0,0 +1,9 @@
+from django.conf.urls.defaults import *
+
+from link.views import *
+
+
+urlpatterns = patterns('',
+ (r"^(?P\d+)/position/up/$", position_up),
+ (r"^(?P\d+)/position/down/$", position_down),
+)
diff --git a/sites/scrapy.org/site/apps/link/views.py b/sites/scrapy.org/site/apps/link/views.py
index 60f00ef0e..bebb50c70 100644
--- a/sites/scrapy.org/site/apps/link/views.py
+++ b/sites/scrapy.org/site/apps/link/views.py
@@ -1 +1,16 @@
-# Create your views here.
+from django.shortcuts import get_object_or_404
+from django.http import HttpResponseRedirect
+
+from link.models import GroupLink
+
+
+def position_up(request, grouplink_id):
+ grouplink = get_object_or_404(GroupLink, pk=grouplink_id)
+ grouplink.position_up()
+ return HttpResponseRedirect("/admin/link/grouplink/")
+
+
+def position_down(request, grouplink_id):
+ grouplink = get_object_or_404(GroupLink, pk=grouplink_id)
+ grouplink.position_down()
+ return HttpResponseRedirect("/admin/link/grouplink/")