diff --git a/ietf/submit/forms.py b/ietf/submit/forms.py index 1aecf5d35..d99b64294 100644 --- a/ietf/submit/forms.py +++ b/ietf/submit/forms.py @@ -14,11 +14,11 @@ from django.core.urlresolvers import reverse as urlreverse import debug -from ietf.group.models import Group -from ietf.idtracker.models import InternetDraft, IETFWG -from ietf.proceedings.models import Meeting +from ietf.group.models import Group, Role +from ietf.doc.models import Document +from ietf.meeting.models import Meeting from ietf.submit.models import IdSubmissionDetail, TempIdAuthors, Preapproval -from ietf.submit.utils import MANUAL_POST_REQUESTED, NONE_WG, UPLOADED, AWAITING_AUTHENTICATION, POSTED, POSTED_BY_SECRETARIAT +from ietf.submit.utils import MANUAL_POST_REQUESTED, UPLOADED, AWAITING_AUTHENTICATION, POSTED, POSTED_BY_SECRETARIAT, submission_confirmation_email_list from ietf.submit.parsers.pdf_parser import PDFParser from ietf.submit.parsers.plain_parser import PlainParser from ietf.submit.parsers.ps_parser import PSParser @@ -154,14 +154,14 @@ class UploadForm(forms.Form): same_name = IdSubmissionDetail.objects.filter(filename=filename, revision=revision, submission_date=today) if same_name.count() > settings.MAX_SAME_DRAFT_NAME: raise forms.ValidationError('The same I-D cannot be submitted more than %s times a day' % settings.MAX_SAME_DRAFT_NAME) - if sum([i.filesize for i in same_name]) > (settings.MAX_SAME_DRAFT_NAME_SIZE * 1048576): + if sum(i.filesize for i in same_name) > settings.MAX_SAME_DRAFT_NAME_SIZE * 1048576: raise forms.ValidationError('The same I-D submission cannot exceed more than %s MByte a day' % settings.MAX_SAME_DRAFT_NAME_SIZE) # Total from same ip same_ip = IdSubmissionDetail.objects.filter(remote_ip=remote_ip, submission_date=today) if same_ip.count() > settings.MAX_SAME_SUBMITTER: raise forms.ValidationError('The same submitter cannot submit more than %s I-Ds a day' % settings.MAX_SAME_SUBMITTER) - if sum([i.filesize for i in same_ip]) > (settings.MAX_SAME_SUBMITTER_SIZE * 1048576): + if sum(i.filesize for i in same_ip) > settings.MAX_SAME_SUBMITTER_SIZE * 1048576: raise forms.ValidationError('The same submitter cannot exceed more than %s MByte a day' % settings.MAX_SAME_SUBMITTER_SIZE) # Total in same group @@ -169,7 +169,7 @@ class UploadForm(forms.Form): same_group = IdSubmissionDetail.objects.filter(group_acronym=self.group, submission_date=today) if same_group.count() > settings.MAX_SAME_WG_DRAFT: raise forms.ValidationError('The same working group I-Ds cannot be submitted more than %s times a day' % settings.MAX_SAME_WG_DRAFT) - if sum([i.filesize for i in same_group]) > (settings.MAX_SAME_WG_DRAFT_SIZE * 1048576): + if sum(i.filesize for i in same_group) > settings.MAX_SAME_WG_DRAFT_SIZE * 1048576: raise forms.ValidationError('Total size of same working group I-Ds cannot exceed %s MByte a day' % settings.MAX_SAME_WG_DRAFT_SIZE) @@ -177,7 +177,7 @@ class UploadForm(forms.Form): total_today = IdSubmissionDetail.objects.filter(submission_date=today) if total_today.count() > settings.MAX_DAILY_SUBMISSION: raise forms.ValidationError('The total number of today\'s submission has reached the maximum number of submission per day') - if sum([i.filesize for i in total_today]) > (settings.MAX_DAILY_SUBMISSION_SIZE * 1048576): + if sum(i.filesize for i in total_today) > settings.MAX_DAILY_SUBMISSION_SIZE * 1048576: raise forms.ValidationError('The total size of today\'s submission has reached the maximum size of submission per day') def check_paths(self): @@ -234,10 +234,10 @@ class UploadForm(forms.Form): def get_working_group(self): name = self.draft.filename - existing_draft = InternetDraft.objects.filter(filename=name) + existing_draft = Document.objects.filter(name=name, type="draft") if existing_draft: - group = existing_draft[0].group and existing_draft[0].group.ietfwg or None - if group and group.pk != NONE_WG and group.type_id != "area": + group = existing_draft[0].group + if group and group.type_id not in ("individ", "area"): return group else: return None @@ -255,25 +255,18 @@ class UploadForm(forms.Form): # first check groups with dashes for g in Group.objects.filter(acronym__contains="-", type=group_type): if name.startswith('draft-%s-%s-' % (components[1], g.acronym)): - return IETFWG().from_object(g) + return g try: - return IETFWG().from_object(Group.objects.get(acronym=components[2], type=group_type)) + return Group.objects.get(acronym=components[2], type=group_type) except Group.DoesNotExist: raise forms.ValidationError('There is no active group with acronym \'%s\', please rename your draft' % components[2]) elif name.startswith("draft-iab-"): - return IETFWG().from_object(Group.objects.get(acronym="iab")) + return Group.objects.get(acronym="iab") else: return None def save_draft_info(self, draft): - document_id = 0 - existing_draft = InternetDraft.objects.filter(filename=draft.filename) - if existing_draft: - if settings.USE_DB_REDESIGN_PROXY_CLASSES: - document_id = -1 - else: - document_id = existing_draft[0].id_document_tag detail = IdSubmissionDetail.objects.create( id_document_name=draft.get_title(), filename=draft.filename, @@ -283,7 +276,7 @@ class UploadForm(forms.Form): creation_date=draft.get_creation_date(), submission_date=datetime.date.today(), idnits_message=self.idnits_message, - temp_id_document_tag=document_id, + temp_id_document_tag=-1, group_acronym=self.group, remote_ip=self.remote_ip, first_two_pages=''.join(draft.pages[:2]), @@ -291,38 +284,21 @@ class UploadForm(forms.Form): abstract=draft.get_abstract(), file_type=','.join(self.file_type), ) - order = 0 - for author in draft.get_author_list(): + for order, author in enumerate(draft.get_author_list(), start=1): full_name, first_name, middle_initial, last_name, name_suffix, email, company = author - order += 1 - if settings.USE_DB_REDESIGN_PROXY_CLASSES: - # save full name - TempIdAuthors.objects.create( - id_document_tag=document_id, - first_name=full_name.strip(), - email_address=(email or "").strip(), - author_order=order, - submission=detail) - else: - TempIdAuthors.objects.create( - id_document_tag=document_id, - first_name=first_name, - middle_initial=middle_initial, - last_name=last_name, - name_suffix=name_suffix, - email_address=email, - author_order=order, - submission=detail) + # save full name + TempIdAuthors.objects.create( + id_document_tag=-1, + first_name=full_name.strip(), + email_address=(email or "").strip(), + author_order=order, + submission=detail) return detail class AutoPostForm(forms.Form): - if settings.USE_DB_REDESIGN_PROXY_CLASSES: - name = forms.CharField(required=True) - else: - first_name = forms.CharField(label=u'Given name', required=True) - last_name = forms.CharField(label=u'Last name', required=True) + name = forms.CharField(required=True) email = forms.EmailField(label=u'Email address', required=True) def __init__(self, *args, **kwargs): @@ -332,26 +308,12 @@ class AutoPostForm(forms.Form): super(AutoPostForm, self).__init__(*args, **kwargs) def get_author_buttons(self): - if settings.USE_DB_REDESIGN_PROXY_CLASSES: - buttons = [] - for i in self.validation.authors: - buttons.append('' - % dict(name=i.get_full_name(), - email=i.email()[1] or '')) - return "".join(buttons) - - - # this should be moved to a Javascript file and attributes like data-first-name ... - button_template = '' - buttons = [] for i in self.validation.authors: - full_name = u'%s. %s' % (i.first_name[0], i.last_name) - buttons.append(button_template % {'first_name': i.first_name, - 'last_name': i.last_name, - 'email': i.email()[1] or '', - 'full_name': full_name}) - return ''.join(buttons) + buttons.append('' + % dict(name=i.get_full_name(), + email=i.email()[1] or '')) + return "".join(buttons) def save(self, request): self.save_submitter_info() @@ -361,7 +323,7 @@ class AutoPostForm(forms.Form): def send_confirmation_mail(self, request): subject = 'Confirmation for Auto-Post of I-D %s' % self.draft.filename from_email = settings.IDSUBMIT_FROM_EMAIL - to_email = self.draft.confirmation_email_list() + to_email = submission_confirmation_email_list(self.draft) confirm_url = settings.IDTRACKER_BASE_URL + urlreverse('draft_confirm', kwargs=dict(submission_id=self.draft.submission_id, auth_key=self.draft.auth_key)) status_url = settings.IDTRACKER_BASE_URL + urlreverse('draft_status_by_hash', kwargs=dict(submission_id=self.draft.submission_id, submission_hash=self.draft.get_hash())) @@ -370,21 +332,13 @@ class AutoPostForm(forms.Form): { 'draft': self.draft, 'confirm_url': confirm_url, 'status_url': status_url }) def save_submitter_info(self): - if settings.USE_DB_REDESIGN_PROXY_CLASSES: - return TempIdAuthors.objects.create( - id_document_tag=self.draft.temp_id_document_tag, - first_name=self.cleaned_data['name'], - email_address=self.cleaned_data['email'], - author_order=0, - submission=self.draft) - return TempIdAuthors.objects.create( id_document_tag=self.draft.temp_id_document_tag, - first_name=self.cleaned_data['first_name'], - last_name=self.cleaned_data['last_name'], + first_name=self.cleaned_data['name'], email_address=self.cleaned_data['email'], author_order=0, - submission=self.draft) + submission=self.draft, + ) def save_new_draft_info(self): salt = hashlib.sha1(str(random.random())).hexdigest()[:5] @@ -400,18 +354,11 @@ class MetaDataForm(AutoPostForm): creation_date = forms.DateField(label=u'Creation date', required=True) pages = forms.IntegerField(label=u'Pages', required=True) abstract = forms.CharField(label=u'Abstract', widget=forms.Textarea, required=True) - if settings.USE_DB_REDESIGN_PROXY_CLASSES: - name = forms.CharField(required=True) - else: - first_name = forms.CharField(label=u'Given name', required=True) - last_name = forms.CharField(label=u'Last name', required=True) + name = forms.CharField(required=True) email = forms.EmailField(label=u'Email address', required=True) comments = forms.CharField(label=u'Comments to the secretariat', widget=forms.Textarea, required=False) - if settings.USE_DB_REDESIGN_PROXY_CLASSES: - fields = ['title', 'version', 'creation_date', 'pages', 'abstract', 'name', 'email', 'comments'] - else: - fields = ['title', 'version', 'creation_date', 'pages', 'abstract', 'first_name', 'last_name', 'email', 'comments'] + fields = ['title', 'version', 'creation_date', 'pages', 'abstract', 'name', 'email', 'comments'] def __init__(self, *args, **kwargs): super(MetaDataForm, self).__init__(*args, **kwargs) @@ -422,43 +369,21 @@ class MetaDataForm(AutoPostForm): authors=[] if self.is_bound: for key, value in self.data.items(): - if settings.USE_DB_REDESIGN_PROXY_CLASSES: - if key.startswith('name_'): - author = {'errors': {}} - index = key.replace('name_', '') - name = value.strip() - if not name: - author['errors']['name'] = 'This field is required' - email = self.data.get('email_%s' % index, '').strip() - if email and not email_re.search(email): - author['errors']['email'] = 'Enter a valid e-mail address' - if name or email: - author.update({'get_full_name': name, - 'email': (name, email), - 'index': index, - }) - authors.append(author) - - else: - if key.startswith('first_name_'): - author = {'errors': {}} - index = key.replace('first_name_', '') - first_name = value.strip() - if not first_name: - author['errors']['first_name'] = 'This field is required' - last_name = self.data.get('last_name_%s' % index, '').strip() - if not last_name: - author['errors']['last_name'] = 'This field is required' - email = self.data.get('email_%s' % index, '').strip() - if email and not email_re.search(email): - author['errors']['email'] = 'Enter a valid e-mail address' - if first_name or last_name or email: - author.update({'first_name': first_name, - 'last_name': last_name, - 'email': ('%s %s' % (first_name, last_name), email), - 'index': index, - }) - authors.append(author) + if key.startswith('name_'): + author = {'errors': {}} + index = key.replace('name_', '') + name = value.strip() + if not name: + author['errors']['name'] = 'This field is required' + email = self.data.get('email_%s' % index, '').strip() + if email and not email_re.search(email): + author['errors']['email'] = 'Enter a valid e-mail address' + if name or email: + author.update({'get_full_name': name, + 'email': (name, email), + 'index': index, + }) + authors.append(author) authors.sort(key=lambda x: x['index']) return authors @@ -491,7 +416,7 @@ class MetaDataForm(AutoPostForm): raise forms.ValidationError('Version field is not in NN format') if version_int > 99 or version_int < 0: raise forms.ValidationError('Version must be set between 00 and 99') - existing_revisions = [int(i.revision_display()) for i in InternetDraft.objects.filter(filename=self.draft.filename)] + existing_revisions = [int(i.rev) for i in Document.objects.filter(name=self.draft.filename)] expected = 0 if existing_revisions: expected = max(existing_revisions) + 1 @@ -536,14 +461,12 @@ class MetaDataForm(AutoPostForm): self.save_submitter_info() # submitter is author 0 for i, author in enumerate(self.authors): - if settings.USE_DB_REDESIGN_PROXY_CLASSES: - # save full name - TempIdAuthors.objects.create( - id_document_tag=draft.temp_id_document_tag, - first_name=author["get_full_name"], - email_address=author["email"][1], - author_order=i + 1, - submission=draft) + TempIdAuthors.objects.create( + id_document_tag=draft.temp_id_document_tag, + first_name=author["get_full_name"], # save full name + email_address=author["email"][1], + author_order=i + 1, + submission=draft) def save(self, request): self.save_new_draft_info() @@ -556,7 +479,7 @@ class MetaDataForm(AutoPostForm): cc = [self.cleaned_data['email']] cc += [i['email'][1] for i in self.authors] if self.draft.group_acronym: - cc += [i.person.email()[1] for i in self.draft.group_acronym.wgchair_set.all()] + cc += [r.email.address for r in Role.objects.filter(group=self.draft.group_acronym, name="chair").select_related("email")] cc = list(set(cc)) submitter = self.draft.tempidauthors_set.get(author_order=0) send_mail(request, to_email, from_email, subject, 'submit/manual_post_mail.txt', { @@ -588,7 +511,7 @@ class PreapprovalForm(forms.Form): raise forms.ValidationError("Name ends with a dash.") acronym = components[2] if acronym not in self.groups.values_list('acronym', flat=True): - raise forms.ValidationError("WG acronym not recognized as one you can approve drafts for.") + raise forms.ValidationError("Group acronym not recognized as one you can approve drafts for.") if Preapproval.objects.filter(name=n): raise forms.ValidationError("Pre-approval for this name already exists.") diff --git a/ietf/submit/models.py b/ietf/submit/models.py index e73a91611..feb76fa17 100644 --- a/ietf/submit/models.py +++ b/ietf/submit/models.py @@ -1,11 +1,10 @@ -import re, datetime # +import re, datetime, hashlib from django.conf import settings from django.db import models -from django.utils.hashcompat import md5_constructor -from ietf.idtracker.models import InternetDraft, IETFWG from ietf.person.models import Person +from ietf.group.models import Group class IdSubmissionStatus(models.Model): @@ -22,7 +21,7 @@ class IdSubmissionDetail(models.Model): last_updated_date = models.DateField(null=True, blank=True) last_updated_time = models.CharField(null=True, blank=True, max_length=25) id_document_name = models.CharField(null=True, blank=True, max_length=255) - group_acronym = models.ForeignKey(IETFWG, null=True, blank=True) + group_acronym = models.ForeignKey(Group, null=True, blank=True) filename = models.CharField(null=True, blank=True, max_length=255, db_index=True) creation_date = models.DateField(null=True, blank=True) submission_date = models.DateField(null=True, blank=True) @@ -51,7 +50,7 @@ class IdSubmissionDetail(models.Model): return u"%s-%s" % (self.filename, self.revision) def create_hash(self): - self.submission_hash = md5_constructor(settings.SECRET_KEY + self.filename).hexdigest() + self.submission_hash = hashlib.md5(settings.SECRET_KEY + self.filename).hexdigest() def get_hash(self): if not self.submission_hash: @@ -68,14 +67,6 @@ class IdSubmissionDetail(models.Model): return '%s' % (self.submission_id, self.submission_hash, self.status) status_link.allow_tags = True - def confirmation_email_list(self): - try: - draft = InternetDraft.objects.get(filename=self.filename) - email_list = list(set(u'%s <%s>' % (i.person.ascii, i.email()) for i in draft.authors)) - except InternetDraft.DoesNotExist: - email_list = list(set(u'%s <%s>' % i.email() for i in self.tempidauthors_set.all())) - return email_list - def create_submission_hash(sender, instance, **kwargs): instance.create_hash() @@ -102,10 +93,6 @@ class TempIdAuthors(models.Model): middle_initial = models.CharField(blank=True, max_length=255, null=True) name_suffix = models.CharField(blank=True, max_length=255, null=True) - class Meta: - if not settings.USE_DB_REDESIGN_PROXY_CLASSES: - db_table = 'temp_id_authors' - def email(self): return (self.get_full_name(), self.email_address) diff --git a/ietf/submit/parsers/plain_parser.py b/ietf/submit/parsers/plain_parser.py index 40e92c054..cb9c52490 100644 --- a/ietf/submit/parsers/plain_parser.py +++ b/ietf/submit/parsers/plain_parser.py @@ -2,12 +2,9 @@ import datetime import re from django.conf import settings -from ietf.idtracker.models import InternetDraft, IETFWG from django.template.defaultfilters import filesizeformat from ietf.submit.parsers.base import FileParser -NONE_WG_PK = 1027 - class PlainParser(FileParser): diff --git a/ietf/submit/utils.py b/ietf/submit/utils.py index 9b6f9d684..3913c0091 100644 --- a/ietf/submit/utils.py +++ b/ietf/submit/utils.py @@ -7,14 +7,12 @@ from django.contrib.sites.models import Site from django.core.urlresolvers import reverse as urlreverse from django.template.loader import render_to_string -from ietf.idtracker.models import (InternetDraft, PersonOrOrgInfo, IETFWG, - IDAuthor, EmailAddress, IESGLogin, BallotInfo) -from ietf.submit.models import TempIdAuthors, IdSubmissionDetail, Preapproval from ietf.utils.mail import send_mail, send_mail_message from ietf.utils.log import log from ietf.utils import unaccent -from ietf.ietfauth.decorators import has_role +from ietf.ietfauth.utils import has_role +from ietf.submit.models import TempIdAuthors, IdSubmissionDetail, Preapproval from ietf.doc.models import * from ietf.person.models import Person, Alias, Email from ietf.doc.utils import add_state_change_event @@ -30,14 +28,11 @@ CANCELLED = -4 INITIAL_VERSION_APPROVAL_REQUESTED = 10 -# Not a real WG -NONE_WG = 1027 - def request_full_url(request, submission): subject = 'Full URL for managing submission of draft %s' % submission.filename from_email = settings.IDSUBMIT_FROM_EMAIL - to_email = submission.confirmation_email_list() + to_email = submission_confirmation_email_list(submission) url = settings.IDTRACKER_BASE_URL + urlreverse('draft_status_by_hash', kwargs=dict(submission_id=submission.submission_id, submission_hash=submission.get_hash())) @@ -49,7 +44,6 @@ def request_full_url(request, submission): def perform_post(request, submission): system = Person.objects.get(name="(System)") - group_id = submission.group_acronym_id or NONE_WG try: draft = Document.objects.get(name=submission.filename) save_document_in_history(draft) @@ -62,10 +56,11 @@ def perform_post(request, submission): draft.type_id = "draft" draft.time = datetime.datetime.now() draft.title = submission.id_document_name - if not (group_id == NONE_WG and draft.group and draft.group.type_id == "area"): + group = submission.group_acronym or Group.objects.get(type="individ") + if not (group.type_id == "individ" and draft.group and draft.group.type_id == "area"): # don't overwrite an assigned area if it's still an individual # submission - draft.group_id = group_id + draft.group_id = group.pk draft.rev = submission.revision draft.pages = submission.txt_page_count draft.abstract = submission.abstract @@ -142,12 +137,13 @@ def perform_post(request, submission): submission.save() -def send_announcements(submission, draft, state_change_msg): - announce_to_lists(request, submission) - if draft.idinternal and not draft.idinternal.rfc_flag: - announce_new_version(request, submission, draft, state_change_msg) - announce_to_authors(request, submission) - +def submission_confirmation_email_list(submission): + try: + doc = Document.objects.get(name=submission.filename) + email_list = [i.author.formatted_email() for i in doc.documentauthor_set.all()] + except Document.DoesNotExist: + email_list = [u'%s <%s>' % i.email() for i in submission.tempidauthors_set.all()] + return email_list def announce_to_lists(request, submission): authors = [] @@ -156,61 +152,28 @@ def announce_to_lists(request, submission): continue authors.append(i.get_full_name()) - if settings.USE_DB_REDESIGN_PROXY_CLASSES: - m = Message() - m.by = Person.objects.get(name="(System)") - if request.user.is_authenticated(): - try: - m.by = request.user.get_profile() - except Person.DoesNotExist: - pass - m.subject = 'I-D Action: %s-%s.txt' % (submission.filename, submission.revision) - m.frm = settings.IDSUBMIT_ANNOUNCE_FROM_EMAIL - m.to = settings.IDSUBMIT_ANNOUNCE_LIST_EMAIL - if submission.group_acronym: - m.cc = submission.group_acronym.email_address - m.body = render_to_string('submit/announce_to_lists.txt', dict(submission=submission, - authors=authors, - settings=settings,)) - m.save() - m.related_docs.add(Document.objects.get(name=submission.filename)) + m = Message() + m.by = Person.objects.get(name="(System)") + if request.user.is_authenticated(): + try: + m.by = request.user.get_profile() + except Person.DoesNotExist: + pass + m.subject = 'I-D Action: %s-%s.txt' % (submission.filename, submission.revision) + m.frm = settings.IDSUBMIT_ANNOUNCE_FROM_EMAIL + m.to = settings.IDSUBMIT_ANNOUNCE_LIST_EMAIL + if submission.group_acronym and submission.group_acronym.list_email: + m.cc = submission.group_acronym.list_email + m.body = render_to_string('submit/announce_to_lists.txt', dict(submission=submission, + authors=authors, + settings=settings,)) + m.save() + m.related_docs.add(Document.objects.get(name=submission.filename)) - send_mail_message(request, m) - else: - subject = 'I-D Action: %s-%s.txt' % (submission.filename, submission.revision) - from_email = settings.IDSUBMIT_ANNOUNCE_FROM_EMAIL - to_email = [settings.IDSUBMIT_ANNOUNCE_LIST_EMAIL] - if submission.group_acronym: - cc = [submission.group_acronym.email_address] - else: - cc = None - - send_mail(request, to_email, from_email, subject, 'submit/announce_to_lists.txt', - {'submission': submission, - 'authors': authors}, cc=cc, save_message=True) + send_mail_message(request, m) def announce_new_version(request, submission, draft, state_change_msg): - to_email = [] - if draft.idinternal.state_change_notice_to: - to_email.append(draft.idinternal.state_change_notice_to) - if draft.idinternal.job_owner: - to_email.append(draft.idinternal.job_owner.person.email()[1]) - try: - if draft.idinternal.ballot: - for p in draft.idinternal.ballot.positions.all(): - if p.discuss == 1 and p.ad.user_level == IESGLogin.AD_LEVEL: - to_email.append(p.ad.person.email()[1]) - except BallotInfo.DoesNotExist: - pass - subject = 'New Version Notification - %s-%s.txt' % (submission.filename, submission.revision) - from_email = settings.IDSUBMIT_ANNOUNCE_FROM_EMAIL - send_mail(request, to_email, from_email, subject, 'submit/announce_new_version.txt', - {'submission': submission, - 'msg': state_change_msg}) - - -def announce_new_versionREDESIGN(request, submission, draft, state_change_msg): to_email = [] if draft.notify: to_email.append(draft.notify) @@ -241,16 +204,13 @@ def announce_new_versionREDESIGN(request, submission, draft, state_change_msg): {'submission': submission, 'msg': state_change_msg}) -if settings.USE_DB_REDESIGN_PROXY_CLASSES: - announce_new_version = announce_new_versionREDESIGN - def announce_to_authors(request, submission): authors = submission.tempidauthors_set.all() - to_email = list(set(submission.confirmation_email_list() + [u'%s <%s>' % i.email() for i in authors])) + to_email = list(set(submission_confirmation_email_list(submission) + [u'%s <%s>' % i.email() for i in authors])) from_email = settings.IDSUBMIT_ANNOUNCE_FROM_EMAIL subject = 'New Version Notification for %s-%s.txt' % (submission.filename, submission.revision) if submission.group_acronym: - wg = submission.group_acronym.group_acronym.acronym + wg = submission.group_acronym.acronym elif submission.filename.startswith('draft-iesg'): wg = 'IESG' else: @@ -261,64 +221,6 @@ def announce_to_authors(request, submission): 'wg': wg}) -def find_person(first_name, last_name, middle_initial, name_suffix, email): - person_list = None - if email: - person_list = PersonOrOrgInfo.objects.filter(emailaddress__address=email).distinct() - if person_list and len(person_list) == 1: - return person_list[0] - if not person_list: - person_list = PersonOrOrgInfo.objects.all() - person_list = person_list.filter(first_name=first_name, - last_name=last_name) - if middle_initial: - person_list = person_list.filter(middle_initial=middle_initial) - if name_suffix: - person_list = person_list.filter(name_suffix=name_suffix) - if person_list: - return person_list[0] - return None - - -def update_authors(draft, submission): - # TempAuthor of order 0 is submitter - new_authors = list(submission.tempidauthors_set.filter(author_order__gt=0)) - person_pks = [] - for author in new_authors: - person = find_person(author.first_name, author.last_name, - author.middle_initial, author.name_suffix, - author.email_address) - if not person: - person = PersonOrOrgInfo( - first_name=author.first_name, - last_name=author.last_name, - middle_initial=author.middle_initial or '', - name_suffix=author.name_suffix or '', - ) - person.save() - if author.email_address: - EmailAddress.objects.create( - address=author.email_address, - priority=1, - type='INET', - person_or_org=person, - ) - person_pks.append(person.pk) - try: - idauthor = IDAuthor.objects.get( - document=draft, - person=person, - ) - idauthor.author_order = author.author_order - except IDAuthor.DoesNotExist: - idauthor = IDAuthor( - document=draft, - person=person, - author_order=author.author_order, - ) - idauthor.save() - draft.authors.exclude(person__pk__in=person_pks).delete() - def get_person_from_author(author): persons = None @@ -376,7 +278,7 @@ def ensure_person_email_info_exists(author): return email -def update_authorsREDESIGN(draft, submission): +def update_authors(draft, submission): # order 0 is submitter authors = [] for author in submission.tempidauthors_set.exclude(author_order=0).order_by('author_order'): @@ -395,26 +297,6 @@ def update_authorsREDESIGN(draft, submission): draft.documentauthor_set.exclude(author__in=authors).delete() - -if settings.USE_DB_REDESIGN_PROXY_CLASSES: - update_authors = update_authorsREDESIGN - - -def get_person_for_user(user): - try: - return user.get_profile().person() - except: - return None - - -def is_secretariat(user): - if not user or not user.is_authenticated(): - return False - return bool(user.groups.filter(name='Secretariat')) - -if settings.USE_DB_REDESIGN_PROXY_CLASSES: - from ietf.liaisons.accounts import is_secretariat, get_person_for_user - def move_docs(submission): for ext in submission.file_type.split(','): source = os.path.join(settings.IDSUBMIT_STAGING_PATH, '%s-%s%s' % (submission.filename, submission.revision, ext)) @@ -485,7 +367,7 @@ class DraftValidation(object): return passes_idnits def get_working_group(self): - if self.draft.group_acronym and self.draft.group_acronym.pk == NONE_WG: + if self.draft.group_acronym and self.draft.group_acronym.type_id == "individ": return None return self.draft.group_acronym @@ -529,7 +411,7 @@ class DraftValidation(object): self.add_warning('title', 'Title is empty or was not found') def validate_wg(self): - if self.wg and not self.wg.status_id == IETFWG.ACTIVE: + if self.wg and self.wg.state_id != "active": self.add_warning('group', 'Group exists but is not an active group') def validate_abstract(self): @@ -543,7 +425,7 @@ class DraftValidation(object): if self.draft.status_id in [POSTED, POSTED_BY_SECRETARIAT]: return revision = self.draft.revision - existing_revisions = [int(i.revision_display()) for i in InternetDraft.objects.filter(filename=self.draft.filename)] + existing_revisions = [int(i.rev) for i in Document.objects.filter(name=self.draft.filename)] expected = 0 if existing_revisions: expected = max(existing_revisions) + 1 @@ -575,9 +457,9 @@ class DraftValidation(object): submitter = self.draft.tempidauthors_set.filter(author_order=0) if submitter: return submitter[0] - elif self.draft.submitter_tag: - try: - return PersonOrOrgInfo.objects.get(pk=self.draft.submitter_tag) - except PersonOrOrgInfo.DoesNotExist: - return False + # elif self.draft.submitter_tag: + # try: + # return PersonOrOrgInfo.objects.get(pk=self.draft.submitter_tag) + # except PersonOrOrgInfo.DoesNotExist: + # return False return None diff --git a/ietf/submit/views.py b/ietf/submit/views.py index a5e0a440d..023df6c55 100644 --- a/ietf/submit/views.py +++ b/ietf/submit/views.py @@ -9,13 +9,13 @@ from django.shortcuts import get_object_or_404 from django.shortcuts import render_to_response from django.template import RequestContext -from ietf.group.models import Group +from ietf.group.models import Group, Role from ietf.utils.mail import send_mail -from ietf.ietfauth.decorators import has_role, role_required +from ietf.ietfauth.utils import has_role, role_required from ietf.submit.models import IdSubmissionDetail, Preapproval from ietf.submit.forms import UploadForm, AutoPostForm, MetaDataForm, PreapprovalForm from ietf.submit.utils import UPLOADED, AWAITING_AUTHENTICATION, MANUAL_POST_REQUESTED, CANCELLED, POSTED, INITIAL_VERSION_APPROVAL_REQUESTED -from ietf.submit.utils import is_secretariat, get_approvable_submissions, get_preapprovals, get_recently_approved, get_person_for_user, perform_post, remove_docs, request_full_url +from ietf.submit.utils import get_approvable_submissions, get_preapprovals, get_recently_approved, perform_post, remove_docs, request_full_url from ietf.submit.utils import DraftValidation def submit_index(request): @@ -57,10 +57,9 @@ def submit_status(request): def _can_approve(user, detail): - person = get_person_for_user(user) if detail.status_id != INITIAL_VERSION_APPROVAL_REQUESTED or not detail.group_acronym: return None - if person in [i.person for i in detail.group_acronym.wgchair_set.all()] or is_secretariat(user): + if detail.group_acronym.has_role(user, "chair") or has_role(user, "Secretariat"): return True return False @@ -69,14 +68,14 @@ def _can_force_post(user, detail): if detail.status_id not in [MANUAL_POST_REQUESTED, AWAITING_AUTHENTICATION, INITIAL_VERSION_APPROVAL_REQUESTED]: return None - if is_secretariat(user): + if has_role(user, "Secretariat"): return True return False def _can_cancel(user, detail, submission_hash): if detail.status_id in [CANCELLED, POSTED]: return None - if is_secretariat(user): + if has_role(user, "Secretariat"): return True if submission_hash and detail.get_hash() == submission_hash: return True @@ -85,7 +84,7 @@ def _can_cancel(user, detail, submission_hash): def _can_edit(user, detail, submission_hash): if detail.status_id != UPLOADED: return None - if is_secretariat(user): + if has_role(user, "Secretariat"): return True if submission_hash and detail.get_hash() == submission_hash: return True @@ -128,7 +127,7 @@ def draft_status(request, submission_id, submission_hash=None, message=None): submitter = auto_post_form.save_submitter_info() subject = 'New draft waiting for approval: %s' % detail.filename from_email = settings.IDSUBMIT_FROM_EMAIL - to_email = list(set(i.person.email()[1] for i in detail.group_acronym.wgchair_set.all())) + to_email = [r.formatted_email() for r in Role.objects.filter(group=detail.group_acronym, name="chair").select_related("email", "person")] if to_email: authors = detail.tempidauthors_set.exclude(author_order=0).order_by('author_order') send_mail(request, to_email, from_email, subject, 'submit/submission_approval.txt', @@ -158,7 +157,7 @@ def draft_status(request, submission_id, submission_hash=None, message=None): show_notify_button = False if allow_edit == False or can_cancel == False: show_notify_button = True - if submission_hash is None and is_secretariat(request.user): + if submission_hash is None and has_role(request.user, "Secretariat"): submission_hash = detail.get_hash() # we'll need this when rendering the cancel button in the form return render_to_response('submit/draft_status.html', {'selected': 'status', @@ -285,7 +284,7 @@ def add_preapproval(request): groups = Group.objects.filter(type="wg").exclude(state="conclude").order_by("acronym").distinct() if not has_role(request.user, "Secretariat"): - groups = groups.filter(role__person=request.user.get_profile()) + groups = groups.filter(role__person__user=request.user) if request.method == "POST": form = PreapprovalForm(request.POST) @@ -310,7 +309,7 @@ def add_preapproval(request): def cancel_preapproval(request, preapproval_id): preapproval = get_object_or_404(Preapproval, pk=preapproval_id) - if not preapproval in get_preapprovals(request.user): + if preapproval not in get_preapprovals(request.user): raise HttpResponseForbidden("You do not have permission to cancel this preapproval.") if request.method == "POST" and request.POST.get("action", "") == "cancel": diff --git a/ietf/templates/submit/announce_to_lists.txt b/ietf/templates/submit/announce_to_lists.txt index 76146152d..0c195c5cd 100644 --- a/ietf/templates/submit/announce_to_lists.txt +++ b/ietf/templates/submit/announce_to_lists.txt @@ -1,6 +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 %} +{% if submission.group_acronym %} This draft is a work item of the {{ submission.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 %}