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:
commit
bcd28cc45f
|
@ -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)
|
||||
|
||||
|
|
648
ietf/doc/migrations/0001_initial.py
Normal file
648
ietf/doc/migrations/0001_initial.py
Normal 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']
|
|
@ -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']
|
0
ietf/doc/migrations/__init__.py
Normal file
0
ietf/doc/migrations/__init__.py
Normal 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)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -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):
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 = []
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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')),
|
||||
)
|
||||
|
|
|
@ -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")
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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):
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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()]
|
||||
|
|
|
@ -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>
|
|
@ -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)
|
||||
|
||||
|
|
375
ietf/name/migrations/0001_initial.py
Normal file
375
ietf/name/migrations/0001_initial.py
Normal 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']
|
|
@ -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']
|
0
ietf/name/migrations/__init__.py
Normal file
0
ietf/name/migrations/__init__.py
Normal 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
31
ietf/person/forms.py
Normal 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
5
ietf/person/urls.py
Normal 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
8
ietf/person/views.py
Normal 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')
|
|
@ -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 Statements</a></li>
|
||||
<li><a href="/iesg/agenda/">IESG Agenda</a></li>
|
||||
|
|
3
ietf/templates/feeds/group_description.html
Normal file
3
ietf/templates/feeds/group_description.html
Normal file
|
@ -0,0 +1,3 @@
|
|||
{# Copyright The IETF Trust 2011, All Rights Reserved #}
|
||||
{% load ietf_filters %}
|
||||
<p>{{ obj.desc|safe|linebreaksbr }}</p>
|
|
@ -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 %}
|
|
@ -1 +0,0 @@
|
|||
{% load ietf_filters %}WG Charter for {{obj.group.name}} ({{ obj.group.acronym|safe }})
|
|
@ -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>
|
||||
|
|
|
@ -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%}
|
||||
|
|
|
@ -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%}
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
19
ietf/templates/idrfc/document_ballot.html
Normal file
19
ietf/templates/idrfc/document_ballot.html
Normal 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 %}
|
67
ietf/templates/idrfc/document_ballot_content.html
Normal file
67
ietf/templates/idrfc/document_ballot_content.html
Normal 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 %} <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>
|
116
ietf/templates/idrfc/document_charter.html
Normal file
116
ietf/templates/idrfc/document_charter.html
Normal 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 %}
|
||||
|
80
ietf/templates/idrfc/document_history.html
Normal file
80
ietf/templates/idrfc/document_history.html
Normal 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 %}
|
9
ietf/templates/idrfc/document_top.html
Normal file
9
ietf/templates/idrfc/document_top.html
Normal 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>
|
24
ietf/templates/idrfc/document_writeup.html
Normal file
24
ietf/templates/idrfc/document_writeup.html
Normal 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 %}
|
|
@ -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 %}
|
||||
|
|
|
@ -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 %}
|
||||
|
|
|
@ -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 %}
|
|
@ -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>
|
||||
|
|
|
@ -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 %}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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%}
|
||||
|
|
|
@ -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 %}
|
||||
|
|
|
@ -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 %}
|
||||
|
|
|
@ -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 %}
|
||||
|
|
|
@ -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 %}
|
|
@ -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 %}
|
|
@ -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 %}
|
||||
|
|
|
@ -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 %}
|
||||
|
|
|
@ -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 %}
|
||||
|
|
|
@ -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 %}
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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 %}
|
||||
|
|
|
@ -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 %}
|
|
@ -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%}
|
|
@ -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" %}
|
||||
|
||||
|
|
|
@ -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 %}
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
|
@ -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 %}
|
|
@ -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 %}
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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 %}
|
|
@ -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 %}
|
||||
|
|
|
@ -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>
|
|
@ -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>
|
|
@ -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 %}
|
29
ietf/templates/wgcharter/edit_telechat_date.html
Normal file
29
ietf/templates/wgcharter/edit_telechat_date.html
Normal 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 %}
|
|
@ -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 %}
|
||||
|
|
|
@ -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 %}
|
|
@ -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 }}
|
||||
|
|
|
@ -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" %}
|
||||
|
||||
|
|
|
@ -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>
|
|
@ -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 %}
|
|
@ -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 %}
|
|
@ -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 %}
|
|
@ -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>
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
|
@ -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>
|
|
@ -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 %} <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 %}
|
|
@ -1 +0,0 @@
|
|||
IETF Working Group {{ wg.name }} ({{ wg.acronym }}){% if wg.parent %} under the {{ wg.parent }}{% endif %}
|
|
@ -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>
|
|
@ -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 }}
|
||||
|
|
|
@ -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 %}
|
|
@ -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 %}
|
||||
|
|
@ -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 %}
|
|
@ -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 #}
|
||||
|
|
@ -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
Loading…
Reference in a new issue