on_delete=models.CASCADE) description = models.CharField(max_length=255, verbose_name=_("description")) url = models.URLField(verbose_name=_("url")) order = models.IntegerField(blank=True, null=True) class Meta(object): verbose_name = _("contest menu link") verbose_name_plural = _("contest menu links") def contest_links_generator(request): if not hasattr(request, 'contest'): return links = ContestLink.objects.filter(contest=request.contest) for link in links: # pylint: disable=cell-var-from-loop # http://docs.python-guide.org/en/latest/writing/gotchas/#late-binding-closures url_generator = lambda request, url=link.url: url item = MenuItem( name='contest_link_%d' % link.id, text=link.description, url_generator=url_generator, order=link.order, ) yield item menu_registry.register_generator('contest_links', contest_links_generator)
return u'%s,%s' % (self.user, self.contest) class ContestLink(models.Model): contest = models.ForeignKey(Contest, verbose_name=_("contest"), on_delete=models.CASCADE) description = models.CharField(max_length=255, verbose_name=_("description")) url = models.URLField(verbose_name=_("url")) order = models.IntegerField(blank=True, null=True) class Meta(object): verbose_name = _("contest menu link") verbose_name_plural = _("contest menu links") def contest_links_generator(request): links = ContestLink.objects.filter(contest=request.contest) for link in links: # pylint: disable=cell-var-from-loop # http://docs.python-guide.org/en/latest/writing/gotchas/#late-binding-closures url_generator = lambda request, url=link.url: url item = MenuItem( name='contest_link_%d' % link.id, text=link.description, url_generator=url_generator, order=link.order ) yield item menu_registry.register_generator('contest_links', contest_links_generator)