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

[enh] autocompletion, and other ui wizzardry

parent 60484f07
from django import forms from django import forms
from django.conf import settings from django.conf import settings
from django.forms import ModelForm from bt.models import Violation, COUNTRIES
from bt.models import Violation from operator import itemgetter
class AdvancedEditor(forms.Textarea): class AdvancedEditor(forms.Textarea):
class Media: class Media:
...@@ -13,9 +13,15 @@ class AdvancedEditor(forms.Textarea): ...@@ -13,9 +13,15 @@ class AdvancedEditor(forms.Textarea):
if attrs: self.attrs.update(attrs) if attrs: self.attrs.update(attrs)
super(AdvancedEditor, self).__init__(attrs) super(AdvancedEditor, self).__init__(attrs)
class AddViolation(ModelForm): class AddViolation(forms.Form):
class Meta: country = forms.ChoiceField(choices=(('',''),)+tuple(sorted(COUNTRIES,key=itemgetter(1))))
model = Violation operator = forms.CharField(max_length=256)
widgets = { contract = forms.CharField(max_length=256)
'comments': AdvancedEditor, 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 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): class Attachment(models.Model):
attachment = models.FileField(upload_to='static') attachment = models.FileField(upload_to='static')
...@@ -12,22 +40,6 @@ class Comment(models.Model): ...@@ -12,22 +40,6 @@ class Comment(models.Model):
attachments = models.ForeignKey(Attachment) attachments = models.ForeignKey(Attachment)
class Violation(models.Model): 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 = ( RESOURCES = (
('1', 'port'), ('1', 'port'),
('2', 'protocol'), ('2', 'protocol'),
...@@ -44,33 +56,14 @@ class Violation(models.Model): ...@@ -44,33 +56,14 @@ class Violation(models.Model):
('1', 'Fixed'), ('1', 'Fixed'),
('2', 'Mobile'), ('2', 'Mobile'),
) )
country = models.CharField(max_length=2, country = models.CharField(max_length=2, choices=COUNTRIES)
choices=COUNTRIES, operator = models.CharField(max_length=256)
help_text='', contract = models.CharField(max_length=256)
) comments = models.ForeignKey(Comment)
operator = models.CharField(max_length=256, resource = models.CharField(max_length=1, choices=RESOURCES)
help_text='') type = models.CharField(max_length=1, choices=TYPES)
contract = models.CharField(max_length=256, media = models.CharField( max_length=1, choices=MEDIA)
help_text='type of offer, i.e. the name of the subscription') temporary = models.BooleanField( )
comments = models.ForeignKey(Comment, contractual = models.BooleanField()
help_text='') contract_excerpt = models.TextField()
resource = models.CharField(blank=True, loophole = models.BooleanField()
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='')
# Create your views here.
from forms import AddViolation from forms import AddViolation
from django.http import HttpResponse, HttpResponseRedirect, Http404 from django.http import HttpResponse, HttpResponseRedirect, Http404
from django.shortcuts import render_to_response from django.shortcuts import render_to_response
from django.template import RequestContext
from models import Violation
import json
def add(request): def add(request):
if request.method == 'POST': # If the form has been submitted... 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 if form.is_valid(): # All validation rules pass
# Process the data in form.cleaned_data # Process the data in form.cleaned_data
# ... # ...
v=Violation(**form.values)
print 'v',v
return HttpResponseRedirect('/') # Redirect after POST return HttpResponseRedirect('/') # Redirect after POST
else: else:
form = AddViolation() # An unbound form form = AddViolation() # An unbound form
return render_to_response('add.html', { return render_to_response('add.html', {
'form': form, 'form': form,
}) }, context_instance=RequestContext(request))
def edit(request): def edit(request):
if request.method == 'POST': # If the form has been submitted... return add(request)
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 render_to_response('add.html', { def ajax(request, country=None, operator=None):
'form': form, 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" %} {% extends "base.html" %}
{% load bt %} {% load bt %}
{% block styles %}
<link rel="stylesheet" type="text/css" media="all" href="{% media_url %}/css/jquery.autocomplete.css" />
{% endblock %}
{% block scripts %} {% block scripts %}
<script type="text/javascript" src="{%media_url%}/js/tinymce/tiny_mce.js"></script> <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/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.1.4.2.min.js"></script>
<script type="text/javascript" src="{%media_url%}/js/jquery.autocomplete.js"></script>
<script type="text/javascript"> <script type="text/javascript">
$(document).ready(function(){ $(document).ready(function(){
$(".id_contract_excerpt").hide() $(".fieldWrapper").hide();
$(".id_contract_excerpt_parent").hide() $("#id_country").parent().show();
$(".id_contractual").click(function(event) { $("#save_button").hide();
$(".id_contract_excerpt").toggle() $("#id_contractual").click(function(event) {
$(".id_contract_excerpt_parent").toggle() $("#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> </script>
...@@ -18,8 +47,14 @@ ...@@ -18,8 +47,14 @@
{%block content%} {%block content%}
<h2>New Violation</h2> <h2>New Violation</h2>
<form name="addForm" action="{% root_url %}/add/" method="get"> <form id='addForm' name="addForm" action="{% root_url %}/add/" method="post">
{{ form.as_table }} {% for field in form %}
<input type="submit" value="save" /> <div class="fieldWrapper">
{{ field.errors }}
{{ field.label_tag }} {{ field }}
</div>
{% endfor %}
{% csrf_token %}
<input id="save_button" type="submit" value="save" />
</form> </form>
{%endblock%} {%endblock%}
...@@ -9,6 +9,7 @@ from bt import views as bt ...@@ -9,6 +9,7 @@ from bt import views as bt
urlpatterns = patterns('', urlpatterns = patterns('',
(r'^accounts/logout$', 'django.contrib.auth.views.logout', {'next_page' : '/'}), (r'^accounts/logout$', 'django.contrib.auth.views.logout', {'next_page' : '/'}),
(r'^accounts/', include('registration.urls')), (r'^accounts/', include('registration.urls')),
(r'^ajax/(?P<country>[^/]*)(/(?P<operator>[^/]*))?$', bt.ajax),
(r'^add/$', bt.add), (r'^add/$', bt.add),
(r'^edit/$', bt.edit), (r'^edit/$', bt.edit),
) )
......
Supports Markdown
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