mirror of
https://github.com/eldarion/eldarion-ajax-demo.git
synced 2026-01-08 21:47:56 -05:00
Add simple tasks demo app for bootstrap-ajax
This commit is contained in:
10
demo/models.py
Normal file
10
demo/models.py
Normal 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)
|
||||
@@ -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
|
||||
|
||||
3
demo/templates/_complete_count.html
Normal file
3
demo/templates/_complete_count.html
Normal 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
17
demo/templates/_task.html
Normal 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>
|
||||
@@ -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 %}
|
||||
|
||||
@@ -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 %}
|
||||
|
||||
11
demo/urls.py
11
demo/urls.py
@@ -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
101
demo/views.py
Normal 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")
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
]
|
||||
|
||||
Reference in New Issue
Block a user