Add simple tasks demo app for bootstrap-ajax

This commit is contained in:
Patrick Altman
2012-10-31 22:55:52 -05:00
parent dc19d9d93c
commit 8da53be240
10 changed files with 170 additions and 38 deletions

10
demo/models.py Normal file
View File

@@ -0,0 +1,10 @@
from django.db import models
from django.contrib.sessions.models import Session
class Task(models.Model):
session = models.ForeignKey(Session)
label = models.CharField(max_length=100)
done = models.BooleanField(default=False)

View File

@@ -136,6 +136,7 @@ INSTALLED_APPS = [
"metron",
# project
"demo"
]
# A sample logging configuration. The only tangible logging
@@ -173,7 +174,7 @@ FIXTURE_DIRS = [
EMAIL_BACKEND = "django.core.mail.backends.console.EmailBackend"
ACCOUNT_OPEN_SIGNUP = True
ACCOUNT_OPEN_SIGNUP = False
ACCOUNT_USE_OPENID = False
ACCOUNT_REQUIRED_EMAIL = False
ACCOUNT_EMAIL_VERIFICATION = False

View File

@@ -0,0 +1,3 @@
<div class="well" id="done-count" data-refresh-url="{% url task_complete_count_fragment %}">
<h1>{{ done_count }} task{{ done_count|pluralize }} completed</h1>
</div>

17
demo/templates/_task.html Normal file
View File

@@ -0,0 +1,17 @@
<tr class="{% if task.done %}success{% endif %}">
<td>
<div class="btn-toolbar">
<div class="btn-group">
{% if task.done %}
<a href="{% url task_mark_undone task.pk %}" class="btn ajax" data-method="post" data-refresh="#done-count" data-replace-closest="tr"><i class="icon-remove"></i></a>
{% else %}
<a href="{% url task_mark_done task.pk %}" class="btn ajax" data-method="post" data-refresh="#done-count" data-replace-closest="tr"><i class="icon-ok"></i></a>
{% endif %}
<a href="{% url task_delete task.pk %}" class="btn ajax" data-method="post" data-replace-closest="tr" data-refresh="#done-count"><i class="icon-trash"></i></a>
</div>
</div>
</td>
<td>
{{ task.label }}
</td>
</tr>

View File

@@ -1,4 +1,4 @@
{% extends "banner_base.html" %}
{% extends "site_base.html" %}
{% load i18n %}
@@ -6,34 +6,30 @@
{% block body_class %}home{% endblock %}
{% block banner %}
<h1>{% trans "Welcome to Pinax" %}</h1>
<p>
{% blocktrans %}
<b>Pinax</b> is a <a href="http://djangoproject.com/">Django</a>
project intended to provide a starting point for websites. By
integrating numerous reusable Django apps to take care of the
things that many sites have in common, it lets you focus on what
makes your site different.
{% endblocktrans %}
</p>
<h2>About Account Project</h2>
<p>
{% blocktrans %}
In addition to what is provided by the "zero" project, this project
provides thorough integration with django-user-accounts, adding
comprehensive account management functionality. It is a foundation
suitable for most sites that have user accounts.
{% endblocktrans %}
</p>
{% if user.is_authenticated %}
{% url what_next as what_next_url %}
<p class="what_next">{% blocktrans %}Wondering <a href="{{ what_next_url }}" class="btn primary large">What Next</a>?{% endblocktrans %}</p>
{% else %}
{% url account_login as login_url %}
{% url account_signup as signup_url %}
<p>{% blocktrans %}You can <a href="{{ login_url }}" class="btn">Log In</a> or <a href="{{ signup_url }}" class="btn primary">Sign Up</a> to try out the site.{% endblocktrans %}</p>
{% endif %}
{% block body %}
<div class="row">
<div class="span4"></div>
<div class="span4">
<h1>Tasks</h1>
<p class="lead">
A sample tasks app to demonstrate how to use
<a href="https://github.com/eldarion/bootstrap-ajax/">
bootstrap-ajax
</a>
</p>
<form class="form-inline ajax" method="post" action="{% url task_add %}" data-append="#tasks">
{% csrf_token %}
<div class="input-append">
<input type="text" class="span4" name="label" placeholder="Enter a task...">
</div>
</form>
{% include "_complete_count.html" %}
<table class="table table-striped" id="tasks">
{% for task in tasks %}
{% include "_task.html" %}
{% endfor %}
</table>
</div>
<div class="span4"></div>
</div>
{% endblock %}

View File

@@ -12,6 +12,7 @@
{% endblock %}
{% block extra_body_base %}
<script type="text/javascript" src="https://raw.github.com/eldarion/bootstrap-ajax/e272efd297da2ed140049e420912960b280a066d/js/bootstrap-ajax.js"></script>
{% analytics %}
{% block extra_body %}{% endblock %}
{% endblock %}

View File

@@ -2,16 +2,19 @@ from django.conf import settings
from django.conf.urls import patterns, include, url
from django.conf.urls.static import static
from django.views.generic.simple import direct_to_template
from django.contrib import admin
admin.autodiscover()
urlpatterns = patterns("",
url(r"^$", direct_to_template, {"template": "homepage.html"}, name="home"),
url(r"^$", "demo.views.home", name="home"),
url(r"^tasks/(?P<pk>\d+)/done/$", "demo.views.mark_done", name="task_mark_done"),
url(r"^tasks/(?P<pk>\d+)/undone/$", "demo.views.mark_undone", name="task_mark_undone"),
url(r"^tasks/completed/$", "demo.views.complete_count_fragment", name="task_complete_count_fragment"),
url(r"^tasks/add/$", "demo.views.add", name="task_add"),
url(r"^tasks/(?P<pk>\d+)/delete/$", "demo.views.delete", name="task_delete"),
url(r"^admin/", include(admin.site.urls)),
url(r"^account/", include("account.urls")),
)

101
demo/views.py Normal file
View File

@@ -0,0 +1,101 @@
import json
from django.http import HttpResponse
from django.shortcuts import render, get_object_or_404
from django.template import RequestContext
from django.template.loader import render_to_string
from django.views.decorators.http import require_POST
from django.contrib.sessions.models import Session
from demo.models import Task
def home(request):
if not request.session.exists(request.session.session_key):
request.session.create()
return render(request, "homepage.html", {
"tasks": Task.objects.filter(
session__session_key=request.session.session_key
),
"done_count": Task.objects.filter(
session__session_key=request.session.session_key,
done=True
).count()
})
def complete_count_fragment(request):
data = {
"html": render_to_string(
"_complete_count.html",
RequestContext(request, {
"done_count": Task.objects.filter(
done=True,
session__session_key=request.session.session_key
).count()
})
)
}
return HttpResponse(json.dumps(data), mimetype="application/json")
def _task_data(request, task):
data = {
"html": render_to_string(
"_task.html",
RequestContext(request, {
"task": task
})
)
}
return data
@require_POST
def mark_done(request, pk):
task = get_object_or_404(Task,
session__session_key=request.session.session_key,
pk=pk
)
task.done = True
task.save()
data = _task_data(request, task)
return HttpResponse(json.dumps(data), mimetype="application/json")
@require_POST
def mark_undone(request, pk):
task = get_object_or_404(Task,
session__session_key=request.session.session_key,
pk=pk
)
task.done = False
task.save()
data = _task_data(request, task)
return HttpResponse(json.dumps(data), mimetype="application/json")
@require_POST
def add(request):
session = Session.objects.get(session_key=request.session.session_key)
task = Task.objects.create(
session=session,
label=request.POST.get("label")
)
data = _task_data(request, task)
return HttpResponse(json.dumps(data), mimetype="application/json")
@require_POST
def delete(request, pk):
task = get_object_or_404(Task,
session__session_key=request.session.session_key,
pk=pk
)
task.delete()
data = {
"html": ""
}
return HttpResponse(json.dumps(data), mimetype="application/json")

View File

@@ -4,7 +4,7 @@
"model": "sites.site",
"fields": {
"domain": "localhost:8000",
"name": "example.com [localhost]"
"name": "Ajax Tasks [localhost]"
}
},
{
@@ -12,7 +12,7 @@
"model": "sites.site",
"fields": {
"domain": "example.com",
"name": "example.com"
"name": "Ajax Tasks"
}
}
]

0
manage.py Normal file → Executable file
View File