diff --git a/demo/models.py b/demo/models.py new file mode 100644 index 0000000..86485f2 --- /dev/null +++ b/demo/models.py @@ -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) diff --git a/demo/settings.py b/demo/settings.py index 3e33261..56e66d0 100644 --- a/demo/settings.py +++ b/demo/settings.py @@ -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 diff --git a/demo/templates/_complete_count.html b/demo/templates/_complete_count.html new file mode 100644 index 0000000..c005415 --- /dev/null +++ b/demo/templates/_complete_count.html @@ -0,0 +1,3 @@ +
+

{{ done_count }} task{{ done_count|pluralize }} completed

+
\ No newline at end of file diff --git a/demo/templates/_task.html b/demo/templates/_task.html new file mode 100644 index 0000000..b370e5f --- /dev/null +++ b/demo/templates/_task.html @@ -0,0 +1,17 @@ + + +
+
+ {% if task.done %} + + {% else %} + + {% endif %} + +
+
+ + + {{ task.label }} + + \ No newline at end of file diff --git a/demo/templates/homepage.html b/demo/templates/homepage.html index 86fa069..2dcf937 100644 --- a/demo/templates/homepage.html +++ b/demo/templates/homepage.html @@ -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 %} -

{% trans "Welcome to Pinax" %}

-

- {% blocktrans %} - Pinax is a Django - 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 %} -

- -

About Account Project

-

- {% 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 %} -

- - {% if user.is_authenticated %} - {% url what_next as what_next_url %} -

{% blocktrans %}Wondering What Next?{% endblocktrans %}

- {% else %} - {% url account_login as login_url %} - {% url account_signup as signup_url %} -

{% blocktrans %}You can Log In or Sign Up to try out the site.{% endblocktrans %}

- {% endif %} +{% block body %} +
+
+
+

Tasks

+

+ A sample tasks app to demonstrate how to use + + bootstrap-ajax + +

+
+ {% csrf_token %} +
+ +
+
+ {% include "_complete_count.html" %} + + {% for task in tasks %} + {% include "_task.html" %} + {% endfor %} +
+
+
+
{% endblock %} diff --git a/demo/templates/site_base.html b/demo/templates/site_base.html index e3e80a0..c84f0fb 100644 --- a/demo/templates/site_base.html +++ b/demo/templates/site_base.html @@ -12,6 +12,7 @@ {% endblock %} {% block extra_body_base %} + {% analytics %} {% block extra_body %}{% endblock %} {% endblock %} diff --git a/demo/urls.py b/demo/urls.py index 1023d46..12f99a3 100644 --- a/demo/urls.py +++ b/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\d+)/done/$", "demo.views.mark_done", name="task_mark_done"), + url(r"^tasks/(?P\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\d+)/delete/$", "demo.views.delete", name="task_delete"), + url(r"^admin/", include(admin.site.urls)), - url(r"^account/", include("account.urls")), ) diff --git a/demo/views.py b/demo/views.py new file mode 100644 index 0000000..dfbbdd6 --- /dev/null +++ b/demo/views.py @@ -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") diff --git a/fixtures/initial_data.json b/fixtures/initial_data.json index 8242d9f..1774992 100644 --- a/fixtures/initial_data.json +++ b/fixtures/initial_data.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" } } ] diff --git a/manage.py b/manage.py old mode 100644 new mode 100755