示例#1
0
文件: views.py 项目: bea/kitsune
def unwatch_approved(request):
    """Stop watching approved revisions."""
    if request.LANGUAGE_CODE not in settings.SUMO_LANGUAGES:
        raise Http404
    ApproveRevisionInLocaleEvent.stop_notifying(request.user,
                                                locale=request.LANGUAGE_CODE)
    return HttpResponse()
示例#2
0
def unwatch_approved(request):
    """Stop watching approved revisions."""
    if request.LANGUAGE_CODE not in settings.SUMO_LANGUAGES:
        raise Http404
    ApproveRevisionInLocaleEvent.stop_notifying(request.user,
                                                locale=request.LANGUAGE_CODE)
    return HttpResponse()
示例#3
0
文件: views.py 项目: bea/kitsune
def watch_approved(request):
    """Start watching approved revisions in a locale."""
    if request.LANGUAGE_CODE not in settings.SUMO_LANGUAGES:
        raise Http404
    ApproveRevisionInLocaleEvent.notify(request.user, locale=request.LANGUAGE_CODE)
    statsd.incr('wiki.watches.approved')
    return HttpResponse()
示例#4
0
def render_readouts(request, readouts, template, locale=None, extra_data=None,
                    product=None):
    """Render a readouts, possibly with overview page.

    Use the given template, pass the template the given readouts, limit the
    considered data to the given locale, and pass along anything in the
    `extra_data` dict to the template in addition to the standard data.

    """
    current_locale = locale or request.LANGUAGE_CODE
    on_default_locale = request.LANGUAGE_CODE == settings.WIKI_DEFAULT_LANGUAGE

    default_kwargs = {
        'locale': settings.WIKI_DEFAULT_LANGUAGE,
    }
    locale_kwargs = {
        'locale': request.LANGUAGE_CODE,
    }
    ready_kwargs = {}

    if product is not None:
        default_kwargs['product'] = product.slug
        locale_kwargs['product'] = product.slug
        ready_kwargs['product'] = product.slug

    data = {'readouts': SortedDict((slug, class_(request, locale=locale,
                                                 product=product))
                                   for slug, class_ in readouts.iteritems()
                                   if class_.should_show_to(request)),
            'default_locale': settings.WIKI_DEFAULT_LANGUAGE,
            'default_locale_name':
                LOCALES[settings.WIKI_DEFAULT_LANGUAGE].native,
            'current_locale': current_locale,
            'current_locale_name': LOCALES[current_locale].native,
            'request_locale_name': LOCALES[request.LANGUAGE_CODE].native,
            'is_watching_default_approved':
                ApproveRevisionInLocaleEvent.is_notifying(
                    request.user, **default_kwargs),
            'is_watching_other_approved':
                None if on_default_locale
                else ApproveRevisionInLocaleEvent.is_notifying(
                    request.user, **locale_kwargs),
            'is_watching_default_locale':
                ReviewableRevisionInLocaleEvent.is_notifying(
                    request.user, **default_kwargs),
            'is_watching_other_locale':
                None if on_default_locale
                else ReviewableRevisionInLocaleEvent.is_notifying(
                    request.user, **locale_kwargs),
            'is_watching_default_ready':
                ReadyRevisionEvent.is_notifying(request.user, **ready_kwargs),
            'on_default_locale': on_default_locale,
            'announce_form': AnnouncementForm(),
            'announcements': Announcement.get_for_locale_name(current_locale),
            'product': product,
            'products': Product.objects.filter(visible=True),
        }
    if extra_data:
        data.update(extra_data)
    return render(request, 'dashboards/' + template, data)
示例#5
0
 def setUp(self):
     """Have a user watch for revision approval. Log in."""
     self.approved_watcher = user(email="*****@*****.**", save=True)
     ApproveRevisionInLocaleEvent.notify(self.approved_watcher, locale="en-US")
     approver = user(save=True)
     add_permission(approver, Revision, "review_revision")
     add_permission(approver, Revision, "mark_ready_for_l10n")
     self.client.login(username=approver.username, password="******")
示例#6
0
def watch_approved(request):
    """Start watching approved revisions in a locale."""
    if request.LANGUAGE_CODE not in settings.SUMO_LANGUAGES:
        raise Http404
    ApproveRevisionInLocaleEvent.notify(request.user,
                                        locale=request.LANGUAGE_CODE)
    statsd.incr('wiki.watches.approved')
    return HttpResponse()
示例#7
0
 def setUp(self):
     """Have a user watch for revision approval. Log in."""
     self.approved_watcher = UserFactory(email="*****@*****.**")
     ApproveRevisionInLocaleEvent.notify(self.approved_watcher,
                                         locale="en-US")
     approver = UserFactory()
     add_permission(approver, Revision, "review_revision")
     add_permission(approver, Revision, "mark_ready_for_l10n")
     self.client.login(username=approver.username, password="******")
示例#8
0
 def setUp(self):
     """Have a user watch for revision approval. Log in."""
     self.approved_watcher = UserFactory(email='*****@*****.**')
     ApproveRevisionInLocaleEvent.notify(self.approved_watcher,
                                         locale='en-US')
     approver = UserFactory()
     add_permission(approver, Revision, 'review_revision')
     add_permission(approver, Revision, 'mark_ready_for_l10n')
     self.client.login(username=approver.username, password='******')
示例#9
0
 def setUp(self):
     """Have a user watch for revision approval. Log in."""
     self.approved_watcher = user(email='*****@*****.**', save=True)
     ApproveRevisionInLocaleEvent.notify(self.approved_watcher,
                                         locale='en-US')
     approver = user(save=True)
     add_permission(approver, Revision, 'review_revision')
     add_permission(approver, Revision, 'mark_ready_for_l10n')
     self.client.login(username=approver.username, password='******')
示例#10
0
文件: utils.py 项目: rootmeb/kitsune
def render_readouts(request, readouts, template, locale=None, extra_data=None, product=None):
    """Render a readouts, possibly with overview page.

    Use the given template, pass the template the given readouts, limit the
    considered data to the given locale, and pass along anything in the
    `extra_data` dict to the template in addition to the standard data.

    """
    current_locale = locale or request.LANGUAGE_CODE
    on_default_locale = request.LANGUAGE_CODE == settings.WIKI_DEFAULT_LANGUAGE

    default_kwargs = {
        'locale': settings.WIKI_DEFAULT_LANGUAGE,
    }
    locale_kwargs = {
        'locale': request.LANGUAGE_CODE,
    }
    ready_kwargs = {}

    if product is not None:
        default_kwargs['product'] = product.slug
        locale_kwargs['product'] = product.slug
        ready_kwargs['product'] = product.slug

    data = {
        'readouts': OrderedDict((slug, class_(request, locale=locale,
                                              product=product))
                                for slug, class_ in readouts.items()
                                if class_.should_show_to(request)),
        'default_locale': settings.WIKI_DEFAULT_LANGUAGE,
        'default_locale_name': LOCALES[settings.WIKI_DEFAULT_LANGUAGE].native,
        'current_locale': current_locale,
        'current_locale_name': LOCALES[current_locale].native,
        'request_locale_name': LOCALES[request.LANGUAGE_CODE].native,
        'is_watching_default_approved':
            ApproveRevisionInLocaleEvent.is_notifying(request.user, **default_kwargs),
        'is_watching_other_approved': (
            None if on_default_locale
            else ApproveRevisionInLocaleEvent.is_notifying(request.user, **locale_kwargs)),
        'is_watching_default_locale': (
            ReviewableRevisionInLocaleEvent.is_notifying(request.user, **default_kwargs)),
        'is_watching_other_locale': (
            None if on_default_locale
            else ReviewableRevisionInLocaleEvent.is_notifying(request.user, **locale_kwargs)),
        'is_watching_default_ready': ReadyRevisionEvent.is_notifying(request.user, **ready_kwargs),
        'on_default_locale': on_default_locale,
        'announce_form': AnnouncementForm(),
        'announcements': Announcement.get_for_locale_name(current_locale),
        'product': product,
        'products': Product.objects.filter(visible=True),
    }
    if extra_data:
        data.update(extra_data)
    return render(request, 'dashboards/' + template, data)
示例#11
0
def unwatch_approved(request, product=None):
    """Stop watching approved revisions for a given product."""
    if request.LANGUAGE_CODE not in settings.SUMO_LANGUAGES:
        raise Http404

    kwargs = {'locale': request.LANGUAGE_CODE}
    if product is not None:
        kwargs['product'] = product
    ApproveRevisionInLocaleEvent.stop_notifying(request.user, **kwargs)

    return HttpResponse()
示例#12
0
def unwatch_approved(request, product=None):
    """Stop watching approved revisions for a given product."""
    if request.LANGUAGE_CODE not in settings.SUMO_LANGUAGES:
        raise Http404

    kwargs = {'locale': request.LANGUAGE_CODE}
    if product is not None:
        kwargs['product'] = product
    ApproveRevisionInLocaleEvent.stop_notifying(request.user, **kwargs)

    return HttpResponse()
示例#13
0
def watch_approved(request, product=None):
    """Start watching approved revisions in a locale for a given product."""
    if request.LANGUAGE_CODE not in settings.SUMO_LANGUAGES:
        raise Http404

    kwargs = {'locale': request.LANGUAGE_CODE}
    if product is not None:
        kwargs['product'] = product
    ApproveRevisionInLocaleEvent.notify(request.user, **kwargs)
    statsd.incr('wiki.watches.approved')

    return HttpResponse()
示例#14
0
def watch_approved(request, product=None):
    """Start watching approved revisions in a locale for a given product."""
    if request.LANGUAGE_CODE not in settings.SUMO_LANGUAGES:
        raise Http404

    kwargs = {'locale': request.LANGUAGE_CODE}
    if product is not None:
        kwargs['product'] = product
    ApproveRevisionInLocaleEvent.notify(request.user, **kwargs)
    statsd.incr('wiki.watches.approved')

    return HttpResponse()
示例#15
0
    def test_product_specific_ready(self):
        """Verify product-specific ready for review notifications."""
        # Add an all products in 'es' watcher and a Firefox OS in 'es'
        # watcher.
        ApproveRevisionInLocaleEvent.notify(UserFactory(), locale='es')
        ApproveRevisionInLocaleEvent.notify(UserFactory(),
                                            product='firefox-os',
                                            locale='es')

        # Create an 'es' document for Firefox
        parent = DocumentFactory()
        doc = DocumentFactory(parent=parent, locale='es')
        parent.products.add(ProductFactory(slug='firefox'))

        # Review a revision. There should be 3 new emails:
        # 1 to the creator, 1 to the reviewer and 1 to the 'es' watcher.
        self._review_revision(document=doc,
                              is_ready=True,
                              significance=MEDIUM_SIGNIFICANCE)
        eq_(3, len(mail.outbox))
        _assert_approved_mail(mail.outbox[0])
        _assert_creator_mail(mail.outbox[1])

        # Add firefox-os to the document's products and review a new revision.
        # There should be 4 new emails now (the same 3 from before plus one
        # for the firefox-os watcher).
        parent.products.add(ProductFactory(slug='firefox-os'))
        self._review_revision(document=doc,
                              is_ready=True,
                              significance=MEDIUM_SIGNIFICANCE)
        eq_(7, len(mail.outbox))
        _assert_approved_mail(mail.outbox[3])
        _assert_approved_mail(mail.outbox[4])
        _assert_creator_mail(mail.outbox[5])

        # Add a Firefox watcher. This time there should be 5 new emails.
        ApproveRevisionInLocaleEvent.notify(UserFactory(),
                                            product='firefox',
                                            locale='es')
        self._review_revision(document=doc,
                              is_ready=True,
                              significance=MEDIUM_SIGNIFICANCE)
        eq_(12, len(mail.outbox))
示例#16
0
    def test_product_specific_ready(self):
        """Verify product-specific ready for review notifications."""
        # Add an all products in 'es' watcher and a Firefox OS in 'es'
        # watcher.
        ApproveRevisionInLocaleEvent.notify(UserFactory(), locale='es')
        ApproveRevisionInLocaleEvent.notify(
            UserFactory(), product='firefox-os', locale='es')

        # Create an 'es' document for Firefox
        parent = DocumentFactory()
        doc = DocumentFactory(parent=parent, locale='es')
        parent.products.add(ProductFactory(slug='firefox'))

        # Review a revision. There should be 3 new emails:
        # 1 to the creator, 1 to the reviewer and 1 to the 'es' watcher.
        self._review_revision(
            document=doc, is_ready=True, significance=MEDIUM_SIGNIFICANCE)
        eq_(3, len(mail.outbox))
        _assert_approved_mail(mail.outbox[0])
        _assert_creator_mail(mail.outbox[1])

        # Add firefox-os to the document's products and review a new revision.
        # There should be 4 new emails now (the same 3 from before plus one
        # for the firefox-os watcher).
        parent.products.add(ProductFactory(slug='firefox-os'))
        self._review_revision(
            document=doc, is_ready=True, significance=MEDIUM_SIGNIFICANCE)
        eq_(7, len(mail.outbox))
        _assert_approved_mail(mail.outbox[3])
        _assert_approved_mail(mail.outbox[4])
        _assert_creator_mail(mail.outbox[5])

        # Add a Firefox watcher. This time there should be 5 new emails.
        ApproveRevisionInLocaleEvent.notify(
            UserFactory(), product='firefox', locale='es')
        self._review_revision(
            document=doc, is_ready=True, significance=MEDIUM_SIGNIFICANCE)
        eq_(12, len(mail.outbox))
示例#17
0
def review_revision(request, document_slug, revision_id):
    """Review a revision of a wiki document."""
    rev = get_object_or_404(Revision,
                            pk=revision_id,
                            document__slug=document_slug)
    doc = rev.document

    if not doc.allows(request.user, 'review_revision'):
        raise PermissionDenied

    form = ReviewForm(
        initial={
            'needs_change': doc.needs_change,
            'needs_change_comment': doc.needs_change_comment
        })

    # Don't ask significance if this doc is a translation or if it has no
    # former approved versions:
    should_ask_significance = not doc.parent and doc.current_revision

    based_on_revs = doc.revisions.all()
    last_approved_date = getattr(doc.current_revision, 'created',
                                 datetime.fromordinal(1))
    based_on_revs = based_on_revs.filter(created__gt=last_approved_date)
    revision_contributors = list(
        set(based_on_revs.values_list('creator__username', flat=True)))

    # Don't include the reviewer in the recent contributors list.
    if request.user.username in revision_contributors:
        revision_contributors.remove(request.user.username)

    if request.method == 'POST':
        form = ReviewForm(request.POST)
        if form.is_valid() and not rev.reviewed:
            # Don't allow revisions to be reviewed twice
            rev.is_approved = 'approve' in request.POST
            rev.reviewer = request.user
            rev.reviewed = datetime.now()

            if should_ask_significance and form.cleaned_data['significance']:
                rev.significance = form.cleaned_data['significance']
            elif not should_ask_significance and not doc.parent:
                # This is a new document without approved revisions.
                # Significance is MAJOR.
                rev.significance = MAJOR_SIGNIFICANCE

            # If document is localizable and revision was approved and
            # user has permission, set the is_ready_for_localization value.
            if (doc.allows(request.user, 'mark_ready_for_l10n')
                    and rev.is_approved
                    and rev.can_be_readied_for_localization()):
                rev.is_ready_for_localization = form.cleaned_data[
                    'is_ready_for_localization']

                # If the revision is ready for l10n, store the date
                # and the user.
                if rev.is_ready_for_localization:
                    rev.readied_for_localization = rev.reviewed
                    rev.readied_for_localization_by = rev.reviewer

            rev.save()

            # Update the needs change bit (if approved, default language and
            # user has permission).
            if (doc.locale == settings.WIKI_DEFAULT_LANGUAGE
                    and doc.allows(request.user, 'edit_needs_change')
                    and rev.is_approved):
                doc.needs_change = form.cleaned_data['needs_change']
                doc.needs_change_comment = \
                    form.cleaned_data['needs_change_comment']
                doc.save()

            # Send notifications of approvedness and readiness:
            if rev.is_ready_for_localization or rev.is_approved:
                events = [ApproveRevisionInLocaleEvent(rev)]
                if rev.is_ready_for_localization:
                    events.append(ReadyRevisionEvent(rev))
                ApprovedOrReadyUnion(*events).fire(
                    exclude=[rev.creator, request.user])

            # Send an email (not really a "notification" in the sense that
            # there's a Watch table entry) to revision creator.
            msg = form.cleaned_data['comment']
            send_reviewed_notification.delay(rev, doc, msg)
            send_contributor_notification(based_on_revs, rev, doc, msg)

            statsd.incr('wiki.review')
            render_document_cascade.delay(doc)

            return HttpResponseRedirect(
                reverse('wiki.document_revisions', args=[document_slug]))

    if doc.parent:  # A translation
        # For diffing the based_on revision against, to help the user see if he
        # translated all the recent changes:
        parent_revision = (rev.based_on
                           or doc.parent.localizable_or_latest_revision())
        template = 'wiki/review_translation.html'
    else:
        parent_revision = None
        template = 'wiki/review_revision.html'

    data = {
        'revision': rev,
        'document': doc,
        'form': form,
        'parent_revision': parent_revision,
        'revision_contributors': list(revision_contributors),
        'should_ask_significance': should_ask_significance
    }
    return render(request, template, data)