def comment(issue, request): if not request.user.has_perm('issues.comment_issue'): return # Audit fail content = request.POST.get('content') urgent = False if not content: return elif content.startswith(settings.URGENT_MAGIC_TOKEN): content = content[len(settings.URGENT_MAGIC_TOKEN):] urgent = True update(issue=issue, user=request.user, content=content) notify(issue, request.user, 'mail/issue_general.html', {'issue': issue, 'comment': content}) issue.starring.add(request.user) # Follow after comment mentions, extra_receivers = filter_mentions(content) mentions -= set((request.user,)) for user in mentions: issue.starring.add(user) # Auto watch send_mail(request.user, user, 'mail/issue_mentioned.html', { 'issue': issue, 'comment': content }) for receiver in extra_receivers: send_mail(request.user, receiver, 'mail/issue_mentioned.html', { 'issue': issue, 'comment': content }) if urgent: if issue.assignee and issue.assignee not in mentions: mentions.append(issue.assignee) for mentionee in mentions: if mentionee.profile.phone: send_sms(request.user, mentionee, 'sms/issue_comment.txt', { 'issue': issue, 'comment': content })
def comment(issue, request): if not request.user.has_perm('issues.comment_issue'): return # Audit fail content = request.POST.get('content') if content: urgent = False if content.startswith(ISSUE_MAGIC_TOKEN): content = content[len(ISSUE_MAGIC_TOKEN):] urgent = True update(issue=issue, user=request.user, content=content) notify(issue, request.user, 'mail/issue_general.html', {'issue': issue, 'comment': content}) mentions = set(re.findall(u'(?<=@)[0-9A-Za-z\u3400-\u9fff\uf900-\ufaff_\\-]+', content)) for mention in mentions: try: mentionee = User.objects.get(Q(username__istartswith=mention) | Q(profile__display_name__iexact=mention)) except User.DoesNotExist: continue issue.starring.add(mentionee) # Auto watch send_mail(request.user, mentionee, 'mail/issue_mentioned.html', {'issue': issue, 'comment': content }) if urgent: send_sms(request.user, mentionee, 'sms/issue_comment.txt', { 'issue': issue, 'comment': content }) if urgent: if issue.assignee and issue.assignee.profile.phone: send_sms(request.user, issue.assignee, 'sms/issue_comment.txt', { 'issue': issue, 'comment': content })
def comment(issue, request): if not request.user.has_perm('issues.comment_issue'): return # Audit fail content = request.POST.get('content') urgent = False if not content: return elif content.startswith(settings.URGENT_MAGIC_TOKEN): content = content[len(settings.URGENT_MAGIC_TOKEN):] urgent = True update(issue=issue, user=request.user, content=content) notify(issue, request.user, 'mail/issue_general.html', { 'issue': issue, 'comment': content }) issue.starring.add(request.user) # Follow after comment mentions, extra_receivers = filter_mentions(content) mentions -= set((request.user, )) for user in mentions: issue.starring.add(user) # Auto watch send_mail(request.user, user, 'mail/issue_mentioned.html', { 'issue': issue, 'comment': content }) for receiver in extra_receivers: send_mail(request.user, receiver, 'mail/issue_mentioned.html', { 'issue': issue, 'comment': content }) if urgent: if issue.assignee and issue.assignee not in mentions: mentions.append(issue.assignee) for mentionee in mentions: if mentionee.profile.phone: send_sms(request.user, mentionee, 'sms/issue_comment.txt', { 'issue': issue, 'comment': content })
def create(request): errors = [] if 'submit' in request.POST: issue = Issue() issue.title = request.POST['title'] issue.content = request.POST['content'] issue.creator = request.user due_time = request.POST.get('due_time', '').strip() if len(due_time): try: due_time = parse_date(due_time) if due_time: issue.due_time = due_time else: errors.append('date-misformed') except ValueError: errors.append('date-invalid') assignee = request.POST.get('assignee') if assignee: # Empty value => not assigned, no need to set try: issue.assignee = User.objects.get(id=assignee) except User.DoesNotExist: assignee = None # Just in case we're under attack... labels = [] for label_id in request.POST.getlist('labels'): try: labels.append(Label.objects.get(id=label_id)) except Label.DoesNotExist: pass if not errors: issue.save( ) # Need to save before we can enforce N to N relationship issue.starring.add(request.user) # Auto watch # Add or remove labels has history so we don't worry on history creation issue.labels.add(*labels) mentions, _ = filter_mentions(issue.content) if assignee: mentions.add(issue.assignee) mentions.discard(request.user) for user in mentions: issue.starring.add(user) # Auto watch send_mail(request.user, user, 'mail/issue_created.html', {'issue': issue}) # Broadcast new issues automatically send_mail(request.user, settings.BROADCAST_EMAIL, 'mail/issue_created.html', {'issue': issue}) if assignee: IssueHistory.objects.create(issue=issue, user=request.user, mode=IssueHistory.ASSIGN, content=assignee) if due_time: IssueHistory.objects.create(issue=issue, user=request.user, mode=IssueHistory.SET_DUE, content=due_time) return redirect('issues:detail', issue.id) return render( request, 'issues/create.html', { 'labels': Label.objects.all(), 'users': sorted_users(User.objects.filter(is_active=True)), 'errors': errors, })
def notify(issue, user, template_name, context): for watcher in issue.starring.all(): if user == watcher: continue send_mail(user, watcher, template_name, context)
def create(request): errors = [] if 'submit' in request.POST: issue = Issue() issue.title = request.POST['title'] issue.content = request.POST['content'] issue.creator = request.user due_time = request.POST.get('due_time', '').strip() if len(due_time) > 0: try: if len(due_time) <= 10: due_time = dateparse.parse_date(due_time) due_time = datetime.datetime.combine(due_time, datetime.time()) if due_time else None else: due_time = dateparse.parse_datetime(due_time) except ValueError: errors.append('date-invalid') if due_time: issue.due_time = due_time else: errors.append('date-misformed') assignee = request.POST.get('assignee') if assignee: # Empty value => not assigned, no need to set try: assignee = request.POST.get('assignee') issue.assignee = User.objects.get(id=assignee) except User.DoesNotExist: assignee = None # Just in case we're under attack... if len(errors) < 1: issue.save() # Need to save before we can enforce N to N relationship issue.starring.add(request.user) # Auto watch mentions = set(re.findall(u'(?<=@)[0-9A-Za-z\u3400-\u9fff\uf900-\ufaff_\\-]+', issue.content)) for mention in mentions: try: mentionee = User.objects.get(Q(username__istartswith=mention) | Q(profile__display_name__iexact=mention)) except User.DoesNotExist: continue issue.starring.add(mentionee) # Auto watch send_mail(request.user, mentionee, 'mail/issue_mentioned.html', {'issue': issue, 'new_topic': True}) if assignee: IssueHistory.objects.create(issue=issue, user=request.user, mode=IssueHistory.ASSIGN, content=assignee) issue.starring.add(issue.assignee) # Auto watch send_mail(request.user, issue.assignee, 'mail/issue_assigned.html', {'issue': issue, 'new_topic': True}) if due_time: IssueHistory.objects.create(issue=issue, user=request.user, mode=IssueHistory.SET_DUE, content=due_time) # Add or remove labels has history so we don't worry on history creation for label_id in request.POST.getlist('labels'): try: issue.labels.add(Label.objects.get(id=label_id)) except Label.DoesNotExist: pass issue.save() # Now save the labels return redirect('issues:detail', issue.id) return render(request, 'issues/create.html', { 'labels': Label.objects.all(), 'users': sorted_users(User.objects.filter(is_active=True)), 'errors': errors, })
def notify(issue, user, content): message_subject = 'Re: [#%s] %s' % (issue.id, issue.title) for watcher in issue.starring.all(): if user == watcher: continue send_mail(user, watcher, message_subject, content)
def create(request): errors = [] if 'submit' in request.POST: issue = Issue() issue.title = request.POST['title'] issue.content = request.POST['content'] issue.creator = request.user due_time = request.POST.get('due_time', '').strip() if len(due_time): try: due_time = parse_date(due_time) if due_time: issue.due_time = due_time else: errors.append('date-misformed') except ValueError: errors.append('date-invalid') assignee = request.POST.get('assignee') if assignee: # Empty value => not assigned, no need to set try: issue.assignee = User.objects.get(id=assignee) except User.DoesNotExist: assignee = None # Just in case we're under attack... labels = [] for label_id in request.POST.getlist('labels'): try: labels.append(Label.objects.get(id=label_id)) except Label.DoesNotExist: pass if not errors: issue.save() # Need to save before we can enforce N to N relationship issue.starring.add(request.user) # Auto watch # Add or remove labels has history so we don't worry on history creation issue.labels.add(*labels) mentions, _ = filter_mentions(issue.content) if assignee: mentions.add(issue.assignee) mentions.discard(request.user) for user in mentions: issue.starring.add(user) # Auto watch send_mail(request.user, user, 'mail/issue_created.html', { 'issue': issue }) # Broadcast new issues automatically send_mail(request.user, settings.BROADCAST_EMAIL, 'mail/issue_created.html', { 'issue': issue }) if assignee: IssueHistory.objects.create(issue=issue, user=request.user, mode=IssueHistory.ASSIGN, content=assignee) if due_time: IssueHistory.objects.create(issue=issue, user=request.user, mode=IssueHistory.SET_DUE, content=due_time) return redirect('issues:detail', issue.id) return render(request, 'issues/create.html', { 'labels': Label.objects.all(), 'users': sorted_users(User.objects.filter(is_active=True)), 'errors': errors, })
def create(request): if not request.user.has_perm("issues.create_issue"): return (None, None) # Audit fail errors = [] issue = Issue() issue.title = request.POST["title"] issue.content = request.POST["content"] issue.creator = request.user due_time = request.POST.get("due_time", "").strip() if len(due_time) > 0: try: if len(due_time) <= 10: due_time = dateparse.parse_date(due_time) due_time = datetime.datetime.combine(due_time, datetime.time()) if due_time else None else: due_time = dateparse.parse_datetime(due_time) except ValueError: errors.append("date-invalid") if due_time: issue.due_time = due_time else: errors.append("date-misformed") assignee = request.POST.get("assignee") if assignee: # Empty value => not assigned, no need to set try: assignee = request.POST.get("assignee") issue.assignee = User.objects.get(id=assignee) except User.DoesNotExist: assignee = None # Just in case we're under attack... if len(errors) < 1: issue.save() # Need to save before we can enforce N to N relationship issue.starring.add(request.user) # Auto watch if assignee: IssueHistory.objects.create(issue=issue, user=request.user, mode=IssueHistory.ASSIGN, content=assignee) issue.starring.add(issue.assignee) # Auto watch send_mail( request.user, issue.assignee, "[#%s] %s" % (issue.id, issue.title), u"* %s 已將此議題指派給你 *\n\n%s" % (get_user_name(request.user), issue.content), ) if due_time: IssueHistory.objects.create(issue=issue, user=request.user, mode=IssueHistory.SET_DUE, content=due_time) # Add or remove labels has history so we don't worry on history creation for label_id in request.POST.getlist("labels"): try: issue.labels.add(Label.objects.get(id=label_id)) except Label.DoesNotExist: pass issue.save() # Now save the labels return (issue, []) return (None, errors)