From 3ae03b7899b45e312b73fd5c8f8ed0d1e6ad9527 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20A=2E=20S=C3=A1nchez=20L=C3=B3pez?= Date: Tue, 16 Aug 2011 08:12:27 +0000 Subject: [PATCH] Added new community app. See #701 - Legacy-Id: 3319 --- ietf/community/__init__.py | 0 .../migrations/0001_initial_migration.py | 257 ++++++++++++++++++ ietf/community/migrations/__init__.py | 0 ietf/community/models.py | 65 +++++ ietf/community/rules.py | 66 +++++ ietf/community/templatetags/__init__.py | 0 ietf/community/templatetags/community_tags.py | 46 ++++ ietf/community/urls.py | 7 + ietf/community/views.py | 37 +++ ietf/settings.py | 1 + ietf/templates/base_leftmenu.html | 11 +- ietf/templates/community/manage_clist.html | 20 ++ ietf/urls.py | 1 + 13 files changed, 510 insertions(+), 1 deletion(-) create mode 100644 ietf/community/__init__.py create mode 100644 ietf/community/migrations/0001_initial_migration.py create mode 100644 ietf/community/migrations/__init__.py create mode 100644 ietf/community/models.py create mode 100644 ietf/community/rules.py create mode 100644 ietf/community/templatetags/__init__.py create mode 100644 ietf/community/templatetags/community_tags.py create mode 100644 ietf/community/urls.py create mode 100644 ietf/community/views.py create mode 100644 ietf/templates/community/manage_clist.html diff --git a/ietf/community/__init__.py b/ietf/community/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/ietf/community/migrations/0001_initial_migration.py b/ietf/community/migrations/0001_initial_migration.py new file mode 100644 index 000000000..df84340f4 --- /dev/null +++ b/ietf/community/migrations/0001_initial_migration.py @@ -0,0 +1,257 @@ + +from south.db import db +from django.db import models +from ietf.community.models import * + +class Migration: + + def forwards(self, orm): + + # Adding model 'Rule' + db.create_table('community_rule', ( + ('id', orm['community.Rule:id']), + ('community_list', orm['community.Rule:community_list']), + ('rule_type', orm['community.Rule:rule_type']), + ('value', orm['community.Rule:value']), + ('last_updated', orm['community.Rule:last_updated']), + )) + db.send_create_signal('community', ['Rule']) + + # Adding model 'CommunityList' + db.create_table('community_communitylist', ( + ('id', orm['community.CommunityList:id']), + ('user', orm['community.CommunityList:user']), + ('group', orm['community.CommunityList:group']), + )) + db.send_create_signal('community', ['CommunityList']) + + # Adding ManyToManyField 'Rule.cached_ids' + db.create_table('community_rule_cached_ids', ( + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), + ('rule', models.ForeignKey(orm.Rule, null=False)), + ('document', models.ForeignKey(orm['doc.Document'], null=False)) + )) + + # Adding ManyToManyField 'CommunityList.added_ids' + db.create_table('community_communitylist_added_ids', ( + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), + ('communitylist', models.ForeignKey(orm.CommunityList, null=False)), + ('document', models.ForeignKey(orm['doc.Document'], null=False)) + )) + + + + def backwards(self, orm): + + # Deleting model 'Rule' + db.delete_table('community_rule') + + # Deleting model 'CommunityList' + db.delete_table('community_communitylist') + + # Dropping ManyToManyField 'Rule.cached_ids' + db.delete_table('community_rule_cached_ids') + + # Dropping ManyToManyField 'CommunityList.added_ids' + db.delete_table('community_communitylist_added_ids') + + + + models = { + 'auth.group': { + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), + 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'blank': 'True'}) + }, + 'auth.permission': { + 'Meta': {'unique_together': "(('content_type', 'codename'),)"}, + 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) + }, + 'auth.user': { + 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), + 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}), + 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'blank': 'True'}), + 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) + }, + 'community.communitylist': { + 'added_ids': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['doc.Document']"}), + 'group': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['group.Group']", 'null': 'True', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']", 'null': 'True', 'blank': 'True'}) + }, + 'community.rule': { + 'cached_ids': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['doc.Document']"}), + 'community_list': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['community.CommunityList']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'last_updated': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'rule_type': ('django.db.models.fields.CharField', [], {'max_length': '30'}), + 'value': ('django.db.models.fields.CharField', [], {'max_length': '255'}) + }, + 'contenttypes.contenttype': { + 'Meta': {'unique_together': "(('app_label', 'model'),)", 'db_table': "'django_content_type'"}, + 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) + }, + 'doc.docalias': { + 'document': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['doc.Document']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'db_index': 'True'}) + }, + 'doc.document': { + 'abstract': ('django.db.models.fields.TextField', [], {}), + 'ad': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'ad_document_set'", 'null': 'True', 'to': "orm['person.Person']"}), + 'authors': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['person.Email']", 'blank': 'True'}), + 'external_url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}), + 'group': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['group.Group']", 'null': 'True', 'blank': 'True'}), + 'iana_state': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['name.IanaDocStateName']", 'null': 'True', 'blank': 'True'}), + 'iesg_state': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['name.IesgDocStateName']", 'null': 'True', 'blank': 'True'}), + 'intended_std_level': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['name.IntendedStdLevelName']", 'null': 'True', 'blank': 'True'}), + 'internal_comments': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'primary_key': 'True'}), + 'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'notify': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), + 'pages': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'related': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['doc.DocAlias']", 'blank': 'True'}), + 'rev': ('django.db.models.fields.CharField', [], {'max_length': '16', 'blank': 'True'}), + 'rfc_state': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['name.RfcDocStateName']", 'null': 'True', 'blank': 'True'}), + 'shepherd': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'shepherd_document_set'", 'null': 'True', 'to': "orm['person.Person']"}), + 'state': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['name.DocStateName']", 'null': 'True', 'blank': 'True'}), + 'std_level': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['name.StdLevelName']", 'null': 'True', 'blank': 'True'}), + 'stream': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['name.DocStreamName']", 'null': 'True', 'blank': 'True'}), + 'tags': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['name.DocInfoTagName']", 'null': 'True', 'blank': 'True'}), + 'time': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['name.DocTypeName']", 'null': 'True', 'blank': 'True'}), + 'wg_state': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['name.WgDocStateName']", 'null': 'True', 'blank': 'True'}) + }, + 'group.group': { + 'acronym': ('django.db.models.fields.CharField', [], {'max_length': '16', 'db_index': 'True'}), + 'ad': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['person.Person']", 'null': 'True', 'blank': 'True'}), + 'charter': ('django.db.models.fields.related.OneToOneField', [], {'blank': 'True', 'related_name': "'chartered_group'", 'unique': 'True', 'null': 'True', 'to': "orm['doc.Document']"}), + 'comments': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'list_archive': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), + 'list_email': ('django.db.models.fields.CharField', [], {'max_length': '64', 'blank': 'True'}), + 'list_subscribe': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '80'}), + 'parent': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['group.Group']", 'null': 'True', 'blank': 'True'}), + 'state': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['name.GroupStateName']", 'null': 'True'}), + 'time': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['name.GroupTypeName']", 'null': 'True'}) + }, + 'name.docinfotagname': { + 'desc': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '32'}), + 'order': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'slug': ('django.db.models.fields.CharField', [], {'max_length': '8', 'primary_key': 'True'}), + 'used': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}) + }, + 'name.docstatename': { + 'desc': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '32'}), + 'order': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'slug': ('django.db.models.fields.CharField', [], {'max_length': '8', 'primary_key': 'True'}), + 'used': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}) + }, + 'name.docstreamname': { + 'desc': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '32'}), + 'order': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'slug': ('django.db.models.fields.CharField', [], {'max_length': '8', 'primary_key': 'True'}), + 'used': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}) + }, + 'name.doctypename': { + 'desc': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '32'}), + 'order': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'slug': ('django.db.models.fields.CharField', [], {'max_length': '8', 'primary_key': 'True'}), + 'used': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}) + }, + 'name.groupstatename': { + 'desc': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '32'}), + 'order': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'slug': ('django.db.models.fields.CharField', [], {'max_length': '8', 'primary_key': 'True'}), + 'used': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}) + }, + 'name.grouptypename': { + 'desc': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '32'}), + 'order': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'slug': ('django.db.models.fields.CharField', [], {'max_length': '8', 'primary_key': 'True'}), + 'used': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}) + }, + 'name.ianadocstatename': { + 'desc': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '32'}), + 'order': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'slug': ('django.db.models.fields.CharField', [], {'max_length': '8', 'primary_key': 'True'}), + 'used': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}) + }, + 'name.iesgdocstatename': { + 'desc': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '32'}), + 'order': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'slug': ('django.db.models.fields.CharField', [], {'max_length': '8', 'primary_key': 'True'}), + 'used': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}) + }, + 'name.intendedstdlevelname': { + 'desc': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '32'}), + 'order': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'slug': ('django.db.models.fields.CharField', [], {'max_length': '8', 'primary_key': 'True'}), + 'used': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}) + }, + 'name.rfcdocstatename': { + 'desc': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '32'}), + 'order': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'slug': ('django.db.models.fields.CharField', [], {'max_length': '8', 'primary_key': 'True'}), + 'used': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}) + }, + 'name.stdlevelname': { + 'desc': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '32'}), + 'order': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'slug': ('django.db.models.fields.CharField', [], {'max_length': '8', 'primary_key': 'True'}), + 'used': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}) + }, + 'name.wgdocstatename': { + 'desc': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '32'}), + 'order': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'slug': ('django.db.models.fields.CharField', [], {'max_length': '8', 'primary_key': 'True'}), + 'used': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}) + }, + 'person.email': { + 'active': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}), + 'address': ('django.db.models.fields.CharField', [], {'max_length': '64', 'primary_key': 'True'}), + 'person': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['person.Person']", 'null': 'True'}), + 'time': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}) + }, + 'person.person': { + 'address': ('django.db.models.fields.TextField', [], {'max_length': '255', 'blank': 'True'}), + 'ascii': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'ascii_short': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'db_index': 'True'}), + 'time': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'user': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['auth.User']", 'unique': 'True', 'null': 'True', 'blank': 'True'}) + } + } + + complete_apps = ['community'] diff --git a/ietf/community/migrations/__init__.py b/ietf/community/migrations/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/ietf/community/models.py b/ietf/community/models.py new file mode 100644 index 000000000..012a1f74e --- /dev/null +++ b/ietf/community/models.py @@ -0,0 +1,65 @@ +from django.contrib.auth.models import User +from django.core.urlresolvers import reverse +from django.db import models + +from redesign.doc.models import Document +from redesign.group.models import Group + +from ietf.community.rules import TYPES_OF_RULES + + +class CommunityList(models.Model): + + user = models.ForeignKey(User, blank=True, null=True) + group = models.ForeignKey(Group, blank=True, null=True) + added_ids = models.ManyToManyField(Document) + + def check_manager(self, user): + if user == self.user: + return True + if not self.group or self.group.type.slug not in ('area', 'wg'): + return False + try: + person = user.get_profile() + except: + return False + if self.group.type.slug == 'area': + return bool(Role.objects.filter(name__slug='ad', email__in=person.email_set.all()).count(), group=self.group) + elif self.group.type.slug == 'wg': + return bool(Role.objects.filter(name__slug='chair', email__in=person.email_set.all()).count(), group=self.group) + return False + + def short_name(self): + if self.user: + return 'Personal list' + else: + return '%s list' % self.group.acronym + + def long_name(self): + if self.user: + return 'Personal ID list of %s' % self.user.username + else: + return 'ID list for %s' % self.group.name + + def __unicode__(self): + return self.long_name() + + def get_manage_url(self): + if self.user: + return reverse('manage_personal_list', None, args=(self.user.username, )) + else: + return reverse('manage_group_list', None, args=(self.group.acronym, )) + +class Rule(models.Model): + + community_list = models.ForeignKey(CommunityList) + cached_ids = models.ManyToManyField(Document) + + rule_type = models.CharField( + max_length=30, + choices=TYPES_OF_RULES) + value = models.CharField( + max_length=255) + + last_updated = models.DateTimeField( + auto_now=True) diff --git a/ietf/community/rules.py b/ietf/community/rules.py new file mode 100644 index 000000000..76bcf2733 --- /dev/null +++ b/ietf/community/rules.py @@ -0,0 +1,66 @@ +class RuleManager(object): + + codename = '' + description = '' + + def __init__(self, value): + self.value = self.get_value(value) + + def get_value(self, value): + return value + + def get_documents(self): + return [] + + +class WgAsociatedRule(RuleManager): + codename = 'wg_asociated' + description = 'All I-Ds associated with an particular WG' + + +class AreaAsociatedRule(RuleManager): + codename = 'area_asociated' + description = 'All I-Ds associated with all WGs in an particular Area' + + +class AdResponsibleRule(RuleManager): + codename = 'ad_responsible' + description = 'All I-Ds with a particular responsible AD' + + +class AuthorRule(RuleManager): + codename = 'author' + description = 'All I-Ds with a particular author' + + +class ShepherdRule(RuleManager): + codename = 'shepherd' + description = 'All I-Ds with a particular document shepherd' + + +class ReferenceToRFCRule(RuleManager): + codename = 'reference_to_rfc' + description = 'All I-Ds that have a reference to a particular RFC' + + +class ReferenceToIDRule(RuleManager): + codename = 'reference_to_id' + description = 'All I-Ds that have a reference to a particular I-D' + + +class ReferenceFromRFCRule(RuleManager): + codename = 'reference_from_rfc' + description = 'All I-Ds that are referenced by a particular RFC' + + +class ReferenceFromIDRule(RuleManager): + codename = 'reference_from_id' + description = 'All I-Ds that are referenced by a particular I-D' + + +class WithTextRule(RuleManager): + codename = 'with_text' + description = 'All I-Ds that contain a particular text string' + + +TYPES_OF_RULES = [(i.codename, i.description) for i in RuleManager.__subclasses__()] diff --git a/ietf/community/templatetags/__init__.py b/ietf/community/templatetags/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/ietf/community/templatetags/community_tags.py b/ietf/community/templatetags/community_tags.py new file mode 100644 index 000000000..cd9426589 --- /dev/null +++ b/ietf/community/templatetags/community_tags.py @@ -0,0 +1,46 @@ +from django import template + +from ietf.community.models import CommunityList +from redesign.group.models import Role + + +register = template.Library() + + +class CommunityListNode(template.Node): + + def __init__(self, user, var_name): + self.user = user + self.var_name = var_name + + def render(self, context): + user = self.user.resolve(context) + if not user or not user.is_authenticated(): + return '' + lists = {'personal': CommunityList.objects.get_or_create(user=user)[0]} + try: + person = user.get_profile() + groups = [] + managed_areas = [i.group for i in Role.objects.filter(name__slug='ad', email__in=person.email_set.all())] + groups += list(CommunityList.objects.filter(group__in=managed_areas)) + managed_wg = [i.group for i in Role.objects.filter(name__slug='chair', group__type__slug='wg', email__in=person.email_set.all())] + groups += list(CommunityList.objects.filter(group__in=managed_wg)) + lists['group'] = groups + except: + pass + context.update({self.var_name: lists}) + return '' + + +@register.tag +def get_user_managed_lists(parser, token): + firstbits = token.contents.split(None, 2) + if len(firstbits) != 3: + raise TemplateSyntaxError("'get_user_managed_lists' tag takes three arguments") + user = parser.compile_filter(firstbits[1]) + lastbits_reversed = firstbits[2][::-1].split(None, 2) + if lastbits_reversed[1][::-1] != 'as': + raise TemplateSyntaxError("next-to-last argument to 'get_user_managed_lists' tag must" + " be 'as'") + var_name = lastbits_reversed[0][::-1] + return CommunityListNode(user, var_name) diff --git a/ietf/community/urls.py b/ietf/community/urls.py new file mode 100644 index 000000000..b2e336643 --- /dev/null +++ b/ietf/community/urls.py @@ -0,0 +1,7 @@ +from django.conf.urls.defaults import patterns, url + + +urlpatterns = patterns('ietf.community.views', + url(r'^personal/(?P[\w.@+-]+)/$', 'manage_personal_list', name='manage_personal_list'), + url(r'^group/(?P[\w.@+-]+)/$', 'manage_group_list', name='manage_group_list'), +) diff --git a/ietf/community/views.py b/ietf/community/views.py new file mode 100644 index 000000000..7645121f9 --- /dev/null +++ b/ietf/community/views.py @@ -0,0 +1,37 @@ +import datetime +import hashlib + +from django.conf import settings +from django.contrib.auth.models import User +from django.http import HttpResponse, Http404, HttpResponseForbidden +from django.shortcuts import get_object_or_404, render_to_response +from django.template import RequestContext +from django.utils import simplejson +from django.utils.translation import ugettext as _ + +from ietf.community.models import CommunityList +from redesign.group.models import Group + + +def _manage_list(request, clist): + return render_to_response('community/manage_clist.html', + {'cl': clist}, + context_instance=RequestContext(request)) + + +def manage_personal_list(request, username): + user = get_object_or_404(User, username=username) + clist = CommunityList.objects.get_or_create(user=request.user)[0] + if not clist.check_manager(request.user): + return HttpResponseForbidden('You have no permission to access this view') + return _manage_list(request, clist) + + +def manage_group_list(request, acronym): + group = get_object_or_404(Group, acronym=acronym) + if group.type.slug not in ('area', 'wg'): + raise Http404 + clist = CommunityList.objects.get_or_create(group=group)[0] + if not clist.check_manager(request.user): + return HttpResponseForbidden('You have no permission to access this view') + return _manage_list(request, clist) diff --git a/ietf/settings.py b/ietf/settings.py index 0a0545770..fb75c6e8c 100644 --- a/ietf/settings.py +++ b/ietf/settings.py @@ -139,6 +139,7 @@ INSTALLED_APPS = ( 'ietf.redirects', 'ietf.idrfc', 'ietf.wginfo', + 'ietf.community', ) INTERNAL_IPS = ( diff --git a/ietf/templates/base_leftmenu.html b/ietf/templates/base_leftmenu.html index a54a89c8d..0ea082206 100644 --- a/ietf/templates/base_leftmenu.html +++ b/ietf/templates/base_leftmenu.html @@ -33,7 +33,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. {% endcomment %} {% load wg_menu %} -{% load ietf_filters %} +{% load ietf_filters community_tags %}
    {% if user|in_group:"Area_Director" %}
  • AD Dashboard
  • @@ -61,6 +61,15 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  • Concluded WGs
  • Non-WG Lists
  • +{% get_user_managed_lists user as community_lists %} +{% if community_lists %} +
  • Community ID lists
  • +
  • {{ community_lists.personal.short_name }} + {% for cl in community_lists.group %} +
  • {{ cl.short_name }} + {% endfor %} +{% endif %} +
  • Drafts & RFCs
  • Search
  • diff --git a/ietf/templates/community/manage_clist.html b/ietf/templates/community/manage_clist.html new file mode 100644 index 000000000..339c12391 --- /dev/null +++ b/ietf/templates/community/manage_clist.html @@ -0,0 +1,20 @@ +{% extends "base.html" %} + +{% block title %}{{ cl.long_name }}{% endblock %} + +{% block content %} +

    {{ cl.long_name }}

    +

    Feel free to share the following links if you need it.

    + + +

    Rules added to this list

    + +

    Documents added to this list

    +{% for doc in cl.added_ids.all %} + {{ doc }} +{% endfor %} + +{% endblock %} diff --git a/ietf/urls.py b/ietf/urls.py index f81fbbcb2..af0a56f71 100644 --- a/ietf/urls.py +++ b/ietf/urls.py @@ -59,6 +59,7 @@ urlpatterns = patterns('', (r'^doc/', include('ietf.idrfc.urls')), (r'^wg/', include('ietf.wginfo.urls')), (r'^registration/', include('ietf.registration.urls')), + (r'^community/', include('ietf.community.urls')), (r'^$', 'ietf.idrfc.views.main'), ('^admin/', include(admin.site.urls)),