Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
piks3l
Respect My Net
Commits
32c331b9
Commit
32c331b9
authored
Apr 29, 2011
by
stef
Browse files
[enh] autocompletion, and other ui wizzardry
parent
60484f07
Changes
8
Expand all
Hide whitespace changes
Inline
Side-by-side
bt/forms.py
View file @
32c331b9
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
)
bt/models.py
View file @
32c331b9
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
()
bt/views.py
View file @
32c331b9
# 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"]'
)
media/css/jquery.autocomplete.css
0 → 100644
View file @
32c331b9
/*****************************************************************************
* 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
;
}
media/css/style.css
0 → 100644
View file @
32c331b9
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
;
}
media/js/jquery.autocomplete.js
0 → 100644
View file @
32c331b9
This diff is collapsed.
Click to expand it.
templates/add.html
View file @
32c331b9
{% 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%}
urls.py
View file @
32c331b9
...
...
@@ -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
),
)
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment