Code Monkey home page Code Monkey logo

wagtailpolls's Introduction

wagtailpolls

A plugin for Wagtail that provides polling functionality.

Installing

Install using pip:

pip install git+https://github.com/prashanthv/wagtailpolls

It works with Wagtail 2.1 and upwards.

Using

Add wagtailpolls to your INSTALLED_APPS.

Ensure you add the line from wagtailpolls.views.vote import vote to your urls.py and include the URL url(r'^vote/(?P<poll_pk>.*)/$', vote, name='wagtailpolls_vote').

Define a foreign key referring to wagtailpolls.Poll and use the PollChooserPanel:

from django.db import models
from wagtailpolls.edit_handlers import PollChooserPanel
from wagtail.wagtailadmin.edit_handlers import FieldPanel

class Content(Page):
    body = models.TextField()
    poll = models.ForeignKey(
        'wagtailpolls.Poll',
        null=True,
        blank=True,
        on_delete=models.SET_NULL
    )

    content_panels = [
        FieldPanel('body', classname="full"),
        PollChooserPanel('poll'),
    ]

Then, in your editor, ensure that you have added some polls in the polls section in wagtail admin. You will be able to select a poll from there accessable in the template as you would expect.

Templating & Display

There are many ways in which you may want to display your poll. wagtailpolls comes with a template tag to assist with this, as well as certain attributes accessible via templating to render each question as a form. Here is an example using all of the tools provided:

{% extends "layouts/page.html" %}
{% load wagtailpolls_tags %}
{% block content %}
<h1>{{ self.title }}</h1>
<br>
{% if self.poll %}
<form class='poll' method='POST' action='{% vote self.poll %}'>
{% csrf_token %}
{{self.poll.form}}
<br><br>
    <input type="submit" value="Vote">
</form>
{% else %}
    No polls added to this page yet!
{% endif %}
{% endblock %}

As shown, the {% vote %} template tag will need to be passed a poll instance to function correctly. You will also need to {% load wagtailpolls_tags %} at the top of the file where this template tag is used. The poll can be rendered with all questions using .form at the end. .form_as_ul and all other form types will also work.

If you do select a poll for a page, no fields will display on the form and, upon voting, a message stating that there is no poll to vote on will be displayed.

Voting

When a vote has been submitted, the server will return a JsonResponse something like:

{"total_votes": 11, "total_questions": 3, "poll": "Test Poll", "votes": {"Nah": 10, "Yeah": 1, "Maybe": 0}}

With javascript, this data can be used to create a frontend for your poll to your own liking.

The voting form also performs some validation. If the voting form is unable to obtain your IP it will return something like:

{"poll": "Test Poll", "total_questions": 3, "total_votes": 11, "votes": {"Yeah": 1, "Maybe": 0, "Nah": 10}, "form_error": {"__all__": ["Sorry, we were not able to obtain your ip address"]}}

There is also a WAGTAILPOLLS_VOTE_COOLDOWN which is set in your settings. This will only allow users on the same IP to vote at an interval of your choosing. If this is caught, the error will be present in the JsonResponse much like the error above.

Additionally, information will be added to the django session (basically cookies will be set) that will help make sure devices are not able to vote twice. When a vote is rejected due to this reason, the vote simply won't register with no error being returned in the JsonResponse.

Settings

The following settings can to be set in your settings.py file.

WAGTAILPOLLS_VOTE_COOLDOWN This is to be an integer representing minutes, the default is 10 minutes.

WAGTAILPOLLS_VOTE_REQUIRE_PERMS A string or list of strings representing the permissions to vote, aka. 'wagtailadmin.access_admin'

wagtailpolls's People

Contributors

liambrenner avatar frague59 avatar

Watchers

Prashanth Vijayendra avatar James Cloos avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.