Ejemplo n.º 1
0
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 })
Ejemplo n.º 2
0
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 })
Ejemplo n.º 3
0
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
                })
Ejemplo n.º 4
0
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,
        })
Ejemplo n.º 5
0
def notify(issue, user, template_name, context):
    for watcher in issue.starring.all():
        if user == watcher: continue
        send_mail(user, watcher, template_name, context)
Ejemplo n.º 6
0
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,
	})
Ejemplo n.º 7
0
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)
Ejemplo n.º 8
0
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,
    })
Ejemplo n.º 9
0
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)
Ejemplo n.º 10
0
def notify(issue, user, template_name, context):
    for watcher in issue.starring.all():
        if user == watcher: continue
        send_mail(user, watcher, template_name, context)