| OLD | NEW |
| 1 # Copyright 2008 Google Inc. | 1 # Copyright 2008 Google Inc. |
| 2 # | 2 # |
| 3 # Licensed under the Apache License, Version 2.0 (the "License"); | 3 # Licensed under the Apache License, Version 2.0 (the "License"); |
| 4 # you may not use this file except in compliance with the License. | 4 # you may not use this file except in compliance with the License. |
| 5 # You may obtain a copy of the License at | 5 # You may obtain a copy of the License at |
| 6 # | 6 # |
| 7 # http://www.apache.org/licenses/LICENSE-2.0 | 7 # http://www.apache.org/licenses/LICENSE-2.0 |
| 8 # | 8 # |
| 9 # Unless required by applicable law or agreed to in writing, software | 9 # Unless required by applicable law or agreed to in writing, software |
| 10 # distributed under the License is distributed on an "AS IS" BASIS, | 10 # distributed under the License is distributed on an "AS IS" BASIS, |
| (...skipping 168 matching lines...) Show 10 above Show 10 below |
| 179 max_length=1000, | 179 max_length=1000, |
| 180 widget=forms.TextInput(attrs={'size': 60})) | 180 widget=forms.TextInput(attrs={'size': 60})) |
| 181 send_mail = forms.BooleanField() | 181 send_mail = forms.BooleanField() |
| 182 message = forms.CharField(required=False, | 182 message = forms.CharField(required=False, |
| 183 max_length=10000, | 183 max_length=10000, |
| 184 widget=forms.Textarea(attrs={'cols': 60})) | 184 widget=forms.Textarea(attrs={'cols': 60})) |
| 185 | 185 |
| 186 | 186 |
| 187 class MiniPublishForm(forms.Form): | 187 class MiniPublishForm(forms.Form): |
| 188 | 188 |
| 189 reviewers = forms.CharField(required=False, |
| 190 max_length=1000, |
| 191 widget=forms.TextInput(attrs={'size': 60})) |
| 189 send_mail = forms.BooleanField() | 192 send_mail = forms.BooleanField() |
| 190 message = forms.CharField(required=False, | 193 message = forms.CharField(required=False, |
| 191 max_length=10000, | 194 max_length=10000, |
| 192 widget=forms.Textarea(attrs={'cols': 60})) | 195 widget=forms.Textarea(attrs={'cols': 60})) |
| 193 | 196 |
| 194 | 197 |
| 195 class SettingsForm(forms.Form): | 198 class SettingsForm(forms.Form): |
| 196 | 199 |
| 197 nickname = forms.CharField(max_length=30) | 200 nickname = forms.CharField(max_length=30) |
| 198 | 201 |
| (...skipping 366 matching lines...) Show 10 above Show 10 below |
| 565 return True | 568 return True |
| 566 | 569 |
| 567 | 570 |
| 568 def _get_reviewers(form): | 571 def _get_reviewers(form): |
| 569 """Helper to return the list of reviewers, or None for error.""" | 572 """Helper to return the list of reviewers, or None for error.""" |
| 570 reviewers = [] | 573 reviewers = [] |
| 571 raw_reviewers = form.cleaned_data.get('reviewers') | 574 raw_reviewers = form.cleaned_data.get('reviewers') |
| 572 if raw_reviewers: | 575 if raw_reviewers: |
| 573 for reviewer in raw_reviewers.split(','): | 576 for reviewer in raw_reviewers.split(','): |
| 574 reviewer = reviewer.strip() | 577 reviewer = reviewer.strip() |
| 575 if reviewer: | 578 if reviewer and reviewer not in reviewers: |
| 576 try: | 579 try: |
| 577 reviewer = db.Email(reviewer) | 580 reviewer = db.Email(reviewer) |
| 578 if reviewer.count('@') != 1: | 581 if reviewer.count('@') != 1: |
| 579 raise db.BadValueError('Invalid email address: %s' % reviewer) | 582 raise db.BadValueError('Invalid email address: %s' % reviewer) |
| 580 head, tail = reviewer.split('@') | 583 head, tail = reviewer.split('@') |
| 581 if '.' not in tail: | 584 if '.' not in tail: |
| 582 raise db.BadValueError('Invalid email address: %s' % reviewer) | 585 raise db.BadValueError('Invalid email address: %s' % reviewer) |
| 583 except db.BadValueError, err: | 586 except db.BadValueError, err: |
| 584 form.errors['reviewers'] = [unicode(err)] | 587 form.errors['reviewers'] = [unicode(err)] |
| 585 return None | 588 return None |
| (...skipping 349 matching lines...) Show 10 above Show 10 below |
| 935 @issue_required | 938 @issue_required |
| 936 @login_required | 939 @login_required |
| 937 def publish(request): | 940 def publish(request): |
| 938 """ /<issue>/publish - Publish draft comments and send mail.""" | 941 """ /<issue>/publish - Publish draft comments and send mail.""" |
| 939 issue = request.issue | 942 issue = request.issue |
| 940 if request.user == issue.owner: | 943 if request.user == issue.owner: |
| 941 form_class = PublishForm | 944 form_class = PublishForm |
| 942 else: | 945 else: |
| 943 form_class = MiniPublishForm | 946 form_class = MiniPublishForm |
| 944 if request.method != 'POST': | 947 if request.method != 'POST': |
| 948 reviewers = issue.reviewers[:] |
| 949 if request.user != issue.owner and (request.user.email() |
| 950 not in issue.reviewers): |
| 951 reviewers.append(request.user.email()) |
| 945 form = form_class(initial={'subject': issue.subject, | 952 form = form_class(initial={'subject': issue.subject, |
| 946 'reviewers': ', '.join(issue.reviewers), | 953 'reviewers': ', '.join(reviewers), |
| 947 'send_mail': True, | 954 'send_mail': True, |
| 948 }) | 955 }) |
| 949 return respond(request, 'publish.html', {'form': form, 'issue': issue}) | 956 return respond(request, 'publish.html', {'form': form, 'issue': issue}) |
| 950 | 957 |
| 951 form = form_class(request.POST) | 958 form = form_class(request.POST) |
| 952 if form.is_valid(): | 959 if form.is_valid(): |
| 953 reviewers = _get_reviewers(form) | 960 reviewers = _get_reviewers(form) |
| 954 if not form.is_valid(): | 961 if not form.is_valid(): |
| 955 return respond(request, 'publish.html', {'form': form, 'issue': issue}) | 962 return respond(request, 'publish.html', {'form': form, 'issue': issue}) |
| 956 tbd = [] # List of things to put() after all is said and done | 963 tbd = [] # List of things to put() after all is said and done |
| 957 if request.user == issue.owner: | 964 if request.user == issue.owner: |
| 958 subject = form.cleaned_data['subject'] | 965 subject = form.cleaned_data['subject'] |
| 959 issue.subject = subject | 966 issue.subject = subject |
| 960 issue.reviewers = reviewers | 967 issue.reviewers = reviewers |
| 961 else: | 968 else: |
| 962 subject = issue.subject | 969 subject = issue.subject |
| 970 issue.reviewers = reviewers |
| 963 tbd.append(issue) # To update the last modified time | 971 tbd.append(issue) # To update the last modified time |
| 964 message = form.cleaned_data['message'].replace('\r\n', '\n') | 972 message = form.cleaned_data['message'].replace('\r\n', '\n') |
| 965 send_mail = form.cleaned_data['send_mail'] | 973 send_mail = form.cleaned_data['send_mail'] |
| 966 comments = [] | 974 comments = [] |
| 967 | 975 |
| 968 # XXX Should request all drafts for this issue once, now we can. | 976 # XXX Should request all drafts for this issue once, now we can. |
| 969 for patchset in issue.patchset_set.order('created'): | 977 for patchset in issue.patchset_set.order('created'): |
| 970 ## ps_comments = list(models.Comment.gql( | 978 ## ps_comments = list(models.Comment.gql( |
| 971 ## 'WHERE ANCESTOR IS :1 AND author = :2 AND draft = TRUE', | 979 ## 'WHERE ANCESTOR IS :1 AND author = :2 AND draft = TRUE', |
| 972 ## patchset, request.user)) | 980 ## patchset, request.user)) |
| (...skipping 22 matching lines...) Show 10 above Show 10 below |
| 995 if comments: | 1003 if comments: |
| 996 logging.warn('Publishing %d comments', len(comments)) | 1004 logging.warn('Publishing %d comments', len(comments)) |
| 997 # Decide who should receive mail | 1005 # Decide who should receive mail |
| 998 my_email = db.Email(request.user.email()) | 1006 my_email = db.Email(request.user.email()) |
| 999 addressees = [db.Email(issue.owner.email())] + issue.reviewers | 1007 addressees = [db.Email(issue.owner.email())] + issue.reviewers |
| 1000 if my_email in addressees: | 1008 if my_email in addressees: |
| 1001 everyone = addressees[:] | 1009 everyone = addressees[:] |
| 1002 if len(addressees) > 1: # Keep it if sending only to yourself | 1010 if len(addressees) > 1: # Keep it if sending only to yourself |
| 1003 addressees.remove(my_email) | 1011 addressees.remove(my_email) |
| 1004 else: | 1012 else: |
| 1005 everyone = addressees + [my_email] | 1013 everyone = addressees |
| 1006 details = _get_draft_details(request, comments) | 1014 details = _get_draft_details(request, comments) |
| 1007 text = ((message.strip() + '\n\n' + details.strip())).strip() | 1015 text = ((message.strip() + '\n\n' + details.strip())).strip() |
| 1008 msg = models.Message(issue=issue, | 1016 msg = models.Message(issue=issue, |
| 1009 subject=issue.subject, | 1017 subject=issue.subject, |
| 1010 sender=my_email, | 1018 sender=my_email, |
| 1011 recipients=everyone, | 1019 recipients=everyone, |
| 1012 text=db.Text(text), | 1020 text=db.Text(text), |
| 1013 parent=issue) | 1021 parent=issue) |
| 1014 tbd.append(msg) | 1022 tbd.append(msg) |
| 1015 | 1023 |
| (...skipping 220 matching lines...) Show 10 above Show 10 below |
| 1236 else: | 1244 else: |
| 1237 accounts = models.Account.get_accounts_for_nickname(nickname) | 1245 accounts = models.Account.get_accounts_for_nickname(nickname) |
| 1238 if nickname != account.nickname and accounts: | 1246 if nickname != account.nickname and accounts: |
| 1239 form.errors['nickname'] = ['This nickname is already in use.'] | 1247 form.errors['nickname'] = ['This nickname is already in use.'] |
| 1240 else: | 1248 else: |
| 1241 account.nickname = nickname | 1249 account.nickname = nickname |
| 1242 account.put() | 1250 account.put() |
| 1243 if not form.is_valid(): | 1251 if not form.is_valid(): |
| 1244 return respond(request, 'settings.html', {'form': form}) | 1252 return respond(request, 'settings.html', {'form': form}) |
| 1245 return HttpResponseRedirect('/settings') | 1253 return HttpResponseRedirect('/settings') |
| OLD | NEW |