Merged in fixes to the migration from olau@iola.dk. Merged in charter branch from olau@iola.dk. Added various fixes and correction of merge errors.

- Legacy-Id: 4353
This commit is contained in:
Henrik Levkowetz 2012-05-02 19:35:32 +00:00
commit bcd28cc45f
135 changed files with 4869 additions and 4050 deletions

View file

@ -1,3 +1,4 @@
from django.template.defaultfilters import slugify
from django.utils.safestring import mark_safe
from django.contrib import admin
from django import forms
@ -43,7 +44,7 @@ class StatesWidget(forms.SelectMultiple):
html = []
first = True
for label, states in categorized_choices:
htmlid = "id_%s_%s" % (name, label)
htmlid = "id_%s_%s" % (name, slugify(label))
html.append('<div style="clear:both;padding-top:%s">' % ("1em" if first else "0.5em"))
html.append(u'<label for="%s">%s:</label>' % (htmlid, label))
@ -108,11 +109,14 @@ class DocHistoryAdmin(admin.ModelAdmin):
admin.site.register(DocHistory, DocHistoryAdmin)
class DocAliasAdmin(admin.ModelAdmin):
list_display = [ 'name', 'document_link', ]
search_fields = [ 'name', 'document__name', ]
list_display = ['name', 'document_link']
search_fields = ['name', 'document__name']
raw_id_fields = ['document']
admin.site.register(DocAlias, DocAliasAdmin)
class BallotTypeAdmin(admin.ModelAdmin):
list_display = ["slug", "doc_type", "name", "question"]
admin.site.register(BallotType, BallotTypeAdmin)
# events
@ -126,12 +130,13 @@ class DocEventAdmin(admin.ModelAdmin):
admin.site.register(DocEvent, DocEventAdmin)
admin.site.register(NewRevisionDocEvent, DocEventAdmin)
admin.site.register(BallotDocEvent, DocEventAdmin)
admin.site.register(WriteupDocEvent, DocEventAdmin)
admin.site.register(LastCallDocEvent, DocEventAdmin)
admin.site.register(TelechatDocEvent, DocEventAdmin)
class BallotPositionDocEventAdmin(DocEventAdmin):
raw_id_fields = ["doc", "by", "ad"]
raw_id_fields = ["doc", "by", "ad", "ballot"]
admin.site.register(BallotPositionDocEvent, BallotPositionDocEventAdmin)

View file

@ -0,0 +1,648 @@
# encoding: utf-8
import datetime
from south.db import db
from south.v2 import SchemaMigration
from django.db import models
class Migration(SchemaMigration):
def forwards(self, orm):
# Adding model 'StateType'
db.create_table('doc_statetype', (
('slug', self.gf('django.db.models.fields.CharField')(max_length=30, primary_key=True)),
('label', self.gf('django.db.models.fields.CharField')(max_length=255)),
))
db.send_create_signal('doc', ['StateType'])
# Adding model 'State'
db.create_table('doc_state', (
('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
('type', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['doc.StateType'])),
('slug', self.gf('django.db.models.fields.SlugField')(max_length=50, db_index=True)),
('name', self.gf('django.db.models.fields.CharField')(max_length=255)),
('used', self.gf('django.db.models.fields.BooleanField')(default=True)),
('desc', self.gf('django.db.models.fields.TextField')(blank=True)),
('order', self.gf('django.db.models.fields.IntegerField')(default=0)),
))
db.send_create_signal('doc', ['State'])
# Adding M2M table for field next_states on 'State'
db.create_table('doc_state_next_states', (
('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
('from_state', models.ForeignKey(orm['doc.state'], null=False)),
('to_state', models.ForeignKey(orm['doc.state'], null=False))
))
db.create_unique('doc_state_next_states', ['from_state_id', 'to_state_id'])
# Adding model 'RelatedDocument'
db.create_table('doc_relateddocument', (
('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
('source', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['doc.Document'])),
('target', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['doc.DocAlias'])),
('relationship', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['name.DocRelationshipName'])),
))
db.send_create_signal('doc', ['RelatedDocument'])
# Adding model 'DocumentAuthor'
db.create_table('doc_documentauthor', (
('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
('document', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['doc.Document'])),
('author', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['person.Email'])),
('order', self.gf('django.db.models.fields.IntegerField')(default=1)),
))
db.send_create_signal('doc', ['DocumentAuthor'])
# Adding model 'Document'
db.create_table('doc_document', (
('time', self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime.now)),
('type', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['name.DocTypeName'], null=True, blank=True)),
('title', self.gf('django.db.models.fields.CharField')(max_length=255)),
('stream', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['name.StreamName'], null=True, blank=True)),
('group', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['group.Group'], null=True, blank=True)),
('abstract', self.gf('django.db.models.fields.TextField')()),
('rev', self.gf('django.db.models.fields.CharField')(max_length=16, blank=True)),
('pages', self.gf('django.db.models.fields.IntegerField')(null=True, blank=True)),
('order', self.gf('django.db.models.fields.IntegerField')(default=1)),
('intended_std_level', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['name.IntendedStdLevelName'], null=True, blank=True)),
('std_level', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['name.StdLevelName'], null=True, blank=True)),
('ad', self.gf('django.db.models.fields.related.ForeignKey')(blank=True, related_name='ad_document_set', null=True, to=orm['person.Person'])),
('shepherd', self.gf('django.db.models.fields.related.ForeignKey')(blank=True, related_name='shepherd_document_set', null=True, to=orm['person.Person'])),
('expires', self.gf('django.db.models.fields.DateTimeField')(null=True, blank=True)),
('notify', self.gf('django.db.models.fields.CharField')(max_length=255, blank=True)),
('external_url', self.gf('django.db.models.fields.URLField')(max_length=200, blank=True)),
('note', self.gf('django.db.models.fields.TextField')(blank=True)),
('internal_comments', self.gf('django.db.models.fields.TextField')(blank=True)),
('name', self.gf('django.db.models.fields.CharField')(max_length=255, primary_key=True)),
))
db.send_create_signal('doc', ['Document'])
# Adding M2M table for field states on 'Document'
db.create_table('doc_document_states', (
('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
('document', models.ForeignKey(orm['doc.document'], null=False)),
('state', models.ForeignKey(orm['doc.state'], null=False))
))
db.create_unique('doc_document_states', ['document_id', 'state_id'])
# Adding M2M table for field tags on 'Document'
db.create_table('doc_document_tags', (
('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
('document', models.ForeignKey(orm['doc.document'], null=False)),
('doctagname', models.ForeignKey(orm['name.doctagname'], null=False))
))
db.create_unique('doc_document_tags', ['document_id', 'doctagname_id'])
# Adding model 'RelatedDocHistory'
db.create_table('doc_relateddochistory', (
('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
('source', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['doc.DocHistory'])),
('target', self.gf('django.db.models.fields.related.ForeignKey')(related_name='reversely_related_document_history_set', to=orm['doc.DocAlias'])),
('relationship', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['name.DocRelationshipName'])),
))
db.send_create_signal('doc', ['RelatedDocHistory'])
# Adding model 'DocHistoryAuthor'
db.create_table('doc_dochistoryauthor', (
('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
('document', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['doc.DocHistory'])),
('author', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['person.Email'])),
('order', self.gf('django.db.models.fields.IntegerField')()),
))
db.send_create_signal('doc', ['DocHistoryAuthor'])
# Adding model 'DocHistory'
db.create_table('doc_dochistory', (
('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
('time', self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime.now)),
('type', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['name.DocTypeName'], null=True, blank=True)),
('title', self.gf('django.db.models.fields.CharField')(max_length=255)),
('stream', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['name.StreamName'], null=True, blank=True)),
('group', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['group.Group'], null=True, blank=True)),
('abstract', self.gf('django.db.models.fields.TextField')()),
('rev', self.gf('django.db.models.fields.CharField')(max_length=16, blank=True)),
('pages', self.gf('django.db.models.fields.IntegerField')(null=True, blank=True)),
('order', self.gf('django.db.models.fields.IntegerField')(default=1)),
('intended_std_level', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['name.IntendedStdLevelName'], null=True, blank=True)),
('std_level', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['name.StdLevelName'], null=True, blank=True)),
('ad', self.gf('django.db.models.fields.related.ForeignKey')(blank=True, related_name='ad_dochistory_set', null=True, to=orm['person.Person'])),
('shepherd', self.gf('django.db.models.fields.related.ForeignKey')(blank=True, related_name='shepherd_dochistory_set', null=True, to=orm['person.Person'])),
('expires', self.gf('django.db.models.fields.DateTimeField')(null=True, blank=True)),
('notify', self.gf('django.db.models.fields.CharField')(max_length=255, blank=True)),
('external_url', self.gf('django.db.models.fields.URLField')(max_length=200, blank=True)),
('note', self.gf('django.db.models.fields.TextField')(blank=True)),
('internal_comments', self.gf('django.db.models.fields.TextField')(blank=True)),
('doc', self.gf('django.db.models.fields.related.ForeignKey')(related_name='history_set', to=orm['doc.Document'])),
('name', self.gf('django.db.models.fields.CharField')(max_length=255)),
))
db.send_create_signal('doc', ['DocHistory'])
# Adding M2M table for field states on 'DocHistory'
db.create_table('doc_dochistory_states', (
('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
('dochistory', models.ForeignKey(orm['doc.dochistory'], null=False)),
('state', models.ForeignKey(orm['doc.state'], null=False))
))
db.create_unique('doc_dochistory_states', ['dochistory_id', 'state_id'])
# Adding M2M table for field tags on 'DocHistory'
db.create_table('doc_dochistory_tags', (
('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
('dochistory', models.ForeignKey(orm['doc.dochistory'], null=False)),
('doctagname', models.ForeignKey(orm['name.doctagname'], null=False))
))
db.create_unique('doc_dochistory_tags', ['dochistory_id', 'doctagname_id'])
# Adding model 'DocAlias'
db.create_table('doc_docalias', (
('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
('document', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['doc.Document'])),
('name', self.gf('django.db.models.fields.CharField')(max_length=255, db_index=True)),
))
db.send_create_signal('doc', ['DocAlias'])
# Adding model 'DocReminder'
db.create_table('doc_docreminder', (
('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
('event', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['doc.DocEvent'])),
('type', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['name.DocReminderTypeName'])),
('due', self.gf('django.db.models.fields.DateTimeField')()),
('active', self.gf('django.db.models.fields.BooleanField')(default=True)),
))
db.send_create_signal('doc', ['DocReminder'])
# Adding model 'DocEvent'
db.create_table('doc_docevent', (
('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
('time', self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime.now)),
('type', self.gf('django.db.models.fields.CharField')(max_length=50)),
('by', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['person.Person'])),
('doc', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['doc.Document'])),
('desc', self.gf('django.db.models.fields.TextField')()),
))
db.send_create_signal('doc', ['DocEvent'])
# Adding model 'NewRevisionDocEvent'
db.create_table('doc_newrevisiondocevent', (
('docevent_ptr', self.gf('django.db.models.fields.related.OneToOneField')(to=orm['doc.DocEvent'], unique=True, primary_key=True)),
('rev', self.gf('django.db.models.fields.CharField')(max_length=16)),
))
db.send_create_signal('doc', ['NewRevisionDocEvent'])
# Adding model 'BallotPositionDocEvent'
db.create_table('doc_ballotpositiondocevent', (
('docevent_ptr', self.gf('django.db.models.fields.related.OneToOneField')(to=orm['doc.DocEvent'], unique=True, primary_key=True)),
('ad', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['person.Person'])),
('pos', self.gf('django.db.models.fields.related.ForeignKey')(default='norecord', to=orm['name.BallotPositionName'])),
('discuss', self.gf('django.db.models.fields.TextField')(blank=True)),
('discuss_time', self.gf('django.db.models.fields.DateTimeField')(null=True, blank=True)),
('comment', self.gf('django.db.models.fields.TextField')(blank=True)),
('comment_time', self.gf('django.db.models.fields.DateTimeField')(null=True, blank=True)),
))
db.send_create_signal('doc', ['BallotPositionDocEvent'])
# Adding model 'WriteupDocEvent'
db.create_table('doc_writeupdocevent', (
('docevent_ptr', self.gf('django.db.models.fields.related.OneToOneField')(to=orm['doc.DocEvent'], unique=True, primary_key=True)),
('text', self.gf('django.db.models.fields.TextField')(blank=True)),
))
db.send_create_signal('doc', ['WriteupDocEvent'])
# Adding model 'LastCallDocEvent'
db.create_table('doc_lastcalldocevent', (
('docevent_ptr', self.gf('django.db.models.fields.related.OneToOneField')(to=orm['doc.DocEvent'], unique=True, primary_key=True)),
('expires', self.gf('django.db.models.fields.DateTimeField')(null=True, blank=True)),
))
db.send_create_signal('doc', ['LastCallDocEvent'])
# Adding model 'TelechatDocEvent'
db.create_table('doc_telechatdocevent', (
('docevent_ptr', self.gf('django.db.models.fields.related.OneToOneField')(to=orm['doc.DocEvent'], unique=True, primary_key=True)),
('telechat_date', self.gf('django.db.models.fields.DateField')(null=True, blank=True)),
('returning_item', self.gf('django.db.models.fields.BooleanField')(default=False)),
))
db.send_create_signal('doc', ['TelechatDocEvent'])
# Adding model 'GroupBallotPositionDocEvent'
db.create_table('doc_groupballotpositiondocevent', (
('docevent_ptr', self.gf('django.db.models.fields.related.OneToOneField')(to=orm['doc.DocEvent'], unique=True, primary_key=True)),
('ad', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['person.Person'])),
('pos', self.gf('django.db.models.fields.related.ForeignKey')(default='norecord', to=orm['name.GroupBallotPositionName'])),
('block_comment', self.gf('django.db.models.fields.TextField')(blank=True)),
('block_comment_time', self.gf('django.db.models.fields.DateTimeField')(null=True, blank=True)),
('comment', self.gf('django.db.models.fields.TextField')(blank=True)),
('comment_time', self.gf('django.db.models.fields.DateTimeField')(null=True, blank=True)),
))
db.send_create_signal('doc', ['GroupBallotPositionDocEvent'])
# Adding model 'InitialReviewDocEvent'
db.create_table('doc_initialreviewdocevent', (
('docevent_ptr', self.gf('django.db.models.fields.related.OneToOneField')(to=orm['doc.DocEvent'], unique=True, primary_key=True)),
('expires', self.gf('django.db.models.fields.DateTimeField')(null=True, blank=True)),
))
db.send_create_signal('doc', ['InitialReviewDocEvent'])
def backwards(self, orm):
# Deleting model 'StateType'
db.delete_table('doc_statetype')
# Deleting model 'State'
db.delete_table('doc_state')
# Removing M2M table for field next_states on 'State'
db.delete_table('doc_state_next_states')
# Deleting model 'RelatedDocument'
db.delete_table('doc_relateddocument')
# Deleting model 'DocumentAuthor'
db.delete_table('doc_documentauthor')
# Deleting model 'Document'
db.delete_table('doc_document')
# Removing M2M table for field states on 'Document'
db.delete_table('doc_document_states')
# Removing M2M table for field tags on 'Document'
db.delete_table('doc_document_tags')
# Deleting model 'RelatedDocHistory'
db.delete_table('doc_relateddochistory')
# Deleting model 'DocHistoryAuthor'
db.delete_table('doc_dochistoryauthor')
# Deleting model 'DocHistory'
db.delete_table('doc_dochistory')
# Removing M2M table for field states on 'DocHistory'
db.delete_table('doc_dochistory_states')
# Removing M2M table for field tags on 'DocHistory'
db.delete_table('doc_dochistory_tags')
# Deleting model 'DocAlias'
db.delete_table('doc_docalias')
# Deleting model 'DocReminder'
db.delete_table('doc_docreminder')
# Deleting model 'DocEvent'
db.delete_table('doc_docevent')
# Deleting model 'NewRevisionDocEvent'
db.delete_table('doc_newrevisiondocevent')
# Deleting model 'BallotPositionDocEvent'
db.delete_table('doc_ballotpositiondocevent')
# Deleting model 'WriteupDocEvent'
db.delete_table('doc_writeupdocevent')
# Deleting model 'LastCallDocEvent'
db.delete_table('doc_lastcalldocevent')
# Deleting model 'TelechatDocEvent'
db.delete_table('doc_telechatdocevent')
# Deleting model 'GroupBallotPositionDocEvent'
db.delete_table('doc_groupballotpositiondocevent')
# Deleting model 'InitialReviewDocEvent'
db.delete_table('doc_initialreviewdocevent')
models = {
'auth.group': {
'Meta': {'object_name': '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']", 'symmetrical': 'False', 'blank': 'True'})
},
'auth.permission': {
'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'},
'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': {
'Meta': {'object_name': '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']", 'symmetrical': 'False', 'blank': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'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']", 'symmetrical': 'False', 'blank': 'True'}),
'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '64'})
},
'contenttypes.contenttype': {
'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', '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.ballotpositiondocevent': {
'Meta': {'ordering': "['-time', '-id']", 'object_name': 'BallotPositionDocEvent', '_ormbases': ['doc.DocEvent']},
'ad': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['person.Person']"}),
'comment': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
'comment_time': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
'discuss': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
'discuss_time': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
'docevent_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['doc.DocEvent']", 'unique': 'True', 'primary_key': 'True'}),
'pos': ('django.db.models.fields.related.ForeignKey', [], {'default': "'norecord'", 'to': "orm['name.BallotPositionName']"})
},
'doc.docalias': {
'Meta': {'object_name': '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.docevent': {
'Meta': {'ordering': "['-time', '-id']", 'object_name': 'DocEvent'},
'by': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['person.Person']"}),
'desc': ('django.db.models.fields.TextField', [], {}),
'doc': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['doc.Document']"}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'time': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
'type': ('django.db.models.fields.CharField', [], {'max_length': '50'})
},
'doc.dochistory': {
'Meta': {'object_name': 'DocHistory'},
'abstract': ('django.db.models.fields.TextField', [], {}),
'ad': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'ad_dochistory_set'", 'null': 'True', 'to': "orm['person.Person']"}),
'authors': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['person.Email']", 'symmetrical': 'False', 'through': "orm['doc.DocHistoryAuthor']", 'blank': 'True'}),
'doc': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'history_set'", 'to': "orm['doc.Document']"}),
'expires': ('django.db.models.fields.DateTimeField', [], {'null': 'True', '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'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': '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'}),
'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
'notify': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
'order': ('django.db.models.fields.IntegerField', [], {'default': '1'}),
'pages': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
'related': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['doc.DocAlias']", 'symmetrical': 'False', 'through': "orm['doc.RelatedDocHistory']", 'blank': 'True'}),
'rev': ('django.db.models.fields.CharField', [], {'max_length': '16', 'blank': 'True'}),
'shepherd': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'shepherd_dochistory_set'", 'null': 'True', 'to': "orm['person.Person']"}),
'states': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['doc.State']", 'symmetrical': 'False', '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.StreamName']", 'null': 'True', 'blank': 'True'}),
'tags': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': "orm['name.DocTagName']", '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'})
},
'doc.dochistoryauthor': {
'Meta': {'ordering': "['document', 'order']", 'object_name': 'DocHistoryAuthor'},
'author': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['person.Email']"}),
'document': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['doc.DocHistory']"}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'order': ('django.db.models.fields.IntegerField', [], {})
},
'doc.docreminder': {
'Meta': {'object_name': 'DocReminder'},
'active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
'due': ('django.db.models.fields.DateTimeField', [], {}),
'event': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['doc.DocEvent']"}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['name.DocReminderTypeName']"})
},
'doc.document': {
'Meta': {'object_name': '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']", 'symmetrical': 'False', 'through': "orm['doc.DocumentAuthor']", 'blank': 'True'}),
'expires': ('django.db.models.fields.DateTimeField', [], {'null': 'True', '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'}),
'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'}),
'order': ('django.db.models.fields.IntegerField', [], {'default': '1'}),
'pages': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
'related': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'reversely_related_document_set'", 'blank': 'True', 'through': "orm['doc.RelatedDocument']", 'to': "orm['doc.DocAlias']"}),
'rev': ('django.db.models.fields.CharField', [], {'max_length': '16', 'blank': 'True'}),
'shepherd': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'shepherd_document_set'", 'null': 'True', 'to': "orm['person.Person']"}),
'states': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['doc.State']", 'symmetrical': 'False', '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.StreamName']", 'null': 'True', 'blank': 'True'}),
'tags': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': "orm['name.DocTagName']", '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'})
},
'doc.documentauthor': {
'Meta': {'ordering': "['document', 'order']", 'object_name': 'DocumentAuthor'},
'author': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['person.Email']"}),
'document': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['doc.Document']"}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'order': ('django.db.models.fields.IntegerField', [], {'default': '1'})
},
'doc.groupballotpositiondocevent': {
'Meta': {'ordering': "['-time', '-id']", 'object_name': 'GroupBallotPositionDocEvent', '_ormbases': ['doc.DocEvent']},
'ad': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['person.Person']"}),
'block_comment': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
'block_comment_time': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
'comment': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
'comment_time': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
'docevent_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['doc.DocEvent']", 'unique': 'True', 'primary_key': 'True'}),
'pos': ('django.db.models.fields.related.ForeignKey', [], {'default': "'norecord'", 'to': "orm['name.GroupBallotPositionName']"})
},
'doc.initialreviewdocevent': {
'Meta': {'ordering': "['-time', '-id']", 'object_name': 'InitialReviewDocEvent', '_ormbases': ['doc.DocEvent']},
'docevent_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['doc.DocEvent']", 'unique': 'True', 'primary_key': 'True'}),
'expires': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'})
},
'doc.lastcalldocevent': {
'Meta': {'ordering': "['-time', '-id']", 'object_name': 'LastCallDocEvent', '_ormbases': ['doc.DocEvent']},
'docevent_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['doc.DocEvent']", 'unique': 'True', 'primary_key': 'True'}),
'expires': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'})
},
'doc.newrevisiondocevent': {
'Meta': {'ordering': "['-time', '-id']", 'object_name': 'NewRevisionDocEvent', '_ormbases': ['doc.DocEvent']},
'docevent_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['doc.DocEvent']", 'unique': 'True', 'primary_key': 'True'}),
'rev': ('django.db.models.fields.CharField', [], {'max_length': '16'})
},
'doc.relateddochistory': {
'Meta': {'object_name': 'RelatedDocHistory'},
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'relationship': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['name.DocRelationshipName']"}),
'source': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['doc.DocHistory']"}),
'target': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'reversely_related_document_history_set'", 'to': "orm['doc.DocAlias']"})
},
'doc.relateddocument': {
'Meta': {'object_name': 'RelatedDocument'},
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'relationship': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['name.DocRelationshipName']"}),
'source': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['doc.Document']"}),
'target': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['doc.DocAlias']"})
},
'doc.state': {
'Meta': {'ordering': "['type', 'order']", 'object_name': 'State'},
'desc': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
'next_states': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'previous_states'", 'symmetrical': 'False', 'to': "orm['doc.State']"}),
'order': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50', 'db_index': 'True'}),
'type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['doc.StateType']"}),
'used': ('django.db.models.fields.BooleanField', [], {'default': 'True'})
},
'doc.statetype': {
'Meta': {'object_name': 'StateType'},
'label': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
'slug': ('django.db.models.fields.CharField', [], {'max_length': '30', 'primary_key': 'True'})
},
'doc.telechatdocevent': {
'Meta': {'ordering': "['-time', '-id']", 'object_name': 'TelechatDocEvent', '_ormbases': ['doc.DocEvent']},
'docevent_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['doc.DocEvent']", 'unique': 'True', 'primary_key': 'True'}),
'returning_item': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'telechat_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'})
},
'doc.writeupdocevent': {
'Meta': {'ordering': "['-time', '-id']", 'object_name': 'WriteupDocEvent', '_ormbases': ['doc.DocEvent']},
'docevent_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['doc.DocEvent']", 'unique': 'True', 'primary_key': 'True'}),
'text': ('django.db.models.fields.TextField', [], {'blank': 'True'})
},
'group.group': {
'Meta': {'object_name': 'Group'},
'acronym': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '40', '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'}),
'unused_states': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['doc.State']", 'symmetrical': 'False', 'blank': 'True'}),
'unused_tags': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['name.DocTagName']", 'symmetrical': 'False', 'blank': 'True'})
},
'name.ballotpositionname': {
'Meta': {'ordering': "['order']", 'object_name': 'BallotPositionName'},
'desc': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
'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'})
},
'name.docrelationshipname': {
'Meta': {'ordering': "['order']", 'object_name': 'DocRelationshipName'},
'desc': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
'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'})
},
'name.docremindertypename': {
'Meta': {'ordering': "['order']", 'object_name': 'DocReminderTypeName'},
'desc': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
'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'})
},
'name.doctagname': {
'Meta': {'ordering': "['order']", 'object_name': 'DocTagName'},
'desc': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
'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'})
},
'name.doctypename': {
'Meta': {'ordering': "['order']", 'object_name': 'DocTypeName'},
'desc': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
'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'})
},
'name.groupballotpositionname': {
'Meta': {'ordering': "['order']", 'object_name': 'GroupBallotPositionName'},
'desc': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
'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'})
},
'name.groupstatename': {
'Meta': {'ordering': "['order']", 'object_name': 'GroupStateName'},
'desc': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
'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'})
},
'name.grouptypename': {
'Meta': {'ordering': "['order']", 'object_name': 'GroupTypeName'},
'desc': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
'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'})
},
'name.intendedstdlevelname': {
'Meta': {'ordering': "['order']", 'object_name': 'IntendedStdLevelName'},
'desc': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
'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'})
},
'name.stdlevelname': {
'Meta': {'ordering': "['order']", 'object_name': 'StdLevelName'},
'desc': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
'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'})
},
'name.streamname': {
'Meta': {'ordering': "['order']", 'object_name': 'StreamName'},
'desc': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
'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'})
},
'person.email': {
'Meta': {'object_name': 'Email'},
'active': ('django.db.models.fields.BooleanField', [], {'default': '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': {
'Meta': {'object_name': 'Person'},
'address': ('django.db.models.fields.TextField', [], {'max_length': '255', 'blank': 'True'}),
'affiliation': ('django.db.models.fields.CharField', [], {'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', [], {'default': 'datetime.datetime.now'}),
'user': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['auth.User']", 'unique': 'True', 'null': 'True', 'blank': 'True'})
}
}
complete_apps = ['doc']

View file

@ -0,0 +1,402 @@
# encoding: utf-8
import datetime
from south.db import db
from south.v2 import SchemaMigration
from django.db import models
class Migration(SchemaMigration):
def forwards(self, orm):
# Deleting model 'GroupBallotPositionDocEvent'
db.delete_table('doc_groupballotpositiondocevent')
# Adding model 'BallotType'
db.create_table('doc_ballottype', (
('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
('doc_type', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['name.DocTypeName'], null=True, blank=True)),
('slug', self.gf('django.db.models.fields.SlugField')(max_length=50, db_index=True)),
('name', self.gf('django.db.models.fields.CharField')(max_length=255)),
('question', self.gf('django.db.models.fields.TextField')(blank=True)),
('used', self.gf('django.db.models.fields.BooleanField')(default=True)),
('order', self.gf('django.db.models.fields.IntegerField')(default=0)),
))
db.send_create_signal('doc', ['BallotType'])
# Adding M2M table for field positions on 'BallotType'
db.create_table('doc_ballottype_positions', (
('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
('ballottype', models.ForeignKey(orm['doc.ballottype'], null=False)),
('ballotpositionname', models.ForeignKey(orm['name.ballotpositionname'], null=False))
))
db.create_unique('doc_ballottype_positions', ['ballottype_id', 'ballotpositionname_id'])
# Adding model 'BallotDocEvent'
db.create_table('doc_ballotdocevent', (
('docevent_ptr', self.gf('django.db.models.fields.related.OneToOneField')(to=orm['doc.DocEvent'], unique=True, primary_key=True)),
('ballot_type', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['doc.BallotType'])),
))
db.send_create_signal('doc', ['BallotDocEvent'])
# Adding field 'BallotPositionDocEvent.ballot'
db.add_column('doc_ballotpositiondocevent', 'ballot', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['doc.BallotDocEvent'], null=True), keep_default=False)
def backwards(self, orm):
# Adding model 'GroupBallotPositionDocEvent'
db.create_table('doc_groupballotpositiondocevent', (
('block_comment', self.gf('django.db.models.fields.TextField')(blank=True)),
('comment', self.gf('django.db.models.fields.TextField')(blank=True)),
('ad', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['person.Person'])),
('comment_time', self.gf('django.db.models.fields.DateTimeField')(null=True, blank=True)),
('block_comment_time', self.gf('django.db.models.fields.DateTimeField')(null=True, blank=True)),
('pos', self.gf('django.db.models.fields.related.ForeignKey')(default='norecord', to=orm['name.GroupBallotPositionName'])),
('docevent_ptr', self.gf('django.db.models.fields.related.OneToOneField')(to=orm['doc.DocEvent'], unique=True, primary_key=True)),
))
db.send_create_signal('doc', ['GroupBallotPositionDocEvent'])
# Deleting model 'BallotType'
db.delete_table('doc_ballottype')
# Removing M2M table for field positions on 'BallotType'
db.delete_table('doc_ballottype_positions')
# Deleting model 'BallotDocEvent'
db.delete_table('doc_ballotdocevent')
# Deleting field 'BallotPositionDocEvent.ballot'
db.delete_column('doc_ballotpositiondocevent', 'ballot_id')
models = {
'auth.group': {
'Meta': {'object_name': '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']", 'symmetrical': 'False', 'blank': 'True'})
},
'auth.permission': {
'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'},
'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': {
'Meta': {'object_name': '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']", 'symmetrical': 'False', 'blank': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'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']", 'symmetrical': 'False', 'blank': 'True'}),
'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '64'})
},
'contenttypes.contenttype': {
'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', '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.ballotdocevent': {
'Meta': {'ordering': "['-time', '-id']", 'object_name': 'BallotDocEvent', '_ormbases': ['doc.DocEvent']},
'ballot_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['doc.BallotType']"}),
'docevent_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['doc.DocEvent']", 'unique': 'True', 'primary_key': 'True'})
},
'doc.ballotpositiondocevent': {
'Meta': {'ordering': "['-time', '-id']", 'object_name': 'BallotPositionDocEvent', '_ormbases': ['doc.DocEvent']},
'ad': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['person.Person']"}),
'ballot': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['doc.BallotDocEvent']", 'null': 'True'}),
'comment': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
'comment_time': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
'discuss': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
'discuss_time': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
'docevent_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['doc.DocEvent']", 'unique': 'True', 'primary_key': 'True'}),
'pos': ('django.db.models.fields.related.ForeignKey', [], {'default': "'norecord'", 'to': "orm['name.BallotPositionName']"})
},
'doc.ballottype': {
'Meta': {'ordering': "['order']", 'object_name': 'BallotType'},
'doc_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['name.DocTypeName']", 'null': 'True', 'blank': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
'order': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
'positions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['name.BallotPositionName']", 'symmetrical': 'False', 'blank': 'True'}),
'question': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50', 'db_index': 'True'}),
'used': ('django.db.models.fields.BooleanField', [], {'default': 'True'})
},
'doc.docalias': {
'Meta': {'object_name': '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.docevent': {
'Meta': {'ordering': "['-time', '-id']", 'object_name': 'DocEvent'},
'by': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['person.Person']"}),
'desc': ('django.db.models.fields.TextField', [], {}),
'doc': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['doc.Document']"}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'time': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
'type': ('django.db.models.fields.CharField', [], {'max_length': '50'})
},
'doc.dochistory': {
'Meta': {'object_name': 'DocHistory'},
'abstract': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
'ad': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'ad_dochistory_set'", 'null': 'True', 'to': "orm['person.Person']"}),
'authors': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['person.Email']", 'symmetrical': 'False', 'through': "orm['doc.DocHistoryAuthor']", 'blank': 'True'}),
'doc': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'history_set'", 'to': "orm['doc.Document']"}),
'expires': ('django.db.models.fields.DateTimeField', [], {'null': 'True', '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'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': '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'}),
'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
'notify': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
'order': ('django.db.models.fields.IntegerField', [], {'default': '1', 'blank': 'True'}),
'pages': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
'related': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['doc.DocAlias']", 'symmetrical': 'False', 'through': "orm['doc.RelatedDocHistory']", 'blank': 'True'}),
'rev': ('django.db.models.fields.CharField', [], {'max_length': '16', 'blank': 'True'}),
'shepherd': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'shepherd_dochistory_set'", 'null': 'True', 'to': "orm['person.Person']"}),
'states': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['doc.State']", 'symmetrical': 'False', '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.StreamName']", 'null': 'True', 'blank': 'True'}),
'tags': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': "orm['name.DocTagName']", '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'})
},
'doc.dochistoryauthor': {
'Meta': {'ordering': "['document', 'order']", 'object_name': 'DocHistoryAuthor'},
'author': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['person.Email']"}),
'document': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['doc.DocHistory']"}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'order': ('django.db.models.fields.IntegerField', [], {})
},
'doc.docreminder': {
'Meta': {'object_name': 'DocReminder'},
'active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
'due': ('django.db.models.fields.DateTimeField', [], {}),
'event': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['doc.DocEvent']"}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['name.DocReminderTypeName']"})
},
'doc.document': {
'Meta': {'object_name': 'Document'},
'abstract': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
'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']", 'symmetrical': 'False', 'through': "orm['doc.DocumentAuthor']", 'blank': 'True'}),
'expires': ('django.db.models.fields.DateTimeField', [], {'null': 'True', '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'}),
'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'}),
'order': ('django.db.models.fields.IntegerField', [], {'default': '1', 'blank': 'True'}),
'pages': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
'related': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'reversely_related_document_set'", 'blank': 'True', 'through': "orm['doc.RelatedDocument']", 'to': "orm['doc.DocAlias']"}),
'rev': ('django.db.models.fields.CharField', [], {'max_length': '16', 'blank': 'True'}),
'shepherd': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'shepherd_document_set'", 'null': 'True', 'to': "orm['person.Person']"}),
'states': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['doc.State']", 'symmetrical': 'False', '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.StreamName']", 'null': 'True', 'blank': 'True'}),
'tags': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': "orm['name.DocTagName']", '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'})
},
'doc.documentauthor': {
'Meta': {'ordering': "['document', 'order']", 'object_name': 'DocumentAuthor'},
'author': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['person.Email']"}),
'document': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['doc.Document']"}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'order': ('django.db.models.fields.IntegerField', [], {'default': '1'})
},
'doc.initialreviewdocevent': {
'Meta': {'ordering': "['-time', '-id']", 'object_name': 'InitialReviewDocEvent', '_ormbases': ['doc.DocEvent']},
'docevent_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['doc.DocEvent']", 'unique': 'True', 'primary_key': 'True'}),
'expires': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'})
},
'doc.lastcalldocevent': {
'Meta': {'ordering': "['-time', '-id']", 'object_name': 'LastCallDocEvent', '_ormbases': ['doc.DocEvent']},
'docevent_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['doc.DocEvent']", 'unique': 'True', 'primary_key': 'True'}),
'expires': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'})
},
'doc.newrevisiondocevent': {
'Meta': {'ordering': "['-time', '-id']", 'object_name': 'NewRevisionDocEvent', '_ormbases': ['doc.DocEvent']},
'docevent_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['doc.DocEvent']", 'unique': 'True', 'primary_key': 'True'}),
'rev': ('django.db.models.fields.CharField', [], {'max_length': '16'})
},
'doc.relateddochistory': {
'Meta': {'object_name': 'RelatedDocHistory'},
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'relationship': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['name.DocRelationshipName']"}),
'source': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['doc.DocHistory']"}),
'target': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'reversely_related_document_history_set'", 'to': "orm['doc.DocAlias']"})
},
'doc.relateddocument': {
'Meta': {'object_name': 'RelatedDocument'},
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'relationship': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['name.DocRelationshipName']"}),
'source': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['doc.Document']"}),
'target': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['doc.DocAlias']"})
},
'doc.state': {
'Meta': {'ordering': "['type', 'order']", 'object_name': 'State'},
'desc': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
'next_states': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'previous_states'", 'symmetrical': 'False', 'to': "orm['doc.State']"}),
'order': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50', 'db_index': 'True'}),
'type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['doc.StateType']"}),
'used': ('django.db.models.fields.BooleanField', [], {'default': 'True'})
},
'doc.statetype': {
'Meta': {'object_name': 'StateType'},
'label': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
'slug': ('django.db.models.fields.CharField', [], {'max_length': '30', 'primary_key': 'True'})
},
'doc.telechatdocevent': {
'Meta': {'ordering': "['-time', '-id']", 'object_name': 'TelechatDocEvent', '_ormbases': ['doc.DocEvent']},
'docevent_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['doc.DocEvent']", 'unique': 'True', 'primary_key': 'True'}),
'returning_item': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'telechat_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'})
},
'doc.writeupdocevent': {
'Meta': {'ordering': "['-time', '-id']", 'object_name': 'WriteupDocEvent', '_ormbases': ['doc.DocEvent']},
'docevent_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['doc.DocEvent']", 'unique': 'True', 'primary_key': 'True'}),
'text': ('django.db.models.fields.TextField', [], {'blank': 'True'})
},
'group.group': {
'Meta': {'object_name': 'Group'},
'acronym': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '40', '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'}),
'unused_states': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['doc.State']", 'symmetrical': 'False'}),
'unused_tags': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['name.DocTagName']", 'symmetrical': 'False'})
},
'name.ballotpositionname': {
'Meta': {'ordering': "['order']", 'object_name': 'BallotPositionName'},
'blocking': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'desc': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
'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'})
},
'name.docrelationshipname': {
'Meta': {'ordering': "['order']", 'object_name': 'DocRelationshipName'},
'desc': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
'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'})
},
'name.docremindertypename': {
'Meta': {'ordering': "['order']", 'object_name': 'DocReminderTypeName'},
'desc': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
'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'})
},
'name.doctagname': {
'Meta': {'ordering': "['order']", 'object_name': 'DocTagName'},
'desc': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
'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'})
},
'name.doctypename': {
'Meta': {'ordering': "['order']", 'object_name': 'DocTypeName'},
'desc': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
'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'})
},
'name.groupstatename': {
'Meta': {'ordering': "['order']", 'object_name': 'GroupStateName'},
'desc': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
'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'})
},
'name.grouptypename': {
'Meta': {'ordering': "['order']", 'object_name': 'GroupTypeName'},
'desc': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
'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'})
},
'name.intendedstdlevelname': {
'Meta': {'ordering': "['order']", 'object_name': 'IntendedStdLevelName'},
'desc': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
'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'})
},
'name.stdlevelname': {
'Meta': {'ordering': "['order']", 'object_name': 'StdLevelName'},
'desc': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
'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'})
},
'name.streamname': {
'Meta': {'ordering': "['order']", 'object_name': 'StreamName'},
'desc': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
'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'})
},
'person.email': {
'Meta': {'object_name': 'Email'},
'active': ('django.db.models.fields.BooleanField', [], {'default': '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': {
'Meta': {'object_name': 'Person'},
'address': ('django.db.models.fields.TextField', [], {'max_length': '255', 'blank': 'True'}),
'affiliation': ('django.db.models.fields.CharField', [], {'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', [], {'default': 'datetime.datetime.now'}),
'user': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['auth.User']", 'unique': 'True', 'null': 'True', 'blank': 'True'})
}
}
complete_apps = ['doc']

View file

View file

@ -12,11 +12,11 @@ from ietf.utils.admin import admin_link
import datetime, os
class StateType(models.Model):
slug = models.CharField(primary_key=True, max_length=30) # draft, draft_iesg, charter, ...
label = models.CharField(max_length=255) # State, IESG state, WG state, ...
slug = models.CharField(primary_key=True, max_length=30) # draft, draft-iesg, charter, ...
label = models.CharField(max_length=255, help_text="Label that should be used (e.g. in admin) for state drop-down for this type of state") # State, IESG state, WG state, ...
def __unicode__(self):
return self.label
return self.slug
class State(models.Model):
type = models.ForeignKey(StateType)
@ -46,10 +46,10 @@ class DocumentInfo(models.Model):
stream = models.ForeignKey(StreamName, blank=True, null=True) # IETF, IAB, IRTF, Independent Submission
group = models.ForeignKey(Group, blank=True, null=True) # WG, RG, IAB, IESG, Edu, Tools
abstract = models.TextField()
abstract = models.TextField(blank=True)
rev = models.CharField(verbose_name="revision", max_length=16, blank=True)
pages = models.IntegerField(blank=True, null=True)
order = models.IntegerField(default=1)
order = models.IntegerField(default=1, blank=True)
intended_std_level = models.ForeignKey(IntendedStdLevelName, verbose_name="Intended standardization level", blank=True, null=True)
std_level = models.ForeignKey(StdLevelName, verbose_name="Standardization level", blank=True, null=True)
ad = models.ForeignKey(Person, verbose_name="area director", related_name='ad_%(class)s_set', blank=True, null=True)
@ -149,15 +149,10 @@ class Document(DocumentInfo):
def get_absolute_url(self):
name = self.name
if self.type_id == "charter":
return urlreverse('wg_view', kwargs={ 'name': self.group.acronym }, urlconf="ietf.urls")
elif self.type_id == "draft":
if self.get_state_slug() == "rfc":
aliases = self.docalias_set.filter(name__startswith="rfc")
if aliases:
name = aliases[0].name
return urlreverse('doc_view', kwargs={ 'name': name }, urlconf="ietf.urls")
if self.type_id == "draft" and self.get_state_slug() == "rfc":
aliases = self.docalias_set.filter(name__startswith="rfc")
if aliases:
name = aliases[0].name
elif self.type_id in ('slides','agenda','minutes'):
session = self.session_set.all()[0]
meeting = session.meeting
@ -172,6 +167,9 @@ class Document(DocumentInfo):
self.type_id,
filename)
return url
return urlreverse('doc_view', kwargs={ 'name': name }, urlconf="ietf.urls")
def file_tag(self):
return u"<%s>" % self.filename_with_rev()
@ -194,6 +192,9 @@ class Document(DocumentInfo):
a = self.docalias_set.filter(name__startswith="rfc")
if a:
name = a[0].name
elif self.type_id == "charter":
return "charter-ietf-%s" % self.chartered_group.acronym
return name
class RelatedDocHistory(models.Model):
@ -216,11 +217,19 @@ class DocHistoryAuthor(models.Model):
class DocHistory(DocumentInfo):
doc = models.ForeignKey(Document, related_name="history_set")
name = models.CharField(max_length=255) # WG charter names can change if the group acronym changes
name = models.CharField(max_length=255) # WG charter canonical names can change if the group acronym changes
related = models.ManyToManyField('DocAlias', through=RelatedDocHistory, blank=True)
authors = models.ManyToManyField(Email, through=DocHistoryAuthor, blank=True)
def __unicode__(self):
return unicode(self.doc.name)
def canonical_name(self):
return self.name
def latest_event(self, *args, **kwargs):
kwargs["time__lte"] = self.time
return self.doc.latest_event(*args, **kwargs)
class Meta:
verbose_name = "document history"
verbose_name_plural = "document histories"
@ -234,7 +243,7 @@ def save_document_in_history(doc):
# copy fields
fields = get_model_fields_as_dict(doc)
fields["doc"] = doc
fields["name"] = doc.name
fields["name"] = doc.canonical_name()
dochist = DocHistory(**fields)
dochist.save()
@ -311,6 +320,8 @@ EVENT_TYPES = [
# IESG events
("started_iesg_process", "Started IESG process on document"),
("created_ballot", "Created ballot"),
("closed_ballot", "Closed ballot"),
("sent_ballot_announcement", "Sent ballot announcement"),
("changed_ballot_position", "Changed ballot position"),
@ -347,7 +358,26 @@ class NewRevisionDocEvent(DocEvent):
rev = models.CharField(max_length=16)
# IESG events
class BallotType(models.Model):
doc_type = models.ForeignKey(DocTypeName, blank=True, null=True)
slug = models.SlugField()
name = models.CharField(max_length=255)
question = models.TextField(blank=True)
used = models.BooleanField(default=True)
order = models.IntegerField(default=0)
positions = models.ManyToManyField(BallotPositionName, blank=True)
def __unicode__(self):
return self.name
class Meta:
ordering = ['order']
class BallotDocEvent(DocEvent):
ballot_type = models.ForeignKey(BallotType)
class BallotPositionDocEvent(DocEvent):
ballot = models.ForeignKey(BallotDocEvent, null=True, default=None) # default=None is a temporary migration period fix, should be removed when charter branch is live
ad = models.ForeignKey(Person)
pos = models.ForeignKey(BallotPositionName, verbose_name="position", default="norecord")
discuss = models.TextField(help_text="Discuss text if position is discuss", blank=True)
@ -365,14 +395,6 @@ class TelechatDocEvent(DocEvent):
telechat_date = models.DateField(blank=True, null=True)
returning_item = models.BooleanField(default=False)
# Charter ballot events
class GroupBallotPositionDocEvent(DocEvent):
ad = models.ForeignKey(Person)
pos = models.ForeignKey(GroupBallotPositionName, verbose_name="position", default="norecord")
block_comment = models.TextField(help_text="Blocking comment if position is comment", blank=True)
block_comment_time = models.DateTimeField(help_text="Blocking comment was written", blank=True, null=True)
comment = models.TextField(help_text="Non-blocking comment", blank=True)
comment_time = models.DateTimeField(help_text="Time non-blocking comment was written", blank=True, null=True)
# charter events
class InitialReviewDocEvent(DocEvent):
expires = models.DateTimeField(blank=True, null=True)

View file

@ -175,32 +175,6 @@ class InternetDraft(Document):
def expired_tombstone(self):
return False
def calc_process_start_end(self):
import datetime
start, end = datetime.datetime.min, datetime.datetime.max
e = self.latest_event(type="started_iesg_process")
if e:
start = e.time
if self.get_state_slug() == "rfc" and self.name.startswith("draft") and not hasattr(self, "viewing_as_rfc"):
previous_process = self.latest_event(type="started_iesg_process", time__lt=e.time)
if previous_process:
start = previous_process.time
end = e.time
self._process_start = start
self._process_end = end
@property
def process_start(self):
if not hasattr(self, "_process_start"):
self.calc_process_start_end()
return self._process_start
@property
def process_end(self):
if not hasattr(self, "_process_end"):
self.calc_process_start_end()
return self._process_end
#shepherd = BrokenForeignKey('PersonOrOrgInfo', null=True, blank=True, null_values=(0, )) # same name
#idinternal = FKAsOneToOne('idinternal', reverse=True, query=models.Q(rfc_flag = 0))
@ -823,7 +797,7 @@ class DocumentComment(DocEvent):
class Position(BallotPositionDocEvent):
def from_object(self, base):
for f in base._meta.fields:
if not f.name in ('discuss', "ad"): # don't overwrite properties
if not f.name in ('discuss', 'ad', 'ballot', ): # don't overwrite properties
setattr(self, f.name, getattr(base, f.name))
self.orig = base

View file

@ -30,17 +30,14 @@ def get_tags_for_stream_id(stream_id):
else:
return []
def active_ballot_positions(doc):
def active_ballot_positions(doc, ballot=None):
"""Return dict mapping each active AD to a current ballot position (or None if they haven't voted)."""
active_ads = list(Person.objects.filter(role__name="ad", role__group__state="active"))
res = {}
start = datetime.datetime.min
e = doc.latest_event(type="started_iesg_process")
if e:
start = e.time
positions = BallotPositionDocEvent.objects.filter(doc=doc, type="changed_ballot_position", ad__in=active_ads, time__gte=start).select_related('ad').order_by("-time", "-id")
if not ballot:
ballot = doc.latest_event(BallotDocEvent, type="created_ballot")
positions = BallotPositionDocEvent.objects.filter(doc=doc, type="changed_ballot_position", ad__in=active_ads, ballot=ballot).select_related('ad', 'pos').order_by("-time", "-id")
for pos in positions:
if pos.ad not in res:
@ -51,7 +48,64 @@ def active_ballot_positions(doc):
res[ad] = None
return res
def needed_ballot_positions(doc, active_positions):
'''Returns text answering the question "what does this document
need to pass?". The return value is only useful if the document
is currently in IESG evaluation.'''
yes = [p for p in active_positions if p and p.pos_id == "yes"]
noobj = [p for p in active_positions if p and p.pos_id == "noobj"]
blocking = [p for p in active_positions if p and p.pos.blocking]
recuse = [p for p in active_positions if p and p.pos_id == "recuse"]
answer = []
if yes < 1:
answer.append("Needs a YES.")
if blocking:
if blocking:
answer.append("Has a %s." % blocking[0].pos.name.upper())
else:
answer.append("Has %d %s." % (len(blocking), blocking[0].name.upper()))
needed = 1
if doc.type_id == "draft" and doc.intended_std_level_id in ("bcp", "ps", "ds", "std"):
# For standards-track, need positions from 2/3 of the
# non-recused current IESG.
needed = (len(active_positions) - len(recuse)) * 2 // 3
have = len(yes) + len(noobj) + len(blocking)
if have < needed:
more = needed - have
if more == 1:
answer.append("Needs %d more position." % more)
else:
answer.append("Needs %d more positions." % more)
else:
if blocking:
answer.append("Has enough positions to pass once %s positions are resolved." % blocking[0].pos.name.upper())
else:
answer.append("Has enough positions to pass.")
return " ".join(answer)
def ballot_open(doc, ballot_type_slug):
e = doc.latest_event(BallotDocEvent, ballot_type__slug=ballot_type_slug)
return e and not e.type == "closed_ballot"
def create_ballot_if_not_open(doc, by, ballot_type_slug):
if not ballot_open(doc, ballot_type_slug):
e = BallotDocEvent(type="created_ballot", by=by, doc=doc)
e.ballot_type = BallotType.objects.get(doc_type=doc.type, slug=ballot_type_slug)
e.desc = u'Created "%s" ballot' % e.ballot_type.name
e.save()
def close_open_ballots(doc, by):
for t in BallotType.objects.filter(doc_type=doc.type_id):
if ballot_open(doc, t.slug):
e = BallotDocEvent(type="closed_ballot", doc=doc, by=by)
e.ballot_type = t
e.desc = 'Closed "%s" ballot' % t.name
e.save()
def get_rfc_number(doc):
qs = doc.docalias_set.filter(name__startswith='rfc')
return qs[0].name[3:] if qs else None
@ -79,6 +133,16 @@ def augment_with_start_time(docs):
return docs
def get_chartering_type(doc):
chartering = ""
if doc.get_state_slug() not in ("notrev", "approved"):
if doc.group.state_id == "proposed":
chartering = "initial"
elif doc.group.state_id == "active":
chartering = "rechartering"
return chartering
def augment_with_telechat_date(docs):
"""Add a telechat_date attribute to each document with the
scheduled telechat or None if it's not scheduled."""
@ -99,6 +163,3 @@ def augment_with_telechat_date(docs):
seen.add(e.doc_id)
return docs

View file

@ -1,8 +1,6 @@
from ietf.utils.proxy import TranslatingManager, proxy_role_email
from models import *
from ietf.doc.models import Document # for charter text
from ietf.wgcharter.utils import get_charter_for_revision, approved_revision
class Acronym(Group):
class LazyIndividualSubmitter(object):

View file

@ -35,21 +35,23 @@ def get_charter_text(group):
# get file path from settings. Syntesize file name from path, acronym, and suffix
try:
# Try getting charter from new charter tool
from ietf.wgcharter.utils import get_charter_for_revision, approved_revision
c = group.charter
charter = group.charter
ch = get_charter_for_revision(charter, charter.rev)
name = ch.name
rev = approved_revision(ch.rev)
filename = os.path.join(charter.get_file_path(), "%s-%s.txt" % (name, rev))
desc_file = open(filename)
desc = desc_file.read()
return desc
except:
# find the latest, preferably approved, revision
for h in group.charter.history_set.exclude(rev="").order_by("time"):
h_appr = "-" not in h.rev
c_appr = "-" not in c.rev
if (h.rev > c.rev and not (c_appr and not h_appr)) or (h_appr and not c_appr):
c = h
filename = os.path.join(c.get_file_path(), "%s-%s.txt" % (c.canonical_name(), c.rev))
with open(filename) as f:
return f.read()
except IOError:
try:
filename = os.path.join(settings.IETFWG_DESCRIPTIONS_PATH, group.acronym) + ".desc.txt"
desc_file = open(filename)
desc = desc_file.read()
except:
except BaseException:
desc = 'Error Loading Work Group Description'
return desc

View file

@ -742,7 +742,9 @@ class BallotWrapper:
new_revisions = list(NewRevisionDocEvent.objects.filter(doc=self.ballot, type="new_revision").order_by('-time', '-id'))
for pos in BallotPositionDocEvent.objects.filter(doc=self.ballot, type="changed_ballot_position", time__gte=self.ballot.process_start, time__lte=self.ballot.process_end).select_related('ad').order_by("-time", '-id'):
ballot = self.ballot.latest_event(BallotDocEvent, type="created_ballot")
for pos in BallotPositionDocEvent.objects.filter(doc=self.ballot, type="changed_ballot_position", ballot=ballot).select_related('ad').order_by("-time", '-id'):
if pos.ad not in seen:
p = dict(ad_name=pos.ad.plain_name(),
ad_username=pos.ad.pk, # ought to rename this in doc_ballot_list

View file

@ -333,11 +333,10 @@ def email_ballot_deferred(request, doc, by, telechat_date):
def generate_issue_ballot_mail(request, doc):
pass
def generate_issue_ballot_mailREDESIGN(request, doc):
def generate_issue_ballot_mailREDESIGN(request, doc, ballot):
active_ads = Person.objects.filter(role__name="ad", role__group__state="active").distinct()
e = doc.latest_event(type="started_iesg_process")
positions = BallotPositionDocEvent.objects.filter(doc=doc, type="changed_ballot_position", time__gte=e.time).order_by("-time", '-id').select_related('ad')
positions = BallotPositionDocEvent.objects.filter(doc=doc, type="changed_ballot_position", ballot=ballot).order_by("-time", '-id').select_related('ad')
# format positions and setup discusses and comments
ad_feedback = []

View file

@ -34,7 +34,7 @@ from django.utils.html import escape
import string
import re
def markup(content):
def markup(content, split=True):
# normalize line endings to LF only
content = content.replace("\r\n", "\n")
content = content.replace("\r", "\n")
@ -63,8 +63,10 @@ def markup(content):
content = re.sub("\n\n([0-9]+\\.|[A-Z]\\.[0-9]|Appendix|Status of|Abstract|Table of|Full Copyright|Copyright|Intellectual Property|Acknowled|Author|Index)(.*)(?=\n\n)", """\n\n<span class="m_h">\g<1>\g<2></span>""", content)
n = content.find("\n", 5000)
content1 = "<pre>"+content[:n+1]+"</pre>\n"
content2 = "<pre>"+content[n+1:]+"</pre>\n"
return (content1, content2)
if split:
n = content.find("\n", 5000)
content1 = "<pre>"+content[:n+1]+"</pre>\n"
content2 = "<pre>"+content[n+1:]+"</pre>\n"
return (content1, content2)
else:
return "<pre>" + content + "</pre>\n"

View file

@ -36,17 +36,12 @@ from django.conf import settings
from ietf.idtracker.models import IDInternal, BallotInfo
from ietf.idrfc.idrfc_wrapper import position_to_string, BALLOT_ACTIVE_STATES
from ietf.idtracker.templatetags.ietf_filters import in_group, timesince_days
from ietf.ietfauth.decorators import has_role
from ietf.doc.utils import active_ballot_positions
from ietf.doc.models import BallotDocEvent
register = template.Library()
def get_user_adid(context):
if 'user' in context and in_group(context['user'], "Area_Director"):
if settings.USE_DB_REDESIGN_PROXY_CLASSES:
return context['user'].get_profile().id
return context['user'].get_profile().iesg_login_id()
else:
return None
def get_user_name(context):
if 'user' in context and context['user'].is_authenticated():
if settings.USE_DB_REDESIGN_PROXY_CLASSES:
@ -60,103 +55,71 @@ def get_user_name(context):
if person:
return str(person)
return None
def render_ballot_icon(context, doc):
if isinstance(doc,IDInternal):
try:
ballot = doc.ballot
if not ballot.ballot_issued:
return ""
except BallotInfo.DoesNotExist:
return ""
if str(doc.cur_state) not in BALLOT_ACTIVE_STATES:
return ""
if doc.rfc_flag and not settings.USE_DB_REDESIGN_PROXY_CLASSES:
name = doc.document().filename()
else:
name = doc.document().filename
tracker_id = doc.draft_id
else:
if doc.in_ietf_process() and doc.ietf_process.has_active_iesg_ballot():
ballot = doc._idinternal.ballot
else:
return ""
if doc.is_rfc_wrapper:
name = "rfc"+str(doc.rfc_number)
tracker_id = doc.rfc_number
else:
name = doc.draft_name
tracker_id = doc.tracker_id
adId = get_user_adid(context)
red = 0
green = 0
yellow = 0
gray = 0
blank = 0
my = None
for p in ballot.active_positions():
if not p['pos']:
blank = blank + 1
elif (p['pos'].yes > 0) or (p['pos'].noobj > 0):
green = green + 1
elif (p['pos'].discuss > 0):
red = red + 1
elif (p['pos'].abstain > 0):
yellow = yellow + 1
elif (p['pos'].recuse > 0):
gray = gray + 1
else:
blank = blank + 1
if adId and (p['ad'].id == adId):
my = position_to_string(p['pos'])
return render_ballot_icon2(name, tracker_id, red,yellow,green,gray,blank, my, adId)+"<!-- adId="+str(adId)+" my="+str(my)+"-->"
def render_ballot_icon2(draft_name, tracker_id, red,yellow,green,gray,blank, my,adId):
edit_position_url = urlreverse('doc_edit_position', kwargs=dict(name=draft_name))
if adId:
res_cm = ' oncontextmenu="editBallot(\''+str(edit_position_url)+'\');return false;"'
else:
res_cm = ''
res = '<table class="ballot_icon" title="IESG Evaluation Record (click to show more, right-click to edit position)" onclick="showBallot(\'' + draft_name + '\',\'' + str(edit_position_url) + '\')"'+res_cm+'>'
for y in range(3):
res = res + "<tr>"
for x in range(5):
myMark = False
if red > 0:
c = "ballot_icon_red"
red = red - 1
myMark = (my == "Discuss")
elif yellow > 0:
c = "ballot_icon_yellow"
yellow = yellow - 1
myMark = (my == "Abstain")
elif green > 0:
c = "ballot_icon_green"
green = green - 1
myMark = (my == "Yes") or (my == "No Objection")
elif gray > 0:
c = "ballot_icon_gray"
gray = gray - 1
myMark = (my == "Recuse")
else:
c = ""
myMark = (y == 2) and (x == 4) and (my == "No Record")
if myMark:
res = res + '<td class="'+c+' ballot_icon_my" />'
my = None
else:
res = res + '<td class="'+c+'" />'
res = res + '</tr>'
res = res + '</table>'
return res
def render_ballot_icon(user, doc):
if not doc:
return ""
if doc.type_id == "draft":
s = doc.get_state("draft-iesg")
if s and s.name not in BALLOT_ACTIVE_STATES:
return ""
elif doc.type_id == "charter":
if doc.get_state_slug() not in ("intrev", "iesgrev"):
return ""
ballot = doc.latest_event(BallotDocEvent, type="created_ballot")
if not ballot:
return ""
edit_position_url = urlreverse('doc_edit_position', kwargs=dict(name=doc.name, ballot_id=ballot.pk))
def sort_key(t):
_, pos = t
if not pos:
return (2, 0)
elif pos.pos.blocking:
return (0, pos.pos.order)
else:
return (1, pos.pos.order)
positions = list(active_ballot_positions(doc, ballot).items())
positions.sort(key=sort_key)
cm = ""
if has_role(user, "Area Director"):
cm = ' oncontextmenu="editBallot(\''+str(edit_position_url)+'\');return false;"'
res = ['<table class="ballot_icon" title="IESG Evaluation Record (click to show more, right-click to edit position)" onclick="showBallot(\'' + doc.name + '\',\'' + str(edit_position_url) + '\')"' + cm + '>']
res.append("<tr>")
for i, (ad, pos) in enumerate(positions):
if i > 0 and i % 5 == 0:
res.append("</tr>")
res.append("<tr>")
c = "position-%s" % (pos.pos.slug if pos else "norecord")
if ad == user.get_profile():
c += " my"
res.append('<td class="%s" />' % c)
res.append("</tr>")
res.append("</table>")
return "".join(res)
class BallotIconNode(template.Node):
def __init__(self, doc_var):
self.doc_var = doc_var
def render(self, context):
doc = template.resolve_variable(self.doc_var, context)
return render_ballot_icon(context, doc)
if hasattr(doc, "_idinternal"):
# hack for old schema
doc = doc._idinternal
return render_ballot_icon(context.get("user"), doc)
def do_ballot_icon(parser, token):
try:

View file

@ -418,7 +418,8 @@ class EditPositionTestCase(django.test.TestCase):
def test_edit_position(self):
draft = make_test_data()
url = urlreverse('doc_edit_position', kwargs=dict(name=draft.name))
url = urlreverse('doc_edit_position', kwargs=dict(name=draft.name,
ballot_id=draft.latest_event(BallotDocEvent, type="created_ballot").pk))
login_testing_unauthorized(self, "ad", url)
ad = Person.objects.get(name="Aread Irector")
@ -479,7 +480,8 @@ class EditPositionTestCase(django.test.TestCase):
def test_edit_position_as_secretary(self):
draft = make_test_data()
url = urlreverse('doc_edit_position', kwargs=dict(name=draft.name))
url = urlreverse('doc_edit_position', kwargs=dict(name=draft.name,
ballot_id=draft.latest_event(BallotDocEvent, type="created_ballot").pk))
ad = Person.objects.get(name="Aread Irector")
url += "?ad=%s" % ad.pk
login_testing_unauthorized(self, "secretary", url)
@ -523,16 +525,19 @@ class EditPositionTestCase(django.test.TestCase):
draft.save()
ad = Person.objects.get(name="Aread Irector")
ballot = draft.latest_event(BallotDocEvent, type="created_ballot")
BallotPositionDocEvent.objects.create(
doc=draft, type="changed_ballot_position",
by=ad, ad=ad, pos=BallotPositionName.objects.get(slug="discuss"),
by=ad, ad=ad, ballot=ballot, pos=BallotPositionName.objects.get(slug="discuss"),
discuss="This draft seems to be lacking a clearer title?",
discuss_time=datetime.datetime.now(),
comment="Test!",
comment_time=datetime.datetime.now())
url = urlreverse('doc_send_ballot_comment', kwargs=dict(name=draft.name))
url = urlreverse('doc_send_ballot_comment', kwargs=dict(name=draft.name,
ballot_id=ballot.pk))
login_testing_unauthorized(self, "ad", url)
# normal get
@ -691,10 +696,13 @@ class BallotWriteupsTestCase(django.test.TestCase):
url = urlreverse('doc_ballot_writeupnotes', kwargs=dict(name=draft.name))
login_testing_unauthorized(self, "ad", url)
ballot = draft.latest_event(BallotDocEvent, type="created_ballot")
def create_pos(num, vote, comment="", discuss=""):
ad = Person.objects.get(name="Ad No%s" % num)
e = BallotPositionDocEvent()
e.doc = draft
e.ballot = ballot
e.by = ad
e.ad = ad
e.pos = BallotPositionName.objects.get(slug=vote)

View file

@ -30,7 +30,7 @@
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
from django.conf.urls.defaults import patterns, url
from django.conf.urls.defaults import patterns, url, include
from ietf.idrfc import views_doc, views_search, views_edit, views_ballot, views
urlpatterns = patterns('',
@ -40,10 +40,16 @@ urlpatterns = patterns('',
(r'^active/$', views_search.active),
(r'^in-last-call/$', views_search.in_last_call),
url(r'^ad/(?P<name>[A-Za-z0-9.-]+)/$', views_search.by_ad, name="doc_search_by_ad"),
url(r'^(?P<name>[A-Za-z0-9.-]+)/((?P<tab>ballot|writeup|history)/)?$', views_doc.document_main, name="doc_view"),
url(r'^(?P<name>[A-Za-z0-9.-]+)/((?P<rev>[0-9-]+)/)?$', views_doc.document_main, name="doc_view"),
url(r'^(?P<name>[A-Za-z0-9.-]+)/history/$', views_doc.document_history, name="doc_history"),
url(r'^(?P<name>[A-Za-z0-9.-]+)/writeup/$', views_doc.document_writeup, name="doc_writeup"),
url(r'^(?P<name>[A-Za-z0-9.-]+)/ballot/(?P<ballot_id>[A-Za-z0-9.-]+)/position/$', views_ballot.edit_position, name='doc_edit_position'),
url(r'^(?P<name>[A-Za-z0-9.-]+)/ballot/(?P<ballot_id>[A-Za-z0-9.-]+)/emailposition/$', views_ballot.send_ballot_comment, name='doc_send_ballot_comment'),
url(r'^(?P<name>[A-Za-z0-9.-]+)/ballot/(?P<ballot_id>[A-Za-z0-9.-]+)/$', views_doc.document_ballot, name="doc_ballot"),
url(r'^(?P<name>[A-Za-z0-9.-]+)/ballot/$', views_doc.document_ballot, name="doc_ballot"),
(r'^(?P<name>[A-Za-z0-9.-]+)/doc.json$', views_doc.document_debug),
(r'^(?P<name>[A-Za-z0-9.-]+)/_ballot.data$', views_doc.document_ballot),
(r'^(?P<name>[A-Za-z0-9.-]+)/_ballot.data$', views_doc.ballot_html), # why is this url so weird instead of just ballot.html?
(r'^(?P<name>[A-Za-z0-9.-]+)/ballot.tsv$', views_doc.ballot_tsv),
(r'^(?P<name>[A-Za-z0-9.-]+)/ballot.json$', views_doc.ballot_json),
@ -52,14 +58,14 @@ urlpatterns = patterns('',
url(r'^(?P<name>[A-Za-z0-9.-]+)/edit/requestresurrect/$', views_edit.request_resurrect, name='doc_request_resurrect'),
url(r'^(?P<name>[A-Za-z0-9.-]+)/edit/resurrect/$', views_edit.resurrect, name='doc_resurrect'),
url(r'^(?P<name>[A-Za-z0-9.-]+)/edit/addcomment/$', views_edit.add_comment, name='doc_add_comment'),
url(r'^(?P<name>[A-Za-z0-9.-]+)/edit/position/$', views_ballot.edit_position, name='doc_edit_position'),
url(r'^(?P<name>[A-Za-z0-9.-]+)/edit/clearballot/$', views_ballot.clear_ballot, name='doc_clear_ballot'),
url(r'^(?P<name>[A-Za-z0-9.-]+)/edit/deferballot/$', views_ballot.defer_ballot, name='doc_defer_ballot'),
url(r'^(?P<name>[A-Za-z0-9.-]+)/edit/undeferballot/$', views_ballot.undefer_ballot, name='doc_undefer_ballot'),
url(r'^(?P<name>[A-Za-z0-9.-]+)/edit/sendballotcomment/$', views_ballot.send_ballot_comment, name='doc_send_ballot_comment'),
url(r'^(?P<name>[A-Za-z0-9.-]+)/edit/lastcalltext/$', views_ballot.lastcalltext, name='doc_ballot_lastcall'),
url(r'^(?P<name>[A-Za-z0-9.-]+)/edit/ballotwriteupnotes/$', views_ballot.ballot_writeupnotes, name='doc_ballot_writeupnotes'),
url(r'^(?P<name>[A-Za-z0-9.-]+)/edit/approvaltext/$', views_ballot.ballot_approvaltext, name='doc_ballot_approvaltext'),
url(r'^(?P<name>[A-Za-z0-9.-]+)/edit/approveballot/$', views_ballot.approve_ballot, name='doc_approve_ballot'),
url(r'^(?P<name>[A-Za-z0-9.-]+)/edit/makelastcall/$', views_ballot.make_last_call, name='doc_make_last_call'),
(r'^(?P<name>[A-Za-z0-9.-]+)/charter/', include('ietf.wgcharter.urls')),
)

View file

@ -10,10 +10,11 @@ from django.template.loader import render_to_string
from django.template import RequestContext
from django import forms
from django.utils.html import strip_tags
from django.utils import simplejson
from django.conf import settings
from ietf.utils.mail import send_mail_text, send_mail_preformatted
from ietf.ietfauth.decorators import group_required
from ietf.ietfauth.decorators import group_required, role_required
from ietf.idtracker.templatetags.ietf_filters import in_group
from ietf.ietfauth.decorators import has_role, role_required
from ietf.idtracker.models import *
@ -25,10 +26,12 @@ from ietf.idrfc.utils import *
from ietf.idrfc.lastcall import request_last_call
from ietf.idrfc.idrfc_wrapper import BallotWrapper
from ietf.doc.utils import *
from ietf.doc.models import *
from ietf.name.models import BallotPositionName
from ietf.message.utils import infer_message
from ietf.message.utils import infer_message
from ietf.person.models import Person
BALLOT_CHOICES = (("yes", "Yes"),
("noobj", "No Objection"),
@ -216,6 +219,11 @@ class EditPositionFormREDESIGN(forms.Form):
comment = forms.CharField(required=False, widget=forms.Textarea)
return_to_url = forms.CharField(required=False, widget=forms.HiddenInput)
def __init__(self, *args, **kwargs):
ballot_type = kwargs.pop("ballot_type")
super(EditPositionForm, self).__init__(*args, **kwargs)
self.fields['position'].queryset = ballot_type.positions.order_by('order')
def clean_discuss(self):
entered_discuss = self.cleaned_data["discuss"]
entered_pos = self.cleaned_data["position"]
@ -224,38 +232,34 @@ class EditPositionFormREDESIGN(forms.Form):
return entered_discuss
@role_required('Area Director','Secretariat')
def edit_positionREDESIGN(request, name):
"""Vote and edit discuss and comment on Internet Draft as Area Director."""
def edit_positionREDESIGN(request, name, ballot_id):
"""Vote and edit discuss and comment on document as Area Director."""
doc = get_object_or_404(Document, docalias__name=name)
started_process = doc.latest_event(type="started_iesg_process")
if not doc.get_state("draft-iesg") or not started_process:
raise Http404()
ballot = get_object_or_404(BallotDocEvent, type="created_ballot", pk=ballot_id, doc=doc)
ad = login = request.user.get_profile()
if 'HTTP_REFERER' in request.META:
return_to_url = request.META['HTTP_REFERER']
else:
return_to_url = doc.get_absolute_url()
return_to_url = urlreverse("doc_ballot", kwargs=dict(name=doc.name, ballot_id=ballot_id))
# if we're in the Secretariat, we can select an AD to act as stand-in for
if has_role(request.user, "Secretariat"):
ad_id = request.GET.get('ad')
if not ad_id:
raise Http404()
from ietf.person.models import Person
ad = get_object_or_404(Person, pk=ad_id)
old_pos = doc.latest_event(BallotPositionDocEvent, type="changed_ballot_position", ad=ad, time__gte=started_process.time)
old_pos = doc.latest_event(BallotPositionDocEvent, type="changed_ballot_position", ad=ad, ballot=ballot)
if request.method == 'POST':
if not has_role(request.user, "Secretariat") and not ad.role_set.filter(name="ad", group__type="area", group__state="active"):
# prevent pre-ADs from voting
return HttpResponseForbidden("Must be a proper Area Director in an active area to cast ballot")
form = EditPositionForm(request.POST)
form = EditPositionForm(request.POST, ballot_type=ballot.ballot_type)
if form.is_valid():
# save the vote
clean = form.cleaned_data
@ -264,6 +268,7 @@ def edit_positionREDESIGN(request, name):
pos = BallotPositionDocEvent(doc=doc, by=login)
pos.type = "changed_ballot_position"
pos.ballot = ballot
pos.ad = ad
pos.pos = clean["position"]
pos.comment = clean["comment"].rstrip()
@ -276,7 +281,7 @@ def edit_positionREDESIGN(request, name):
changes = []
added_events = []
# possibly add discuss/comment comments to history trail
# so it's easy to see
# so it's easy to see what's happened
old_comment = old_pos.comment if old_pos else ""
if pos.comment != old_comment:
pos.comment_time = pos.time
@ -298,7 +303,8 @@ def edit_positionREDESIGN(request, name):
e = DocEvent(doc=doc, by=login)
e.by = ad # otherwise we can't see who's saying it
e.type = "added_comment"
e.desc = "[Ballot discuss]\n" + pos.discuss
e.desc = "[Ballot %s]\n" % pos.pos.name.lower()
e.desc += pos.discuss
added_events.append(e)
# figure out a description
@ -318,13 +324,13 @@ def edit_positionREDESIGN(request, name):
pos.save()
for e in added_events:
e.save() # save them after the position is saved to get later id
e.save() # save them after the position is saved to get later id for sorting order
if request.POST.get("send_mail"):
qstr = "?return_to_url=%s" % return_to_url
if request.GET.get('ad'):
qstr += "&ad=%s" % request.GET.get('ad')
return HttpResponseRedirect(urlreverse("doc_send_ballot_comment", kwargs=dict(name=doc.name)) + qstr)
return HttpResponseRedirect(urlreverse("doc_send_ballot_comment", kwargs=dict(name=doc.name, ballot_id=ballot_id)) + qstr)
elif request.POST.get("Defer"):
return HttpResponseRedirect(urlreverse("doc_defer_ballot", kwargs=dict(name=doc)))
elif request.POST.get("Undefer"):
@ -341,10 +347,13 @@ def edit_positionREDESIGN(request, name):
if return_to_url:
initial['return_to_url'] = return_to_url
form = EditPositionForm(initial=initial)
form = EditPositionForm(initial=initial, ballot_type=ballot.ballot_type)
blocking_positions = dict((p.pk, p.name) for p in form.fields["position"].queryset.all() if p.blocking)
print blocking_positions, form.fields["position"].queryset.all()
ballot_deferred = None
if doc.get_state_slug("draft-iesg") == "defer":
if doc.get_state_slug("%s-iesg" % doc.type_id) == "defer":
ballot_deferred = doc.latest_event(type="changed_document", desc__startswith="State changed to <b>IESG Evaluation - Defer</b>")
return render_to_response('idrfc/edit_positionREDESIGN.html',
@ -354,6 +363,8 @@ def edit_positionREDESIGN(request, name):
return_to_url=return_to_url,
old_pos=old_pos,
ballot_deferred=ballot_deferred,
show_discuss_text=old_pos and old_pos.pos.blocking,
blocking_positions=simplejson.dumps(blocking_positions),
),
context_instance=RequestContext(request))
@ -434,42 +445,39 @@ def send_ballot_comment(request, name):
),
context_instance=RequestContext(request))
@group_required('Area_Director','Secretariat')
def send_ballot_commentREDESIGN(request, name):
"""Email Internet Draft ballot discuss/comment for area director."""
@role_required('Area Director','Secretariat')
def send_ballot_commentREDESIGN(request, name, ballot_id):
"""Email document ballot position discuss/comment for Area Director."""
doc = get_object_or_404(Document, docalias__name=name)
started_process = doc.latest_event(type="started_iesg_process")
if not started_process:
raise Http404()
ballot = get_object_or_404(BallotDocEvent, type="created_ballot", pk=ballot_id, doc=doc)
ad = login = request.user.get_profile()
return_to_url = request.GET.get('return_to_url')
if not return_to_url:
return_to_url = doc.get_absolute_url()
return_to_url = urlreverse("doc_ballot", kwargs=dict(name=doc.name, ballot_id=ballot_id))
if 'HTTP_REFERER' in request.META:
back_url = request.META['HTTP_REFERER']
else:
back_url = doc.get_absolute_url()
back_url = urlreverse("doc_ballot", kwargs=dict(name=doc.name, ballot_id=ballot_id))
# if we're in the Secretariat, we can select an AD to act as stand-in for
if not has_role(request.user, "Area Director"):
ad_id = request.GET.get('ad')
if not ad_id:
raise Http404()
from ietf.person.models import Person
ad = get_object_or_404(Person, pk=ad_id)
pos = doc.latest_event(BallotPositionDocEvent, type="changed_ballot_position", ad=ad, time__gte=started_process.time)
pos = doc.latest_event(BallotPositionDocEvent, type="changed_ballot_position", ad=ad, ballot=ballot)
if not pos:
raise Http404()
subj = []
d = ""
if pos.pos_id == "discuss" and pos.discuss:
if pos.pos.blocking and pos.discuss:
d = pos.discuss
subj.append("DISCUSS")
subj.append(pos.pos.name.upper())
c = ""
if pos.comment:
c = pos.comment
@ -950,9 +958,6 @@ class BallotWriteupFormREDESIGN(forms.Form):
def ballot_writeupnotesREDESIGN(request, name):
"""Editing of ballot write-up and notes"""
doc = get_object_or_404(Document, docalias__name=name)
started_process = doc.latest_event(type="started_iesg_process")
if not started_process:
raise Http404()
login = request.user.get_profile()
@ -975,9 +980,13 @@ def ballot_writeupnotesREDESIGN(request, name):
e.save()
if "issue_ballot" in request.POST:
if has_role(request.user, "Area Director") and not doc.latest_event(BallotPositionDocEvent, ad=login, time__gte=started_process.time):
create_ballot_if_not_open(doc, login, "approve")
ballot = doc.latest_event(BallotDocEvent, type="created_ballot")
if has_role(request.user, "Area Director") and not doc.latest_event(BallotPositionDocEvent, ad=login, ballot=ballot):
# sending the ballot counts as a yes
pos = BallotPositionDocEvent(doc=doc, by=login)
pos.ballot = ballot
pos.type = "changed_ballot_position"
pos.ad = login
pos.pos_id = "yes"
@ -988,7 +997,7 @@ def ballot_writeupnotesREDESIGN(request, name):
if not approval:
approval = generate_approval_mail(request, doc)
msg = generate_issue_ballot_mail(request, doc)
msg = generate_issue_ballot_mail(request, doc, ballot)
send_mail_preformatted(request, msg)
email_iana(request, doc, 'drafts-eval@icann.org', msg)
@ -1241,6 +1250,8 @@ def approve_ballotREDESIGN(request, name):
new_state = State.objects.get(type="draft-iesg", slug="ann")
# fixup document
close_open_ballots(doc, login)
save_document_in_history(doc)
prev = doc.get_state("draft-iesg")

View file

@ -30,11 +30,10 @@
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
import re, os
from datetime import datetime, time
import re, os, datetime
from django.http import HttpResponse, Http404
from django.shortcuts import render_to_response, get_object_or_404
from django.shortcuts import render_to_response, get_object_or_404, redirect
from django.template import RequestContext
from django.template.loader import render_to_string
from django.template.defaultfilters import truncatewords_html
@ -50,6 +49,299 @@ from ietf.idrfc import markup_txt
from ietf.idrfc.models import RfcIndex, DraftVersions
from ietf.idrfc.idrfc_wrapper import BallotWrapper, IdWrapper, RfcWrapper
from ietf.ietfworkflows.utils import get_full_info_for_draft
from ietf.doc.models import *
from ietf.doc.utils import get_chartering_type, needed_ballot_positions, active_ballot_positions
from ietf.utils.history import find_history_active_at
from ietf.ietfauth.decorators import has_role
def render_document_top(request, doc, tab):
tabs = []
tabs.append(("Document", "document", urlreverse("ietf.idrfc.views_doc.document_main", kwargs=dict(name=doc.name)), True))
ballot = doc.latest_event(BallotDocEvent, type="created_ballot")
if doc.type_id == "draft":
# if doc.in_ietf_process and doc.ietf_process.has_iesg_ballot:
tabs.append(("IESG Evaluation Record", "ballot", urlreverse("ietf.idrfc.views_doc.document_ballot", kwargs=dict(name=doc.name)), ballot))
elif doc.type_id == "charter":
tabs.append(("IESG Review", "ballot", urlreverse("ietf.idrfc.views_doc.document_ballot", kwargs=dict(name=doc.name)), ballot))
# FIXME: if doc.in_ietf_process and doc.ietf_process.has_iesg_ballot:
tabs.append(("IESG Writeups", "writeup", urlreverse("ietf.idrfc.views_doc.document_writeup", kwargs=dict(name=doc.name)), True))
tabs.append(("History", "history", urlreverse("ietf.idrfc.views_doc.document_history", kwargs=dict(name=doc.name)), True))
name = doc.canonical_name()
if name.startswith("rfc"):
name = "RFC %s" % name[3:]
else:
name += "-" + doc.rev
return render_to_string("idrfc/document_top.html",
dict(doc=doc,
tabs=tabs,
selected=tab,
name=name))
def document_main(request, name, rev=None):
if name.lower().startswith("draft") or name.lower().startswith("rfc"):
if rev != None: # no support for old revisions at the moment
raise Http404()
return document_main_idrfc(request, name, tab="document")
print name
print Document.objects.filter(name=name)
doc = get_object_or_404(Document, docalias__name=name)
print doc
group = doc.group
print group
revisions = [ doc.rev ]
for h in doc.history_set.order_by("-time"):
if h.rev and not h.rev in revisions:
revisions.append(h.rev)
snapshot = False
if rev != None:
if rev == doc.rev:
return redirect('doc_view', name=name)
# find the entry in the history
for h in doc.history_set.order_by("-time"):
if rev == h.rev:
snapshot = True
doc = h
break
if not snapshot:
return redirect('doc_view', name=name)
# find old group, too
gh = find_history_active_at(doc.group, doc.time)
if gh:
group = gh
top = render_document_top(request, doc, "document")
telechat = doc.latest_event(TelechatDocEvent, type="scheduled_for_telechat")
if telechat and telechat.telechat_date < datetime.date.today():
telechat = None
if doc.type_id == "charter":
filename = "%s-%s.txt" % (doc.canonical_name(), doc.rev)
content = _get_html(filename, os.path.join(settings.CHARTER_PATH, filename), split=False)
ballot_summary = None
if doc.get_state_slug() in ("intrev", "iesgrev"):
ballot_summary = needed_ballot_positions(doc, active_ballot_positions(doc).values())
return render_to_response("idrfc/document_charter.html",
dict(doc=doc,
top=top,
chartering=get_chartering_type(doc),
content=content,
txt_url=settings.CHARTER_TXT_URL + filename,
revisions=revisions,
snapshot=snapshot,
telechat=telechat,
ballot_summary=ballot_summary,
group=group,
),
context_instance=RequestContext(request))
raise Http404()
def document_history(request, name):
# todo: remove need for specific handling of drafts by porting the
# two event text hacks
if name.lower().startswith("draft") or name.lower().startswith("rfc"):
return document_main_idrfc(request, name, "history")
doc = get_object_or_404(Document, docalias__name=name)
top = render_document_top(request, doc, "history")
diff_documents = [ doc ]
diff_documents.extend(Document.objects.filter(docalias__relateddocument__source=doc, docalias__relateddocument__relationship="replaces"))
# pick up revisions from events
diff_revisions = []
seen = set()
diffable = name.startswith("draft") or name.startswith("charter")
if diffable:
for e in NewRevisionDocEvent.objects.filter(type="new_revision", doc__in=diff_documents).select_related('doc').order_by("-time", "-id"):
if not (e.doc.name, e.rev) in seen:
seen.add((e.doc.name, e.rev))
url = ""
if name.startswith("charter"):
h = find_history_active_at(e.doc, e.time)
url = settings.CHARTER_TXT_URL + ("%s-%s.txt" % ((h or doc).canonical_name(), e.rev))
elif name.startswith("draft"):
# rfcdiff tool has special support for IDs
url = e.doc.name + "-" + e.rev
diff_revisions.append((e.doc.name, e.rev, e.time, url))
# grab event history
events = doc.docevent_set.all().order_by("-time", "-id").select_related("by")
# fill in revision numbers
event_revisions = list(NewRevisionDocEvent.objects.filter(doc=doc).order_by('time', 'id').values('rev', 'time'))
cur_rev = doc.rev
if doc.get_state_slug() == "rfc":
cur_rev = "RFC"
for e in events:
while event_revisions and e.time < event_revisions[-1]["time"]:
event_revisions.pop()
if event_revisions:
cur_rev = event_revisions[-1]["rev"]
else:
cur_rev = "00"
e.rev = cur_rev
return render_to_response("idrfc/document_history.html",
dict(doc=doc,
top=top,
diff_revisions=diff_revisions,
events=events,
),
context_instance=RequestContext(request))
def document_writeup(request, name):
if name.lower().startswith("draft") or name.lower().startswith("rfc"):
# todo: migrate idrfc to pattern below
return document_main_idrfc(request, name, "writeup")
doc = get_object_or_404(Document, docalias__name=name)
top = render_document_top(request, doc, "writeup")
writeups = []
if doc.type_id == "charter":
e = doc.latest_event(WriteupDocEvent, type="changed_review_announcement")
writeups.append(("WG Review Announcement",
e.text if e else "",
urlreverse("ietf.wgcharter.views.announcement_text", kwargs=dict(name=doc.name, ann="review"))))
e = doc.latest_event(WriteupDocEvent, type="changed_action_announcement")
writeups.append(("WG Action Announcement",
e.text if e else "",
urlreverse("ietf.wgcharter.views.announcement_text", kwargs=dict(name=doc.name, ann="action"))))
if doc.latest_event(BallotDocEvent, type="created_ballot"):
e = doc.latest_event(WriteupDocEvent, type="changed_ballot_writeup_text")
writeups.append(("Ballot Announcement",
e.text if e else "",
urlreverse("ietf.wgcharter.views.ballot_writeupnotes", kwargs=dict(name=doc.name))))
if not writeups:
raise Http404()
return render_to_response("idrfc/document_writeup.html",
dict(doc=doc,
top=top,
writeups=writeups,
can_edit=has_role(request.user, ("Area Director", "Secretariat")),
),
context_instance=RequestContext(request))
def document_ballot_content(request, doc, ballot_id, editable=True):
"""Render HTML string with content of ballot page."""
if ballot_id != None:
ballot = doc.latest_event(BallotDocEvent, type="created_ballot", pk=ballot_id)
else:
ballot = doc.latest_event(BallotDocEvent, type="created_ballot")
if not ballot:
raise Http404()
deferred = None
if doc.type_id == "draft" and doc.get_state_slug("draft-iesg") == "defer":
# FIXME: fragile
deferred = doc.latest_event(type="changed_document", desc__startswith="State changed to <b>IESG Evaluation - Defer</b>")
# collect positions
active_ads = list(Person.objects.filter(role__name="ad", role__group__state="active").distinct())
positions = []
seen = {}
for e in BallotPositionDocEvent.objects.filter(doc=doc, type="changed_ballot_position", ballot=ballot).select_related('ad', 'pos').order_by("-time", '-id'):
if e.ad not in seen:
e.old_ad = e.ad not in active_ads
e.old_positions = []
positions.append(e)
seen[e.ad] = e
else:
latest = seen[e.ad]
if latest.old_positions:
prev = latest.old_positions[-1]
else:
prev = latest.pos.name
if e.pos.name != prev:
latest.old_positions.append(e.pos.name)
# add any missing ADs through fake No Record events
norecord = BallotPositionName.objects.get(slug="norecord")
for ad in active_ads:
if ad not in seen:
e = BallotPositionDocEvent(type="changed_ballot_position", doc=doc, ad=ad)
e.pos = norecord
e.old_ad = False
e.old_positions = []
positions.append(e)
# put into position groups
position_groups = []
for n in BallotPositionName.objects.filter(slug__in=[p.pos_id for p in positions]).order_by('order'):
g = (n, [p for p in positions if p.pos_id == n.slug])
g[1].sort(key=lambda p: (p.old_ad, p.ad.plain_name()))
if n.blocking:
position_groups.insert(0, g)
else:
position_groups.append(g)
summary = needed_ballot_positions(doc, [p for p in positions if not p.old_ad])
text_positions = [p for p in positions if p.discuss or p.comment]
text_positions.sort(key=lambda p: (p.old_ad, p.ad.plain_name()))
all_ballots = BallotDocEvent.objects.filter(doc=doc, type="created_ballot")
return render_to_string("idrfc/document_ballot_content.html",
dict(doc=doc,
ballot=ballot,
position_groups=position_groups,
text_positions=text_positions,
editable=editable,
deferred=deferred,
summary=summary,
all_ballots=all_ballots,
),
context_instance=RequestContext(request))
def document_ballot(request, name, ballot_id=None):
doc = get_object_or_404(Document, docalias__name=name)
top = render_document_top(request, doc, "ballot")
c = document_ballot_content(request, doc, ballot_id, editable=True)
return render_to_response("idrfc/document_ballot.html",
dict(doc=doc,
top=top,
ballot_content=c,
),
context_instance=RequestContext(request))
def document_debug(request, name):
r = re.compile("^rfc([1-9][0-9]*)$")
@ -63,18 +355,21 @@ def document_debug(request, name):
doc = IdWrapper(draft=id)
return HttpResponse(doc.to_json(), mimetype='text/plain')
def _get_html(key, filename):
def _get_html(key, filename, split=True):
f = None
try:
f = open(filename, 'rb')
raw_content = f.read()
except IOError:
return ("Error; cannot read ("+key+")", "")
error = "Error; cannot read ("+key+")"
if split:
return (error, "")
else:
return error
finally:
if f:
f.close()
(c1,c2) = markup_txt.markup(raw_content)
return (c1,c2)
return markup_txt.markup(raw_content, split)
def include_text(request):
include_text = request.GET.get( 'include_text' )
@ -114,9 +409,7 @@ def document_main_rfc(request, rfc_number, tab):
context_instance=RequestContext(request));
@decorator_from_middleware(GZipMiddleware)
def document_main(request, name, tab):
if tab is None:
tab = "document"
def document_main_idrfc(request, name, tab):
r = re.compile("^rfc([1-9][0-9]*)$")
m = r.match(name)
if m:
@ -221,11 +514,11 @@ def _get_history(doc, versions):
# convert plain dates to datetimes (required for sorting)
for x in results:
if not isinstance(x['date'], datetime):
if not isinstance(x['date'], datetime.datetime):
if x['date']:
x['date'] = datetime.combine(x['date'], time(0,0,0))
x['date'] = datetime.datetime.combine(x['date'], datetime.time(0,0,0))
else:
x['date'] = datetime(1970,1,1)
x['date'] = datetime.datetime(1970,1,1)
results.sort(key=lambda x: x['date'])
results.reverse()
@ -295,7 +588,7 @@ def get_ballot(name):
ballot = BallotWrapper(id)
return ballot, doc
def document_ballot(request, name):
def ballot_html(request, name):
ballot, doc = get_ballot(name)
return render_to_response('idrfc/doc_ballot.html', {'ballot':ballot, 'doc':doc}, context_instance=RequestContext(request))
@ -308,3 +601,4 @@ def ballot_json(request, name):
response = HttpResponse(mimetype='text/plain')
response.write(json.dumps(ballot.dict(), indent=2))
return response

View file

@ -791,10 +791,8 @@ def add_comment(request, name):
@group_required('Area_Director', 'Secretariat', 'IANA')
def add_commentREDESIGN(request, name):
"""Add comment to Internet Draft."""
"""Add comment to history of document."""
doc = get_object_or_404(Document, docalias__name=name)
if not doc.get_state("draft-iesg"):
raise Http404()
login = request.user.get_profile()
@ -808,16 +806,16 @@ def add_commentREDESIGN(request, name):
e.desc = c
e.save()
email_owner(request, doc, doc.ad, login,
"A new comment added by %s" % login.name)
return HttpResponseRedirect(doc.get_absolute_url())
if doc.type_id == "draft":
email_owner(request, doc, doc.ad, login,
"A new comment added by %s" % login.name)
return HttpResponseRedirect(urlreverse("doc_history", kwargs=dict(name=doc.name)))
else:
form = AddCommentForm()
return render_to_response('idrfc/add_comment.html',
dict(doc=doc,
form=form,
back_url=doc.get_absolute_url()),
form=form),
context_instance=RequestContext(request))
if settings.USE_DB_REDESIGN_PROXY_CLASSES:

View file

@ -445,9 +445,9 @@ def ad_area(user):
def format_history_text(text):
"""Run history text through some cleaning and add ellipsis if it's too long."""
full = mark_safe(sanitize_html(keep_spacing(linebreaksbr(urlize(mark_safe(text))))))
snipped = truncatewords_html(format_textarea(fill(text, 80)), 25)
if snipped[-3:] == "...":
return mark_safe(u'<div class="snipped">%s<div class="showAll">[show all]</div><div><div style="display:none" class="full">%s</div>' % (snipped, full))
snippet = truncatewords_html(format_textarea(text), 25)
if snippet[-3:] == "...":
return mark_safe(u'<div class="snippet">%s<span class="showAll">[show all]</span></div><div style="display:none" class="full">%s</div>' % (snippet, full))
return full
@register.filter

View file

@ -33,6 +33,9 @@
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
import codecs, re, os, glob
import datetime
import tarfile
from ietf.idtracker.models import IDInternal, InternetDraft,AreaGroup, Position, IESGLogin, Acronym
from django.views.generic.list_detail import object_list
from django.views.generic.simple import direct_to_template
@ -50,8 +53,8 @@ from ietf.idrfc.utils import update_telechat
from ietf.ietfauth.decorators import group_required
from ietf.idtracker.templatetags.ietf_filters import in_group
from ietf.ipr.models import IprRfc, IprDraft, IprDetail
import datetime
import tarfile
from ietf.doc.models import Document, TelechatDocEvent
from ietf.group.models import Group
def date_threshold():
"""Return the first day of the month that is 185 days ago."""
@ -208,6 +211,23 @@ def get_doc_sectionREDESIGN(id):
s = s + "1"
return s
def get_wg_section(wg):
s = ""
charter_slug = None
if wg.charter:
charter_slug = wg.charter.get_state_slug()
if wg.state_id == "proposed":
if charter_slug == "intrev":
s = '411'
elif charter_slug == "iesgrev":
s = '412'
elif wg.state_id == "active":
if charter_slug == "intrev":
s = '421'
elif charter_slug == "iesgrev":
s = '422'
return s
if settings.USE_DB_REDESIGN_PROXY_CLASSES:
get_doc_section = get_doc_sectionREDESIGN
@ -253,15 +273,16 @@ def agenda_docs(date, next_agenda):
return res
def agenda_wg_actions(date):
mapping = {12:'411', 13:'412',22:'421',23:'422'}
matches = WGAction.objects.filter(agenda=1,telechat_date=date,category__in=mapping.keys()).order_by('category')
res = {}
for o in matches:
section_key = "s"+mapping[o.category]
res = dict(("s%s%s%s" % (i, j, k), []) for i in range(2, 5) for j in range (1, 4) for k in range(1, 4))
charters = Document.objects.filter(type="charter", docevent__telechatdocevent__telechat_date=date).distinct()
for c in charters:
if c.latest_event(TelechatDocEvent, type="scheduled_for_telechat").telechat_date != date:
continue
section_key = "s" + get_wg_section(c.group)
if section_key not in res:
res[section_key] = []
area = AreaGroup.objects.get(group=o.group_acronym)
res[section_key].append({'obj':o, 'area':str(area.area)})
res[section_key].append({'obj': c.group})
return res
def agenda_management_issues(date):

View file

@ -71,30 +71,38 @@ def has_role(user, role_names):
if not user or not user.is_authenticated():
return False
from ietf.person.models import Person
try:
person = user.get_profile()
except Person.DoesNotExist:
return False
if not hasattr(user, "roles_check_cache"):
user.roles_check_cache = {}
role_qs = {
"Area Director": Q(person=person, name__in=("pre-ad", "ad"), group__type="area", group__state="active"),
"Secretariat": Q(person=person, name="secr", group__acronym="secretariat"),
"IANA": Q(person=person, name="auth", group__acronym="iana"),
"IAD": Q(person=person, name="admdir", group__acronym="ietf"),
"IETF Chair": Q(person=person, name="chair", group__acronym="ietf"),
"IAB Chair": Q(person=person, name="chair", group__acronym="iab"),
"WG Chair": Q(person=person,name="chair", group__type="wg", group__state="active"),
"WG Secretary": Q(person=person,name="secr", group__type="wg", group__state="active"),
}
key = frozenset(role_names)
if key not in user.roles_check_cache:
filter_expr = Q()
for r in role_names:
filter_expr |= role_qs[r]
from ietf.person.models import Person
from ietf.group.models import Role
from ietf.group.models import Role
return bool(Role.objects.filter(filter_expr)[:1])
try:
person = user.get_profile()
except Person.DoesNotExist:
return False
role_qs = {
"Area Director": Q(person=person, name__in=("pre-ad", "ad"), group__type="area", group__state="active"),
"Secretariat": Q(person=person, name="secr", group__acronym="secretariat"),
"IANA": Q(person=person, name="auth", group__acronym="iana"),
"IAD": Q(person=person, name="admdir", group__acronym="ietf"),
"IETF Chair": Q(person=person, name="chair", group__acronym="ietf"),
"IAB Chair": Q(person=person, name="chair", group__acronym="iab"),
"WG Chair": Q(person=person,name="chair", group__type="wg", group__state="active"),
"WG Secretary": Q(person=person,name="secr", group__type="wg", group__state="active"),
}
filter_expr = Q()
for r in role_names:
filter_expr |= role_qs[r]
user.roles_check_cache[key] = bool(Role.objects.filter(filter_expr)[:1])
return user.roles_check_cache[key]
def role_required(*role_names):
"""View decorator for checking that the user is logged in and

View file

@ -361,7 +361,7 @@ class OutgoingLiaisonForm(LiaisonForm):
person = self.fake_person or self.person
for i in self.hm.get_entities_for_person(person):
all_entities += i[1]
# If the from entity is one in wich the user has full privileges the to entity could be anyone
# If the from entity is one in which the user has full privileges the to entity could be anyone
if from_code in [i[0] for i in all_entities]:
return to_code
sdo_codes = ['sdo_%s' % i.sdo.pk for i in person.liaisonmanagers_set.all().distinct()]

View file

@ -5,36 +5,49 @@
<field type="TextField" name="desc"></field>
<field type="BooleanField" name="used">True</field>
<field type="IntegerField" name="order">1</field>
<field type="BooleanField" name="blocking">False</field>
</object>
<object pk="noobj" model="name.ballotpositionname">
<field type="CharField" name="name">No Objection</field>
<field type="TextField" name="desc"></field>
<field type="BooleanField" name="used">True</field>
<field type="IntegerField" name="order">2</field>
<field type="BooleanField" name="blocking">False</field>
</object>
<object pk="discuss" model="name.ballotpositionname">
<field type="CharField" name="name">Discuss</field>
<field type="TextField" name="desc"></field>
<field type="BooleanField" name="used">True</field>
<field type="IntegerField" name="order">3</field>
<field type="BooleanField" name="blocking">False</field>
</object>
<object pk="block" model="name.ballotpositionname">
<field type="CharField" name="name">Block</field>
<field type="TextField" name="desc"></field>
<field type="BooleanField" name="used">True</field>
<field type="IntegerField" name="order">3</field>
<field type="BooleanField" name="blocking">True</field>
</object>
<object pk="abstain" model="name.ballotpositionname">
<field type="CharField" name="name">Abstain</field>
<field type="TextField" name="desc"></field>
<field type="BooleanField" name="used">True</field>
<field type="IntegerField" name="order">4</field>
<field type="BooleanField" name="blocking">False</field>
</object>
<object pk="recuse" model="name.ballotpositionname">
<field type="CharField" name="name">Recuse</field>
<field type="TextField" name="desc"></field>
<field type="BooleanField" name="used">True</field>
<field type="IntegerField" name="order">5</field>
<field type="BooleanField" name="blocking">False</field>
</object>
<object pk="norecord" model="name.ballotpositionname">
<field type="CharField" name="name">No Record</field>
<field type="TextField" name="desc"></field>
<field type="BooleanField" name="used">True</field>
<field type="IntegerField" name="order">6</field>
<field type="BooleanField" name="blocking">False</field>
</object>
<object pk="conflict" model="name.constraintname">
<field type="CharField" name="name">Conflicts with</field>
@ -54,8 +67,8 @@
<field type="BooleanField" name="used">True</field>
<field type="IntegerField" name="order">0</field>
</object>
<object pk="replaces" model="name.docrelationshipname">
<field type="CharField" name="name">Replaces</field>
<object pk="obs" model="name.docrelationshipname">
<field type="CharField" name="name">Obsoletes</field>
<field type="TextField" name="desc"></field>
<field type="BooleanField" name="used">True</field>
<field type="IntegerField" name="order">0</field>
@ -66,8 +79,8 @@
<field type="BooleanField" name="used">True</field>
<field type="IntegerField" name="order">0</field>
</object>
<object pk="obs" model="name.docrelationshipname">
<field type="CharField" name="name">Obsoletes</field>
<object pk="replaces" model="name.docrelationshipname">
<field type="CharField" name="name">Replaces</field>
<field type="TextField" name="desc"></field>
<field type="BooleanField" name="used">True</field>
<field type="IntegerField" name="order">0</field>
@ -78,6 +91,30 @@
<field type="BooleanField" name="used">True</field>
<field type="IntegerField" name="order">0</field>
</object>
<object pk="iana-crd" model="name.doctagname">
<field type="CharField" name="name">IANA coordination</field>
<field type="TextField" name="desc">RFC-Editor/IANA Registration Coordination</field>
<field type="BooleanField" name="used">True</field>
<field type="IntegerField" name="order">0</field>
</object>
<object pk="ref" model="name.doctagname">
<field type="CharField" name="name">Holding for references</field>
<field type="TextField" name="desc">Holding for normative reference</field>
<field type="BooleanField" name="used">True</field>
<field type="IntegerField" name="order">0</field>
</object>
<object pk="missref" model="name.doctagname">
<field type="CharField" name="name">Missing references</field>
<field type="TextField" name="desc">Awaiting missing normative reference</field>
<field type="BooleanField" name="used">True</field>
<field type="IntegerField" name="order">0</field>
</object>
<object pk="errata" model="name.doctagname">
<field type="CharField" name="name">Has errata</field>
<field type="TextField" name="desc"></field>
<field type="BooleanField" name="used">True</field>
<field type="IntegerField" name="order">0</field>
</object>
<object pk="rfc-rev" model="name.doctagname">
<field type="CharField" name="name">Review by RFC Editor</field>
<field type="TextField" name="desc"></field>
@ -90,24 +127,12 @@
<field type="BooleanField" name="used">True</field>
<field type="IntegerField" name="order">0</field>
</object>
<object pk="exp-tomb" model="name.doctagname">
<field type="CharField" name="name">Expired tombstone</field>
<field type="TextField" name="desc"></field>
<field type="BooleanField" name="used">True</field>
<field type="IntegerField" name="order">0</field>
</object>
<object pk="app-min" model="name.doctagname">
<field type="CharField" name="name">Approved in minute</field>
<field type="TextField" name="desc"></field>
<field type="BooleanField" name="used">True</field>
<field type="IntegerField" name="order">0</field>
</object>
<object pk="errata" model="name.doctagname">
<field type="CharField" name="name">Has errata</field>
<field type="TextField" name="desc"></field>
<field type="BooleanField" name="used">True</field>
<field type="IntegerField" name="order">0</field>
</object>
<object pk="need-sh" model="name.doctagname">
<field type="CharField" name="name">Shepherd Needed</field>
<field type="TextField" name="desc"></field>
@ -246,6 +271,12 @@
<field type="BooleanField" name="used">True</field>
<field type="IntegerField" name="order">11</field>
</object>
<object pk="charter" model="name.doctypename">
<field type="CharField" name="name">Charter</field>
<field type="TextField" name="desc"></field>
<field type="BooleanField" name="used">True</field>
<field type="IntegerField" name="order">0</field>
</object>
<object pk="agenda" model="name.doctypename">
<field type="CharField" name="name">Agenda</field>
<field type="TextField" name="desc"></field>
@ -276,12 +307,6 @@
<field type="BooleanField" name="used">True</field>
<field type="IntegerField" name="order">0</field>
</object>
<object pk="charter" model="name.doctypename">
<field type="CharField" name="name">Charter</field>
<field type="TextField" name="desc"></field>
<field type="BooleanField" name="used">True</field>
<field type="IntegerField" name="order">0</field>
</object>
<object pk="no" model="name.groupballotpositionname">
<field type="CharField" name="name">No</field>
<field type="TextField" name="desc"></field>
@ -396,6 +421,12 @@
<field type="BooleanField" name="used">True</field>
<field type="IntegerField" name="order">0</field>
</object>
<object pk="irtf" model="name.grouptypename">
<field type="CharField" name="name">IRTF</field>
<field type="TextField" name="desc"></field>
<field type="BooleanField" name="used">True</field>
<field type="IntegerField" name="order">0</field>
</object>
<object pk="ps" model="name.intendedstdlevelname">
<field type="CharField" name="name">Proposed Standard</field>
<field type="TextField" name="desc"></field>
@ -405,7 +436,7 @@
<object pk="ds" model="name.intendedstdlevelname">
<field type="CharField" name="name">Draft Standard</field>
<field type="TextField" name="desc"></field>
<field type="BooleanField" name="used">True</field>
<field type="BooleanField" name="used">False</field>
<field type="IntegerField" name="order">2</field>
</object>
<object pk="std" model="name.intendedstdlevelname">
@ -480,8 +511,8 @@
<field type="BooleanField" name="used">True</field>
<field type="IntegerField" name="order">0</field>
</object>
<object pk="ex-ad" model="name.rolename">
<field type="CharField" name="name">Ex Area Director</field>
<object pk="pre-ad" model="name.rolename">
<field type="CharField" name="name">Incoming Area Director</field>
<field type="TextField" name="desc"></field>
<field type="BooleanField" name="used">True</field>
<field type="IntegerField" name="order">0</field>
@ -582,6 +613,12 @@
<field type="BooleanField" name="used">True</field>
<field type="IntegerField" name="order">0</field>
</object>
<object pk="deleted" model="name.sessionstatusname">
<field type="CharField" name="name">Deleted</field>
<field type="TextField" name="desc"></field>
<field type="BooleanField" name="used">True</field>
<field type="IntegerField" name="order">0</field>
</object>
<object pk="std" model="name.stdlevelname">
<field type="CharField" name="name">Internet Standard</field>
<field type="TextField" name="desc"></field>
@ -630,32 +667,38 @@
<field type="BooleanField" name="used">True</field>
<field type="IntegerField" name="order">0</field>
</object>
<object pk="legacy" model="name.streamname">
<field type="CharField" name="name">Legacy</field>
<field type="TextField" name="desc"></field>
<field type="BooleanField" name="used">True</field>
<field type="IntegerField" name="order">0</field>
</object>
<object pk="ietf" model="name.streamname">
<field type="CharField" name="name">IETF</field>
<field type="TextField" name="desc"></field>
<field type="TextField" name="desc">IETF stream</field>
<field type="BooleanField" name="used">True</field>
<field type="IntegerField" name="order">0</field>
<field type="IntegerField" name="order">1</field>
</object>
<object pk="ise" model="name.streamname">
<field type="CharField" name="name">ISE</field>
<field type="TextField" name="desc">Independent submission editor stream</field>
<field type="TextField" name="desc">Independent Submission Editor stream</field>
<field type="BooleanField" name="used">True</field>
<field type="IntegerField" name="order">0</field>
</object>
<object pk="iab" model="name.streamname">
<field type="CharField" name="name">IAB</field>
<field type="TextField" name="desc"></field>
<field type="BooleanField" name="used">True</field>
<field type="IntegerField" name="order">0</field>
<field type="IntegerField" name="order">2</field>
</object>
<object pk="irtf" model="name.streamname">
<field type="CharField" name="name">IRTF</field>
<field type="TextField" name="desc">Independent Submission Editor stream</field>
<field type="BooleanField" name="used">True</field>
<field type="IntegerField" name="order">3</field>
</object>
<object pk="iab" model="name.streamname">
<field type="CharField" name="name">IAB</field>
<field type="TextField" name="desc">IAB stream</field>
<field type="BooleanField" name="used">True</field>
<field type="IntegerField" name="order">4</field>
</object>
<object pk="legacy" model="name.streamname">
<field type="CharField" name="name">Legacy</field>
<field type="TextField" name="desc">Legacy stream</field>
<field type="BooleanField" name="used">True</field>
<field type="IntegerField" name="order">5</field>
</object>
<object pk="other" model="name.timeslottypename">
<field type="CharField" name="name">Other</field>
<field type="TextField" name="desc"></field>
<field type="BooleanField" name="used">True</field>
<field type="IntegerField" name="order">0</field>
@ -697,10 +740,10 @@
<field type="CharField" name="label">RFC Editor state</field>
</object>
<object pk="draft-stream-ietf" model="doc.statetype">
<field type="CharField" name="label">WG state</field>
<field type="CharField" name="label">IETF state</field>
</object>
<object pk="draft-stream-irtf" model="doc.statetype">
<field type="CharField" name="label">RG state</field>
<field type="CharField" name="label">IRTF state</field>
</object>
<object pk="draft-stream-ise" model="doc.statetype">
<field type="CharField" name="label">ISE state</field>
@ -919,7 +962,7 @@
<field type="BooleanField" name="used">True</field>
<field type="TextField" name="desc">The document is now (finally!) being formally reviewed by the entire IESG. Documents are discussed in email or during a bi-weekly IESG telechat. In this phase, each AD reviews the document and airs any issues they may have. Unresolvable issues are documented as "discuss" comments that can be forwarded to the authors/WG. See the description of substates for additional details about the current state of the IESG discussion.</field>
<field type="IntegerField" name="order">20</field>
<field to="doc.state" name="next_states" rel="ManyToManyRel"><object pk="18"></object><object pk="10"></object><object pk="22"></object></field>
<field to="doc.state" name="next_states" rel="ManyToManyRel"><object pk="18"></object><object pk="9"></object><object pk="22"></object></field>
</object>
<object pk="18" model="doc.state">
<field to="doc.statetype" name="type" rel="ManyToOneRel">draft-iesg</field>
@ -937,7 +980,7 @@
<field type="BooleanField" name="used">True</field>
<field type="TextField" name="desc">The IESG has approved the document for publication, but the Secretariat has not yet sent out on official approval message.</field>
<field type="IntegerField" name="order">27</field>
<field to="doc.state" name="next_states" rel="ManyToManyRel"><object pk="17"></object></field>
<field to="doc.state" name="next_states" rel="ManyToManyRel"><object pk="10"></object></field>
</object>
<object pk="10" model="doc.state">
<field to="doc.statetype" name="type" rel="ManyToOneRel">draft-iesg</field>
@ -946,7 +989,7 @@
<field type="BooleanField" name="used">True</field>
<field type="TextField" name="desc">The IESG has approved the document for publication, and the Secretariat has sent out the official approval message to the RFC editor.</field>
<field type="IntegerField" name="order">30</field>
<field to="doc.state" name="next_states" rel="ManyToManyRel"><object pk="9"></object></field>
<field to="doc.state" name="next_states" rel="ManyToManyRel"><object pk="17"></object></field>
</object>
<object pk="17" model="doc.state">
<field to="doc.statetype" name="type" rel="ManyToOneRel">draft-iesg</field>
@ -1581,4 +1624,31 @@
<field type="IntegerField" name="order">2</field>
<field to="doc.state" name="next_states" rel="ManyToManyRel"></field>
</object>
</django-objects>
<object pk="1" model="doc.ballottype">
<field to="name.doctypename" name="doc_type" rel="ManyToOneRel">charter</field>
<field type="SlugField" name="slug">r-extrev</field>
<field type="CharField" name="name">Ready for external review</field>
<field type="TextField" name="question">Is this charter ready for external review?</field>
<field type="BooleanField" name="used">True</field>
<field type="IntegerField" name="order">0</field>
<field to="name.ballotpositionname" name="positions" rel="ManyToManyRel"><object pk="yes"></object><object pk="noobj"></object><object pk="block"></object><object pk="abstain"></object><object pk="norecord"></object></field>
</object>
<object pk="2" model="doc.ballottype">
<field to="name.doctypename" name="doc_type" rel="ManyToOneRel">charter</field>
<field type="SlugField" name="slug">approve</field>
<field type="CharField" name="name">Approve</field>
<field type="TextField" name="question">Do we approve of this charter?</field>
<field type="BooleanField" name="used">True</field>
<field type="IntegerField" name="order">0</field>
<field to="name.ballotpositionname" name="positions" rel="ManyToManyRel"><object pk="yes"></object><object pk="noobj"></object><object pk="block"></object><object pk="abstain"></object><object pk="norecord"></object></field>
</object>
<object pk="3" model="doc.ballottype">
<field to="name.doctypename" name="doc_type" rel="ManyToOneRel">draft</field>
<field type="SlugField" name="slug">approve</field>
<field type="CharField" name="name">Approve</field>
<field type="TextField" name="question"></field>
<field type="BooleanField" name="used">True</field>
<field type="IntegerField" name="order">0</field>
<field to="name.ballotpositionname" name="positions" rel="ManyToManyRel"><object pk="yes"></object><object pk="noobj"></object><object pk="discuss"></object><object pk="abstain"></object><object pk="recuse"></object><object pk="norecord"></object></field>
</object>
</django-objects>

View file

@ -37,9 +37,10 @@ for n in dir(ietf.name.models):
objects.extend(model.objects.all())
import ietf.doc.models # FIXME
import ietf.doc.models # also pick some other name-like types while we're at it
objects += ietf.doc.models.StateType.objects.all()
objects += ietf.doc.models.State.objects.all()
objects += ietf.doc.models.BallotType.objects.all()
output("names", objects)

View file

@ -0,0 +1,375 @@
# encoding: utf-8
import datetime
from south.db import db
from south.v2 import SchemaMigration
from django.db import models
class Migration(SchemaMigration):
def forwards(self, orm):
# Adding model 'GroupStateName'
db.create_table('name_groupstatename', (
('slug', self.gf('django.db.models.fields.CharField')(max_length=8, primary_key=True)),
('name', self.gf('django.db.models.fields.CharField')(max_length=255)),
('desc', self.gf('django.db.models.fields.TextField')(blank=True)),
('used', self.gf('django.db.models.fields.BooleanField')(default=True)),
('order', self.gf('django.db.models.fields.IntegerField')(default=0)),
))
db.send_create_signal('name', ['GroupStateName'])
# Adding model 'GroupTypeName'
db.create_table('name_grouptypename', (
('slug', self.gf('django.db.models.fields.CharField')(max_length=8, primary_key=True)),
('name', self.gf('django.db.models.fields.CharField')(max_length=255)),
('desc', self.gf('django.db.models.fields.TextField')(blank=True)),
('used', self.gf('django.db.models.fields.BooleanField')(default=True)),
('order', self.gf('django.db.models.fields.IntegerField')(default=0)),
))
db.send_create_signal('name', ['GroupTypeName'])
# Adding model 'RoleName'
db.create_table('name_rolename', (
('slug', self.gf('django.db.models.fields.CharField')(max_length=8, primary_key=True)),
('name', self.gf('django.db.models.fields.CharField')(max_length=255)),
('desc', self.gf('django.db.models.fields.TextField')(blank=True)),
('used', self.gf('django.db.models.fields.BooleanField')(default=True)),
('order', self.gf('django.db.models.fields.IntegerField')(default=0)),
))
db.send_create_signal('name', ['RoleName'])
# Adding model 'StreamName'
db.create_table('name_streamname', (
('slug', self.gf('django.db.models.fields.CharField')(max_length=8, primary_key=True)),
('name', self.gf('django.db.models.fields.CharField')(max_length=255)),
('desc', self.gf('django.db.models.fields.TextField')(blank=True)),
('used', self.gf('django.db.models.fields.BooleanField')(default=True)),
('order', self.gf('django.db.models.fields.IntegerField')(default=0)),
))
db.send_create_signal('name', ['StreamName'])
# Adding model 'DocRelationshipName'
db.create_table('name_docrelationshipname', (
('slug', self.gf('django.db.models.fields.CharField')(max_length=8, primary_key=True)),
('name', self.gf('django.db.models.fields.CharField')(max_length=255)),
('desc', self.gf('django.db.models.fields.TextField')(blank=True)),
('used', self.gf('django.db.models.fields.BooleanField')(default=True)),
('order', self.gf('django.db.models.fields.IntegerField')(default=0)),
))
db.send_create_signal('name', ['DocRelationshipName'])
# Adding model 'DocTypeName'
db.create_table('name_doctypename', (
('slug', self.gf('django.db.models.fields.CharField')(max_length=8, primary_key=True)),
('name', self.gf('django.db.models.fields.CharField')(max_length=255)),
('desc', self.gf('django.db.models.fields.TextField')(blank=True)),
('used', self.gf('django.db.models.fields.BooleanField')(default=True)),
('order', self.gf('django.db.models.fields.IntegerField')(default=0)),
))
db.send_create_signal('name', ['DocTypeName'])
# Adding model 'DocTagName'
db.create_table('name_doctagname', (
('slug', self.gf('django.db.models.fields.CharField')(max_length=8, primary_key=True)),
('name', self.gf('django.db.models.fields.CharField')(max_length=255)),
('desc', self.gf('django.db.models.fields.TextField')(blank=True)),
('used', self.gf('django.db.models.fields.BooleanField')(default=True)),
('order', self.gf('django.db.models.fields.IntegerField')(default=0)),
))
db.send_create_signal('name', ['DocTagName'])
# Adding model 'StdLevelName'
db.create_table('name_stdlevelname', (
('slug', self.gf('django.db.models.fields.CharField')(max_length=8, primary_key=True)),
('name', self.gf('django.db.models.fields.CharField')(max_length=255)),
('desc', self.gf('django.db.models.fields.TextField')(blank=True)),
('used', self.gf('django.db.models.fields.BooleanField')(default=True)),
('order', self.gf('django.db.models.fields.IntegerField')(default=0)),
))
db.send_create_signal('name', ['StdLevelName'])
# Adding model 'IntendedStdLevelName'
db.create_table('name_intendedstdlevelname', (
('slug', self.gf('django.db.models.fields.CharField')(max_length=8, primary_key=True)),
('name', self.gf('django.db.models.fields.CharField')(max_length=255)),
('desc', self.gf('django.db.models.fields.TextField')(blank=True)),
('used', self.gf('django.db.models.fields.BooleanField')(default=True)),
('order', self.gf('django.db.models.fields.IntegerField')(default=0)),
))
db.send_create_signal('name', ['IntendedStdLevelName'])
# Adding model 'DocReminderTypeName'
db.create_table('name_docremindertypename', (
('slug', self.gf('django.db.models.fields.CharField')(max_length=8, primary_key=True)),
('name', self.gf('django.db.models.fields.CharField')(max_length=255)),
('desc', self.gf('django.db.models.fields.TextField')(blank=True)),
('used', self.gf('django.db.models.fields.BooleanField')(default=True)),
('order', self.gf('django.db.models.fields.IntegerField')(default=0)),
))
db.send_create_signal('name', ['DocReminderTypeName'])
# Adding model 'BallotPositionName'
db.create_table('name_ballotpositionname', (
('slug', self.gf('django.db.models.fields.CharField')(max_length=8, primary_key=True)),
('name', self.gf('django.db.models.fields.CharField')(max_length=255)),
('desc', self.gf('django.db.models.fields.TextField')(blank=True)),
('used', self.gf('django.db.models.fields.BooleanField')(default=True)),
('order', self.gf('django.db.models.fields.IntegerField')(default=0)),
))
db.send_create_signal('name', ['BallotPositionName'])
# Adding model 'GroupBallotPositionName'
db.create_table('name_groupballotpositionname', (
('slug', self.gf('django.db.models.fields.CharField')(max_length=8, primary_key=True)),
('name', self.gf('django.db.models.fields.CharField')(max_length=255)),
('desc', self.gf('django.db.models.fields.TextField')(blank=True)),
('used', self.gf('django.db.models.fields.BooleanField')(default=True)),
('order', self.gf('django.db.models.fields.IntegerField')(default=0)),
))
db.send_create_signal('name', ['GroupBallotPositionName'])
# Adding model 'MeetingTypeName'
db.create_table('name_meetingtypename', (
('slug', self.gf('django.db.models.fields.CharField')(max_length=8, primary_key=True)),
('name', self.gf('django.db.models.fields.CharField')(max_length=255)),
('desc', self.gf('django.db.models.fields.TextField')(blank=True)),
('used', self.gf('django.db.models.fields.BooleanField')(default=True)),
('order', self.gf('django.db.models.fields.IntegerField')(default=0)),
))
db.send_create_signal('name', ['MeetingTypeName'])
# Adding model 'SessionStatusName'
db.create_table('name_sessionstatusname', (
('slug', self.gf('django.db.models.fields.CharField')(max_length=8, primary_key=True)),
('name', self.gf('django.db.models.fields.CharField')(max_length=255)),
('desc', self.gf('django.db.models.fields.TextField')(blank=True)),
('used', self.gf('django.db.models.fields.BooleanField')(default=True)),
('order', self.gf('django.db.models.fields.IntegerField')(default=0)),
))
db.send_create_signal('name', ['SessionStatusName'])
# Adding model 'TimeSlotTypeName'
db.create_table('name_timeslottypename', (
('slug', self.gf('django.db.models.fields.CharField')(max_length=8, primary_key=True)),
('name', self.gf('django.db.models.fields.CharField')(max_length=255)),
('desc', self.gf('django.db.models.fields.TextField')(blank=True)),
('used', self.gf('django.db.models.fields.BooleanField')(default=True)),
('order', self.gf('django.db.models.fields.IntegerField')(default=0)),
))
db.send_create_signal('name', ['TimeSlotTypeName'])
# Adding model 'ConstraintName'
db.create_table('name_constraintname', (
('slug', self.gf('django.db.models.fields.CharField')(max_length=8, primary_key=True)),
('name', self.gf('django.db.models.fields.CharField')(max_length=255)),
('desc', self.gf('django.db.models.fields.TextField')(blank=True)),
('used', self.gf('django.db.models.fields.BooleanField')(default=True)),
('order', self.gf('django.db.models.fields.IntegerField')(default=0)),
))
db.send_create_signal('name', ['ConstraintName'])
# Adding model 'LiaisonStatementPurposeName'
db.create_table('name_liaisonstatementpurposename', (
('slug', self.gf('django.db.models.fields.CharField')(max_length=8, primary_key=True)),
('name', self.gf('django.db.models.fields.CharField')(max_length=255)),
('desc', self.gf('django.db.models.fields.TextField')(blank=True)),
('used', self.gf('django.db.models.fields.BooleanField')(default=True)),
('order', self.gf('django.db.models.fields.IntegerField')(default=0)),
))
db.send_create_signal('name', ['LiaisonStatementPurposeName'])
def backwards(self, orm):
# Deleting model 'GroupStateName'
db.delete_table('name_groupstatename')
# Deleting model 'GroupTypeName'
db.delete_table('name_grouptypename')
# Deleting model 'RoleName'
db.delete_table('name_rolename')
# Deleting model 'StreamName'
db.delete_table('name_streamname')
# Deleting model 'DocRelationshipName'
db.delete_table('name_docrelationshipname')
# Deleting model 'DocTypeName'
db.delete_table('name_doctypename')
# Deleting model 'DocTagName'
db.delete_table('name_doctagname')
# Deleting model 'StdLevelName'
db.delete_table('name_stdlevelname')
# Deleting model 'IntendedStdLevelName'
db.delete_table('name_intendedstdlevelname')
# Deleting model 'DocReminderTypeName'
db.delete_table('name_docremindertypename')
# Deleting model 'BallotPositionName'
db.delete_table('name_ballotpositionname')
# Deleting model 'GroupBallotPositionName'
db.delete_table('name_groupballotpositionname')
# Deleting model 'MeetingTypeName'
db.delete_table('name_meetingtypename')
# Deleting model 'SessionStatusName'
db.delete_table('name_sessionstatusname')
# Deleting model 'TimeSlotTypeName'
db.delete_table('name_timeslottypename')
# Deleting model 'ConstraintName'
db.delete_table('name_constraintname')
# Deleting model 'LiaisonStatementPurposeName'
db.delete_table('name_liaisonstatementpurposename')
models = {
'name.ballotpositionname': {
'Meta': {'ordering': "['order']", 'object_name': 'BallotPositionName'},
'desc': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
'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'})
},
'name.constraintname': {
'Meta': {'ordering': "['order']", 'object_name': 'ConstraintName'},
'desc': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
'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'})
},
'name.docrelationshipname': {
'Meta': {'ordering': "['order']", 'object_name': 'DocRelationshipName'},
'desc': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
'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'})
},
'name.docremindertypename': {
'Meta': {'ordering': "['order']", 'object_name': 'DocReminderTypeName'},
'desc': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
'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'})
},
'name.doctagname': {
'Meta': {'ordering': "['order']", 'object_name': 'DocTagName'},
'desc': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
'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'})
},
'name.doctypename': {
'Meta': {'ordering': "['order']", 'object_name': 'DocTypeName'},
'desc': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
'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'})
},
'name.groupballotpositionname': {
'Meta': {'ordering': "['order']", 'object_name': 'GroupBallotPositionName'},
'desc': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
'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'})
},
'name.groupstatename': {
'Meta': {'ordering': "['order']", 'object_name': 'GroupStateName'},
'desc': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
'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'})
},
'name.grouptypename': {
'Meta': {'ordering': "['order']", 'object_name': 'GroupTypeName'},
'desc': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
'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'})
},
'name.intendedstdlevelname': {
'Meta': {'ordering': "['order']", 'object_name': 'IntendedStdLevelName'},
'desc': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
'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'})
},
'name.liaisonstatementpurposename': {
'Meta': {'ordering': "['order']", 'object_name': 'LiaisonStatementPurposeName'},
'desc': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
'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'})
},
'name.meetingtypename': {
'Meta': {'ordering': "['order']", 'object_name': 'MeetingTypeName'},
'desc': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
'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'})
},
'name.rolename': {
'Meta': {'ordering': "['order']", 'object_name': 'RoleName'},
'desc': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
'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'})
},
'name.sessionstatusname': {
'Meta': {'ordering': "['order']", 'object_name': 'SessionStatusName'},
'desc': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
'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'})
},
'name.stdlevelname': {
'Meta': {'ordering': "['order']", 'object_name': 'StdLevelName'},
'desc': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
'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'})
},
'name.streamname': {
'Meta': {'ordering': "['order']", 'object_name': 'StreamName'},
'desc': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
'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'})
},
'name.timeslottypename': {
'Meta': {'ordering': "['order']", 'object_name': 'TimeSlotTypeName'},
'desc': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
'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'})
}
}
complete_apps = ['name']

View file

@ -0,0 +1,161 @@
# encoding: utf-8
import datetime
from south.db import db
from south.v2 import SchemaMigration
from django.db import models
class Migration(SchemaMigration):
def forwards(self, orm):
# Adding field 'BallotPositionName.blocking'
db.add_column('name_ballotpositionname', 'blocking', self.gf('django.db.models.fields.BooleanField')(default=False), keep_default=False)
def backwards(self, orm):
# Deleting field 'BallotPositionName.blocking'
db.delete_column('name_ballotpositionname', 'blocking')
models = {
'name.ballotpositionname': {
'Meta': {'ordering': "['order']", 'object_name': 'BallotPositionName'},
'blocking': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'desc': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
'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'})
},
'name.constraintname': {
'Meta': {'ordering': "['order']", 'object_name': 'ConstraintName'},
'desc': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
'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'})
},
'name.docrelationshipname': {
'Meta': {'ordering': "['order']", 'object_name': 'DocRelationshipName'},
'desc': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
'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'})
},
'name.docremindertypename': {
'Meta': {'ordering': "['order']", 'object_name': 'DocReminderTypeName'},
'desc': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
'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'})
},
'name.doctagname': {
'Meta': {'ordering': "['order']", 'object_name': 'DocTagName'},
'desc': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
'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'})
},
'name.doctypename': {
'Meta': {'ordering': "['order']", 'object_name': 'DocTypeName'},
'desc': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
'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'})
},
'name.groupballotpositionname': {
'Meta': {'ordering': "['order']", 'object_name': 'GroupBallotPositionName'},
'desc': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
'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'})
},
'name.groupstatename': {
'Meta': {'ordering': "['order']", 'object_name': 'GroupStateName'},
'desc': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
'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'})
},
'name.grouptypename': {
'Meta': {'ordering': "['order']", 'object_name': 'GroupTypeName'},
'desc': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
'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'})
},
'name.intendedstdlevelname': {
'Meta': {'ordering': "['order']", 'object_name': 'IntendedStdLevelName'},
'desc': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
'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'})
},
'name.liaisonstatementpurposename': {
'Meta': {'ordering': "['order']", 'object_name': 'LiaisonStatementPurposeName'},
'desc': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
'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'})
},
'name.meetingtypename': {
'Meta': {'ordering': "['order']", 'object_name': 'MeetingTypeName'},
'desc': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
'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'})
},
'name.rolename': {
'Meta': {'ordering': "['order']", 'object_name': 'RoleName'},
'desc': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
'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'})
},
'name.sessionstatusname': {
'Meta': {'ordering': "['order']", 'object_name': 'SessionStatusName'},
'desc': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
'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'})
},
'name.stdlevelname': {
'Meta': {'ordering': "['order']", 'object_name': 'StdLevelName'},
'desc': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
'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'})
},
'name.streamname': {
'Meta': {'ordering': "['order']", 'object_name': 'StreamName'},
'desc': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
'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'})
},
'name.timeslottypename': {
'Meta': {'ordering': "['order']", 'object_name': 'TimeSlotTypeName'},
'desc': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
'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'})
}
}
complete_apps = ['name']

View file

View file

@ -42,7 +42,8 @@ class IntendedStdLevelName(NameModel):
class DocReminderTypeName(NameModel):
"Stream state"
class BallotPositionName(NameModel):
""" Yes, No Objection, Abstain, Discuss, Recuse """
""" Yes, No Objection, Abstain, Discuss, Block, Recuse """
blocking = models.BooleanField(default=False)
class GroupBallotPositionName(NameModel):
""" Yes, No, Block, Abstain """
class MeetingTypeName(NameModel):

31
ietf/person/forms.py Normal file
View file

@ -0,0 +1,31 @@
from django.utils import simplejson
from django.utils.html import escape
from django.utils.functional import lazy
from django import forms
from django.core.urlresolvers import reverse as urlreverse
from ietf.person.models import *
def json_emails(emails):
return simplejson.dumps([{"id": e.address + "", "name": escape(u"%s <%s>" % (e.person.name, e.address))} for e in emails])
class EmailsField(forms.CharField):
def __init__(self, *args, **kwargs):
kwargs["max_length"] = 1000
if not "help_text" in kwargs:
kwargs["help_text"] = "Type in name to search for person"
super(EmailsField, self).__init__(*args, **kwargs)
self.widget.attrs["class"] = "emails-field"
self.widget.attrs["data-ajax-url"] = lazy(urlreverse, str)("ajax_search_emails") # make this lazy to prevent initialization problem
def prepare_value(self, value):
if not value:
return ""
if isinstance(value, str):
return value
return json_emails(value)
def clean(self, value):
value = super(EmailsField, self).clean(value)
return Email.objects.filter(address__in=[x.strip() for x in value.split(",") if x.strip()]).select_related("person")

5
ietf/person/urls.py Normal file
View file

@ -0,0 +1,5 @@
from django.conf.urls.defaults import patterns, url
urlpatterns = patterns('',
(r'^search/$', "ietf.person.views.ajax_search_emails", None, 'ajax_search_emails'),
)

8
ietf/person/views.py Normal file
View file

@ -0,0 +1,8 @@
from django.http import Http404, HttpResponse
from ietf.person.models import *
from ietf.person.forms import json_emails
def ajax_search_emails(request):
emails = Email.objects.filter(person__alias__name__istartswith=request.GET.get('q','')).order_by('person__name').distinct()
return HttpResponse(json_emails(emails), mimetype='application/json')

View file

@ -72,7 +72,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
</div></div></li>
<li style="padding-top:0;"><a href="/wg/">Active WGs</a></li>
{# FIXME: wgcharter <li><a href="DEAD_BEEF_TASTY_TASTY">Proposed WGs</a></li> #}
<li><a href="{% url ietf.wginfo.views.chartering_wgs %}">Chartering WGs</a></li>
<li><a href="http://tools.ietf.org/wg/concluded">Concluded WGs</a></li>
<li><a href="http://www.ietf.org/list/nonwg.html">Non-WG Lists</a></li>
@ -89,7 +89,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
<li><a href="http://www.ietf.org/meeting/upcoming.html">Upcoming</a></li>
<li class="sect">Other Documents</li>
{# FIXME: wgcharter <li><a href="/wgcharter/">WG Charters</a></li> #}
<li><a href="/ipr/">IPR Disclosures</a></li>
<li><a href="/liaison/">Liaison&nbsp;Statements</a></li>
<li><a href="/iesg/agenda/">IESG Agenda</a></li>

View file

@ -0,0 +1,3 @@
{# Copyright The IETF Trust 2011, All Rights Reserved #}
{% load ietf_filters %}
<p>{{ obj.desc|safe|linebreaksbr }}</p>

View file

@ -1,28 +0,0 @@
{# Copyright The IETF Trust 2011, All Rights Reserved #}
{% load ietf_filters %}
{{ obj.info.text|safe }}<br/>
<br/>
{% with obj.group as wg %}
WG name: {{ wg.name }}<br/>
WG acronym: {{ wg.acronym }}<br/>
IETF area: {{ wg.parent|default:"-" }}<br/>
WG chairs: {% for n in obj.chairs %}{{ n }}{% if not forloop.last %}, {% endif %}{% endfor %}<br/>
WG secretaries: {% for n in obj.secr %}{{ n }}{% if not forloop.last %}, {% endif %}{% endfor %}<br/>
WG technical advisors: {% for n in obj.techadv %}{{ n }}{% if not forloop.last %}, {% endif %}{% endfor %}<br/>
Assigned AD: {{ wg.ad }}<br/>
Mailing list: {{ wg.list_email }}<br/>
Mailing list subscribe {{ wg.list_subscribe }}<br/>
Mailing list archive: {{ wg.list_archive }}<br/>
Other web sites: {% for a in wg.groupurl_set.all %}{{ a.url }} {% if a.name %}({{ a.name }}){% endif %}{% if not forloop.last %}, {% endif %}{% endfor %}<br/>
WG State: {{ wg.state|safe }}<br/>
Charter State: {{ wg.charter.charter_state|safe }}<br/>
<br/>
{% if obj.rev %}
{{ obj.charter|safe }}
{% else %}
The WG does not yet have a charter
{% endif %}
{% endwith %}

View file

@ -1 +0,0 @@
{% load ietf_filters %}WG Charter for {{obj.group.name}} ({{ obj.group.acronym|safe }})

View file

@ -24,7 +24,7 @@ form.add-comment .actions {
<tr>
<td></td>
<td class="actions">
<a href="{{ back_url }}">Back</a>
<a href="{% url doc_history name=doc.name %}">Back</a>
<input type="submit" value="Add comment"/>
</td>
</tr>

View file

@ -1,4 +1,4 @@
{% autoescape off %}
Technical Summary
Relevant content can frequently be found in the abstract
@ -47,4 +47,4 @@ IESG Note
IANA Note
(Insert IANA Note here or remove section)
{% endautoescape%}

View file

@ -1,6 +1,8 @@
{% autoescape off %}
Please DO NOT reply to this email.
I-D: {{ doc.file_tag|safe }}
ID Tracker URL: {{ url }}
{{ text }}
{% endautoescape%}

View file

@ -1,6 +1,6 @@
{% comment %}
{% comment %}<!--
Copyright (C) 2009-2010 Nokia Corporation and/or its subsidiary(-ies).
All rights reserved. Contact: Pasi Eronen <pasi.eronen@nokia.com>
All rights reserved. Contact: Pasi Eronen <pasi.eronen@nokia.com>
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
@ -30,7 +30,7 @@ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
{% endcomment %}
-->{% endcomment %}
{% load ietf_filters %}
<table class="ietf-ballot"><tr valign="top"><td class="left">
@ -86,12 +86,12 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
{% ifequal pos.position "Discuss" %}
<p><b>Discuss ({{pos.discuss_date}})</b> <img src="/images/comment.png" width="14" height="12" alt=""/></p>
<pre>{{pos.discuss_text|fill:"80"|escape }}</pre>
<pre>{{pos.discuss_text|wrap_text:80|escape }}</pre>
{% endifequal %}
{% if pos.comment_text %}
<p><b>Comment ({{pos.comment_date}})</b> <img src="/images/comment.png" width="14" height="12" alt=""/></p>
<pre>{{pos.comment_text|fill:"80"|escape }}</pre>
<pre>{{pos.comment_text|wrap_text:80|escape }}</pre>
{% endif %}
{% endfor %}
</td></tr></table>

View file

@ -62,13 +62,13 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
<div id="commentS{{c.comment.id}}">{{ c.info.textSnippet|safe }}</div>
<span class="comment_toggle" onclick="toggleComment({{c.comment.id}})" id="commentT{{c.comment.id}}">[show all]</span>
<div id="commentF{{c.comment.id}}" style="display:none;">
{{ c.info.text|fill:"80"|safe|urlize|linebreaksbr|keep_spacing|sanitize_html|safe }}
{{ c.info.text|safe|urlize|linebreaksbr|keep_spacing|sanitize_html|safe }}
</div>
{% else %}
{% if c.info.dontmolest %}
{{ c.info.text|safe }}
{% else %}
{{ c.info.text|fill:"80"|safe|urlize|linebreaksbr|keep_spacing|sanitize_html|safe }}
{{ c.info.text|safe|urlize|linebreaksbr|keep_spacing|sanitize_html|safe }}
{% endif %}
{% endif %}
</td>

View file

@ -0,0 +1,19 @@
{% extends "base.html" %}
{% load ietf_filters %}
{% block title %}Ballot for {{ doc.name }}-{{ doc.rev }}{% endblock %}
{% block pagehead %}
<link rel="stylesheet" type="text/css" href="/css/doc.css"></link>
{% endblock %}
{% block content %}
{{ top|safe }}
{{ ballot_content|safe }}
{% endblock content %}
{% block content_end %}
{% endblock content_end %}

View file

@ -0,0 +1,67 @@
{% load ietf_filters %}
<div class="ballot-sidebar">
{% if editable and user|has_role:"Area Director,Secretariat" %}
<div class="ballot-actions">
{% if user|has_role:"Area Director" %}
<div class="action"><a href="{% url doc_edit_position name=doc.name,ballot_id=ballot.pk %}">Edit position</a></div>
{% endif %}
{% if doc.type_id == "draft" %}
<div class="action">
{% if deferred %}
<a href="{% url doc_undefer_ballot name=doc.name %}">Undefer ballot</a>
<div>Ballot deferred by {{ deferred.by }} on {{ deferred.time|date:"Y-m-d" }}.</div>
{% else %}
<a href="{% url doc_defer_ballot name=doc.name %}">Defer ballot</a>
{% endif %}
</div>
{% endif %}
</div>
{% endif %}
{% for n, positions in position_groups %}
<div class="position-group">
<div class="heading"><span class="square position-{{ n.slug }}"></span> {{ n.name }}</div>
{% for p in positions %}
<div>{% if p.old_ad %}[{% endif %}<a{% if user|has_role:"Secretariat" %} href="{% url doc_edit_position name=doc.name,ballot_id=ballot.pk %}?ad={{ p.ad.pk }}" title="Click to edit the position of {{ p.ad.plain_name }}"{% endif %}>{{ p.ad.plain_name }}</a>{% if p.old_ad %}]{% endif %}{% if p.comment_text or p.discuss_text %}&nbsp;<a href="#{{ p.ad.plain_name|slugify }}"><img src="/images/comment.png" width="14" height="12" alt="*" border="0"/></a>{% endif %}</div>
{% if p.old_positions %}<div class="was">(was {{ p.old_positions|join:", " }})</div>{% endif %}
{% empty %}
<i>none</i>
{% endfor %}
</div>
{% endfor %}
</div>
<div class="ballot-content">
{% if all_ballots and all_ballots|length > 1 %}
<div class="other-ballots">
Other ballots:
{% for b in all_ballots %}
<a{% if b != ballot %} href="{% url doc_ballot name=doc.name,ballot_id=b.pk %}"{% endif %}>{{ b.ballot_type.name }} ({{ b.time|date:"Y-m-d" }})</a>
{% endfor %}
</div>
{% endif %}
<h2 style="margin-top:12px;">{{ ballot.ballot_type.question }}</h2>
<p>Summary: <i>{{ summary }}</i></p>
{% for p in text_positions %}
<h2 id="{{ p.ad.plain_name|slugify }}" class="ad-ballot-comment">{% if p.old_ad %}[{% endif %}{{ p.ad.plain_name }}{% if p.old_ad %}]{% endif %}</h2>
{% if p.discuss %}
<p><b>{{ p.pos.name }} ({{ p.discuss_time|date:"Y-m-d" }})</b> <img src="/images/comment.png" width="14" height="12" alt=""/></p>
<pre>{{ p.discuss|wrap_text:80|escape }}</pre>
{% endif %}
{% if p.comment %}
<p><b>Comment ({{ p.comment_time|date:"Y-m-d" }})</b> <img src="/images/comment.png" width="14" height="12" alt=""/></p>
<pre>{{ p.comment|wrap_text:80|escape }}</pre>
{% endif %}
{% endfor %}
</div>

View file

@ -0,0 +1,116 @@
{% extends "base.html" %}
{% load ietf_filters %}
{% block title %}{{ doc.canonical_name }}-{{ doc.rev }}{% endblock %}
{% block pagehead %}
<link rel="stylesheet" type="text/css" href="/css/doc.css"></link>
{% endblock %}
{% block content %}
{{ top|safe }}
<div class="snapshots">
Snapshots:
<span class="revisions">
{% for rev in revisions %}
<a {% if rev != doc.rev %}href="{% url doc_view name=doc.name %}{% if not forloop.first %}{{ rev }}/{% endif %}"{% endif %}>{{ rev }}</a>
{% endfor %}
</span>
</div>
<div class="ietf-box metabox">
<div>
{% if snapshot %}Snapshot of{% endif %}
{% if doc.get_state_slug != "approved" %}Proposed{% endif %}
Charter for "{{ group.name }}"
(<a href="{% url wginfo.views.wg_charter acronym=group.acronym %}">{{ group.acronym }}</a>) {{ group.type.name }}
</div>
<table id="metatable" width="100%">
<tr>
<td>WG State:</td>
<td>{{ group.state.name }}</td>
</tr>
<tr>
<td><a href="/wgcharter/help/state/">Charter State</a>:</td>
<td>
<div>
<a title="{{ doc.get_state.desc }}"{% if not snapshot and user|has_role:"Area Director,Secretariat" %} href="{% url charter_change_state name=doc.name %}"{% endif %}>{{ doc.get_state.name }}</a>
{% if chartering == "initial" %}(Initial Chartering){% endif %}
{% if chartering == "rechartering" %}(Rechartering){% endif %}
{% if not snapshot and user|has_role:"Area Director,Secretariat" %}
{% if chartering %}
- <a href="{% url charter_startstop_process name=doc.name option='abandon' %}">Abandon effort</a>
{% if request.user|has_role:"Secretariat" %}
- <a href="{% url charter_approve name=doc.name %}">Approve charter</a>
{% endif %}
{% else %}
- <a href="{% url charter_startstop_process name=doc.name option='recharter' %}">Recharter</a>
{% endif %}
{% endif %}
</div>
{% if not snapshot and chartering %}
<div class="telechat">
{% if not telechat %}Not on agenda of IESG telechat{% else %}On agenda of {{ telechat.telechat_date|date:"Y-m-d" }} IESG telechat{% endif %}
{% if user|has_role:"Area Director,Secretariat" %}
- <a href="{% url charter_telechat_date name=doc.name %}">Change</a>
{% endif %}
</div>
{% if ballot_summary %}
<div class="ballot-summary">
({{ ballot_summary }})
</div>
{% endif %}
{% endif %}
</td>
</tr>
{% if chartering and group.comments %}
<tr>
{% if chartering == "initial" %}<td>Reason for chartering:</td>{% endif %}
{% if chartering == "rechartering" %}<td>Reason for rechartering:</td>{% endif %}
<td>{{ group.comments }}</td>
</tr>
{% endif %}
<tr><td colspan='2'><hr size='1' noshade /></td></tr>
<tr><td>Last updated:</td><td> {{ doc.time|date:"Y-m-d" }}</td></tr>
<tr><td colspan='2'><hr size='1' noshade /></td></tr>
</table>
<div class="actions">
<a href="/feed/wgchanges/{{ group.acronym }}/">Atom feed</a>
</div>
</div>
<p>Other versions: <a href="{{ txt_url }}">plain text</a></p>
<h3>Charter {{ doc.canonical_name }}-{{ doc.rev }}
{% if user|has_role:"Area Director,Secretariat" and chartering and group.state_id != "conclude" %}
<a class="edit" href="{% url charter_submit name=doc.name %}">Change charter text</a>
{% endif %}
</h3>
{% if doc.rev %}
<div class="markup_draft">
{{ content|fill:"80"|safe|linebreaksbr|keep_spacing|sanitize_html|safe }}
</div>
{% endif %}
{% endblock %}

View file

@ -0,0 +1,80 @@
{% extends "base.html" %}
{% load ietf_filters %}
{% block title %}History for {{ doc.name }}-{{ doc.rev }}{% endblock %}
{% block pagehead %}
<link rel="stylesheet" type="text/css" href="/css/doc.css"></link>
{% endblock %}
{% block content %}
{{ top|safe }}
{% if diff_revisions %}
<div class="ietf-box diffTool">
<h2>Diffs</h2>
<form action="http{% if request.is_secure %}s{% endif %}://tools.ietf.org/rfcdiff" method="get" target="_blank">
<table>
<tr>
<td>
<label>From:</label>
<select name="url1">
{% for name, rev, time, url in diff_revisions %}
<option value="{{ url }}" {% if forloop.counter == 2 %} selected="selected" {% endif %}>{{ name }}-{{ rev }} ({{ time|date:"Y-m-d" }})</option>
{% endfor %}
</select>
</td>
<td rowspan="2" valign="top">
<label>Format:</label>
<select name="difftype">
<option value="--html" selected="selected">Side-by-side</option>
<option value="--abdiff">Before-after</option>
<option value="--chbars">Change bars</option>
<option value="--hwdiff">Wdiff</option>
</select>
<input name="submit" value="Go!" type="submit" />
</td>
</tr>
<tr>
<td>
<label>To:</label>
<select name="url2">
{% for name, rev, time, url in diff_revisions %}
<option value="{{ url }}" {% if forloop.counter == 1 %} selected="selected" {% endif %}>{{ name }}-{{ rev }} ({{ time|date:"Y-m-d" }})</option>
{% endfor %}
</select>
</td>
</tr>
</table>
</form>
</div>
{% endif %}
<h2>Document history</h2>
{% if user|has_role:"Area Director,Secretariat,IANA" %}
<div class="history-actions">
<a href="{% url doc_add_comment name=doc.name %}">Add comment</a>
</div>
{% endif %}
<table class="ietf-table history">
<tr><th>Date</th><th>Version</th><th>By</th><th>Text</th></tr>
{% for e in events %}
<tr class="{% cycle oddrow,evenrow %}" id="history-{{ e.pk }}">
<td>{{ e.time|date:"Y-m-d" }}</td>
<td>{{ e.rev }}</td>
<td>{{ e.by|escape }}</td>
<td>{{ e.desc|format_history_text }}
</td>
</tr>
{% endfor %}
</table>
{% endblock content %}
{% block content_end %}
<script type="text/javascript" src="/js/history.js"></script>
{% endblock content_end %}

View file

@ -0,0 +1,9 @@
<h1>{{ doc.title }}<br/>{{ name }}</h1>
<div id="mytabs" class="yui-navset">
<ul class="yui-nav">
{% for name, t, url, active in tabs %}
<li {% if t == selected %}class="selected"{% endif %}{% if not active %}class="disabled"{% endif %}><a{% if active %} href="{{ url }}"{% endif %}><em>{{ name }}</em></a></li>
{% endfor %}
</ul>
</div>

View file

@ -0,0 +1,24 @@
{% extends "base.html" %}
{% block title %}Writeups for {{ doc.name }}-{{ doc.rev }}{% endblock %}
{% block pagehead %}
<link rel="stylesheet" type="text/css" href="/css/doc.css"></link>
{% endblock %}
{% block content %}
{{ top|safe }}
{% for title, text, url in writeups %}
<div class="writeup">
<h2>{{ title }}</h2>
{% if can_edit %}<a href="{{ url }}" class="edit">Edit {{ title }}</a>{% endif %}
<pre {% if can_edit %}class="editable"{% endif %}>
{{ text }}
</pre>
</div>
{% endfor%}
{% endblock content %}

View file

@ -45,13 +45,15 @@ form.position-form .comment-text {
<span class="actions">
<input type="submit" name="send_mail" value="Save and send email"/>
<input type="submit" value="Save"/>
{% if doc.type_id == "draft" %}
{% if ballot_deferred %}<input type="submit" name="Undefer" value="Undefer"/>{% else %}<input type="submit" name="Defer" value="Defer"/>{% endif %}
{% endif %}
</span>
</div>
<div style="clear:left"></div>
<div class="discuss-widgets" {% ifnotequal form.position.initial "discuss" %}style="display:none"{% endifnotequal %}>
<div class="discuss-widgets"{% if not show_discuss_text %} style="display:none"{% endif %}>
<div class="discuss-text">
{{ form.discuss.label_tag }}:
{% if old_pos and old_pos.discuss_time %}<span class="last-edited">(last edited {{ old_pos.discuss_time }})</span>{% endif %}
@ -76,5 +78,8 @@ form.position-form .comment-text {
{% endblock %}
{% block content_end %}
<script>
var blockingPositions = {{ blocking_positions|safe }};
</script>
<script type="text/javascript" src="/js/doc-edit-position.js"></script>
{% endblock %}

View file

@ -1,6 +1,7 @@
{{ doc.file_tag|safe }} was just expired.
{% autoescape off %}{{ doc.file_tag|safe }} was just expired.
This draft is in the state "{{ state }}" in the ID Tracker.
Thanks,
IETF Secretariat.
{% endautoescape %}

View file

@ -1,4 +1,6 @@
{% autoescape off %}
Last Call Request has been submitted for
{% for d in docs %}{{ d.file_tag|safe }}
{% endfor %}
{{ doc_url|safe }}
{% endautoescape %}

View file

@ -43,20 +43,14 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
{% endif %}
<tr>
<td>{{wg.area|upper}}</td>
<td>{{ wg.obj.status_date|date:"M d"}}</td>
<td>{{ wg.obj.parent.acronym|upper }}</td>
<td>{{ wg.obj.time|date:"M d"}}</td>
<td>
<a href="http://www.ietf.org/iesg/evaluation/{{wg.obj.group_acronym}}-charter.txt">
{{ wg.obj.group_acronym.name|escape }} ({{wg.obj.group_acronym}})
<a href="http://www.ietf.org/iesg/evaluation/charter-ietf-{{wg.obj.acronym}}-{{wg.obj.charter.rev}}.txt">
{{ wg.obj.name|escape }} ({{wg.obj.acronym}})
</a>
</td>
</tr>
{% if wg.obj.token_name %}
<tr><td></td><td>Token:</td><td>{{ wg.obj.token_name|escape }}</td></tr>
{% endif %}
{% if wg.obj.note %}
<tr><td></td><td></td><td>Note: {{wg.obj.note|escape}}</td></tr>
{% endif %}
{% if forloop.last %}
</table>

View file

@ -35,11 +35,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
{{ title2 }}
{% endif %}{{ title3 }}
{% for wg in section_wgs %}
o {{ wg.obj.group_acronym.name }} ({{wg.obj.group_acronym}})
{% if wg.obj.token_name %} Token: {{ wg.obj.token_name }}
{% endif %}
{% if wg.obj.note %} {% filter wordwrap:"68"|indent|indent %}Note: {{wg.obj.note|striptags}}{% endfilter %}
{% endif %}
o {{ wg.obj.name }} ({{wg.obj.acronym}})
{% empty %}
NONE
{% endfor %}

View file

@ -36,14 +36,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
{{ title2 }}<br>
{{ title3 }} ({{ forloop.counter }} of {{ section_wgs|length }})</h3>
<p><b>{{ wg.obj.group_acronym.name }} ({{wg.obj.group_acronym}})<br>
{% if wg.obj.token_name %}
Token: {{ wg.obj.token_name }}
{% endif %}</b></p>
{% if wg.obj.note %}
<p>Note: {{wg.obj.note|striptags}}</p>
{% endif %}
<p><b>{{ wg.obj.name }} ({{wg.obj.acronym}})<br>
{% if title3|startswith:"4.1.1" %}
<p>Does anyone have an objection to the charter being sent for

View file

@ -1,4 +1,4 @@
{% comment %}
{% comment %}<!--
Copyright (C) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
All rights reserved. Contact: Pasi Eronen <pasi.eronen@nokia.com>
@ -30,7 +30,7 @@ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
{% endcomment %}{% comment %}
-->{% endcomment %}{% comment %}
Some parts Copyright (c) 2009 The IETF Trust, all rights reserved.
{% endcomment %}{% load ietf_filters %}
@ -38,37 +38,21 @@ Some parts Copyright (c) 2009 The IETF Trust, all rights reserved.
<p><b>{{ doc.obj.document.filename }}</b></p>
{% if doc.obj.ballot.active %}
<ol>
{% if USE_DB_REDESIGN_PROXY_CLASSES %}
{% for p in doc.obj.active_positions|dictsort:"ad.last_name" %}
{% if p.pos and p.pos.pos_id == "discuss" %}
<li><a name="{{doc.obj.document.filename}}+{{p.ad.plain_name|slugify}}+discuss">{{ p.ad.plain_name }}</a>: Discuss [{{ p.pos.discuss_time|date:"Y-m-d" }}]:<br>
<pre>
{{ p.pos.orig.discuss|fill:"80"|escape }}
</pre>
<pre>{{ p.pos.orig.discuss|wrap_text:80|escape }}</pre>
</li>
{% endif %}
{% if p.pos and p.pos.comment %}
<li><a name="{{doc.obj.document.filename}}+{{p.ad.plain_name|slugify}}+comment">{{ p.ad.plain_name }}</a>: Comment [{{ p.pos.comment_time|date:"Y-m-d" }}]:<br>
<pre>{{ p.pos.comment|fill:"80"|escape }}</pre>
<pre>{{ p.pos.comment|wrap_text:80|escape }}</pre>
</li>
{% endif %}
{% endfor %}
{% else %}
{% for position in doc.obj.ballot.positions.all|dictsort:"ad.last_name" %}{% ifequal position.discuss 1 %} <li><a name="{{doc.obj.document.filename}}+{{position.ad|slugify}}+discuss">{{ position.ad }}</a>:{% for item in doc.obj.ballot.discusses.all %}{% ifequal position.ad item.ad %} Discuss [{{ item.date }}]:<br>
<pre>
{{ item.text|fill:"80"|escape }}
</pre>
{% endifequal %}{% endfor %}{% endifequal %}{% for item in doc.obj.ballot.comments.all %}{% ifequal position.ad item.ad %} <li><a name="{{doc.obj.document.filename}}+{{position.ad|slugify}}+comment">{{ position.ad }}</a>: Comment [{{ item.date }}]:<br>
<pre>{{ item.text|fill:"80"|escape }}</pre>
{% endifequal %}{% endfor %}{% endfor %}
{%endif %}
</ol>
{% endif%}

View file

@ -1,3 +1,4 @@
{% autoescape off %}
The annotation tags of document {{ doc }} have been updated. See more information below.
Annotation tags set: {{ entry.setted }}
@ -7,3 +8,4 @@ Author of the change: {{ entry.person }}
Comment:
{{ entry.comment }}
{% endautoescape %}

View file

@ -1,3 +1,4 @@
{% autoescape off %}
The state of document {{ doc }} has been updated. See more information below.
Previous state: {{ entry.from_state }}
@ -7,3 +8,4 @@ Author of the change: {{ entry.person }}
Comment:
{{ entry.comment }}
{% endautoescape %}

View file

@ -1,3 +1,4 @@
{% autoescape off %}
The stream of document {{ doc }} has been updated. See more information below.
Previous stream: {{ entry.from_stream }}
@ -7,3 +8,4 @@ Author of the change: {{ entry.person }}
Comment:
{{ entry.comment }}
{% endautoescape %}

View file

@ -1,4 +1,4 @@
{% load ietf_filters %}IPR Title: {{ ipr.title|safe }}
{% autoescape off %}{% load ietf_filters %}IPR Title: {{ ipr.title|safe }}
Section I: Patent Holder/Applicant ("Patent Holder")
@ -76,3 +76,4 @@ Section VII: Contact Information of Submitter of this Form (if different from IE
Section VIII: Other Note(s)
{{ ipr.other_notes|safe }}
{% endautoescape %}

View file

@ -1,4 +1,7 @@
A new version of I-D, {{ submission.filename }}-{{ submission.revision }}.txt has been successfully submitted by {{ submitter }} and posted to the IETF repository.
{% autoescape off %}
A new version of I-D, {{ submission.filename }}-{{ submission.revision }}.txt
has been successfully submitted by {{ submitter }} and posted to the
IETF repository.
Filename: {{ submission.filename }}
Revision: {{ submission.revision }}
@ -6,6 +9,10 @@ Title: {{ submission.id_document_name }}
Creation date: {{ submission.creation_date|date:"Y-m-d" }}
WG ID: {{ wg }}
Number of pages: {{ submission.txt_page_count }}
URL: http://www.ietf.org/internet-drafts/{{ submission.filename }}-{{ submission.revision }}.txt
Status: http://datatracker.ietf.org/doc/{{ submission.filename }}
Htmlized: http://tools.ietf.org/html/submission.filename }}-{{ submission.revision }}
{% ifnotequal submission.revision "00" %}Diff: http://tools.ietf.org/rfcdiff?url2={{ submission.filename }}-{{ submission.revision }}{% endifnotequal %}
Abstract:
{{ submission.abstract }}
@ -13,3 +20,4 @@ Abstract:
{{ submission.comment_to_sec|default:"" }}
The IETF Secretariat
{% endautoescape %}

View file

@ -1,5 +1,6 @@
{% autoescape off %}
A New Internet-Draft is available from the on-line Internet-Drafts directories.{% if submission.group_acronym %} This draft is a work item of the {{ submission.group_acronym.group_acronym.name }} Working Group of the IETF.{% endif %}
A New Internet-Draft is available from the on-line Internet-Drafts directories.
{% if submission.group_acronym %} This draft is a work item of the {{ submission.group_acronym.group_acronym.name }} Working Group of the IETF.{% endif %}
Title : {{ submission.id_document_name }}
Author(s) : {% for author in authors %}{{ author }}{% if not forloop.last %}
@ -8,17 +9,19 @@ A New Internet-Draft is available from the on-line Internet-Drafts directories.{
Pages : {{ submission.txt_page_count }}
Date : {{ submission.submission_date|date:"Y-m-d" }}
Abstract:
{{ submission.abstract }}
A URL for this Internet-Draft is:
http://www.ietf.org/internet-drafts/{{ submission.filename }}-{{ submission.revision }}.txt
The IETF datatracker status page for this draft is:
https://datatracker.ietf.org/doc/{{ submission.filename }}
There's also a htmlized version available at:
http://tools.ietf.org/html/submission.filename }}-{{ submission.revision }}
{% if submission.revision != "00" %}
A diff from previous version is available at:
http://tools.ietf.org/rfcdiff?url2={{ submission.filename }}-{{ submission.revision }}
{% endif %}
Internet-Drafts are also available by anonymous FTP at:
ftp://ftp.ietf.org/internet-drafts/
This Internet-Draft can be retrieved at:
ftp://ftp.ietf.org/internet-drafts/{{ submission.filename }}-{{ submission.revision }}.txt
The IETF datatracker page for this Internet-Draft is:
https://datatracker.ietf.org/doc/{{ submission.filename }}/
{% endautoescape %}

View file

@ -1,7 +1,8 @@
Follow this link to confirm your Auto-Post of
I-D {{ draft.filename }}-{{ draft.revision }}:
{% autoescape off %}Follow this link to confirm your Auto-Post of
{{ draft.filename }}-{{ draft.revision }}:
I-D Submission Tool URL: {{ confirm_url|safe }}
Remember that you can cancel the submission from:
{{ status_url|safe }}
{% endautoescape %}

View file

@ -1,4 +1,5 @@
Follow this link to get full access to the submission of
I-D {{ submission.filename }}-{{ submission.revision }}:
{% autoescape off %}Follow this link to get full access to the submission of
{{ submission.filename }}-{{ submission.revision }}:
{{ url|safe }}
{% endautoescape %}

View file

@ -1,4 +1,4 @@
WG chair approval is needed for posting of {{ draft.filename }}-{{ draft.revision }}.
{% autoescape off %}WG chair approval is needed for posting of {{ draft.filename }}-{{ draft.revision }}.
Go to this URL to approve the draft (note: you need to login to be
able to approve):
@ -21,3 +21,4 @@ Submitter: {{ submitter.get_full_name }} <{{ submitter.email_address }}>
Authors:
{% for author in authors %}{{ author.get_full_name }} <{{ author.email.1 }}>
{% endfor %}
{% endautoescape %}

View file

@ -7,7 +7,7 @@
{% block submit_content %}
<p>
Please enter the filename of the Internet-Draft who's status you wish to view:
Please enter the filename of the Internet-Draft you wish to view submission status for:
</p>
<form method="post" action="">
@ -18,7 +18,7 @@ Please enter the filename of the Internet-Draft who's status you wish to view:
<p>
<strong>
Please note that the Status page only displays the status of an Internet-Draft whose posting is still in progress or an Internet-Draft that has been successfully posted. </strong>
Note that the status page only displays the status of an Internet-Draft with a posting still in progress or an Internet-Draft that has been successfully posted.</strong>
</p>
<p>
The IETF is an organized activity of the <a href="http://www.isoc.org">Internet Society</a>

View file

@ -1,4 +1,4 @@
{{ chair }} as a WG Chair of {{ wg }} wants to add you as a {{ wg }} {% if shepherd %}shepherd of document {{ shepherd }}{% else %}WG Delegate{% endif %}.
{% autoescape off %}{{ chair }} as a WG Chair of {{ wg }} wants to add you as a {{ wg }} {% if shepherd %}shepherd of document {{ shepherd }}{% else %}WG Delegate{% endif %}.
You don't have an user/password to log into the datatracker so you must contact
the Secretariat at iesg-secretary@ietf.org in order to get your credentials.
@ -7,3 +7,4 @@ When you get your credentials, please inform {{ chair }} at
{{ chair.email.1 }} so he/she can finish the designate process.
Thank you.
{% endautoescape %}

View file

@ -1,4 +1,4 @@
{{ chair }} as a WG Chair of {{ wg }} wants to add a person with email
{% autoescape off %}{{ chair }} as a WG Chair of {{ wg }} wants to add a person with email
{{ delegate_email }} as a {% if shepherd %}shepherd of document {{ shepherd }}{% else %}WG Delegate{% endif %}.
This person don't have an user/password to log into the datatracker so
@ -12,3 +12,4 @@ already exists in the system but they can not log in.
{{ person.pk }} - {{ person }}
{% endfor %}
{% endif %}
{% endautoescape %}

View file

@ -1,4 +1,4 @@
{{ chair }} as a WG Chair of {{ wg }} wants to add a person with email
{% autoescape off %}{{ chair }} as a WG Chair of {{ wg }} wants to add a person with email
{{ delegate_email }} as a {% if shepherd %}shepherd of document {{ shepherd }}{% else %}WG Delegate{% endif %}.
This person don't have an user/password to log into the datatracker so
@ -9,3 +9,4 @@ When he/she gets her credentials then he/she will send an email to
{{ chair }} at {{ chair.email.1 }}.
{{ chair }} could then assign this person as {% if shepherd %}shepherd of document {{ shepherd }}{% else %}WG Delegate{% endif %}.
{% endautoescape%}

View file

@ -1,8 +1,8 @@
{% load ietf_filters %}{% autoescape off %}From: The IESG <iesg-secretary@ietf.org>
To: IETF-Announce <ietf-announce@ietf.org>
Subject: WG Action: {{ action_type }} {{ wg.name }} ({{wg.acronym}})
Subject: WG Action: {{ action_type }} {{ wg.name }} ({{ wg.acronym }})
{% filter wordwrap:73 %}{% ifequal action_type "Formed" %}A new IETF working group has been formed in the {{ wg.parent.name }}.{% endifequal %}{% ifequal action_type "Rechartered" %}The {{ wg.name }} ({{wg.acronym}}) working group in the {{ wg.parent.name }} of the IETF has been rechartered.{% endifequal %} For additional information please contact the Area Directors or the WG Chair.
{% filter wordwrap:73 %}{% ifequal action_type "Formed" %}A new IETF working group has been formed in the {{ wg.parent.name }}.{% endifequal %}{% ifequal action_type "Rechartered" %}The {{ wg.name }} ({{ wg.acronym }}) working group in the {{ wg.parent.name }} of the IETF has been rechartered.{% endifequal %} For additional information please contact the Area Directors or the WG Chair.
{% include "wgcharter/wg_info.txt" %}

View file

@ -1,36 +0,0 @@
{% extends "base.html" %}
{% comment %}
Copyright The IETF Trust 2011, All Rights Reserved
{% endcomment %}
{% block title %}Add comment on {{ wg.acronym }}{% endblock %}
{% block morecss %}
form.add-comment #id_comment {
width: 600px;
height: 300px;
}
form.add-comment .actions {
padding-top: 20px;
}
{% endblock %}
{% block content %}
<h1>Add comment on {{ wg.acronym }}</h1>
<p>The comment will be added to the history trail.</p>
<form class="add-comment" action="" method="POST">
<table>
{{ form.as_table }}
<tr>
<td></td>
<td class="actions">
<a href="{% url wg_view name=wg.acronym %}">Back</a>
<input type="submit" value="Add comment"/>
</td>
</tr>
</table>
</form>
{% endblock %}

View file

@ -23,7 +23,7 @@ form #id_announcement_text {
</div>
{% load ietf_filters %}
{% if user|in_group:"Secretariat" %}
{% if user|has_role:"Secretariat" %}
<div class="actions">
<input type="submit" name="send_text" value="Send WG {{ announcement }} announcement" />
</div>

View file

@ -1,15 +1,15 @@
{% extends "base.html" %}
{% block title %}Approve ballot for {{ wg.acronym }}{% endblock %}
{% block title %}Approve {{ charter.canonical_name }}{% endblock %}
{% block morecss %}
form.approve-ballot pre {
form.approve pre {
margin: 0;
padding: 4px;
border-top: 4px solid #eee;
border-bottom: 4px solid #eee;
}
form.approve-ballot .announcement {
form.approve .announcement {
overflow-x: auto;
overflow-y: scroll;
width: 800px;
@ -19,18 +19,18 @@ form.approve-ballot .announcement {
{% endblock %}
{% block content %}
<h1>Approve Ballot for {{ wg.acronym }}</h1>
<h1>Approve {{ charter.canonical_name }}</h1>
<div>IETF announcement:</div>
<form class="approve-ballot" action="" method="POST">
<form class="approve" action="" method="POST">
<div class="announcement">
<pre>{{ announcement }}</pre>
</div>
<div class="actions">
<a href="{% url wg_view name=wg.acronym %}">Back</a>
<a href="{% url doc_view name=charter.name %}">Back</a>
<input type="submit" value="Send out the announcement, close ballot and update revision"/>
</div>
</form>

View file

@ -1,25 +0,0 @@
{% autoescape off %}{{ ad }} has entered the following ballot position for
{{ charter.name }}-{{ charter.rev }}: {{ pos.name }}
When responding, please keep the subject line intact and reply to all
email addresses included in the To and CC lines. (Feel free to cut this
introductory paragraph, however.)
{% if not block_comment and not comment %}
There is no BLOCK or COMMENT text associated with this position.
{% endif %}
{% if block_comment %}----------------------------------------------------------------------
BLOCK:
----------------------------------------------------------------------
{{ block_comment|safe|wordwrap:73 }}
{% endif %}{% if comment %}----------------------------------------------------------------------
COMMENT:
----------------------------------------------------------------------
{{ comment|safe|wordwrap:73 }}
{% endif %}
{% endautoescape %}

View file

@ -1,13 +1,13 @@
{% extends "base.html" %}
{% block title %}Ballot for {{ charter.chartered_group }} issued{% endblock %}
{% block title %}Ballot for {{ doc.name }} issued{% endblock %}
{% block content %}
<h1>Ballot for {{ charter.chartered_group }} issued</h1>
<h1>Ballot for {{ doc.name }} issued</h1>
<p>Ballot has been sent out.</p>
<div class="actions">
<a href="{{ back_url }}">Back to WG</a>
<a href="{% url doc_writeup name=doc.name %}">Back to writeups</a>
</div>
{% endblock %}

View file

@ -20,7 +20,7 @@ form #id_ballot_writeup {
{{ ballot_writeup_form.ballot_writeup }}
<div class="actions">
<a href="{{ charter.get_absolute_url }}">Back</a>
<a href="{% url doc_writeup name=charter.name %}">Back</a>
<input type="submit" name="save_ballot_writeup" value="Save Ballot Writeup" />
<input style="margin-left: 8px" type="submit" name="issue_ballot" value="Save and {% if reissue %}Re-{% endif %}Issue Ballot" />
</div>

View file

@ -1,29 +0,0 @@
{% extends "base.html" %}
{% comment %}
Copyright The IETF Trust 2011, All Rights Reserved
{% endcomment %}
{% block title %}Working Groups for {{ area_name }}{% endblock %}
{% block content %}
<h1>Working Groups for {{ area_name }}</h1>
<p>
<span id="create_wg" class="yui-button yui-link-button" style="margin-left:2px;"><span class="first-child"><a href="/wgcharter/create/">Start new WG charter effort</a></span></span>
</p>
{% if not recs %}
<p><b>No WGs match your query.</b></p>
{% else %}
<table class="ietf-table ietf-doctable">
<tr>
{% for hdr in meta.hdrs %}
{% include "wgcharter/table_header.html" %}
{% endfor %}
</tr>
{% for wg in recs %}
{% include "wgcharter/search_result_row.html" %}
{% endfor %}
</table>
{% endif %}
{% endblock content %}

View file

@ -15,49 +15,55 @@ form.change-state .actions {
text-align: right;
padding-top: 10px;
}
{% endblock %}
{% block content %}
<h1>{{ title }}</h1>
{% if "Change state" in title %}<p class="helptext">For help on the states, see the <a href="{% url help_charter_states %}">state table</a>.</p>{% endif %}
{% if "Change state" in title %}<p class="helptext">For help on the states, see the <a href="{% url help_charter_states name=doc.name %}">state table</a>.</p>{% endif %}
<form class="change-state" action="" method="post">
<table>
{% for field in form.visible_fields %}
<tr>
{% if field.name == "initial_time" %}
{% if option == "recharter" %}
<th>{{ field.label_tag }}:</th>
<td>{{ field }}
{% if field.help_text %}<div class="help">{{ field.help_text }}</div>{% endif %}
{% else %}
{% if option == "initcharter" %}
<th>{{ field.label_tag }}:</th>
<td>{{ field }}
{% if field.help_text %}<div class="help">{{ field.help_text }}</div>{% endif %}
{% endif %}
{% endif %}
{% if option == "recharter" %}
<th>{{ field.label_tag }}:</th>
<td>{{ field }}
{% if field.help_text %}<div class="help">{{ field.help_text }}</div>{% endif %}
{% else %}
<th>{{ field.label_tag }}:</th>
<td>{{ field }}
{% if field.help_text %}<div class="help">{{ field.help_text }}</div>{% endif %}
{% if option == "initcharter" %}
<th>{{ field.label_tag }}:</th>
<td>{{ field }}
{% if field.help_text %}<div class="help">{{ field.help_text }}</div>{% endif %}
{% endif %}
{% if field.name == "charter_state" and field.errors == "warning" %}
<ul><li>The initial review time hasn't elapsed. Select this checkbox to proceed anyway: <label><input type="checkbox" name="confirm_state" /></label></li></ul>
{% endif %}
{% else %}
{{ field.errors }}
<th>{{ field.label_tag }}:</th>
<td>{{ field }}
{% if field.help_text %}<div class="help">{{ field.help_text }}</div>{% endif %}
{% endif %}
{{ field.errors }}
</td>
</tr>
{% if field.name == "charter_state" and not option == "initcharter" %}
<tr class="ballot-wo-extern" style="display:none">
<td></td>
<td><label><input name="ballot_wo_extern" type="checkbox" /> Ask whether external review can be skipped in ballot</label></td>
</tr>
{% endif %}
{% endfor %}
{% if initial_review %}
<tr><td></td><td class="warning">Warning: Announced initial review time hasn't elapsed yet. It does so at {{ initial_review.expires }}.</td></tr>
{% endif %}
<tr>
<td colspan="2" class="actions">
{% if option %}
<input type="submit" value="Submit"/>
{% else %}
<a href="{% url wg_view name=wg.acronym %}">Back</a>
<a href="{% url doc_view name=doc.name %}">Back</a>
<input type="submit" value="Save"/>
{% endif %}
</td>
@ -80,12 +86,8 @@ form.change-state .actions {
{% block content_end %}
<script type="text/javascript">
var message = {
"infrev": "The WG {{ wg.name }} ({{ wg.acronym }}) has been set to Informal IESG review by {{ login.name }}",
"intrev": "The WG {{ wg.name }} ({{ wg.acronym }}) has been set to Internal review by {{ login.name }}. Please place it on the next IESG telechat and inform the IAB.",
"extrev": "The WG {{ wg.name }} ({{ wg.acronym }}) has been set to External review by {{ login.name }}. Please send out the external review announcement to the appropriate lists.\n\nSend the announcement to other SDOs: Yes\nAdditional recipients of the announcement: "
};
var messages = {{ messages|safe }},
statesForBallotWoExtern = {{ states_for_ballot_wo_extern }};
</script>
<script type="text/javascript" src="/js/wg-change-state.js"></script>
<script type="text/javascript" src="/js/charter-change-state.js"></script>
{% endblock %}

View file

@ -1,34 +0,0 @@
<div class="ietf-box diffTool">
<h2 style="margin-top:0;margin-bottom:4px;">Diffs</h2>
<form action="http{% if request.is_secure %}s{% endif %}://tools.ietf.org/rfcdiff" method="get" target="_blank" style="margin:0;">
<table>
<tr><td>
<label>From:</label> <select name="url1">
{% for c in versions %}
<option value="{{ charter_text_url }}{{c.name}}-{{c.rev}}.txt" {% ifequal forloop.counter 2 %} selected="selected" {% endifequal %}>{{c.name}}-{{c.rev}} ({{c.date}})</option>
{% endfor %}
</select>
</td>
<td rowspan="2" valign="top">
Format:
<select name="difftype">
<option value="--html" selected="selected">Side-by-side</option>
<option value="--abdiff">Before-after</option>
<option value="--chbars">Change bars</option>
<option value="--hwdiff">Wdiff</option>
</select> <input name="submit" value="Go!" type="submit" />
</td>
</tr>
<tr>
<td>
<label>To:</label>
<select name="url2">
{% for c in versions %}
<option value="{{ charter_text_url }}{{c.name}}-{{c.rev}}.txt" {% ifequal forloop.counter 1 %} selected="selected" {% endifequal %}>{{c.name}}-{{c.rev}} ({{c.date}})</option>
{% endfor %}
</select>
</td>
</tr>
</table>
</form>
</div>

View file

@ -1,5 +0,0 @@
{% comment %}
Copyright The IETF Trust 2011, All Rights Reserved
{% endcomment %}
{% load ietf_filters %}<td class="date">{{ wg.time|date:"Y-m-d" }}
</td>

View file

@ -1,71 +0,0 @@
{% extends "base.html" %}
{% block title %}Change position for {{ ad.plain_name }} on {{ wg.acronym }}{% endblock %}
{% block morecss %}
form.position-form .position ul {
padding: 0;
margin: 0;
}
form.position-form .position li {
list-style-type: none;
float: left;
padding-right: 10px;
}
form.position-form .last-edited {
font-style: italic;
}
form.position-form .block_comment {
padding-top: 20px
}
form.position-form #id_block_comment,
form.position-form #id_comment {
width: 700px;
height: 250px;
}
form.position-form .comment {
margin-top: 20px;
}
{% endblock %}
{% block content %}
<h1>Change position for {{ ad.plain_name }} on {{ wg.acronym }}</h1>
<form class="position-form" action="" method="POST">
<div>
<span class="position">{{ form.position }}</span>
<span class="actions">
<input type="submit" name="send_mail" value="Save and send email"/>
<input type="submit" value="Save"/>
</span>
</div>
<div style="clear:left"></div>
<div class="block_comment-widgets" {% ifnotequal form.position.initial "block" %}style="display:none"{% endifnotequal %}>
<div class="block_comment">
{{ form.block_comment.label_tag }}:
{% if old_pos and old_pos.block_comment_time %}<span class="last-edited">(last edited {{ old_pos.block_comment_time }})</span>{% endif %}
</div>
{{ form.block_comment.errors }}
{{ form.block_comment }}
</div>
<div class="comment">
{{ form.comment.label_tag }}:
{% if old_pos and old_pos.comment_time %}<span class="last-edited">(last edited {{ old_pos.comment_time }}){% endif %}</span>
</div>
{{ form.comment }}
<div class="actions">
<a href="{{ return_to_url }}">Back</a>
</div>
{{ form.return_to_url }}
</form>
{% endblock %}
{% block content_end %}
<script type="text/javascript" src="/js/wg-edit-position.js"></script>
{% endblock %}

View file

@ -0,0 +1,29 @@
{% extends "base.html" %}
{% block title %}
Set Telechat Date for {{ doc.name }}
{% endblock %}
{% block morecss %}
form.telechat-date td.actions {
padding-top: 1em;
}
{% endblock %}
{% block content %}
{% load ietf_filters %}
<h1>Set Telechat Date for {{ doc.name }}</h1>
<form class="telechat-date" action="" method="POST">
<table>
{{ form.as_table }}
<tr>
<td></td>
<td class="actions">
<a href="{% url doc_view name=doc.name %}">Back</a>
<input type="submit" value="Save"/>
</td>
</tr>
</table>
</form>
{% endblock %}

View file

@ -1,5 +1,6 @@
{% autoescape off %}
{{ text }}
{% load ietf_filters %}{% autoescape off %}
{{ text|fill:70 }}
WG Record URL: {{ url }}
WG: {{ wg_url }}
Charter: {{ charter_url }}
{% endautoescape %}

View file

@ -1,29 +0,0 @@
{% extends "base.html" %}
{% comment %}
Copyright The IETF Trust 2011, All Rights Reserved
{% endcomment %}
{% block title %}Working Groups in IESG process{% endblock %}
{% block content %}
<h1>Working Groups in IESG process</h1>
<p>
<span id="create_wg" class="yui-button yui-link-button" style="margin-left:2px;"><span class="first-child"><a href="/wgcharter/create/">Start new WG charter effort</a></span></span>
</p>
{% if not recs %}
<p><b>No WGs match your query.</b></p>
{% else %}
<table class="ietf-table ietf-doctable">
<tr>
{% for hdr in meta.hdrs %}
{% include "wgcharter/table_header.html" %}
{% endfor %}
</tr>
{% for wg in recs %}
{% include "wgcharter/search_result_row.html" %}
{% endfor %}
</table>
{% endif %}
{% endblock content %}

View file

@ -1,9 +1,9 @@
{% autoescape off %}To: Internet Engineering Steering Group <iesg@ietf.org>
From: IESG Secretary <iesg-secretary@ietf.org>
Reply-To: IESG Secretary <iesg-secretary@ietf.org>
Subject: Evaluation: {{ charter.chartered_group }} ({{ charter.chartered_group.acronym }})
Subject: Evaluation: {{ doc.name }}
{% filter wordwrap:73 %}Evaluation for {{ charter.chartered_group }} ({{ charter.chartered_group.acronym }}) can be found at {{ charter_url }}
{% filter wordwrap:73 %}Evaluation for {{ doc.title }} can be found at {{ doc_url }}
{% endfilter %}
Please return the full line with your position.
@ -20,8 +20,8 @@ BLOCKING AND NON-BLOCKING COMMENTS
==================================
{% filter wordwrap:79 %}{% for p in ad_feedback %}{{ p.ad }}:
{% if p.block_comment %}Blocking comment [{{ p.time }}]:
{{ p.block_comment }}
{% if p.discuss %}Blocking comment [{{ p.time }}]:
{{ p.discuss }}
{% endif %}{% if p.comment %}Comment [{{ p.time }}]:
{{ p.comment }}

View file

@ -1,8 +1,8 @@
{% load ietf_filters %}{% autoescape off %}From: The IESG <iesg-secretary@ietf.org>
To: IETF-Announce <ietf-announce@ietf.org>
Subject: WG Review: {{ wg.name }} ({{wg.acronym}})
Subject: WG Review: {{ wg.name }} ({{ wg.acronym }})
{% filter wordwrap:73 %}{% ifequal review_type "new" %}A new IETF working group has been proposed in the {{ wg.parent.name }}.{% endifequal %}{% ifequal review_type "recharter" %}The {{ wg.name }} ({{wg.acronym}}) working group in the {{ wg.parent.name }} of the IETF is undergoing rechartering.{% endifequal %} The IESG has not made any determination yet. The following draft charter was submitted, and is provided for informational purposes only. Please send your comments to the IESG mailing list (iesg at ietf.org) by {{ info.bydate }}.
{% filter wordwrap:73 %}{% ifequal review_type "new" %}A new IETF working group has been proposed in the {{ wg.parent.name }}.{% endifequal %}{% ifequal review_type "recharter" %}The {{ wg.name }} ({{wg.acronym}}) working group in the {{ wg.parent.name }} of the IETF is undergoing rechartering.{% endifequal %} The IESG has not made any determination yet. The following draft charter was submitted, and is provided for informational purposes only. Please send your comments to the IESG mailing list (iesg at ietf.org) by {{ review_date }}.
{% include "wgcharter/wg_info.txt" %}

View file

@ -1,144 +0,0 @@
{% comment %}
Copyright The IETF Trust 2011, All Rights Reserved
{% endcomment %}
<form name="search_form" id="search_form" class="search_form" action="/wgcharter/search/" method="get">
<div class="search_field">
<label>Name/acronym:</label> {{ form.nameacronym }}
</div>
<div class="search_field">
<label>Types:</label>
<table id="search_types">
<tr><td>{{ form.inprocess }} WGs (in chartering process)</td></tr>
<tr><td>{{ form.active }} WGs (approved charter)</td></tr>
<tr><td>{{ form.concluded }} WGs (concluded or not under review)</td></tr>
</table>
</div>
<span onclick="toggleAdvanced();"><b><img src="/images/{% if meta.advanced %}minus{% else %}plus{% endif %}.png" alt="" id="search_advanced-img" /> Advanced</b></span>
<div id="search_advanced" style="{% if not meta.advanced %}display:none;{%endif%}margin-top:1em;">
Additional search criteria:
<div class="search_field">
<label><input type="radio" class="radio" name="by" value="state" {% ifequal meta.by "state" %}checked="checked"{% endifequal %} onclick="changeBy();"/> State:</label> {{ form.state }} :: {{ form.charter_state }}
</div>
<div class="search_field">
<label><input type="radio" class="radio" name="by" value="ad" {% ifequal meta.by "ad" %}checked="checked"{% endifequal %} onclick="changeBy();"/> Assigned AD:</label> {{ form.ad }}
</div>
<div class="search_field">
<label><input type="radio" class="radio" name="by" value="area" {% ifequal meta.by "area" %}checked="checked"{% endifequal %} onclick="changeBy();"/> Area:</label> {{ form.area }}
</div>
<div class="search_field">
<label><input type="radio" class="radio" name="by" value="anyfield" {% ifequal meta.by "anyfield" %}checked="checked"{% endifequal %} onclick="changeBy();"/> Text in any field:</label> {{ form.anyfield }}
</div>
<div class="search_field">
<label><input type="radio" class="radio" name="by" value="eacronym" {% ifequal meta.by "eacronym" %}checked="checked"{% endifequal %} onclick="changeBy();"/> Earlier acronym:</label> {{ form.eacronym }}
</div>
</div><!-- end of advanced -->
<div style="padding-top:0.5em;">
<span class="first-child">
<button type="submit" name="search_submit" id="id_search_submit">Search</button>
</span>
</div>
<div style="padding-top:0.5em;">
Quick search: <a href="{% url wg_search %}?nameacronym=&inprocess=on&by=state&state=&charter_state=intrev">WGs in Internal review</a> | <a href="{% url wg_search %}?nameacronym=&inprocess=on&by=state&state=&charter_state=extrev">WGs in External review</a> | <a href="{% url wg_search %}?nameacronym=&inprocess=on&by=state&state=&charter_state=iesgrev">WGs in IESG review</a>
</div>
</form>
<script type="text/javascript">
//<![CDATA[
// we want to disable our submit button if we have no search text,
// and we have no advanced options selected
function toggleSubmit() {
var button = document.getElementById("id_search_submit");
var by = findCheckedSearchBy();
var value = findSearchByValue(by);
var concluded = document.getElementById("id_concluded");
var text = document.getElementById("id_nameacronym");
if ((value == "") && (text.value == "" && concluded.checked)) {
button.disabled = true;
} else {
button.disabled = false;
}
}
// check our button status after every change to text fields
// Internet Explorer uses 'onpropertychange', everyone else 'oninput'
window.oninput = toggleSubmit;
window.onpropertychange = toggleSubmit;
// check our button status after every change to selection pulldowns
window.onchange = toggleSubmit;
function togglePlusMinus(id) {
var el = document.getElementById(id);
var imgEl = document.getElementById(id+"-img");
if (el.style.display == 'none') {
el.style.display = 'block';
imgEl.src = "/images/minus.png";
} else {
el.style.display = 'none';
imgEl.src = "/images/plus.png";
}
}
function findCheckedSearchBy() {
var by='';
var f = document.search_form;
for (var i = 0; i < f.by.length; i++) {
if (f.by[i].checked) {
by = f.by[i].value;
break;
}
}
return by;
}
function findSearchByValue(by) {
if (by == 'state') {
// state might be wg state...
state_value = document.getElementById("id_state").value;
if (state_value) { return state_value; }
// ...or charter state
return document.getElementById("id_charter_state").value;
}
if (by == 'ad') { return document.getElementById("id_ad").value; }
if (by == 'area') { return document.getElementById("id_area").value; }
if (by == 'anyfield') { return document.getElementById("id_anyfield").value; }
if (by == 'eacronym') { return document.getElementById("id_eacronym").value; }
return '';
}
function changeBy() {
var by=findCheckedSearchBy();
var f = document.search_form;
f.state.disabled=true; f.charter_state.disabled=true;
f.ad.disabled=true;
f.area.disabled=true;
f.anyfield.disabled=true;
f.eacronym.disabled=true;
if (by=='state') { f.state.disabled=false; f.charter_state.disabled=false;}
if (by=='ad') { f.ad.disabled=false; }
if (by=='area') { f.area.disabled=false;}
if (by=='anyfield') { f.anyfield.disabled=false;}
if (by=='eacronym') { f.eacronym.disabled=false;}
toggleSubmit();
}
function toggleAdvanced() {
togglePlusMinus("search_advanced");
var f = document.search_form;
for (var i = 0; i < f.by.length; i++) { f.by[i].checked = false; }
changeBy();
}
changeBy();
//]]>
</script>

View file

@ -1,25 +0,0 @@
{% extends "base.html" %}
{% comment %}
Copyright 2011 The IETF Trust. All rights reserved.
{% endcomment %}
{% block title %}Working Group Charters{% endblock %}
{% block content %}
<h1>Working Group Charters</h1>
<div class="ietf-box search_form_box">
{% include "wgcharter/search_form.html" %}
</div>
<div id="search_results">
{% if meta.searching %}
{% include "wgcharter/search_results.html" %}
{% endif %}
</div>
{% endblock content %}
{% block scripts %}
YAHOO.util.Event.onContentReady("search_submit_button", function () {
var oButton = new YAHOO.widget.Button("search_submit_button", {});
});
{% endblock scripts %}

View file

@ -1,22 +0,0 @@
{% comment %}
Copyright The IETF Trust 2011, All Rights Reserved
{% endcomment %}
{% if meta.max %}
<p><b>Too many WGs match the query! Returning partial result only.</b></p>
{% endif %}
{% if not recs %}
<p><b>No WGs match your query.</b></p>
{% else %}
<table class="ietf-table ietf-doctable">
<tr>
{% for hdr in meta.hdrs %}
{% include "wgcharter/table_header.html" %}
{% endfor %}
</tr>
{% for wg in recs %}
{% include "wgcharter/search_result_row.html" %}
{% endfor %}
</table>
{% endif %}

View file

@ -1,40 +0,0 @@
{% extends "base.html" %}
{% load ietf_filters %}
{% block title %}Send ballot position email for {{ ad }}{% endblock %}
{% block morecss %}
form.send-ballot pre {
margin: 0;
padding: 4px;
border-top: 4px solid #eee;
border-bottom: 4px solid #eee;
}
{% endblock %}
{% block content %}
<h1>Send ballot position email for {{ ad }}</h1>
<form class="send-ballot" action="" method="POST">
<table>
<tr><th>From:</th> <td>{{ frm }}</td></tr>
<tr><th>To:</th> <td>{{ to }}</td></tr>
<tr>
<th>Cc:<br/>
<span class="help">separated<br/> by comma</span></th>
<td><input type="text" name="cc" value="" size="75" /></td>
</tr>
<tr><th>Subject:</th> <td>{{ subject }}</td></tr>
<tr>
<th>Body:</th>
<td><pre>{{ body|wrap_text }}</pre></td>
</tr>
<tr>
<td></td>
<td class="actions">
<a href="{{ back_url }}">Back</a>
<input type="submit" value="Send"/>
</td>
</tr>
</table>
</form>
{% endblock %}

View file

@ -1,17 +0,0 @@
{% comment %}
Copyright The IETF Trust 2011, All Rights Reserved
{% endcomment %}
{% load ietf_filters ietf_streams %}{% load wg_ballot_icon %}
<td class="status">
{% if wg.charter %}
{{ wg.charter.get_state|safe }} {% ifequal wg.state_id "proposed" %}{% ifnotequal wg.charter.get_state_slug "notrev" %}(Initial Chartering){% endifnotequal %}{% else %}{% ifequal wg.state_id "active" %}{% ifnotequal wg.charter.get_state_slug "approved" %}(Rechartering){% endifnotequal %}{% endifequal %}{% ifequal wg.state_id "conclude" %}(Concluded){% endifequal %}{% endifequal %}
{% else %}
(data missing)
{% endif %}
{% if wg.charter.telechat_date %}<br/>IESG Telechat: {{ wg.charter.telechat_date }}{% endif %}
{% block extra_status %}{% endblock %}
</td>
<td class="ballot">
{% if wg.charter.get_state_slug == "iesgrev" %}{% wg_ballot_icon wg.acronym %}{% endif %}
</td>

View file

@ -30,7 +30,7 @@ Charter submission for {{ wg.acronym }}
<tr>
<td></td>
<td class="actions">
<a href="{% url wg_view name=wg.acronym %}">Back</a>
<a href="{% url doc_view name=wg.charter.name %}">Back</a>
<input type="submit" value="Submit"/>
</td>
</tr>

View file

@ -1,15 +0,0 @@
{# Copyright The IETF Trust 2011, All Rights Reserved #}
<th class="{{hdr.htype}}"{% if hdr.colspan %}colspan="{{ hdr.colspan }}" {% endif %}
onclick="location=unescape('{{ meta.rqps }}&sortBy={{hdr.htype}}');"
style="white-space: nowrap;"
>
<span>
<label>{{hdr.htitle}}</label>
{% if hdr.selected %}
<img style="border-style: none;vertical-align:top" src="/images/sort-header-filled.png"/>
{% else %}
<img style="border-style: none;vertical-align:top" src="/images/sort-header-clear.png"/>
{% endif %}
</span>
</th>

View file

@ -1,57 +0,0 @@
{% comment %}
Copyright The IETF Trust 2011, All Rights Reserved
{% endcomment %}
{% load ietf_filters %}
<table class="ietf-ballot"><tr valign="top"><td class="left">
{% if user|in_group:"Area_Director,Secretariat" %}
{% if user|in_group:"Area_Director" %}
<div style="margin-top:8px; margin-bottom:8px;"><span id="wg_ballot_button" class="yui-button yui-link-button"><span class="first-child"><a href="{% url wg_edit_position name=wg.acronym %}">Edit position</a></span></span></div>
{% endif %}
{% if user|in_group:"Secretariat" %}
{% if not info.pos_block %}<div style="margin-top:8px; margin-bottom:8px;"><span id="wg_ballot_button" class="yui-button yui-link-button"><span class="first-child"><a href="{% url wg_approve_ballot name=wg.acronym %}">Approve ballot</a></span></span></div>
{% endif %}
{% endif %}
{% endif %}
<p style="margin-top:1em;"><span class="square" style="background:#c00000;"></span><b>Blocking</b><br/>
{% with info.pos_block as positions %}{% include "wgcharter/wg_ballot_list.html" %}{% endwith %}</p>
<p><span class="square" style="background:#80ff80;"></span><b>Yes</b><br/>
{% with info.pos_yes as positions %}{% include "wgcharter/wg_ballot_list.html" %}{% endwith %}</p>
<p><span class="square" style="background:#80ff80;"></span><b>No</b><br/>
{% with info.pos_no as positions %}{% include "wgcharter/wg_ballot_list.html" %}{% endwith %}</p>
<p><span class="square" style="background:#ffff00;"></span><b>Abstain</b><br/>
{% with info.pos_abstain as positions %}{% include "wgcharter/wg_ballot_list.html" %}{% endwith %}</p>
<p><span class="square" style="background:white;"></span><b>No Record</b><br/>
{% for p in info.pos_no_record %}
<a{% if user|in_group:"Secretariat" %} href="{% url wg_edit_position name=wg.acronym %}?ad={{ p.id }}" title="Click to edit the position of {{ p.name }}"{% endif %}>{{p.name}}{% if user|in_group:"Secretariat" %}</a>{% endif %}<br/>
{% empty %}
<i>none</i>
{% endfor %}
</p>
</td>
<td class="right">
<h2 style="margin-top:12px;">Comments</h2>
{% for pos in info.positions %}
{% if pos.comment or pos.block_comment %}
<h2 class="ballot_ad"><a name="{{pos.ad|slugify}}">{{pos.ad|escape}}</a></h2>
{% if pos.block_comment %}
<p><b>Blocking ({{pos.block_comment_time}})</b> <img src="/images/comment.png" width="14" height="12" alt=""/></p>
<pre>{{pos.block_comment|fill:"80"|escape }}</pre>
{% endif %}
{% if pos.comment %}
<p><b>Comment ({{pos.comment_time}})</b> <img src="/images/comment.png" width="14" height="12" alt=""/></p>
<pre>{{pos.comment|fill:"80"|escape }}</pre>
{% endif %}
{% endif %}
{% endfor %}
</td></tr></table>

View file

@ -1,6 +0,0 @@
{% load ietf_filters %}
{% for p in positions %}
{% for oad in info.old_ads %}{% ifequal oad p.ad %}[{%endifequal%}{% endfor %}<a{% if user|in_group:"Secretariat" %} href="{% url wg_edit_position name=wg.acronym %}?ad={{ p.ad_id }}" title="Click to edit the position of {{ p.ad }}"{% endif %}>{{p.ad}}</a>{% for oad in info.old_ads %}{% ifequal oad p.ad %}]{%endifequal%}{% endfor %}{% if p.comment or p.block_comment %}&nbsp;<a href="#{{p.ad|slugify}}"><img src="/images/comment.png" width="14" height="12" alt="*" border="0"/></a>{% endif %}<br/>
{% empty %}
<i>none</i>
{% endfor %}

View file

@ -1 +0,0 @@
IETF Working Group {{ wg.name }} ({{ wg.acronym }}){% if wg.parent %} under the {{ wg.parent }}{% endif %}

View file

@ -1,40 +0,0 @@
{% comment %}
Copyright The IETF Trust 2011, All Rights Reserved
{% endcomment %}
{% load ietf_filters %}
<table class="ietf-table">
<tr><th class="comment_date">Date</th><th>Version</th><th>By</th><th>Text</th></tr>
{% for c in history %}
<tr class="{% cycle oddrow,evenrow %}"{% if c.is_com %} id="history-{{c.comment.id }}"{% endif %}>
<td class="comment_date">{{ c.date|date:"Y-m-d" }}</td>
{% if c.is_rev %}
<td>{{ c.info.version }}</td>
<td>(System)</td>
<td>New version available: <a href="{{ c.txt_url }}charter-ietf-{{ c.group.acronym }}-{{c.charter.rev}}.txt">charter-ietf-{{ c.group.acronym }}-{{ c.charter.rev }}</a> {% if c.prev_charter %}(<a href="http://tools.ietf.org/rfcdiff?url1={{ c.txt_url }}charter-ietf-{{ c.group.acronym }}-{{c.charter.rev}}.txt&url2={{ c.txt_url }}charter-ietf-{{ c.prev_group.acronym }}-{{c.prev_charter.rev}}.txt">diff from -{{ c.prev_charter.rev }}</a>){% endif %}</td>
{% endif %}
{% if c.is_com %}
<td>{{ c.info.version }}</td>
<td>{{ c.info.by|escape }}</td>
<td>{% if c.comment.ballot %}
[Ballot {{ c.comment.get_ballot_display }}]<br />
{% endif %}
{% if c.info.snipped %}
<div id="commentS{{c.comment.id}}">{{ c.info.textSnippet|safe }}</div>
<span class="comment_toggle" onclick="toggleComment({{c.comment.id}})" id="commentT{{c.comment.id}}">[show all]</span>
<div id="commentF{{c.comment.id}}" style="display:none;">
{{ c.info.text|fill:"80"|safe|urlize|linebreaksbr|keep_spacing|sanitize_html|safe }}
</div>
{% else %}
{{ c.info.text|fill:"80"|safe|urlize|linebreaksbr|keep_spacing|sanitize_html|safe }}
{% endif %}
</td>
{% endif %}
</tr>
{% endfor %}
</table>

View file

@ -3,22 +3,22 @@
Current Status: {{ wg.state.name }} Working Group
Chairs:
{% for p in info.chairs %} {{ p.plain_name }} <{{p.email}}>
{% for r in chairs %} {{ r.person.plain_name }} <{{r.email.address}}>
{% endfor %}
Secretaries:
{% for p in info.secr %} {{ p.plain_name }} <{{p.email}}>
{% for r in secr %} {{ r.person.plain_name }} <{{r.email.address}}>
{% endfor %}
Technical advisors:
{% for p in info.techadv %} {{ p.plain_name }} <{{p.email}}>
{% for r in techadv %} {{ r.person.plain_name }} <{{r.email.address}}>
{% endfor %}
Assigned Area Director:
{{ info.ad.0.plain_name }} <{{ info.ad.0.email }}>
{% if wg.ad %} {{ wg.ad.plain_name }} <{{ ad_email }}>{% endif %}
Mailing list:
Address: {{ info.list.0 }}
To Subscribe: {{ info.list_subscribe.0 }}
Archive: {{ info.list_archive.0 }}
Address: {{ wg.list_email }}
To Subscribe: {{ wg.list_subscribe }}
Archive: {{ wg.list_archive }}
Charter:
{{ info.charter_txt }}
{{ charter_text }}

View file

@ -1,72 +0,0 @@
{% extends "base.html" %}
{% comment %}
Copyright The IETF Trust 2011, All Rights Reserved
{% endcomment %}
{% load ietf_filters %}
{% block morecss %}
.metabox { width: 99%; margin-top:8px; padding:4px; margin-bottom:1em; }
#metatable { border: 0; border-spacing: 0; }
#metatable tr { vertical-align:top ;}
.comment_toggle { text-decoration: underline; color: blue; }
.comment_date { white-space: nowrap; }
div.diffTool { padding: 8px 4px; margin: 8px 0;}
.diffTool label { float:left; width:50px; }
.markup_draft pre {line-height: 1.2em; margin: 0; }
.m_hdr, .m_ftr { color: #808080; }
.m_ftr { border-bottom: 1px solid #a0a0a0; }
.m_h { font-family: arial; font-weight:bold;}
.ietf-concluded-bg {background-color: #F8F8D0; }
.ietf-concluded-warning { background:red;color:white;padding:2px 2px;}
.ietf-proposed-bg { }
.ietf-proposed-warning { background:green;color:white;padding:2px 2px;}
{% endblock %}
{% block pagehead %}
<link rel="alternate" type="application/atom+xml" href="/feed/wgcomments/{{ wg.acronym }}/" />
<meta name="description" content="{% include "wgcharter/wg_description.html" %}" />
{% endblock %}
{% block title %}{% include "wgcharter/wg_title.html" %}{% endblock title %}
{% block content %}
<h1>{% include "wgcharter/wg_title.html" %}
{% ifequal wg.state_id "conclude" %}<br/><span class="ietf-concluded-warning">(concluded WG)</span>{% endifequal %}
{% ifequal wg.state_id "proposed" %}<br/><span class="ietf-proposed-warning">(proposed WG)</span>{% endifequal %}
</h1>
<div id="mytabs" class="yui-navset">
<ul class="yui-nav">
<li{% ifequal tab "charter" %} class="selected"{% endifequal %}><a href="/wgcharter/{{ wg.acronym }}"><em>Charter {% if snapshot %}(snapshot){% endif %}</em></a></li>
<li{% if wg.charter %}{% ifequal wg.charter.get_state_slug "iesgrev" %}{% ifequal tab "ballot" %} class="selected"{% endifequal %}{%else%} class="disabled"{%endifequal%}{% else %} class="disabled"{% endif %}{% if snapshot %} class="disabled"{% endif %}><a href="/wgcharter/{{ wg.acronym }}/ballot/"><em>IESG Review</em></a></li>
<li{% if wg.charter %}{% ifequal tab "writeup" %} class="selected"{% endifequal %}{% ifequal wg.charter.get_state_slug "notrev" %} class="disabled"{%endifequal%}{% else %} class="disabled"{% endif %}{% if snapshot %} class="disabled"{% endif %}><a href="/wgcharter/{{ wg.acronym }}/writeup/"><em>IESG Writeups</em></a></li>
<li{% ifequal tab "history" %} class="selected"{% endifequal %}{% if snapshot %} class="disabled"{% endif %}><a href="/wgcharter/{{ wg.acronym }}/history/"><em>History</em></a></li>
</ul>
<div class="yui-content">
{% block tab_content %}{% endblock %}
</div> <!-- yui-content -->
</div> <!-- mytabs -->
{% endblock content %}
{% block scripts %}
function toggleComment(n) {
var el = document.getElementById("commentF"+n);
var el2 = document.getElementById("commentS"+n);
var el3 = document.getElementById("commentT"+n);
if (el.style.display == 'none') {
el.style.display = 'block';
el2.style.display = 'none';
el3.innerHTML = ""; //[hide]";
} else {
el.style.display = 'none';
el2.style.display= 'block';
el3.innerHTML = "[show all]";
}
}
{% endblock scripts %}

View file

@ -1,11 +0,0 @@
{% extends "wgcharter/wg_main.html" %}
{% comment %}
Copyright The IETF Trust 2011, All Rights Reserved
{% endcomment %}
{% load ietf_filters %}
{% block tab_content %}
{% include "wgcharter/wg_ballot.html" %}
{% endblock tab_content %}

View file

@ -1,59 +0,0 @@
{% extends "wgcharter/wg_main.html" %}
{% comment %}
Copyright The IETF Trust 2011, All Rights Reserved
{% endcomment %}
{% load ietf_filters %}
{% block tab_content %}
{% block wg_revision %}{% endblock %}
<div class="ietf-box metabox">
<table id="metatable" width="100%">
{% block wg_metatable %}{% endblock %}
</table>
<div style="padding-top:6px;padding-bottom:6px;padding-left:2px;">
{% block wg_metalinks %}{% endblock %}
</div>
{% block wg_metabuttons %}
{% if user|in_group:"Area_Director,Secretariat" %}
{% if not snapshot %}
<div style="padding-bottom:2px;">
{% ifnotequal wg.charter.get_state_slug "notrev" %}
{% ifnotequal wg.charter.get_state_slug "approved" %}
<span id="wg_edit_state_button" class="yui-button yui-link-button" style="margin-left:2px;"><span class="first-child"><a href="{% url wg_startstop_process name=wg.acronym option='abandon' %}">Abandon effort</a></span></span>
<span id="wg_edit_state_button" class="yui-button yui-link-button" style="margin-left:2px;"><span class="first-child"><a href="{% url wg_change_state name=wg.acronym %}">Change state</a></span></span>
{% ifnotequal wg.state_id "conclude" %}
<span id="wg_edit_info_button" class="yui-button yui-link-button" style="margin-left:2px;"><span class="first-child"><a href="{% url wg_submit name=wg.acronym %}">Edit charter</a></span></span>
{% endifnotequal %}
{% else %}
<span id="wg_edit_state_button" class="yui-button yui-link-button" style="margin-left:2px;"><span class="first-child"><a href="{% url wg_startstop_process name=wg.acronym option='recharter' %}">Recharter</a></span></span>
{% endifnotequal %}
{% else %}
<span id="wg_edit_state_button" class="yui-button yui-link-button" style="margin-left:2px;"><span class="first-child"><a href="{% url wg_startstop_process name=wg.acronym option='recharter' %}">Recharter</a></span></span>
{% endifnotequal %}
{% ifequal wg.state_id "active" %}{% ifequal wg.charter.get_state_slug "approved" %}
<span id="wg_conclude_button" class="yui-button yui-link-button" style="margin-left:2px;"><span class="first-child"><a href="{% url wg_conclude name=wg.acronym %}">Conclude WG</a></span></span>
{% endifequal %}{% endifequal %}
{% ifnotequal wg.state_id "conclude" %}
<span id="wg_edit_info_button" class="yui-button yui-link-button" style="margin-left:2px;"><span class="first-child"><a href="{% url wg_edit_info name=wg.acronym %}">Edit WG</a></span></span>
{% endifnotequal %}
</div>
{% endif %}{# if not snapshot #}
{% endif %}{# if user in group #}
{% endblock wg_metabuttons%}
</div> <!-- metabox -->
<div id="charterText">
{% block charter_text %}{% endblock %}
</div> <!-- charterText -->
{% endblock tab_content %}
{% block content_end %}
{% endblock content_end %}

View file

@ -1,81 +0,0 @@
{% extends "wgcharter/wg_tab_base.html" %}
{% comment %}
Copyright The IETF Trust 2011, All Rights Reserved
{% endcomment %}
{% load ietf_filters %}
{% block wg_revision %}
Snapshots: {% for d in versions reversed %}{% if forloop.first %}<strong>{% ifnotequal rev wg.charter.rev %}<a href="{% url wg_view name=wg.acronym %}">{% endifnotequal %}{% else %}{% ifnotequal rev d.rev %}{% ifequal d.rev wg.charter.rev %}<a href="{% url wg_view name=wg.acronym %}">{% else %}<a href="{% url wg_view name=wg.acronym %}{{d.rev}}/">{% endifequal %}{% endifnotequal %}{% endif %}{{ d.rev }}{% ifnotequal rev d.rev %}</a>{% endifnotequal %}{% if forloop.first %}{% ifnotequal rev wg.charter.rev %}</a>{% endifnotequal %}</strong>{% endif %} {% endfor %}
{% endblock %}
{% block wg_metatable %}
<tr><td style="width: 15em">WG name:</td><td>{% if not snapshot %}{{ wg.name }}{% else %} {{ gh.name }} {% endif %}</td></tr>
<tr><td>WG acronym:</td><td>{% if not snapshot %}{{ wg.acronym }} {% if info.prev_acronyms %}(previous acronyms: {% for a in info.prev_acronyms %}{{ a }}{% if not forloop.last %}, {% endif %}{% endfor %}){% endif %}{% else %}{{ gh.acronym }}{% endif %}</td></tr>
<tr><td>IETF area:</td><td>{% if not snapshot %}{{ wg.parent|default:"-" }}{% else %}{{ gh.parent|default:"-" }}{% endif %}</td></tr>
<tr><td colspan='2'><hr size='1' noshade /></td></tr>
<tr><td>WG chairs:</td><td>{% if not snapshot %}{% for n in info.chairs %}{{ n }}{% if not forloop.last %}, {% endif %}{% endfor %}{% else %}{% for n in info.history_chairs %}{{ n }}{% if not forloop.last %}, {% endif %}{% endfor %}{% endif %}</td></tr>
{% if not snapshot %}
<tr><td>WG secretaries:</td><td>{% for n in info.secr %}{{ n }}{% if not forloop.last %}, {% endif %}{% endfor %}</td></tr>
<tr><td>WG technical advisors:</td><td>{% for n in info.techadv %}{{ n }}{% if not forloop.last %}, {% endif %}{% endfor %}</td></tr>
{% endif %}
<tr><td>Assigned AD:</td><td>{% if not snapshot %}{{ wg.ad }}{% else %}{{ gh.ad }}{% endif %}</td></tr>
{% if not snapshot %}
<tr><td colspan='2'><hr size='1' noshade /></td></tr>
<tr><td>Mailing list:</td><td><a href="mailto:{{ wg.list_email }}">{{ wg.list_email }}</a>{% if info.prev_list_email %}<br />(previous lists: {% for a in info.prev_list_email %}{{ a }}{% if not forloop.last %}, {% else %}){% endif %}{% endfor %}{% endif %}</td></tr>
<tr><td>Mailing list subscribe:</td><td><a href="{{ wg.list_subscribe }}">{{ wg.list_subscribe }}</a>{% if info.prev_list_subscribe %}<br />(previous archives: {% for a in info.prev_list_subscribe %}<a href="{{ a }}">{{ a }}</a>{% if not forloop.last %}, {% endif %}{% endfor %}){% endif %}</td></tr>
<tr><td>Mailing list archive:</td><td><a href="{{ wg.list_archive }}">{{ wg.list_archive }}</a>{% if info.prev_list_archive %}<br />(previous archives: {% for a in info.prev_list_archive %}<a href="{{ a }}">{{ a }}</a>{% if not forloop.last %}, {% endif %}{% endfor %}){% endif %}</td></tr>
<tr><td>Other web sites:</td><td>{% for a in wg.groupurl_set.all %}<a href="{{ a.url }}">{{ a.url }}</a> {% if a.name %}({{ a.name }}){% endif %}{% if not forloop.last %}<br />{% endif %}{% endfor %}</td></tr>
<tr><td colspan='2'><hr size='1' noshade /></td></tr>
<tr><td>WG State:</td><td> {{ wg.state|safe }} </td>
{% ifnotequal wg.state_id "conclude" %}<tr><td><a href="/wgcharter/help/state/">Charter State</>:</td><td> {{ wg.charter.get_state|safe }} {% ifequal wg.state_id "proposed" %}{% ifnotequal wg.charter.get_state_slug "notrev" %}(Initial Chartering){% endifnotequal %}{% else %}{% ifnotequal wg.charter.get_state_slug "approved" %}(Rechartering){% endifnotequal %}{% endifequal %}</td>{% endifnotequal %}
{% ifequal wg.state_id "proposed" %}
{% if wg.comments %}
<tr><td>Reason for chartering:</td><td>{{ wg.comments }}</td></tr>
{% endif %}
{% endifequal %}
{% ifequal wg.state_id "active" %}
{% ifnotequal wg.charter.get_state_slug "approved" %}
{% if wg.comments %}
<tr><td>Reason for rechartering:</td><td>{{ wg.comments }}</td></tr>
{% endif %}
{% endifnotequal %}
{% endifequal %}
<tr><td colspan='2'><hr size='1' noshade /></td></tr>
<tr><td>Last updated:</td><td> {{ info.last_update|date:"Y-m-d"|default:"(data missing)" }}</td></tr>
<tr><td colspan='2'><hr size='1' noshade /></td></tr>
{% endif %}{# if not snapshot #}
{% endblock wg_metatable %}
{% block wg_metalinks %}
{% if not snapshot %}
<a href="/feed/wgcomments/{{ wg.acronym }}/">Atom feed</a>
{% endif %}
{% endblock %}
{% block charter_text %}
{% ifnotequal charter.rev "" %}
<p>Other versions: <a href="{{ charter_text_url }}{{charter.name}}-{{rev}}.txt">plain text</a></p>
<h3>Charter {{ charter.name }}-{{ rev }}</h3>
<div class="markup_draft">
{{ content|fill:"80"|safe|linebreaksbr|keep_spacing|sanitize_html|safe }}
</div>
{% else %}
<h3>The WG does not yet have a charter</h3>
{% endifnotequal %}
{% endblock %}{# charter_text #}

View file

@ -1,18 +0,0 @@
{% extends "wgcharter/wg_main.html" %}
{% comment %}
Copyright The IETF Trust 2011, All Rights Reserved
{% endcomment %}
{% load ietf_filters %}
{% block tab_content %}
{% include "wgcharter/charter_diffs.html" %}
<h2 style="margin-top:1em;">WG History</h2>
{% if user|in_group:"Area_Director,Secretariat" %}
<div style="margin-bottom:8px" id="history_actions">
<span id="wg_add_comment_button" class="yui-button yui-link-button" style="margin-left:2px;"><span class="first-child"><a href="{% url wg_add_comment name=wg.acronym %}">Add comment</a></span></span>
</div>
{% endif %}
{% include "wgcharter/wg_history.html" %}
{% endblock tab_content %}

Some files were not shown because too many files have changed in this diff Show more