Remove shim layer from ietfauth, delete some dead code and migrate

remaining importers of ietfauth.decorators to ietfauth.utils
 - Legacy-Id: 6797
This commit is contained in:
Ole Laursen 2013-12-05 16:24:03 +00:00
parent fe5ad0c998
commit e63ac36b8f
38 changed files with 90 additions and 456 deletions

View file

@ -5,7 +5,7 @@ from django.template import RequestContext
from ietf.dbtemplate.models import DBTemplate from ietf.dbtemplate.models import DBTemplate
from ietf.dbtemplate.forms import DBTemplateForm from ietf.dbtemplate.forms import DBTemplateForm
from ietf.group.models import Group from ietf.group.models import Group
from ietf.ietfauth.decorators import has_role from ietf.ietfauth.utils import has_role
def template_list(request, acronym): def template_list(request, acronym):

View file

@ -423,7 +423,7 @@ def startswith(x, y):
@register.filter @register.filter
def has_role(user, role_names): def has_role(user, role_names):
from ietf.ietfauth.decorators import has_role from ietf.ietfauth.utils import has_role
if not user: if not user:
return False return False
return has_role(user, role_names.split(',')) return has_role(user, role_names.split(','))

View file

@ -16,7 +16,7 @@ from django.conf import settings
import debug import debug
from ietf.utils.mail import send_mail_text, send_mail_preformatted from ietf.utils.mail import send_mail_text, send_mail_preformatted
from ietf.ietfauth.decorators import has_role, role_required from ietf.ietfauth.utils import has_role, role_required
from ietf.iesg.models import TelechatDate from ietf.iesg.models import TelechatDate
from ietf.ipr.models import IprDetail from ietf.ipr.models import IprDetail
from ietf.ipr.search import iprs_from_docs from ietf.ipr.search import iprs_from_docs

View file

@ -12,7 +12,7 @@ from ietf.doc.utils import log_state_changed, update_telechat
from ietf.doc.models import save_document_in_history from ietf.doc.models import save_document_in_history
from ietf.doc.utils import create_ballot_if_not_open, close_open_ballots, get_document_content from ietf.doc.utils import create_ballot_if_not_open, close_open_ballots, get_document_content
from ietf.ietfauth.decorators import has_role, role_required from ietf.ietfauth.utils import has_role, role_required
from ietf.utils.textupload import get_cleaned_text_file_content from ietf.utils.textupload import get_cleaned_text_file_content
from ietf.utils.mail import send_mail_preformatted from ietf.utils.mail import send_mail_preformatted
from ietf.doc.mails import email_iana from ietf.doc.mails import email_iana

View file

@ -18,7 +18,7 @@ from django.contrib.auth.decorators import login_required
from django.template.defaultfilters import pluralize from django.template.defaultfilters import pluralize
from ietf.utils.mail import send_mail_text, send_mail_message from ietf.utils.mail import send_mail_text, send_mail_message
from ietf.ietfauth.decorators import role_required from ietf.ietfauth.utils import role_required
from ietf.ietfauth.utils import has_role, is_authorized_in_doc_stream, user_is_person from ietf.ietfauth.utils import has_role, is_authorized_in_doc_stream, user_is_person
from ietf.iesg.models import TelechatDate from ietf.iesg.models import TelechatDate
from ietf.doc.mails import * from ietf.doc.mails import *

View file

@ -12,7 +12,7 @@ from ietf.doc.utils import log_state_changed, update_telechat
from ietf.doc.models import save_document_in_history from ietf.doc.models import save_document_in_history
from ietf.doc.utils import create_ballot_if_not_open, close_open_ballots, get_document_content from ietf.doc.utils import create_ballot_if_not_open, close_open_ballots, get_document_content
from ietf.ietfauth.decorators import has_role, role_required from ietf.ietfauth.utils import has_role, role_required
from ietf.utils.textupload import get_cleaned_text_file_content from ietf.utils.textupload import get_cleaned_text_file_content
from ietf.utils.mail import send_mail_preformatted from ietf.utils.mail import send_mail_preformatted
from ietf.doc.models import State, Document, DocHistory, DocAlias from ietf.doc.models import State, Document, DocHistory, DocAlias

View file

@ -1,17 +1,15 @@
from django.utils import simplejson as json
from dajaxice.core import dajaxice_functions
from dajaxice.decorators import dajaxice_register
from ietf.ietfauth.decorators import group_required
from django.shortcuts import get_object_or_404
from django.http import HttpResponseRedirect, HttpResponse, Http404
from ietf.group.models import Group
import datetime import datetime
import logging import logging
import sys import sys
from ietf.settings import LOG_DIR
log = logging.getLogger(__name__) from django.utils import simplejson as json
from django.shortcuts import get_object_or_404
from django.http import HttpResponseRedirect, HttpResponse, Http404
from dajaxice.core import dajaxice_functions
from dajaxice.decorators import dajaxice_register
from ietf.group.models import Group
def group_json(request, groupname): def group_json(request, groupname):
group = get_object_or_404(Group, acronym=groupname) group = get_object_or_404(Group, acronym=groupname)

View file

@ -1,2 +0,0 @@
# Copyright The IETF Trust 2007, All Rights Reserved

View file

@ -1,115 +0,0 @@
# Portions Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
# 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
# are met:
#
# * Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
#
# * Redistributions in binary form must reproduce the above
# copyright notice, this list of conditions and the following
# disclaimer in the documentation and/or other materials provided
# with the distribution.
#
# * Neither the name of the Nokia Corporation and/or its
# subsidiary(-ies) nor the names of its contributors may be used
# to endorse or promote products derived from this software
# without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# 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.
# Copyright The IETF Trust 2007, All Rights Reserved
from django.contrib.auth.backends import RemoteUserBackend
from django.contrib.auth.models import Group
from ietf.idtracker.models import IESGLogin, Role
from ietf.ietfauth.models import IetfUserProfile
from ietf.utils import log
AUTOMATIC_GROUPS = ["Area_Director", "Secretariat", "IETF_Chair",
"IAB_Chair", "IRTF_Chair", ]
class IetfUserBackend(RemoteUserBackend):
def find_groups(username):
"""
Role/Group:
Area_Director currently sitting AD
IETF_Chair currently sitting IETF Chair
IAB_Chair currently sitting IAB Chair
IRTF_Chair currently sitting IRTF Chair
Secretariat secretariat staff
Roles/Groups NOT YET IMPLEMENTED
WG_Chair currently sitting chair of some WG
IESG_Liaison non-ADs on iesg@ietf.org and telechats
Session_Chair chairing a non-WG session in IETF meeting
Ex_Area_Director past AD
"""
# Any group name added by this method should be added to the
# AUTOMATIC_GROUPS list
groups = []
try:
login = IESGLogin.objects.get(login_name=username)
if login.user_level == 1:
groups.append("Area_Director")
elif login.user_level == 0:
groups.append("Secretariat")
if login.person:
for role in login.person.role_set.all():
if role.id == Role.IETF_CHAIR:
groups.append("IETF_Chair")
elif role.id == Role.IAB_CHAIR:
groups.append("IAB_Chair")
elif role.id == Role.IRTF_CHAIR:
groups.append("IRTF_Chair")
except IESGLogin.DoesNotExist:
pass
#
# Additional sources of group memberships:
# - wg_password table
# - other Roles
# - the /etc/.../*.perms files
return groups
find_groups = staticmethod(find_groups)
def authenticate(self, remote_user):
user = RemoteUserBackend.authenticate(self, remote_user)
if not user:
return user
# Create profile if it doesn't exist
try:
profile = user.get_profile()
except IetfUserProfile.DoesNotExist:
profile = IetfUserProfile(user=user)
profile.save()
# Remove any automatic groups, the proper ones will be retrieved by
# find_groups
groups = [group for group in user.groups.exclude(name__in=AUTOMATIC_GROUPS)]
# Update group memberships
group_names = IetfUserBackend.find_groups(user.username)
for group_name in group_names:
# Create groups as needed
group,created = Group.objects.get_or_create(name=group_name)
if created:
log("IetfUserBackend created Group '%s'" % (group_name,))
groups.append(group)
user.groups = groups
return user

View file

@ -1,35 +0,0 @@
# Portion Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
# 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
# are met:
#
# * Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
#
# * Redistributions in binary form must reproduce the above
# copyright notice, this list of conditions and the following
# disclaimer in the documentation and/or other materials provided
# with the distribution.
#
# * Neither the name of the Nokia Corporation and/or its
# subsidiary(-ies) nor the names of its contributors may be used
# to endorse or promote products derived from this software
# without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# 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.
# REDESIGN: backwards compatibility, to be deleted
from ietf.ietfauth.utils import role_required, has_role, passes_test_decorator
group_required = lambda *group_names: role_required(*[n.replace("Area_Director", "Area Director") for n in group_names])

View file

@ -10,7 +10,8 @@ from django.contrib.sites.models import Site
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from ietf.utils.mail import send_mail from ietf.utils.mail import send_mail
from ietf.person.models import Person, Email from ietf.person.models import Person, Email, Alias
from ietf.group.models import Role
class RegistrationForm(forms.Form): class RegistrationForm(forms.Form):
@ -167,7 +168,6 @@ class PersonForm(ModelForm):
request = None request = None
new_emails = [] new_emails = []
class Meta: class Meta:
from ietf.person.models import Person
model = Person model = Person
exclude = ('time','user') exclude = ('time','user')
@ -193,8 +193,6 @@ class PersonForm(ModelForm):
send_mail(self.request, to_email, from_email, subject, 'registration/add_email_email.txt', context) send_mail(self.request, to_email, from_email, subject, 'registration/add_email_email.txt', context)
def save(self, force_insert=False, force_update=False, commit=True): def save(self, force_insert=False, force_update=False, commit=True):
from ietf.group.models import Role
from ietf.person.models import Alias
m = super(PersonForm, self).save(commit=False) m = super(PersonForm, self).save(commit=False)
self.new_emails = [v for k,v in self.data.items() if k[:10] == u'new_email_' and u'@' in v] self.new_emails = [v for k,v in self.data.items() if k[:10] == u'new_email_' and u'@' in v]

View file

@ -1,136 +1 @@
# Portions Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
# 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
# are met:
#
# * Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
#
# * Redistributions in binary form must reproduce the above
# copyright notice, this list of conditions and the following
# disclaimer in the documentation and/or other materials provided
# with the distribution.
#
# * Neither the name of the Nokia Corporation and/or its
# subsidiary(-ies) nor the names of its contributors may be used
# to endorse or promote products derived from this software
# without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# 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.
# Copyright The IETF Trust 2007, All Rights Reserved
from django.db import models from django.db import models
from django.contrib.auth.models import User
from ietf.idtracker.models import PersonOrOrgInfo, IESGLogin
from ietf.utils.admin import admin_link
def find_person(username):
try:
person = IESGLogin.objects.get(login_name=username).person
return person
except IESGLogin.DoesNotExist, PersonOrOrgInfo.DoesNotExist:
pass
# try LegacyWgPassword next
try:
return LegacyWgPassword.objects.get(login_name=username).person
except LegacyWgPassword.DoesNotExist, PersonOrOrgInfo.DoesNotExist:
pass
# try LegacyLiaisonUser next
try:
return LegacyLiaisonUser.objects.get(login_name=username).person
except LegacyLiaisonUser.DoesNotExist, PersonOrOrgInfo.DoesNotExist:
pass
return None
class IetfUserProfile(models.Model):
user = models.ForeignKey(User,unique=True)
def person(self):
return find_person(self.user.username)
def iesg_login_id(self):
person = self.person()
if not person:
return None
try:
return person.iesglogin_set.all()[0].id
except:
return None
def email(self):
# quick hack to bind new and old schema together for the time being
try:
l = IESGLogin.objects.get(login_name=self.user.username)
if l.person:
person = l.person
else:
person = PersonOrOrgInfo.objects.get(first_name=l.first_name,
last_name=l.last_name)
except IESGLogin.DoesNotExist, PersonOrOrgInfo.DoesNotExist:
person = None
from ietf.person.models import Email
return Email.objects.get(address=person.email()[1])
def __str__(self):
return "IetfUserProfile(%s)" % (self.user,)
######################################################
# legacy per-tool access tables.
# ietf.idtracker.models.IESGLogin is in the same vein.
class LegacyLiaisonUser(models.Model):
USER_LEVEL_CHOICES = (
(0, 'Secretariat'),
(1, 'IESG'),
(2, 'ex-IESG'),
(3, 'Level 3'),
(4, 'Comment Only(?)'),
)
person = models.ForeignKey(PersonOrOrgInfo, db_column='person_or_org_tag', primary_key=True)
login_name = models.CharField(max_length=255)
password = models.CharField(max_length=25, blank=True, editable=False)
user_level = models.IntegerField(null=True, blank=True, choices=USER_LEVEL_CHOICES)
comment = models.TextField(blank=True,null=True)
def __str__(self):
return self.login_name
class Meta:
db_table = 'users'
ordering = ['login_name']
person_link = admin_link('person')
class LegacyWgPassword(models.Model):
person = models.ForeignKey(PersonOrOrgInfo, db_column='person_or_org_tag', primary_key=True)
password = models.CharField(blank=True, null=True,max_length=255)
secrete_question_id = models.IntegerField(null=True, blank=True)
secrete_answer = models.CharField(blank=True, null=True, max_length=255)
is_tut_resp = models.IntegerField(null=True, blank=True)
irtf_id = models.IntegerField(null=True, blank=True)
comment = models.TextField(blank=True,null=True)
login_name = models.CharField(blank=True, max_length=100)
def __str__(self):
return self.login_name
class Meta:
db_table = 'wg_password'
ordering = ['login_name']
person_link = admin_link('person')
# changes done by convert-096.py:changed maxlength to max_length
# removed core
# removed edit_inline
# removed max_num_in_admin
# removed num_in_admin
# removed raw_id_admin

View file

@ -31,12 +31,12 @@
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
import unittest import unittest
from django.conf import settings from urlparse import urlsplit
from django.contrib.auth.models import User from django.contrib.auth.models import User
from django.test.client import Client from django.test.client import Client
from ietf.utils.test_utils import SimpleUrlTestCase, RealDatabaseTest from ietf.utils.test_utils import SimpleUrlTestCase, RealDatabaseTest
from ietf.idtracker.models import Role
from urlparse import urlsplit
class IetfAuthUrlTestCase(SimpleUrlTestCase): class IetfAuthUrlTestCase(SimpleUrlTestCase):
def testUrls(self): def testUrls(self):
@ -66,40 +66,3 @@ class IetfAuthTestCase(unittest.TestCase,RealDatabaseTest):
self.assertEquals(response.status_code, 200) self.assertEquals(response.status_code, 200)
self.assert_("User name" in response.content) self.assert_("User name" in response.content)
return response return response
def testLogin(self):
TEST_USERNAME = '__testuser'
print " Testing login with "+TEST_USERNAME
# Delete test user (if it exists)
try:
testuser = User.objects.get(username=TEST_USERNAME)
testuser.delete()
except User.DoesNotExist:
pass
self._doLogin(TEST_USERNAME)
# Delete test user after test
testuser = User.objects.get(username=TEST_USERNAME)
testuser.delete()
print "OK"
def testGroups(self):
print " Testing group assignment"
username = Role.objects.get(id=Role.IETF_CHAIR).person.iesglogin_set.all()[0].login_name
print " (with username "+str(username)+")"
self._doLogin(username)
user = User.objects.get(username=username)
groups = [x.name for x in user.groups.all()]
self.assert_("Area_Director" in groups)
self.assert_("IETF_Chair" in groups)
print "OK"
if settings.USE_DB_REDESIGN_PROXY_CLASSES:
del IetfAuthTestCase.testLogin
# this test doesn't make any sense anymore
del IetfAuthTestCase.testGroups

View file

@ -1,18 +1,14 @@
# Copyright The IETF Trust 2007, 2009, All Rights Reserved # Copyright The IETF Trust 2007, 2009, All Rights Reserved
from django.conf.urls.defaults import patterns, url from django.conf.urls.defaults import patterns, url
from ietf.ietfauth import views
urlpatterns = patterns('', urlpatterns = patterns('ietf.ietfauth.views',
(r'^$', views.index, None, 'account_index'), url(r'^$', 'index', name='account_index'),
(r'^login/$', views.ietf_login), url(r'^login/$', 'ietf_login'),
(r'^loggedin/$', views.ietf_loggedin), url(r'^loggedin/$', 'ietf_loggedin'),
(r'^profile/$', views.profile), url(r'^profile/$', 'profile'),
# (r'^login/(?P<user>[a-z0-9.@]+)/(?P<passwd>.+)$', views.url_login), # (r'^login/(?P<user>[a-z0-9.@]+)/(?P<passwd>.+)$', 'url_login'),
(r'^testemail/$', views.test_email), url(r'^testemail/$', 'test_email'),
)
urlpatterns += patterns('ietf.ietfauth.views',
url(r'^create/$', 'create_account', name='create_account'), url(r'^create/$', 'create_account', name='create_account'),
url(r'^confirm/(?P<username>[\w.@+-]+)/(?P<date>[\d]+)/(?P<realm>[\w]+)/(?P<hash>[a-f0-9]+)/$', 'confirm_account', name='confirm_account'), url(r'^confirm/(?P<username>[\w.@+-]+)/(?P<date>[\d]+)/(?P<realm>[\w]+)/(?P<hash>[a-f0-9]+)/$', 'confirm_account', name='confirm_account'),
url(r'^reset/$', 'password_reset_view', name='password_reset'), url(r'^reset/$', 'password_reset_view', name='password_reset'),

View file

@ -34,6 +34,7 @@
import datetime import datetime
import hashlib import hashlib
import json
from django.conf import settings from django.conf import settings
from django.template import RequestContext from django.template import RequestContext
@ -43,10 +44,12 @@ from django.contrib.auth import REDIRECT_FIELD_NAME, authenticate, login
from django.contrib.auth.decorators import login_required from django.contrib.auth.decorators import login_required
from django.contrib.auth.models import User from django.contrib.auth.models import User
from django.utils.http import urlquote from django.utils.http import urlquote
from django.utils import simplejson as json
from django.utils.translation import ugettext as _ from django.utils.translation import ugettext as _
from django.core.exceptions import ValidationError, NON_FIELD_ERRORS
from ietf.ietfauth.forms import RegistrationForm, PasswordForm, RecoverPasswordForm, TestEmailForm from ietf.person.models import Person, Email, Alias
from ietf.group.models import Role
from ietf.ietfauth.forms import RegistrationForm, PasswordForm, RecoverPasswordForm, TestEmailForm, PersonForm
def index(request): def index(request):
return render_to_response('registration/index.html', context_instance=RequestContext(request)) return render_to_response('registration/index.html', context_instance=RequestContext(request))
@ -62,8 +65,8 @@ def url_login(request, user, passwd):
def ietf_login(request): def ietf_login(request):
if not request.user.is_authenticated(): if not request.user.is_authenticated():
# This probably means an exception occured inside IetfUserBackend
return HttpResponse("Not authenticated?", status=500) return HttpResponse("Not authenticated?", status=500)
redirect_to = request.REQUEST.get(REDIRECT_FIELD_NAME, '') redirect_to = request.REQUEST.get(REDIRECT_FIELD_NAME, '')
request.session.set_test_cookie() request.session.set_test_cookie()
return HttpResponseRedirect('/accounts/loggedin/?%s=%s' % (REDIRECT_FIELD_NAME, urlquote(redirect_to))) return HttpResponseRedirect('/accounts/loggedin/?%s=%s' % (REDIRECT_FIELD_NAME, urlquote(redirect_to)))
@ -79,10 +82,6 @@ def ietf_loggedin(request):
@login_required @login_required
def profile(request): def profile(request):
from ietf.person.models import Person, Email, Alias
from ietf.group.models import Role
from ietf.ietfauth.forms import PersonForm
roles = [] roles = []
person = None person = None
try: try:
@ -119,8 +118,6 @@ def profile(request):
context_instance=RequestContext(request)) context_instance=RequestContext(request))
def confirm_new_email(request, username, date, email, hash): def confirm_new_email(request, username, date, email, hash):
from ietf.person.models import Person, Email, Alias
from django.core.exceptions import ValidationError, NON_FIELD_ERRORS
valid = hashlib.md5('%s%s%s%s' % (settings.SECRET_KEY, date, email, username)).hexdigest() == hash valid = hashlib.md5('%s%s%s%s' % (settings.SECRET_KEY, date, email, username)).hexdigest() == hash
if not valid: if not valid:
raise Http404 raise Http404
@ -233,24 +230,15 @@ def ajax_check_username(request):
return HttpResponse(json.dumps({'error': error}), mimetype='text/plain') return HttpResponse(json.dumps({'error': error}), mimetype='text/plain')
def test_email(request): def test_email(request):
"""Set email address to which email generated in the system will be sent."""
if settings.SERVER_MODE == "production": if settings.SERVER_MODE == "production":
raise Http404() raise Http404
# note that the cookie set here is only used when running in # Note that the cookie set here is only used when running in
# "test" mode, normally you run the server in "development" mode, # "test" mode, normally you run the server in "development" mode,
# in which case email is sent out as usual; for development, put # in which case email is sent out as usual; for development, you
# this # can easily start a little email debug server with Python, see
# # the instructions in utils/mail.py.
# EMAIL_HOST = 'localhost'
# EMAIL_PORT = 1025
# EMAIL_HOST_USER = None
# EMAIL_HOST_PASSWORD = None
# EMAIL_COPY_TO = ""
#
# in your settings.py and start a little debug email server in a
# console with the following (it receives and prints messages)
#
# python -m smtpd -n -c DebuggingServer localhost:1025
cookie = None cookie = None

View file

@ -1,18 +1,14 @@
from django.utils import simplejson as json from django.utils import simplejson as json
from dajaxice.decorators import dajaxice_register
from django.core.urlresolvers import reverse from django.core.urlresolvers import reverse
from django.shortcuts import get_object_or_404 from django.shortcuts import get_object_or_404
from ietf.ietfauth.decorators import group_required, has_role
from ietf.name.models import TimeSlotTypeName
from django.http import HttpResponseRedirect, HttpResponse, QueryDict from django.http import HttpResponseRedirect, HttpResponse, QueryDict
from dajaxice.decorators import dajaxice_register
from ietf.ietfauth.utils import role_required, has_role
from ietf.name.models import TimeSlotTypeName
from ietf.meeting.helpers import get_meeting, get_schedule, get_schedule_by_id, agenda_permissions from ietf.meeting.helpers import get_meeting, get_schedule, get_schedule_by_id, agenda_permissions
from ietf.meeting.views import edit_timeslots, edit_agenda from ietf.meeting.views import edit_timeslots, edit_agenda
# New models
from ietf.meeting.models import TimeSlot, Session, Schedule, Room, Constraint from ietf.meeting.models import TimeSlot, Session, Schedule, Room, Constraint
import debug import debug
@ -50,7 +46,7 @@ def readonly(request, meeting_num, schedule_id):
'owner_href': request.build_absolute_uri(schedule.owner.json_url()), 'owner_href': request.build_absolute_uri(schedule.owner.json_url()),
'read_only': read_only}) 'read_only': read_only})
@group_required('Area Director','Secretariat') @role_required('Area Director','Secretariat')
@dajaxice_register @dajaxice_register
def update_timeslot_pinned(request, schedule_id, scheduledsession_id, pinned=False): def update_timeslot_pinned(request, schedule_id, scheduledsession_id, pinned=False):
schedule = get_object_or_404(Schedule, pk = int(schedule_id)) schedule = get_object_or_404(Schedule, pk = int(schedule_id))
@ -73,7 +69,7 @@ def update_timeslot_pinned(request, schedule_id, scheduledsession_id, pinned=Fal
@group_required('Area Director','Secretariat') @role_required('Area Director','Secretariat')
@dajaxice_register @dajaxice_register
def update_timeslot(request, schedule_id, session_id, scheduledsession_id=None, extended_from_id=None, duplicate=False): def update_timeslot(request, schedule_id, session_id, scheduledsession_id=None, extended_from_id=None, duplicate=False):
schedule = get_object_or_404(Schedule, pk = int(schedule_id)) schedule = get_object_or_404(Schedule, pk = int(schedule_id))
@ -132,7 +128,7 @@ def update_timeslot(request, schedule_id, session_id, scheduledsession_id=None,
return json.dumps({'message':'valid'}) return json.dumps({'message':'valid'})
@group_required('Secretariat') @role_required('Secretariat')
@dajaxice_register @dajaxice_register
def update_timeslot_purpose(request, timeslot_id=None, purpose=None): def update_timeslot_purpose(request, timeslot_id=None, purpose=None):
ts_id = int(timeslot_id) ts_id = int(timeslot_id)
@ -167,10 +163,8 @@ def timeslot_roomlist(request, mtg):
return HttpResponse(json.dumps(json_array), return HttpResponse(json.dumps(json_array),
mimetype="application/json") mimetype="application/json")
@group_required('Secretariat') @role_required('Secretariat')
def timeslot_addroom(request, meeting): def timeslot_addroom(request, meeting):
# authorization was enforced by the @group_require decorator above.
newroomform = AddRoomForm(request.POST) newroomform = AddRoomForm(request.POST)
if not newroomform.is_valid(): if not newroomform.is_valid():
return HttpResponse(status=404) return HttpResponse(status=404)
@ -188,9 +182,8 @@ def timeslot_addroom(request, meeting):
return HttpResponseRedirect( return HttpResponseRedirect(
reverse(edit_timeslots, args=[meeting.number])) reverse(edit_timeslots, args=[meeting.number]))
@group_required('Secretariat') @role_required('Secretariat')
def timeslot_delroom(request, meeting, roomid): def timeslot_delroom(request, meeting, roomid):
# authorization was enforced by the @group_require decorator above.
room = get_object_or_404(meeting.room_set, pk=roomid) room = get_object_or_404(meeting.room_set, pk=roomid)
room.delete_timeslots() room.delete_timeslots()
@ -235,10 +228,8 @@ def timeslot_slotlist(request, mtg):
return HttpResponse(json.dumps(json_array), return HttpResponse(json.dumps(json_array),
mimetype="application/json") mimetype="application/json")
@group_required('Secretariat') @role_required('Secretariat')
def timeslot_addslot(request, meeting): def timeslot_addslot(request, meeting):
# authorization was enforced by the @group_require decorator above.
addslotform = AddSlotForm(request.POST) addslotform = AddSlotForm(request.POST)
#debug.log("newslot: %u" % ( addslotform.is_valid() )) #debug.log("newslot: %u" % ( addslotform.is_valid() ))
if not addslotform.is_valid(): if not addslotform.is_valid():
@ -261,9 +252,8 @@ def timeslot_addslot(request, meeting):
return HttpResponseRedirect( return HttpResponseRedirect(
reverse(edit_timeslots, args=[meeting.number])) reverse(edit_timeslots, args=[meeting.number]))
@group_required('Secretariat') @role_required('Secretariat')
def timeslot_delslot(request, meeting, slotid): def timeslot_delslot(request, meeting, slotid):
# authorization was enforced by the @group_require decorator above.
slot = get_object_or_404(meeting.timeslot_set, pk=slotid) slot = get_object_or_404(meeting.timeslot_set, pk=slotid)
# this will delete self as well. # this will delete self as well.
@ -301,7 +291,7 @@ def timeslot_sloturl(request, num=None, slotid=None):
AgendaEntryForm = modelform_factory(Schedule, exclude=('meeting','owner')) AgendaEntryForm = modelform_factory(Schedule, exclude=('meeting','owner'))
EditAgendaEntryForm = modelform_factory(Schedule, exclude=('meeting','owner', 'name')) EditAgendaEntryForm = modelform_factory(Schedule, exclude=('meeting','owner', 'name'))
@group_required('Area Director','Secretariat') @role_required('Area Director','Secretariat')
def agenda_list(request, mtg): def agenda_list(request, mtg):
agendas = mtg.schedule_set.all() agendas = mtg.schedule_set.all()
json_array=[] json_array=[]
@ -311,10 +301,8 @@ def agenda_list(request, mtg):
mimetype="application/json") mimetype="application/json")
# duplicates save-as functionality below. # duplicates save-as functionality below.
@group_required('Area Director','Secretariat') @role_required('Area Director','Secretariat')
def agenda_add(request, meeting): def agenda_add(request, meeting):
# authorization was enforced by the @group_require decorator above.
newagendaform = AgendaEntryForm(request.POST) newagendaform = AgendaEntryForm(request.POST)
if not newagendaform.is_valid(): if not newagendaform.is_valid():
return HttpResponse(status=404) return HttpResponse(status=404)
@ -332,10 +320,8 @@ def agenda_add(request, meeting):
return HttpResponseRedirect( return HttpResponseRedirect(
reverse(edit_agenda, args=[meeting.number, newagenda.name])) reverse(edit_agenda, args=[meeting.number, newagenda.name]))
@group_required('Area Director','Secretariat') @role_required('Area Director','Secretariat')
def agenda_update(request, meeting, schedule): def agenda_update(request, meeting, schedule):
# authorization was enforced by the @group_require decorator above.
# forms are completely useless for update actions that want to # forms are completely useless for update actions that want to
# accept a subset of values. # accept a subset of values.
update_dict = QueryDict(request.raw_post_data, encoding=request._encoding) update_dict = QueryDict(request.raw_post_data, encoding=request._encoding)
@ -380,7 +366,7 @@ def agenda_update(request, meeting, schedule):
return HttpResponseRedirect( return HttpResponseRedirect(
reverse(edit_agenda, args=[meeting.number, schedule.name])) reverse(edit_agenda, args=[meeting.number, schedule.name]))
@group_required('Secretariat') @role_required('Secretariat')
def agenda_del(request, meeting, schedule): def agenda_del(request, meeting, schedule):
schedule.delete_scheduledsessions() schedule.delete_scheduledsessions()
#debug.log("deleting meeting: %s agenda: %s" % (meeting, meeting.agenda)) #debug.log("deleting meeting: %s agenda: %s" % (meeting, meeting.agenda))
@ -427,10 +413,8 @@ def meeting_get(request, meeting):
sort_keys=True, indent=2), sort_keys=True, indent=2),
mimetype="application/json") mimetype="application/json")
@group_required('Secretariat') @role_required('Secretariat')
def meeting_update(request, meeting): def meeting_update(request, meeting):
# authorization was enforced by the @group_require decorator above.
# at present, only the official agenda can be updated from this interface. # at present, only the official agenda can be updated from this interface.
update_dict = QueryDict(request.raw_post_data, encoding=request._encoding) update_dict = QueryDict(request.raw_post_data, encoding=request._encoding)

View file

@ -14,7 +14,7 @@ from django.utils.cache import get_cache_key
import debug import debug
from django.shortcuts import get_object_or_404 from django.shortcuts import get_object_or_404
from ietf.ietfauth.decorators import has_role from ietf.ietfauth.utils import has_role
from ietf.utils.history import find_history_active_at from ietf.utils.history import find_history_active_at
from ietf.doc.models import Document, State from ietf.doc.models import Document, State

View file

@ -6,7 +6,7 @@ from ietf.utils import TestCase
from ietf.person.models import Person from ietf.person.models import Person
from django.contrib.auth.models import User from django.contrib.auth.models import User
from ietf.meeting.models import TimeSlot, Session, ScheduledSession, Meeting from ietf.meeting.models import TimeSlot, Session, ScheduledSession, Meeting
from ietf.ietfauth.decorators import has_role from ietf.ietfauth.utils import has_role
from auths import auth_joeblow, auth_wlo, auth_ietfchair, auth_ferrel from auths import auth_joeblow, auth_wlo, auth_ietfchair, auth_ferrel
from django.utils import simplejson as json from django.utils import simplejson as json
from ietf.meeting.helpers import get_meeting from ietf.meeting.helpers import get_meeting

View file

@ -3,7 +3,7 @@ from django.test import Client
from ietf.utils import TestCase from ietf.utils import TestCase
#from ietf.person.models import Person #from ietf.person.models import Person
from django.contrib.auth.models import User from django.contrib.auth.models import User
from ietf.ietfauth.decorators import has_role from ietf.ietfauth.utils import has_role
# from http://djangosnippets.org/snippets/850/ # from http://djangosnippets.org/snippets/850/

View file

@ -1,17 +1,17 @@
# Copyright The IETF Trust 2007, All Rights Reserved # Copyright The IETF Trust 2007, All Rights Reserved
#import models
import datetime import datetime
import os import os
import re import re
import tarfile import tarfile
import debug
import urllib
from tempfile import mkstemp from tempfile import mkstemp
from django import forms from django import forms
from django.shortcuts import render_to_response, get_object_or_404 from django.shortcuts import render_to_response, get_object_or_404
from django.utils import simplejson as json from django.utils import simplejson as json
from ietf.idtracker.models import IETFWG, IRTF, Area
from django.http import HttpResponseRedirect, HttpResponse, Http404 from django.http import HttpResponseRedirect, HttpResponse, Http404
from django.core.urlresolvers import reverse from django.core.urlresolvers import reverse
from django.db.models import Q from django.db.models import Q
@ -19,16 +19,14 @@ from django.template import RequestContext
from django.template.loader import render_to_string from django.template.loader import render_to_string
from django.conf import settings from django.conf import settings
from django.utils.decorators import decorator_from_middleware from django.utils.decorators import decorator_from_middleware
from ietf.ietfauth.decorators import group_required, has_role
from django.middleware.gzip import GZipMiddleware from django.middleware.gzip import GZipMiddleware
from django.db.models import Max from django.db.models import Max
from django.forms.models import modelform_factory from django.forms.models import modelform_factory
import debug
import urllib
from ietf.utils.pipe import pipe from ietf.utils.pipe import pipe
from ietf.doc.models import Document, State from ietf.doc.models import Document, State
from ietf.idtracker.models import IETFWG, IRTF, Area
from ietf.ietfauth.utils import role_required, has_role
# Old model -- needs to be removed # Old model -- needs to be removed
from ietf.proceedings.models import Meeting as OldMeeting, WgMeetingSession, Proceeding, Switches from ietf.proceedings.models import Meeting as OldMeeting, WgMeetingSession, Proceeding, Switches
@ -46,8 +44,6 @@ from ietf.meeting.helpers import get_modified_from_scheduledsessions
from ietf.meeting.helpers import get_wg_list, find_ads_for_meeting from ietf.meeting.helpers import get_wg_list, find_ads_for_meeting
from ietf.meeting.helpers import get_meeting, get_schedule, agenda_permissions from ietf.meeting.helpers import get_meeting, get_schedule, agenda_permissions
import debug
@decorator_from_middleware(GZipMiddleware) @decorator_from_middleware(GZipMiddleware)
def materials(request, meeting_num=None): def materials(request, meeting_num=None):
proceeding = get_object_or_404(Proceeding, meeting_num=meeting_num) proceeding = get_object_or_404(Proceeding, meeting_num=meeting_num)
@ -100,7 +96,7 @@ def get_user_agent(request):
class SaveAsForm(forms.Form): class SaveAsForm(forms.Form):
savename = forms.CharField(max_length=100) savename = forms.CharField(max_length=100)
@group_required('Area Director','Secretariat') @role_required('Area Director','Secretariat')
def agenda_create(request, num=None, schedule_name=None): def agenda_create(request, num=None, schedule_name=None):
meeting = get_meeting(num) meeting = get_meeting(num)
schedule = get_schedule(meeting, schedule_name) schedule = get_schedule(meeting, schedule_name)
@ -203,7 +199,7 @@ def edit_timeslots(request, num=None):
RequestContext(request)), mimetype="text/html") RequestContext(request)), mimetype="text/html")
############################################################################## ##############################################################################
#@group_required('Area Director','Secretariat') #@role_required('Area Director','Secretariat')
# disable the above security for now, check it below. # disable the above security for now, check it below.
@decorator_from_middleware(GZipMiddleware) @decorator_from_middleware(GZipMiddleware)
def edit_agenda(request, num=None, schedule_name=None): def edit_agenda(request, num=None, schedule_name=None):
@ -293,7 +289,7 @@ def edit_agenda(request, num=None, schedule_name=None):
# #
AgendaPropertiesForm = modelform_factory(Schedule, fields=('name','visible', 'public')) AgendaPropertiesForm = modelform_factory(Schedule, fields=('name','visible', 'public'))
@group_required('Area Director','Secretariat') @role_required('Area Director','Secretariat')
@decorator_from_middleware(GZipMiddleware) @decorator_from_middleware(GZipMiddleware)
def edit_agenda_properties(request, num=None, schedule_name=None): def edit_agenda_properties(request, num=None, schedule_name=None):
@ -311,7 +307,7 @@ def edit_agenda_properties(request, num=None, schedule_name=None):
# show list of agendas. # show list of agendas.
# #
@group_required('Area Director','Secretariat') @role_required('Area Director','Secretariat')
@decorator_from_middleware(GZipMiddleware) @decorator_from_middleware(GZipMiddleware)
def edit_agendas(request, num=None, order=None): def edit_agendas(request, num=None, order=None):

View file

@ -2,7 +2,7 @@ from django.core.urlresolvers import reverse
from django.http import HttpResponseRedirect from django.http import HttpResponseRedirect
from django.utils.http import urlquote from django.utils.http import urlquote
from ietf.ietfauth.decorators import passes_test_decorator from ietf.ietfauth.utils import passes_test_decorator
from ietf.nomcom.utils import get_nomcom_by_year from ietf.nomcom.utils import get_nomcom_by_year

View file

@ -11,7 +11,7 @@ from django.template.context import RequestContext
from ietf.dbtemplate.forms import DBTemplateForm from ietf.dbtemplate.forms import DBTemplateForm
from ietf.utils.mail import send_mail from ietf.utils.mail import send_mail
from ietf.ietfauth.decorators import role_required from ietf.ietfauth.utils import role_required
from ietf.utils import fields as custom_fields from ietf.utils import fields as custom_fields
from ietf.group.models import Group, Role from ietf.group.models import Group, Role
from ietf.name.models import RoleName, FeedbackType, NomineePositionState from ietf.name.models import RoleName, FeedbackType, NomineePositionState

View file

@ -7,7 +7,7 @@ from django.template.defaultfilters import linebreaksbr, force_escape
from ietf.utils.pipe import pipe from ietf.utils.pipe import pipe
from ietf.utils.log import log from ietf.utils.log import log
from ietf.ietfauth.decorators import has_role from ietf.ietfauth.utils import has_role
from ietf.doc.templatetags.ietf_filters import wrap_text from ietf.doc.templatetags.ietf_filters import wrap_text
from ietf.person.models import Person from ietf.person.models import Person

View file

@ -1,17 +1,15 @@
from django.utils import simplejson as json
from dajaxice.core import dajaxice_functions
from dajaxice.decorators import dajaxice_register
from ietf.ietfauth.decorators import group_required
from django.shortcuts import get_object_or_404
from django.http import HttpResponseRedirect, HttpResponse, Http404
from ietf.person.models import Person
import datetime import datetime
import logging import logging
import sys import sys
from ietf.settings import LOG_DIR
log = logging.getLogger(__name__) from django.utils import simplejson as json
from django.shortcuts import get_object_or_404
from django.http import HttpResponseRedirect, HttpResponse, Http404
from dajaxice.core import dajaxice_functions
from dajaxice.decorators import dajaxice_register
from ietf.person.models import Person
def person_json(request, personid): def person_json(request, personid):
person = get_object_or_404(Person, pk=personid) person = get_object_or_404(Person, pk=personid)

View file

@ -6,7 +6,7 @@ from ietf.secr.utils.mail import MultiEmailField
from ietf.secr.utils.group import current_nomcom from ietf.secr.utils.group import current_nomcom
from ietf.message.models import Message from ietf.message.models import Message
from ietf.ietfauth.decorators import has_role from ietf.ietfauth.utils import has_role
# --------------------------------------------- # ---------------------------------------------
# Globals # Globals

View file

@ -4,7 +4,7 @@ from ietf.utils import TestCase
from django.contrib.auth.models import User from django.contrib.auth.models import User
from ietf.group.models import Group from ietf.group.models import Group
from ietf.ietfauth.decorators import has_role from ietf.ietfauth.utils import has_role
from ietf.person.models import Person from ietf.person.models import Person
from ietf.utils.mail import outbox from ietf.utils.mail import outbox
from ietf.utils.test_data import make_test_data from ietf.utils.test_data import make_test_data

View file

@ -4,7 +4,7 @@ from django.http import HttpResponseRedirect, HttpResponse, HttpResponseForbidde
from django.shortcuts import render_to_response, get_object_or_404 from django.shortcuts import render_to_response, get_object_or_404
from django.template import RequestContext from django.template import RequestContext
from ietf.ietfauth.decorators import has_role from ietf.ietfauth.utils import has_role
from ietf.utils.mail import send_mail_text from ietf.utils.mail import send_mail_text
from ietf.group.models import Group from ietf.group.models import Group
from ietf.secr.utils.group import current_nomcom from ietf.secr.utils.group import current_nomcom

View file

@ -3,7 +3,7 @@ from ietf.utils import TestCase
from django.contrib.auth.models import User from django.contrib.auth.models import User
from ietf.group.models import Group, GroupEvent from ietf.group.models import Group, GroupEvent
from ietf.ietfauth.decorators import has_role from ietf.ietfauth.utils import has_role
from ietf.person.models import Person from ietf.person.models import Person
from ietf.utils.test_data import make_test_data from ietf.utils.test_data import make_test_data

View file

@ -2,7 +2,7 @@ from django.conf import settings
from django.http import HttpResponseForbidden from django.http import HttpResponseForbidden
from django.shortcuts import render_to_response from django.shortcuts import render_to_response
from ietf.ietfauth.decorators import has_role from ietf.ietfauth.utils import has_role
import re import re

View file

@ -26,7 +26,7 @@ from ietf.doc.models import Document, DocAlias, DocEvent, State, NewRevisionDocE
from ietf.group.models import Group from ietf.group.models import Group
from ietf.group.proxy import IETFWG from ietf.group.proxy import IETFWG
from ietf.group.utils import get_charter_text from ietf.group.utils import get_charter_text
from ietf.ietfauth.decorators import has_role from ietf.ietfauth.utils import has_role
from ietf.meeting.models import Meeting, Session, TimeSlot, ScheduledSession from ietf.meeting.models import Meeting, Session, TimeSlot, ScheduledSession
from ietf.name.models import MeetingTypeName, SessionStatusName from ietf.name.models import MeetingTypeName, SessionStatusName
from ietf.person.models import Person from ietf.person.models import Person

View file

@ -5,7 +5,7 @@ from django.core.urlresolvers import reverse
from ietf.utils import TestCase from ietf.utils import TestCase
from django.test.client import Client from django.test.client import Client
from ietf.group.models import Group from ietf.group.models import Group
from ietf.ietfauth.decorators import has_role from ietf.ietfauth.utils import has_role
from ietf.utils.test_data import make_test_data from ietf.utils.test_data import make_test_data
from ietf.utils.test_utils import SimpleUrlTestCase, RealDatabaseTest from ietf.utils.test_utils import SimpleUrlTestCase, RealDatabaseTest

View file

@ -11,7 +11,7 @@ from ietf.secr.utils.mail import get_ad_email_list, get_chair_email_list, get_cc
from ietf.secr.utils.decorators import check_permissions, sec_only from ietf.secr.utils.decorators import check_permissions, sec_only
from ietf.secr.utils.group import get_my_groups, groups_by_session from ietf.secr.utils.group import get_my_groups, groups_by_session
from ietf.ietfauth.decorators import has_role from ietf.ietfauth.utils import has_role
from ietf.utils.mail import send_mail from ietf.utils.mail import send_mail
from ietf.meeting.models import Meeting, Session, Constraint from ietf.meeting.models import Meeting, Session, Constraint

View file

@ -3,7 +3,7 @@ from django.http import HttpResponseRedirect
from django.shortcuts import render_to_response, get_object_or_404 from django.shortcuts import render_to_response, get_object_or_404
from functools import wraps from functools import wraps
from ietf.ietfauth.decorators import has_role from ietf.ietfauth.utils import has_role
from ietf.doc.models import Document from ietf.doc.models import Document
from ietf.group.models import Group from ietf.group.models import Group
from ietf.meeting.models import Session from ietf.meeting.models import Session

View file

@ -2,7 +2,7 @@ from django.conf import settings
from ietf.group.models import Group from ietf.group.models import Group
from ietf.meeting.models import Session from ietf.meeting.models import Session
from ietf.ietfauth.decorators import has_role from ietf.ietfauth.utils import has_role
import itertools import itertools
import os import os

View file

@ -9,7 +9,7 @@ from django import forms
from django.db.models import Q from django.db.models import Q
from django.contrib.auth.models import User from django.contrib.auth.models import User
from ietf.ietfauth.decorators import role_required, has_role from ietf.ietfauth.utils import role_required, has_role
from ietf.doc.models import * from ietf.doc.models import *
from ietf.sync import iana, rfceditor from ietf.sync import iana, rfceditor
from ietf.sync.discrepancies import find_discrepancies from ietf.sync.discrepancies import find_discrepancies

View file

@ -16,7 +16,7 @@ from django.contrib import messages
from ietf.utils.mail import send_mail_preformatted from ietf.utils.mail import send_mail_preformatted
from ietf.utils.textupload import get_cleaned_text_file_content from ietf.utils.textupload import get_cleaned_text_file_content
from ietf.utils.history import find_history_active_at from ietf.utils.history import find_history_active_at
from ietf.ietfauth.decorators import has_role, role_required from ietf.ietfauth.utils import has_role, role_required
from ietf.iesg.models import TelechatDate from ietf.iesg.models import TelechatDate
from ietf.doc.models import * from ietf.doc.models import *
from ietf.doc.utils import * from ietf.doc.utils import *

View file

@ -11,7 +11,7 @@ from django.utils.html import mark_safe
import debug import debug
from ietf.ietfauth.decorators import role_required, has_role from ietf.ietfauth.utils import role_required, has_role
from ietf.doc.models import * from ietf.doc.models import *
from ietf.name.models import * from ietf.name.models import *

View file

@ -11,7 +11,7 @@ from django.utils.html import mark_safe, escape
from django.utils.functional import lazy from django.utils.functional import lazy
from django.core.urlresolvers import reverse as urlreverse from django.core.urlresolvers import reverse as urlreverse
from ietf.ietfauth.decorators import role_required, has_role from ietf.ietfauth.utils import role_required, has_role
from ietf.doc.models import Document, DocEvent from ietf.doc.models import Document, DocEvent
from ietf.doc.utils import get_chartering_type from ietf.doc.utils import get_chartering_type
from ietf.group.models import * from ietf.group.models import *