Refactor mange group views:
* Create a new models NomComGroup with public_key field. Default type is nomcom * News urls and views to separate members and chair forms * Add rolodex url when person not found. * Views access is only for secretariat and chair roles See #904 - Legacy-Id: 5069
This commit is contained in:
parent
53ca2abbe6
commit
65afd10d4a
11
ietf/nomcom/admin.py
Normal file
11
ietf/nomcom/admin.py
Normal file
|
@ -0,0 +1,11 @@
|
|||
from django.contrib import admin
|
||||
|
||||
from ietf.group.admin import GroupAdmin
|
||||
from ietf.nomcom.models import NomComGroup
|
||||
|
||||
|
||||
class NomComGroupAdmin(GroupAdmin):
|
||||
exclude = ('type',)
|
||||
|
||||
|
||||
admin.site.register(NomComGroup, NomComGroupAdmin)
|
|
@ -1,61 +1,58 @@
|
|||
from django import forms
|
||||
from django.contrib.formtools.preview import FormPreview
|
||||
from django.http import HttpResponseRedirect, HttpResponseForbidden
|
||||
from django.shortcuts import get_object_or_404
|
||||
from django.core.urlresolvers import reverse
|
||||
from django.conf import settings
|
||||
|
||||
from ietf.ietfauth.decorators import has_role
|
||||
from ietf.utils import fields as custom_fields
|
||||
from ietf.group.models import Group, Role
|
||||
from ietf.group.models import Role
|
||||
from ietf.nomcom.models import NomComGroup
|
||||
from ietf.name.models import RoleName
|
||||
from ietf.person.models import Email
|
||||
|
||||
|
||||
class ManageGroupForm(forms.Form):
|
||||
ROLODEX_URL = getattr(settings, 'ROLODEX_URL', None)
|
||||
|
||||
|
||||
class EditMembersForm(forms.Form):
|
||||
|
||||
chair = forms.EmailField(label="Chair email", required=False,
|
||||
widget=forms.TextInput(attrs={'size': '40'}))
|
||||
members = custom_fields.MultiEmailField(label="Members email", required=False)
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
super(ManageGroupForm, self).__init__(*args, **kwargs)
|
||||
|
||||
class EditMembersFormPreview(FormPreview):
|
||||
form_template = 'nomcom/edit_members.html'
|
||||
preview_template = 'nomcom/edit_members_preview.html'
|
||||
|
||||
class ManageGroupFormPreview(FormPreview):
|
||||
form_template = 'nomcom/manage_group.html'
|
||||
preview_template = 'nomcom/manage_group_review.html'
|
||||
def __call__(self, request, *args, **kwargs):
|
||||
year = kwargs['year']
|
||||
group = get_object_or_404(NomComGroup,
|
||||
acronym__icontains=year,
|
||||
state__slug='active')
|
||||
is_group_chair = bool(group.role_set.filter(person__user=request.user, name__slug='chair')[:1])
|
||||
is_secretariat = has_role(request.user, "Secretariat")
|
||||
if not is_secretariat and not is_group_chair:
|
||||
return HttpResponseForbidden("Must be a secretariat or group chair")
|
||||
|
||||
def preview_get(self, request):
|
||||
if not has_role(request.user, "Secretariat"):
|
||||
return HttpResponseForbidden("Must be a secretariat")
|
||||
|
||||
return super(ManageGroupFormPreview, self).preview_get(request)
|
||||
self.state['group'] = group
|
||||
self.state['rolodex_url'] = ROLODEX_URL
|
||||
self.group = group
|
||||
self.year = year
|
||||
|
||||
return super(EditMembersFormPreview, self).__call__(request, *args, **kwargs)
|
||||
|
||||
def parse_params(self, *args, **kwargs):
|
||||
group_acronym = kwargs['acronym']
|
||||
group = Group.objects.get(acronym=group_acronym)
|
||||
chairs = group.role_set.filter(name__slug='chair')
|
||||
members = group.role_set.filter(name__slug='member')
|
||||
if chairs:
|
||||
self.form.base_fields['chair'].initial = chairs[0].email.address
|
||||
members = self.group.role_set.filter(name__slug='member')
|
||||
|
||||
if members:
|
||||
self.form.base_fields['members'].initial = ',\r\n'.join([role.email.address for role in members])
|
||||
self.state['group'] = group
|
||||
|
||||
def process_preview(self, request, form, context):
|
||||
chair_email = form.cleaned_data['chair']
|
||||
members_email = form.cleaned_data['members'].replace('\r\n', '').replace(' ', '').split(',')
|
||||
|
||||
members_info = []
|
||||
emails_not_found = []
|
||||
try:
|
||||
chair_email_obj = Email.objects.get(address=chair_email)
|
||||
chair_person = chair_email_obj.person
|
||||
except Email.DoesNotExist:
|
||||
chair_person = None
|
||||
chair_email_obj = None
|
||||
chair_info = {'email': chair_email,
|
||||
'email_obj': chair_email_obj,
|
||||
'person': chair_person}
|
||||
|
||||
for email in members_email:
|
||||
try:
|
||||
|
@ -69,29 +66,76 @@ class ManageGroupFormPreview(FormPreview):
|
|||
'person': person})
|
||||
else:
|
||||
emails_not_found.append(email)
|
||||
self.state.update({'chair_info': chair_info,
|
||||
'members_info': members_info,
|
||||
self.state.update({'members_info': members_info,
|
||||
'emails_not_found': emails_not_found})
|
||||
|
||||
def done(self, request, cleaned_data):
|
||||
group = self.state['group']
|
||||
chair_info = self.state['chair_info']
|
||||
members_info = self.state['members_info']
|
||||
members_email = [member['email'] for member in self.state['members_info']]
|
||||
members_excluded = group.role_set.filter(name__slug='member').exclude(email__address__in=members_email)
|
||||
members_excluded = self.group.role_set.filter(name__slug='member').exclude(email__address__in=members_email)
|
||||
members_excluded.delete()
|
||||
for member in members_info:
|
||||
Role.objects.get_or_create(name=RoleName.objects.get(slug="member"),
|
||||
group=group,
|
||||
group=self.group,
|
||||
person=member['person'],
|
||||
email=member['email_obj'])
|
||||
|
||||
chair_exclude = group.role_set.filter(name__slug='chair').exclude(email__address=chair_info['email'])
|
||||
return HttpResponseRedirect(reverse('edit_members', kwargs={'year': self.year}))
|
||||
|
||||
|
||||
class EditChairForm(forms.Form):
|
||||
|
||||
chair = forms.EmailField(label="Chair email", required=False,
|
||||
widget=forms.TextInput(attrs={'size': '40'}))
|
||||
|
||||
|
||||
class EditChairFormPreview(FormPreview):
|
||||
form_template = 'nomcom/edit_chair.html'
|
||||
preview_template = 'nomcom/edit_chair_preview.html'
|
||||
|
||||
def __call__(self, request, *args, **kwargs):
|
||||
year = kwargs['year']
|
||||
group = get_object_or_404(NomComGroup,
|
||||
acronym__icontains=year,
|
||||
state__slug='active')
|
||||
is_secretariat = has_role(request.user, "Secretariat")
|
||||
if not is_secretariat:
|
||||
return HttpResponseForbidden("Must be a secretariat")
|
||||
|
||||
self.state['group'] = group
|
||||
self.state['rolodex_url'] = ROLODEX_URL
|
||||
self.group = group
|
||||
self.year = year
|
||||
|
||||
return super(EditChairFormPreview, self).__call__(request, *args, **kwargs)
|
||||
|
||||
def parse_params(self, *args, **kwargs):
|
||||
chairs = self.group.role_set.filter(name__slug='chair')
|
||||
if chairs:
|
||||
self.form.base_fields['chair'].initial = chairs[0].email.address
|
||||
|
||||
def process_preview(self, request, form, context):
|
||||
chair_email = form.cleaned_data['chair']
|
||||
try:
|
||||
chair_email_obj = Email.objects.get(address=chair_email)
|
||||
chair_person = chair_email_obj.person
|
||||
except Email.DoesNotExist:
|
||||
chair_person = None
|
||||
chair_email_obj = None
|
||||
chair_info = {'email': chair_email,
|
||||
'email_obj': chair_email_obj,
|
||||
'person': chair_person}
|
||||
|
||||
self.state.update({'chair_info': chair_info})
|
||||
|
||||
def done(self, request, cleaned_data):
|
||||
chair_info = self.state['chair_info']
|
||||
chair_exclude = self.group.role_set.filter(name__slug='chair').exclude(email__address=chair_info['email'])
|
||||
chair_exclude.delete()
|
||||
if chair_info['email_obj'] and chair_info['person']:
|
||||
Role.objects.get_or_create(name=RoleName.objects.get(slug="chair"),
|
||||
group=group,
|
||||
group=self.group,
|
||||
person=chair_info['person'],
|
||||
email=chair_info['email_obj'])
|
||||
|
||||
return HttpResponseRedirect(reverse('manage_group', kwargs={'acronym': group.acronym}))
|
||||
return HttpResponseRedirect(reverse('edit_chair', kwargs={'year': self.year}))
|
||||
|
|
228
ietf/nomcom/migrations/0001_initial.py
Normal file
228
ietf/nomcom/migrations/0001_initial.py
Normal file
|
@ -0,0 +1,228 @@
|
|||
# encoding: utf-8
|
||||
from south.db import db
|
||||
from south.v2 import SchemaMigration
|
||||
|
||||
|
||||
class Migration(SchemaMigration):
|
||||
|
||||
def forwards(self, orm):
|
||||
|
||||
# Adding model 'NomComGroup'
|
||||
db.create_table('nomcom_nomcomgroup', (
|
||||
('group_ptr', self.gf('django.db.models.fields.related.OneToOneField')(to=orm['group.Group'], unique=True, primary_key=True)),
|
||||
('public_key', self.gf('django.db.models.fields.TextField')(blank=True)),
|
||||
))
|
||||
db.send_create_signal('nomcom', ['NomComGroup'])
|
||||
|
||||
def backwards(self, orm):
|
||||
|
||||
# Deleting model 'NomComGroup'
|
||||
db.delete_table('nomcom_nomcomgroup')
|
||||
|
||||
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.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.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.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'})
|
||||
},
|
||||
'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.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.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'})
|
||||
},
|
||||
'nomcom.nomcomgroup': {
|
||||
'Meta': {'object_name': 'NomComGroup', '_ormbases': ['group.Group']},
|
||||
'group_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['group.Group']", 'unique': 'True', 'primary_key': 'True'}),
|
||||
'public_key': ('django.db.models.fields.TextField', [], {'blank': '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 = ['nomcom']
|
0
ietf/nomcom/migrations/__init__.py
Normal file
0
ietf/nomcom/migrations/__init__.py
Normal file
|
@ -1,3 +1,21 @@
|
|||
from django.db import models
|
||||
|
||||
# Create your models here.
|
||||
from ietf.group.models import Group
|
||||
from ietf.name.models import GroupTypeName
|
||||
|
||||
|
||||
class NomComGroup(Group):
|
||||
public_key = models.TextField(verbose_name="Public Key", blank=True)
|
||||
|
||||
class Meta:
|
||||
verbose_name_plural = "NomCom groups"
|
||||
verbose_name = "NomCom group"
|
||||
|
||||
def save(self, *args, **kwargs):
|
||||
if not self.id:
|
||||
try:
|
||||
self.type = GroupTypeName.objects.get(slug='nomcom')
|
||||
except GroupTypeName.DoesNotExist:
|
||||
pass
|
||||
|
||||
super(NomComGroup, self).save(*args, **kwargs)
|
||||
|
|
|
@ -1,7 +1,8 @@
|
|||
from django.conf.urls.defaults import patterns, url
|
||||
from ietf.nomcom.forms import ManageGroupForm, ManageGroupFormPreview
|
||||
from ietf.nomcom.forms import EditChairForm, EditChairFormPreview, \
|
||||
EditMembersForm, EditMembersFormPreview
|
||||
|
||||
urlpatterns = patterns('ietf.nomcom.views',
|
||||
|
||||
url(r'^group/(?P<acronym>[\w.@+-]+)/$', ManageGroupFormPreview(ManageGroupForm), name='manage_group'),
|
||||
url(r'^(?P<year>\d{4})/edit-chair/$', EditChairFormPreview(EditChairForm), name='edit_chair'),
|
||||
url(r'^(?P<year>\d{4})/edit-members/$', EditMembersFormPreview(EditMembersForm), name='edit_members'),
|
||||
)
|
||||
|
|
|
@ -84,7 +84,7 @@ MEDIA_URL = ''
|
|||
ADMIN_MEDIA_PREFIX = '/media/'
|
||||
|
||||
AUTH_PROFILE_MODULE = 'person.Person'
|
||||
AUTHENTICATION_BACKENDS = ( 'django.contrib.auth.backends.RemoteUserBackend', )
|
||||
#AUTHENTICATION_BACKENDS = ( 'django.contrib.auth.backends.RemoteUserBackend', )
|
||||
|
||||
#DATABASE_ROUTERS = ["ietf.legacy_router.LegacyRouter"]
|
||||
|
||||
|
@ -160,6 +160,7 @@ INSTALLED_APPS = (
|
|||
'ietf.wgchairs',
|
||||
'ietf.wgcharter',
|
||||
'ietf.community',
|
||||
'ietf.nomcom',
|
||||
)
|
||||
|
||||
INTERNAL_IPS = (
|
||||
|
@ -256,6 +257,9 @@ IDSUBMIT_TO_EMAIL = 'internet-drafts@ietf.org'
|
|||
IDSUBMIT_ANNOUNCE_FROM_EMAIL = 'internet-drafts@ietf.org'
|
||||
IDSUBMIT_ANNOUNCE_LIST_EMAIL = 'i-d-announce@ietf.org'
|
||||
|
||||
# NomCom Tool settings
|
||||
ROLODEX_URL = ""
|
||||
|
||||
# Days from meeting to cut off dates on submit
|
||||
FIRST_CUTOFF_DAYS = 19
|
||||
SECOND_CUTOFF_DAYS = 12
|
||||
|
|
18
ietf/templates/nomcom/edit_chair.html
Normal file
18
ietf/templates/nomcom/edit_chair.html
Normal file
|
@ -0,0 +1,18 @@
|
|||
{% extends "base.html" %}
|
||||
|
||||
{% block title %}Edit {{ state.group.acronym }} chair{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<h1>Edit {{ state.group.acronym }} chair</h1>
|
||||
|
||||
{% if form.errors %}<h3>Please correct the following errors</h3>{% endif %}
|
||||
|
||||
<form action="" method="post">{% csrf_token %}
|
||||
<table>
|
||||
{{ form }}
|
||||
</table>
|
||||
<input type="hidden" name="{{ stage_field }}" value="1" />
|
||||
<p><input type="submit" value="Preview" /></p>
|
||||
</form>
|
||||
|
||||
{% endblock %}
|
44
ietf/templates/nomcom/edit_chair_preview.html
Normal file
44
ietf/templates/nomcom/edit_chair_preview.html
Normal file
|
@ -0,0 +1,44 @@
|
|||
{% extends "base.html" %}
|
||||
|
||||
{% block title %}Edit {{ state.group.acronym }} chair{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<h1>Edit {{ state.group.acronym }} chair</h1>
|
||||
|
||||
<h2>Chair info </h2>
|
||||
<p>
|
||||
{% if state.chair_info.person %}
|
||||
<ul>
|
||||
<li><strong>Email:</strong> {{ state.chair_info.email }}</li>
|
||||
<li><strong>Person name:</strong> {{ state.chair_info.person.name }}</li>
|
||||
</ul>
|
||||
{% else %}
|
||||
<p>Person with {{ state.chair_info.email }} not exists. {% if state.rolodex_url %} Please go to <a href="{{ state.rolodex_url }}">{{ state.rolodex_url }}</a> to add this person.{% endif %}</p>
|
||||
{% endif %}
|
||||
</p>
|
||||
|
||||
{% if state.chair_info.person %}
|
||||
<table>
|
||||
<form action="" method="post">{% csrf_token %}
|
||||
{% for field in form %}{{ field.as_hidden }}
|
||||
{% endfor %}
|
||||
<input type="hidden" name="{{ stage_field }}" value="2" />
|
||||
<input type="hidden" name="{{ hash_field }}" value="{{ hash_value }}" />
|
||||
<p><input type="submit" value="Submit" /></p>
|
||||
</form>
|
||||
{% endif %}
|
||||
|
||||
|
||||
<h1>Edit it again</h1>
|
||||
|
||||
<form action="" method="post">{% csrf_token %}
|
||||
<table>
|
||||
{{ form }}
|
||||
</table>
|
||||
<input type="hidden" name="{{ stage_field }}" value="1" />
|
||||
<p><input type="submit" value="Preview" /></p>
|
||||
</form>
|
||||
|
||||
|
||||
|
||||
{% endblock %}
|
|
@ -1,9 +1,9 @@
|
|||
{% extends "base.html" %}
|
||||
|
||||
{% block title %}Manage group {{ state.group.acronym }}{% endblock %}
|
||||
{% block title %}Edit {{ state.group.acronym }} members{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<h1>Manage group {{ state.group.acronym }}</h1>
|
||||
<h1>Edit {{ state.group.acronym }} members</h1>
|
||||
|
||||
{% if form.errors %}<h3>Please correct the following errors</h3>{% endif %}
|
||||
|
|
@ -1,19 +1,9 @@
|
|||
{% extends "base.html" %}
|
||||
|
||||
{% block title %}Preview group {{ state.group.acronym }} {% endblock %}
|
||||
{% block title %}Edit {{ state.group.acronym }} members{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<h1>Preview group {{ state.group.acronym }}</h1>
|
||||
|
||||
<h2>Chair info </h2>
|
||||
{% if state.chair_info.person.name %}
|
||||
<ul>
|
||||
<li><strong>Email:</strong> {{ state.chair_info.email }}</li>
|
||||
<li><strong>Person name:</strong> {{ state.chair_info.person.name }}</li>
|
||||
</ul>
|
||||
{% else %}
|
||||
email {{ state.chair_info.email }} not found
|
||||
{% endif %}
|
||||
<h1>Edit {{ state.group.acronym }} members</h1>
|
||||
|
||||
{% if state.members_info %}
|
||||
<h2>Members info </h2>
|
||||
|
@ -25,12 +15,13 @@
|
|||
{% endif %}
|
||||
|
||||
{% if state.emails_not_found %}
|
||||
<h2>Members not found </h2>
|
||||
<ul>
|
||||
{% for email in state.emails_not_found %}
|
||||
<li>{{ email }}</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
<h2>Members not found </h2>
|
||||
<ul>
|
||||
{% for email in state.emails_not_found %}
|
||||
<li>{{ email }}</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
{% if state.rolodex_url %}Please go to <a href="{{ state.rolodex_url }}">{{ state.rolodex_url }}</a> to add these people.{% endif %}
|
||||
{% endif %}
|
||||
|
||||
|
|
@ -9,6 +9,8 @@ class MultiEmailField(forms.CharField):
|
|||
def clean(self, value):
|
||||
super(MultiEmailField, self).clean(value)
|
||||
if value:
|
||||
if value.endswith(','):
|
||||
value = value[:-1]
|
||||
emails = map(unicode.strip, value.split(','))
|
||||
else:
|
||||
return value
|
||||
|
|
Loading…
Reference in a new issue