~launchpad-pqm/launchpad/devel

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
# Copyright 2009 Canonical Ltd.  This software is licensed under the
# GNU Affero General Public License version 3 (see the file LICENSE).

""" Karma for the Answer Tracker. """

__metaclass__ = type
__all__ = [
    'assignKarmaUsingQuestionContext',
    ]

from canonical.database.sqlbase import block_implicit_flushes
from lp.answers.enums import QuestionAction
from lp.registry.interfaces.distribution import IDistribution
from lp.registry.interfaces.person import IPerson
from lp.registry.interfaces.product import IProduct


def assignKarmaUsingQuestionContext(person, question, actionname):
    """Assign Karma with the given actionname to the given person.

    Use the given question's context as the karma context.
    """
    person.assignKarma(
        actionname, product=question.product,
    distribution=question.distribution,
        sourcepackagename=question.sourcepackagename)


@block_implicit_flushes
def question_created(question, event):
    """Assign karma to the user which created <question>."""
    assignKarmaUsingQuestionContext(
        question.owner, question, 'questionasked')


@block_implicit_flushes
def question_modified(question, event):
    """Check changes made to <question> and assign karma to user if needed."""
    user = IPerson(event.user)
    old_question = event.object_before_modification

    if old_question.description != question.description:
        assignKarmaUsingQuestionContext(
            user, question, 'questiondescriptionchanged')

    if old_question.title != question.title:
        assignKarmaUsingQuestionContext(
            user, question, 'questiontitlechanged')


QuestionAction2KarmaAction = {
    QuestionAction.REQUESTINFO: 'questionrequestedinfo',
    QuestionAction.GIVEINFO: 'questiongaveinfo',
    QuestionAction.SETSTATUS: None,
    QuestionAction.COMMENT: 'questioncommentadded',
    QuestionAction.ANSWER: 'questiongaveanswer',
    QuestionAction.CONFIRM: None,
    QuestionAction.EXPIRE: None,
    QuestionAction.REJECT: 'questionrejected',
    QuestionAction.REOPEN: 'questionreopened',
}


@block_implicit_flushes
def question_comment_added(questionmessage, event):
    """Assign karma to the user which added <questionmessage>."""
    question = questionmessage.question
    karma_action = QuestionAction2KarmaAction.get(questionmessage.action)
    if karma_action:
        assignKarmaUsingQuestionContext(
            questionmessage.owner, question, karma_action)


def get_karma_context_parameters(context):
    """Return the proper karma context parameters based on the object."""
    # XXX flacoste 2007-07-13 bug=125849:
    # This should go away once bug #125849 is fixed.
    params = dict(product=None, distribution=None)
    if IProduct.providedBy(context):
        params['product'] = context
    elif IDistribution.providedBy(context):
        params['distribution'] = context
    else:
        raise AssertionError('Unknown karma context: %r' % context)
    return params


@block_implicit_flushes
def faq_created(faq, event):
    """Assign karma to the user who created the FAQ."""
    context = get_karma_context_parameters(faq.target)
    faq.owner.assignKarma('faqcreated', **context)


@block_implicit_flushes
def faq_edited(faq, event):
    """Assign karma to user who edited a FAQ."""
    user = IPerson(event.user)
    old_faq = event.object_before_modification

    context = get_karma_context_parameters(faq.target)
    if old_faq.content != faq.content or old_faq.title != faq.title:
        user.assignKarma('faqedited', **context)