class NewsTagAdmin(PgwebAdmin):
list_display = ('urlname', 'name', 'description')
+ filter_horizontal = ('allowed_orgs', )
admin.site.register(NewsArticle, NewsArticleAdmin)
'tags': {t.id: t.description for t in NewsTag.objects.all()}
}
+ def clean(self):
+ data = super().clean()
+
+ if 'tags' not in data:
+ self.add_error('tags', 'Select one or more tags')
+ else:
+ for t in data['tags']:
+ # Check each tag for permissions. This is not very db-efficient, but people
+ # don't save news articles that often...
+ if t.allowed_orgs.exists() and not t.allowed_orgs.filter(pk=data['org'].pk).exists():
+ self.add_error('tags',
+ 'The organisation {} is not allowed to use the tag {}.'.format(
+ data['org'],
+ t,
+ ))
+
+ return data
+
class Meta:
model = NewsArticle
exclude = ('submitter', 'approved', 'tweeted')
--- /dev/null
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11.27 on 2020-07-04 15:47
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('core', '0002_block_oauth'),
+ ('news', '0003_news_tags'),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name='newstag',
+ name='allowed_orgs',
+ field=models.ManyToManyField(blank=True, help_text='Organisations allowed to use this tag', to='core.Organisation'),
+ ),
+ migrations.AddField(
+ model_name='newstag',
+ name='sortkey',
+ field=models.IntegerField(default=100),
+ ),
+ migrations.AlterModelOptions(
+ name='newstag',
+ options={'ordering': ('sortkey', 'urlname', )},
+ )
+ ]
urlname = models.CharField(max_length=20, null=False, blank=False, unique=True)
name = models.CharField(max_length=32, null=False, blank=False)
description = models.CharField(max_length=200, null=False, blank=False)
+ allowed_orgs = models.ManyToManyField(Organisation, blank=True,
+ help_text="Organisations allowed to use this tag")
+ sortkey = models.IntegerField(null=False, blank=False, default=100)
def __str__(self):
return self.name
class Meta:
- ordering = ('urlname', )
+ ordering = ('sortkey', 'urlname', )
class NewsArticle(models.Model):
def taglist_json(request):
return HttpResponse(json.dumps({
- 'tags': [{'name': t.urlname, 'description': t.description} for t in NewsTag.objects.distinct('urlname')],
+ 'tags': [{
+ 'urlname': t.urlname,
+ 'name': t.name,
+ 'description': t.description,
+ 'sortkey': t.sortkey,
+ } for t in NewsTag.objects.order_by('urlname').distinct('urlname')],
}), content_type='application/json')