diff --git a/ietf/community/display.py b/ietf/community/display.py new file mode 100644 index 000000000..4bd5373af --- /dev/null +++ b/ietf/community/display.py @@ -0,0 +1,167 @@ +import datetime + +from django.db.models import Q + + +class DisplayField(object): + + codename = '' + description = '' + + def get_value(self, document): + return None + + +class FilenameField(DisplayField): + codename = 'filename' + description = 'I-D filename' + + def get_value(self, document): + return document.name + + +class TitleField(DisplayField): + codename = 'title' + description = 'I-D title' + + def get_value(self, document): + return document.title + + +class DateField(DisplayField): + codename = 'date' + description = 'Date of current I-D' + + def get_value(self, document): + dates = document.documentchangedates_set.all() + if dates and dates[0].new_version_date: + return dates[0].new_version_date + return document.time.strftime('%Y-%m-%d') + + +class StatusField(DisplayField): + codename = 'status' + description = 'Status in the IETF process' + + def get_value(self, document): + return document.state + + +class WGField(DisplayField): + codename = 'wg_rg' + description = 'Associated WG or RG' + + def get_value(self, document): + return document.group or '' + + +class ADField(DisplayField): + codename = 'ad' + description = 'Associated AD, if any' + + def get_value(self, document): + return document.ad or '' + + +class OneDayField(DisplayField): + codename = '1_day' + description = 'Changed within the last 1 day' + + def get_value(self, document): + now = datetime.datetime.now() + last = now - datetime.timedelta(days=1) + if document.documentchangedates_set.filter( + Q(new_version_date__gte=last) | + Q(normal_change_date__gte=last)): + return '✔' + return '' + + +class TwoDaysField(DisplayField): + codename = '2_days' + description = 'Changed within the last 2 days' + + def get_value(self, document): + now = datetime.datetime.now() + last = now - datetime.timedelta(days=2) + if document.documentchangedates_set.filter( + Q(new_version_date__gte=last) | + Q(normal_change_date__gte=last)): + return '✔' + return '' + + +class SevenDaysField(DisplayField): + codename = '7_days' + description = 'Changed within the last 7 days' + + def get_value(self, document): + now = datetime.datetime.now() + last = now - datetime.timedelta(days=7) + if document.documentchangedates_set.filter( + Q(new_version_date__gte=last) | + Q(normal_change_date__gte=last)): + return '✔' + return '' + + +TYPES_OF_DISPLAY_FIELDS = [(i.codename, i.description) for i in DisplayField.__subclasses__()] + + +class SortMethod(object): + codename = '' + description = '' + + def get_sort_field(self): + return 'pk' + + +class FilenameSort(SortMethod): + codename = 'by_filename' + description = 'Alphabetical by I-D filename and RFC number' + + def get_sort_field(self): + return 'name' + + +class TitleSort(SortMethod): + codename = 'by_title' + description = 'Alphabetical by document title' + + def get_sort_field(self): + return 'title' + + +class WGSort(SortMethod): + codename = 'by_wg' + description = 'Alphabetical by associated WG' + + def get_sort_field(self): + return 'group__name' + + +class PublicationSort(SortMethod): + codename = 'date_publication' + description = 'Date of publication of current version of the document' + + def get_sort_field(self): + return 'documentchangedates__new_version_date' + + +class ChangeSort(SortMethod): + codename = 'recent_change' + description = 'Date of most recent change of status of any type' + + def get_sort_field(self): + return 'documentchangedates__normal_change_date' + + +class SignificantSort(SortMethod): + codename = 'recent_significant' + description = 'Date of most recent significant change of status' + + def get_sort_field(self): + return 'documentchangedates__significant_change_date' + + +TYPES_OF_SORT = [(i.codename, i.description) for i in SortMethod.__subclasses__()] diff --git a/ietf/community/migrations/0002_add_display_config.py b/ietf/community/migrations/0002_add_display_config.py new file mode 100644 index 000000000..27661721b --- /dev/null +++ b/ietf/community/migrations/0002_add_display_config.py @@ -0,0 +1,231 @@ + +from south.db import db +from django.db import models +from ietf.community.models import * + +class Migration: + + def forwards(self, orm): + + # Adding model 'DisplayConfiguration' + db.create_table('community_displayconfiguration', ( + ('id', orm['community.displayconfiguration:id']), + ('community_list', orm['community.displayconfiguration:community_list']), + ('sort_method', orm['community.displayconfiguration:sort_method']), + ('display_fields', orm['community.displayconfiguration:display_fields']), + )) + db.send_create_signal('community', ['DisplayConfiguration']) + + + + def backwards(self, orm): + + # Deleting model 'DisplayConfiguration' + db.delete_table('community_displayconfiguration') + + + + 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.displayconfiguration': { + 'community_list': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['community.CommunityList']"}), + 'display_fields': ('django.db.models.fields.TextField', [], {}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'sort_method': ('django.db.models.fields.CharField', [], {'default': "'by_filename'", 'max_length': '100'}) + }, + '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/0003_add_notifications.py b/ietf/community/migrations/0003_add_notifications.py new file mode 100644 index 000000000..7b97730e6 --- /dev/null +++ b/ietf/community/migrations/0003_add_notifications.py @@ -0,0 +1,295 @@ + +from south.db import db +from django.db import models +from ietf.community.models import * + +class Migration: + + def forwards(self, orm): + + # Adding model 'ListNotification' + db.create_table('community_listnotification', ( + ('id', orm['community.listnotification:id']), + ('document', orm['community.listnotification:document']), + ('notification_date', orm['community.listnotification:notification_date']), + ('desc', orm['community.listnotification:desc']), + ('significant', orm['community.listnotification:significant']), + )) + db.send_create_signal('community', ['ListNotification']) + + # Adding model 'EmailSubscription' + db.create_table('community_emailsubscription', ( + ('id', orm['community.emailsubscription:id']), + ('community_list', orm['community.emailsubscription:community_list']), + ('email', orm['community.emailsubscription:email']), + ('significant', orm['community.emailsubscription:significant']), + )) + db.send_create_signal('community', ['EmailSubscription']) + + # Adding model 'DocumentChangeDates' + db.create_table('community_documentchangedates', ( + ('id', orm['community.documentchangedates:id']), + ('document', orm['community.documentchangedates:document']), + ('new_version_date', orm['community.documentchangedates:new_version_date']), + ('normal_change_date', orm['community.documentchangedates:normal_change_date']), + ('significant_change_date', orm['community.documentchangedates:significant_change_date']), + )) + db.send_create_signal('community', ['DocumentChangeDates']) + + # Adding model 'ExpectedChange' + db.create_table('community_expectedchange', ( + ('id', orm['community.expectedchange:id']), + ('community_list', orm['community.expectedchange:community_list']), + ('document', orm['community.expectedchange:document']), + ('expected_date', orm['community.expectedchange:expected_date']), + )) + db.send_create_signal('community', ['ExpectedChange']) + + + + def backwards(self, orm): + + # Deleting model 'ListNotification' + db.delete_table('community_listnotification') + + # Deleting model 'EmailSubscription' + db.delete_table('community_emailsubscription') + + # Deleting model 'DocumentChangeDates' + db.delete_table('community_documentchangedates') + + # Deleting model 'ExpectedChange' + db.delete_table('community_expectedchange') + + + + 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.displayconfiguration': { + 'community_list': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['community.CommunityList']"}), + 'display_fields': ('django.db.models.fields.TextField', [], {}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'sort_method': ('django.db.models.fields.CharField', [], {'default': "'by_filename'", 'max_length': '100'}) + }, + 'community.documentchangedates': { + 'document': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['doc.Document']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'new_version_date': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'normal_change_date': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'significant_change_date': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}) + }, + 'community.emailsubscription': { + 'community_list': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['community.CommunityList']"}), + 'email': ('django.db.models.fields.CharField', [], {'max_length': '200'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'significant': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}) + }, + 'community.expectedchange': { + 'community_list': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['community.CommunityList']"}), + 'document': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['doc.Document']"}), + 'expected_date': ('django.db.models.fields.DateField', [], {}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}) + }, + 'community.listnotification': { + 'desc': ('django.db.models.fields.TextField', [], {}), + 'document': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['doc.Document']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'notification_date': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'significant': ('django.db.models.fields.BooleanField', [], {'default': 'False', '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/models.py b/ietf/community/models.py index 012a1f74e..8706c3715 100644 --- a/ietf/community/models.py +++ b/ietf/community/models.py @@ -1,11 +1,14 @@ from django.contrib.auth.models import User from django.core.urlresolvers import reverse from django.db import models +from django.db.models import signals from redesign.doc.models import Document -from redesign.group.models import Group +from redesign.group.models import Group, Role -from ietf.community.rules import TYPES_OF_RULES +from ietf.community.rules import TYPES_OF_RULES, RuleManager +from ietf.community.display import (TYPES_OF_SORT, DisplayField, + SortMethod) class CommunityList(models.Model): @@ -24,9 +27,9 @@ class CommunityList(models.Model): 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) + return bool(Role.objects.filter(name__slug='ad', email__in=person.email_set.all(), group=self.group).count()) 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 bool(Role.objects.filter(name__slug='chair', email__in=person.email_set.all(), group=self.group).count()) return False def short_name(self): @@ -44,12 +47,37 @@ class CommunityList(models.Model): def __unicode__(self): return self.long_name() + def get_public_url(self): + if self.user: + return reverse('view_personal_list', None, args=(self.user.username, )) + else: + return reverse('view_group_list', None, args=(self.group.acronym, )) + 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, )) + def get_display_config(self): + dconfig = getattr(self, '_cached_dconfig', None) + if not dconfig: + self._cached_dconfig = DisplayConfiguration.objects.get_or_create(community_list=self)[0] + return self._cached_dconfig + return self._cached_dconfig + + def get_documents(self): + docs = self.added_ids.all().distinct() + for rule in self.rule_set.all(): + docs = docs | rule.cached_ids.all().distinct() + sort_field = self.get_display_config().get_sort_method().get_sort_field() + docs = docs.distinct().order_by(sort_field) + return docs + + def add_subscriptor(self, email, significant): + self.emailsubscription_set.get_or_create(email=email, significant=significant) + + class Rule(models.Model): community_list = models.ForeignKey(CommunityList) @@ -63,3 +91,143 @@ class Rule(models.Model): last_updated = models.DateTimeField( auto_now=True) + + def get_callable_rule(self): + for i in RuleManager.__subclasses__(): + if i.codename == self.rule_type: + return i(self.value) + return RuleManager(self.value) + + def save(self, *args, **kwargs): + super(Rule, self).save(*args, **kwargs) + rule = self.get_callable_rule() + self.cached_ids = rule.get_documents() + + +class DisplayConfiguration(models.Model): + + community_list = models.ForeignKey(CommunityList) + sort_method = models.CharField( + max_length=100, + choices=TYPES_OF_SORT, + default='by_filename', + blank=False, + null=False) + display_fields = models.TextField( + default='filename,title,date') + + def get_display_fields_config(self): + fields = self.display_fields and self.display_fields.split(',') or [] + config = [] + for i in DisplayField.__subclasses__(): + config.append({ + 'codename': i.codename, + 'description': i.description, + 'active': i.codename in fields, + }) + return config + + def get_active_fields(self): + fields = self.display_fields and self.display_fields.split(',') or '' + active_fields = [i for i in DisplayField.__subclasses__() if i.codename in fields] + return active_fields + + def get_sort_method(self): + for i in SortMethod.__subclasses__(): + if i.codename == self.sort_method: + return i() + return SortMethod() + + +class ExpectedChange(models.Model): + + community_list = models.ForeignKey(CommunityList) + document = models.ForeignKey(Document) + expected_date = models.DateField( + verbose_name='Expected date' + ) + + +class EmailSubscription(models.Model): + community_list = models.ForeignKey(CommunityList) + email = models.CharField(max_length=200) + significant = models.BooleanField(default=False) + + +class ListNotification(models.Model): + + document = models.ForeignKey(Document) + notification_date = models.DateTimeField(auto_now=True) + desc = models.TextField() + significant = models.BooleanField(default=False) + + def save(self, *args, **kwargs): + super(ListNotification, self).save(*args, **kwargs) + (changes, created) = DocumentChangeDates.objects.get_or_create(document=self.document) + if self.significant: + changes.significant_change_date = self.notification_date + changes.normal_change_date = self.notification_date + else: + changes.normal_change_date = self.notification_date + changes.save() + + +def save_previous_states(sender, instance, **kwargs): + if isinstance(instance, Document) and not instance.pk: + instance.new_document = True + elif isinstance(instance, Document): + original = Document.objects.get(pk=instance.pk) + instance.prev_state = original.state + instance.prev_wg_state = original.wg_state + instance.prev_iesg_state = original.iesg_state + instance.prev_iana_state = original.iana_state + instance.prev_rfc_state = original.rfc_state + + +def create_notifications(sender, instance, **kwargs): + if not isinstance(instance, Document): + return + if getattr(instance, 'new_document', False): + ListNotification.objects.create( + document=instance, + significant=True, + desc='New document created %s: %s' % (instance.name, instance.title) + ) + return + if getattr(instance, 'prev_state', False) != False: + desc = '' + significant = False + if instance.prev_state != instance.state: + desc += 'State changed from %s to %s\n' % (instance.prev_state, instance.state) + if instance.prev_wg_state != instance.wg_state: + desc += 'WG state changed from %s to %s\n' % (instance.prev_wg_state, instance.wg_state) + if instance.iesg_state.name in ['Adopted by a WG', 'In WG Last Call', + 'WG Consensus: Waiting for Write-up', + 'Parked WG document', 'Dead WG document']: + significant = True + if instance.prev_iesg_state != instance.iesg_state: + desc += 'IESG state changed from %s to %s\n' % (instance.prev_iesg_state, instance.iesg_state) + if instance.iesg_state.name in ['RFC Published', 'Dead', 'Approved-announcement sent', + 'Publication Requested', 'In Last Call', 'IESG Evaluation', + 'Sent to the RFC Editor']: + significant = True + if instance.prev_iana_state != instance.iana_state: + desc += 'Iana state changed from %s to %s\n' % (instance.prev_iana_state, instance.iana_state) + if instance.prev_rfc_state != instance.rfc_state: + desc += 'RFC state changed from %s to %s\n' % (instance.prev_rfc_state, instance.rfc_state) + if desc: + ListNotification.objects.create( + document=instance, + significant=significant, + desc=desc + ) +signals.pre_save.connect(save_previous_states) +signals.post_save.connect(create_notifications) + + +class DocumentChangeDates(models.Model): + + document = models.ForeignKey(Document) + new_version_date = models.DateTimeField(blank=True, null=True) + normal_change_date = models.DateTimeField(blank=True, null=True) + significant_change_date = models.DateTimeField(blank=True, null=True) diff --git a/ietf/community/rules.py b/ietf/community/rules.py index 76bcf2733..8731462a8 100644 --- a/ietf/community/rules.py +++ b/ietf/community/rules.py @@ -1,3 +1,8 @@ +from django.db.models import Q + +from redesign.doc.models import Document + + class RuleManager(object): codename = '' @@ -10,33 +15,48 @@ class RuleManager(object): return value def get_documents(self): - return [] + return Document.objects.none() class WgAsociatedRule(RuleManager): codename = 'wg_asociated' - description = 'All I-Ds associated with an particular WG' + description = 'All I-Ds associated with a particular WG' + + def get_documents(self): + return Document.objects.filter(group__acronym=self.value) class AreaAsociatedRule(RuleManager): codename = 'area_asociated' - description = 'All I-Ds associated with all WGs in an particular Area' + description = 'All I-Ds associated with all WGs in a particular Area' + + def get_documents(self): + return Document.objects.filter(group__parent__acronym=self.value, group__parent__type='area') class AdResponsibleRule(RuleManager): codename = 'ad_responsible' description = 'All I-Ds with a particular responsible AD' + def get_documents(self): + return Document.objects.filter(ad__name__icontains=self.value) + class AuthorRule(RuleManager): codename = 'author' description = 'All I-Ds with a particular author' + def get_documents(self): + return Document.objects.filter(authors__person__name__icontains=self.value) + class ShepherdRule(RuleManager): codename = 'shepherd' description = 'All I-Ds with a particular document shepherd' + def get_documents(self): + return Document.objects.filter(shepherd__name__icontains=self.value) + class ReferenceToRFCRule(RuleManager): codename = 'reference_to_rfc' @@ -62,5 +82,8 @@ class WithTextRule(RuleManager): codename = 'with_text' description = 'All I-Ds that contain a particular text string' + def get_documents(self): + return Document.objects.filter(Q(title__icontains=self.value) | Q(abstract__icontains=self.value)) + TYPES_OF_RULES = [(i.codename, i.description) for i in RuleManager.__subclasses__()]