Exemple #1
0
def feedback_recently(request, page=None):
    if page is None:
        page = request.META['PATH_INFO']
    query = Feedback.all()
    if page != 'all':
        query.filter('page', page)
    query.order('-submitted')
    return render_query(request, query, 20 if page == 'all' else 10)
Exemple #2
0
def feedback_popular(request, page=None):
    if page is None:
        page = request.META['PATH_INFO']
    feedback_list = []
    query = Feedback.all()
    if page != 'all':
        query.filter('page', page)
    query.order('-points')
    query.order('-submitted')
    return render_query(request, query, 20 if page == 'all' else 10)
Exemple #3
0
def feedback_recently(request):
    page = request.META["PATH_INFO"]
    feedback_list = []
    for feedback in Feedback.all().filter("page", page).order("-points").order("-submitted"):
        try:
            submitter = feedback.submitter  # Attempt to dereference.
            feedback_list.append(feedback)
        except datastore_errors.Error:
            pass  # Ignore feedback if the submitter doesn't exist.
    feedback_list
    already_voted = get_already_voted(request)
    return render_to_string("feedback/messages.html", locals())
Exemple #4
0
def index(request):
    """
    Check reminders and tags for consistency.
    """
    if (request.META.get('HTTP_X_APPENGINE_CRON', '') != 'true'
        and not request.user.is_staff):
        return HttpResponseRedirect('/accounts/login/?next=/consistency/')

    # Get all tags and suggestions from the datastore.
    tag_dict = dict((tag.key().name(), tag) for tag in Tag.all())
    suggestion_dict = dict((suggestion.key().name(), suggestion)
        for suggestion in Reminder.all().filter('owner', None))

    # Initialize empty problems dict.
    problems = dict((problem, []) for problem in PROBLEM_MESSAGES)

    # Check all tags.
    for tag_key, tag in tag_dict.items():
        if tag.count != len(tag.suggestions):
            problems['tag_count'].append(
                (tag, tag.count, len(tag.suggestions)))
        elif tag.count == 0:
            problems['tag_empty'].append((tag, ))
        oldest = None
        for suggestion_key in tag.suggestions:
            if tag.suggestions.count(suggestion_key) > 1:
                problems['tag_suggestion_duplicate'].append(
                    (tag, tag.suggestions.count(suggestion_key),
                     suggestion_key))
            if suggestion_key not in suggestion_dict:
                problems['tag_suggestion_missing'].append(
                    (tag, suggestion_key))
                continue
            suggestion = suggestion_dict[suggestion_key]
            if tag.key().name() not in suggestion.tags:
                problems['tag_suggestion_reverse'].append((tag, suggestion))
            if oldest is None or suggestion.created < oldest.created:
                oldest = suggestion
        if oldest:
            if tag.created is None:
                problems['tag_created_none'].append((tag, oldest))
            elif tag.created > oldest.created:
                problems['tag_created_later'].append((tag, oldest))

    # Check all suggestions.
    for suggestion_key, suggestion in suggestion_dict.items():
        for tag_key in suggestion.tags:
            if tag_key not in tag_dict:
                problems['suggestion_tag_missing'].append(
                    (suggestion, tag_key))
                continue
            tag = tag_dict[tag_key]
            if suggestion.key().name() not in tag.suggestions:
                problems['suggestion_tag_reverse'].append((suggestion, tag))

    # Check all feedback submitters.
    for feedback in Feedback.all().filter('submitter !=', None):
        try:
            submitter = feedback.submitter # Attempt to dereference.
        except datastore_errors.Error:
            problems['feedback_submitter'].append((feedback, request.user))

    # Check all reminders.
    for reminder in Reminder.all().filter('owner !=', None):
        try:
            owner = reminder.owner # Attempt to dereference.
        except datastore_errors.Error:
            problems['reminder_owner'].append((reminder, request.user))

    # Remove empty problem sections.
    for problem in PROBLEM_MESSAGES:
        if not problems[problem]:
            assert problems.pop(problem) == []

    # Return plain-text summary if cron is calling, development test with:
    # curl --header "X-AppEngine-Cron: true" http://localhost:8000/consistency/
    if request.META.get('HTTP_X_APPENGINE_CRON', '') == 'true':
        message = []
        for problem in problems:
            message.append(PROBLEM_HEADLINES[problem].rstrip('.') + ':')
            for data in problems[problem]:
                message.append("* " + format_problem(problem, data))
            message.append('')
        if not message:
            message.append("No problems found.")
            message.append('')
        message.append('http://www.minderbot.com/consistency/')
        message.append('')
        message = '\n'.join(message)
        if problems:
            if request.META.get('HTTP_USER_AGENT', '') != 'django.test.Client':
                logging.error(message)
            mail_admins('Consistency check found problems',
                        message, fail_silently=True)
        return HttpResponse(message, mimetype="text/plain")

    # Fix inconsistencies if admin clicked one of the buttons.
    if request.user.is_staff:
        for problem in problems:
            if problems[problem] and problem in request.POST:
                func = getattr(repair, problem)
                assert callable(func)
                for item in problems[problem]:
                    func(*item)
                return HttpResponseRedirect(request.path)

    # Collect errors and remove sections without problems.
    consistency_results = []
    for problem in problems:
        consistency_results.append(
            (problem,
             PROBLEM_HEADLINES[problem],
             [format_problem(problem, item) for item in problems[problem]],
             PROBLEM_BUTTONS[problem]))
    consistency_results.sort()
    return render_to_response(request, 'consistency/index.html', locals())