Commit 32c331b9 authored by stef's avatar stef
Browse files

[enh] autocompletion, and other ui wizzardry

parent 60484f07
from django import forms
from django.conf import settings
from django.forms import ModelForm
from bt.models import Violation
from bt.models import Violation, COUNTRIES
from operator import itemgetter
class AdvancedEditor(forms.Textarea):
class Media:
......@@ -13,9 +13,15 @@ class AdvancedEditor(forms.Textarea):
if attrs: self.attrs.update(attrs)
super(AdvancedEditor, self).__init__(attrs)
class AddViolation(ModelForm):
class Meta:
model = Violation
widgets = {
'comments': AdvancedEditor,
}
class AddViolation(forms.Form):
country = forms.ChoiceField(choices=(('',''),)+tuple(sorted(COUNTRIES,key=itemgetter(1))))
operator = forms.CharField(max_length=256)
contract = forms.CharField(max_length=256)
comment = forms.CharField(required=True, widget=AdvancedEditor())
resource = forms.CharField(required=False, max_length=1)
type = forms.CharField(max_length=1)
media = forms.CharField(required=False, max_length=1)
temporary = forms.BooleanField(required=False )
contractual = forms.BooleanField(required=False)
contract_excerpt = forms.CharField(required=False, widget=AdvancedEditor())
loophole = forms.BooleanField(required=False)
from django.db import models
# Create your models here.
COUNTRIES = (
('BE', 'Belgium'),
('BG', 'Bulgaria'),
('CZ', 'Czech Republic'),
('DK', 'Denmark'),
('DE', 'Germany'),
('EE', 'Estonia'),
('IE', 'Ireland'),
('EL', 'Greece'),
('ES', 'Spain'),
('FR', 'France'),
('IT', 'Italy'),
('CY', 'Cyprus'),
('LV', 'Latvia'),
('LT', 'Lithuania'),
('LU', 'Luxembourg'),
('HU', 'Hungary'),
('MT', 'Malta'),
('NL', 'Netherlands'),
('AT', 'Austria'),
('PL', 'Poland'),
('PT', 'Portugal'),
('RO', 'Romania'),
('SI', 'Slovenia'),
('SK', 'Slovakia'),
('FI', 'Finland'),
('SE', 'Sweden'),
('UK', 'United Kingdom '),
)
class Attachment(models.Model):
attachment = models.FileField(upload_to='static')
......@@ -12,22 +40,6 @@ class Comment(models.Model):
attachments = models.ForeignKey(Attachment)
class Violation(models.Model):
COUNTRIES = (
# TODO complete and sort
('A', 'Austria'),
('B', 'Belgium'),
('CZ', 'Czech Republic'),
('HU', 'Hungary'),
('RO', 'Romania'),
('SE', 'Sweden'),
('PL', 'Poland'),
('ES', 'Spain'),
('PT', 'Portugal'),
('I', 'Italy'),
('DE', 'Germany'),
('SK', 'Slovakia'),
('FR', 'France'),
)
RESOURCES = (
('1', 'port'),
('2', 'protocol'),
......@@ -44,33 +56,14 @@ class Violation(models.Model):
('1', 'Fixed'),
('2', 'Mobile'),
)
country = models.CharField(max_length=2,
choices=COUNTRIES,
help_text='',
)
operator = models.CharField(max_length=256,
help_text='')
contract = models.CharField(max_length=256,
help_text='type of offer, i.e. the name of the subscription')
comments = models.ForeignKey(Comment,
help_text='')
resource = models.CharField(blank=True,
max_length=1,
choices=RESOURCES,
help_text='')
type = models.CharField(blank=True,
max_length=1,
choices=RESOURCES,
help_text='')
media = models.CharField(blank=True,
max_length=1,
choices=MEDIA,
help_text='')
temporary = models.BooleanField(blank=True,
help_text='')
contractual = models.BooleanField(blank=True,
help_text='')
contract_excerpt = models.TextField(blank=True,
help_text='')
loophole = models.BooleanField(blank=True,
help_text='')
country = models.CharField(max_length=2, choices=COUNTRIES)
operator = models.CharField(max_length=256)
contract = models.CharField(max_length=256)
comments = models.ForeignKey(Comment)
resource = models.CharField(max_length=1, choices=RESOURCES)
type = models.CharField(max_length=1, choices=TYPES)
media = models.CharField( max_length=1, choices=MEDIA)
temporary = models.BooleanField( )
contractual = models.BooleanField()
contract_excerpt = models.TextField()
loophole = models.BooleanField()
# Create your views here.
from forms import AddViolation
from django.http import HttpResponse, HttpResponseRedirect, Http404
from django.shortcuts import render_to_response
from django.template import RequestContext
from models import Violation
import json
def add(request):
if request.method == 'POST': # If the form has been submitted...
form = ViolationForm(request.POST) # A form bound to the POST data
form = AddViolation(request.POST) # A form bound to the POST data
print form.errors
v=Violation(**form.cleaned_data)
print 'v',v
if form.is_valid(): # All validation rules pass
# Process the data in form.cleaned_data
# ...
v=Violation(**form.values)
print 'v',v
return HttpResponseRedirect('/') # Redirect after POST
else:
form = AddViolation() # An unbound form
return render_to_response('add.html', {
'form': form,
})
}, context_instance=RequestContext(request))
def edit(request):
if request.method == 'POST': # If the form has been submitted...
form = ViolationForm(request.POST) # A form bound to the POST data
if form.is_valid(): # All validation rules pass
# Process the data in form.cleaned_data
# ...
return HttpResponseRedirect('/') # Redirect after POST
else:
form = AddViolation() # An unbound form
return add(request)
return render_to_response('add.html', {
'form': form,
})
def ajax(request, country=None, operator=None):
if not operator:
print 'c',sorted(list(set([x.operator for x in Violation.objects.filter(country=country)])))
return HttpResponse('["Vodafone", "T-Mobile", "T-Home", "UPC Chello", "Orange"]')
else:
print 'co', sorted(list(set([x.operator for x in Violation.objects.filter(country=country).filter(operator=operator)])))
return HttpResponse('["Basic", "Surfer", "Gamer", "Pro", "Business"]')
/*****************************************************************************
* jQuery autocomplete
****************************************************************************/
.ac_results {
padding: 0px;
border: 1px solid #ccc;
background-color: #fff;
overflow: hidden;
z-index: 99999;
text-align: left;
}
.ac_results ul {
width: 100%;
list-style-position: outside;
list-style: none;
padding: 0;
margin: 0;
}
.ac_results li {
margin: 0px;
padding: 3px 5px;
cursor: default;
display: block;
font: menu;
font-size: 12px;
line-height: 14px;
overflow: hidden;
}
.ac_loading {
background: white url('../img/indicator.gif') right center no-repeat;
}
.ac_odd {
background-color: #eee;
}
.ac_over {
background-color: #999;
color: white;
}
body { border: 0; padding: 0; font-family: Verdana,Arial,Helvetica,sans-serif; }
img { border: 0; }
h1, h2, h3, h4, div, ul { padding: 0; margin: 0; }
h2 { margin: auto; width: 50%; padding 4em; }
#addForm { margin: auto; width: 50%; padding 4em; }
.fieldWrapper { margin: 1em; }
.fieldWrapper label { width: 120px; display: inline-block; }
This diff is collapsed.
{% extends "base.html" %}
{% load bt %}
{% block styles %}
<link rel="stylesheet" type="text/css" media="all" href="{% media_url %}/css/jquery.autocomplete.css" />
{% endblock %}
{% block scripts %}
<script type="text/javascript" src="{%media_url%}/js/tinymce/tiny_mce.js"></script>
<script type="text/javascript" src="{%media_url%}/js/editor.js"></script>
<script type="text/javascript" src="{%media_url%}/js/jquery.1.4.2.min.js"></script>
<script type="text/javascript" src="{%media_url%}/js/jquery.autocomplete.js"></script>
<script type="text/javascript">
$(document).ready(function(){
$(".id_contract_excerpt").hide()
$(".id_contract_excerpt_parent").hide()
$(".id_contractual").click(function(event) {
$(".id_contract_excerpt").toggle()
$(".id_contract_excerpt_parent").toggle()
$(".fieldWrapper").hide();
$("#id_country").parent().show();
$("#save_button").hide();
$("#id_contractual").click(function(event) {
$("#id_contract_excerpt_parent").parent().toggle()
});
$('#id_country').change(function() {
var country=$(this).attr('value');
if(country.length>0) {
$('#id_operator').parent().show();
$.getJSON('/ajax/'+country, function(data) {
$("#id_operator").autocomplete(data);
});
}
});
$('#id_operator').change(function() {
var country=$('#id_country').attr('value');
var operator=$(this).attr('value');
if(operator.length>0) {
$('#id_contract').parent().show();
$.getJSON('/ajax/'+country+'/'+operator, function(data) {
$("#id_contract").autocomplete(data);
});
}
});
$('#id_contract').change(function() {
if($(this).attr('value').length>0) {
$('#id_comments').parent().show();
$('#save_button').show();
}
});
});
</script>
......@@ -18,8 +47,14 @@
{%block content%}
<h2>New Violation</h2>
<form name="addForm" action="{% root_url %}/add/" method="get">
{{ form.as_table }}
<input type="submit" value="save" />
<form id='addForm' name="addForm" action="{% root_url %}/add/" method="post">
{% for field in form %}
<div class="fieldWrapper">
{{ field.errors }}
{{ field.label_tag }} {{ field }}
</div>
{% endfor %}
{% csrf_token %}
<input id="save_button" type="submit" value="save" />
</form>
{%endblock%}
......@@ -9,6 +9,7 @@ from bt import views as bt
urlpatterns = patterns('',
(r'^accounts/logout$', 'django.contrib.auth.views.logout', {'next_page' : '/'}),
(r'^accounts/', include('registration.urls')),
(r'^ajax/(?P<country>[^/]*)(/(?P<operator>[^/]*))?$', bt.ajax),
(r'^add/$', bt.add),
(r'^edit/$', bt.edit),
)
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment