Skip to content

Commit a9eec51

Browse files
author
dotz
committed
Imported sources from code.google.com (w/o history)
1 parent b67d584 commit a9eec51

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

64 files changed

+4933
-0
lines changed

MANIFEST.in

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
recursive-include datable *
2+
recursive-exclude test_project *

README.txt

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
2+
WARNING: this file is wildly outdated
3+
4+
=dojango-datable=
5+
6+
==What is it?==
7+
8+
Dojango Data Tables allows you to define table layout and column types in
9+
Python instead of JS or HTML. It also includes a few template tags to create
10+
HTML required for the dojo.DataGrid in a configurable manner.
11+
12+
It can also be used to generate a XLS file or CSV file out of displayed information,
13+
so you can either use it as a web UI widget or a XLS generator with Django and Dojango,
14+
or both. First, show a nice, scrollable table to the user, then let him/her download
15+
the data in preferred format.
16+
17+
dojango-datable requires [http://code.google.com/p/dojango/ dojango] and [http://www.python-excel.org/ xlwt].
18+
19+
==Installation==
20+
21+
{{{
22+
$ pip install svn+http://dojango-datable.googlecode.com/svn/trunk/
23+
}}}
24+
25+
26+
== TODO ==
27+
28+
6) save state of all filters
29+
7) save sort order of the table
30+
8) optional on-off columns
31+
9) minimal example for contrib.auth for the docs

datable/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
version = "0.9.3"

datable/core/__init__.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
"""Core, abstract classess
2+
"""
3+
4+
from datable.core.filters import *
5+
from datable.core.serializers import *
6+
from datable.core.converters import *
7+
from datable.core import formats

datable/core/converters.py

Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
from iso8601 import parse_date
2+
from datetime import date
3+
4+
class JSValueConverter:
5+
"""I convert values from and to JavaScript, both sides."""
6+
7+
def __init__(self, jsName):
8+
self.jsName = jsName
9+
10+
def existsIn(self, requestDict):
11+
if self.jsName in requestDict:
12+
return True
13+
return False
14+
15+
def valueFromJS(self, requestDict):
16+
value = requestDict.get(self.jsName, None)
17+
if value is None:
18+
return None
19+
20+
return self.convertFromJS(safe_value=value)
21+
22+
def valueToJS(self, value):
23+
if value is not None:
24+
return self.convertToJS(value)
25+
return None
26+
27+
def convertFromJS(self, safe_value):
28+
raise NotImplementedError
29+
30+
def convertToJS(self, safe_value):
31+
raise NotImplementedError
32+
33+
34+
class StringValueConverter(JSValueConverter):
35+
def convertFromJS(self, safe_value):
36+
return safe_value
37+
38+
def convertToJS(self, safe_value):
39+
return unicode(safe_value)
40+
41+
42+
class DojoComboValueConverter(StringValueConverter):
43+
def convertFromJS(self, safe_value):
44+
if not safe_value:
45+
return None
46+
47+
if safe_value[-1] == '*':
48+
return safe_value[:-1]
49+
return safe_value
50+
51+
52+
class DateTimeValueConverter(JSValueConverter):
53+
timezone = None
54+
55+
def convertToJS(self, safe_value):
56+
return safe_value.isoformat()
57+
58+
def convertFromJS(self, safe_value):
59+
return parse_date(safe_value, self.timezone)
60+
61+
62+
class DateValueConverter(JSValueConverter):
63+
def convertToJS(self, safe_value):
64+
return safe_value.strftime("%Y-%m-%d")
65+
66+
def convertFromJS(self, safe_value):
67+
try:
68+
y, m, d = safe_value.split('-', 2)
69+
except ValueError:
70+
return None
71+
72+
try:
73+
y = int(y)
74+
m = int(m)
75+
d = int(d)
76+
except (TypeError, ValueError):
77+
return None
78+
79+
return date(y, m, d)
80+
81+
82+
class BooleanConverter(JSValueConverter):
83+
def convertFromJS(self, safe_value):
84+
if safe_value == 'true':
85+
return True
86+
return False
87+
88+
def convertToJS(self, safe_value):
89+
if safe_value:
90+
return 'true'
91+
92+
if safe_value is None:
93+
return 'null'
94+
95+
return 'false'
96+
97+
98+
class IntegerConverter(JSValueConverter):
99+
def __init__(self, jsName, max=None, min=None):
100+
JSValueConverter.__init__(self, jsName)
101+
self.min = min
102+
self.max = max
103+
104+
def convertFromJS(self, safe_value):
105+
try:
106+
i = int(safe_value)
107+
except (TypeError, ValueError):
108+
return None
109+
110+
if self.min is not None:
111+
if i < self.min:
112+
return None
113+
114+
if self.max is not None:
115+
if i > self.max:
116+
return None
117+
118+
return i
119+
120+
def convertToJS(self, safe_value):
121+
return str(safe_value)

datable/core/filters.py

Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
from datetime import date
2+
from datetime import datetime
3+
4+
5+
class NoFilter:
6+
def __init__(self, field, operation=None):
7+
pass
8+
9+
def filterQuerySet(self, querySet, value):
10+
return querySet
11+
12+
class SimpleFilter:
13+
"""This is an object, which is able to filter a QuerySet
14+
using an operation. It also performs a 'cleaning' operation
15+
on the input value (the filter parameter).
16+
"""
17+
18+
operation = "eq"
19+
20+
def __init__(self, field, operation=None):
21+
self.field = field
22+
23+
if operation is not None:
24+
self.operation = operation
25+
26+
def clean(self, value):
27+
"""By default, we just return this value"""
28+
return value
29+
30+
def filterQuerySet(self, querySet, value):
31+
"""This modifies a QuerySet by filtering it, or just returns
32+
it in case there are no modifications. The value has not
33+
been cleaned yet!"""
34+
35+
if value is None:
36+
return querySet
37+
38+
safe_value = self.clean(value)
39+
40+
if safe_value is None:
41+
return querySet
42+
43+
return self.enabled(querySet, safe_value)
44+
45+
def enabled(self, querySet, safe_value):
46+
"""The filter is enabled -- we don't check anything at this point,
47+
we just want to do the filtering right now. Value has been checked
48+
to be safe & properly fomatted so we can just blindly filter
49+
the query set here.
50+
"""
51+
52+
fn = self.field
53+
if self.operation != "eq":
54+
fn = self.field + "__" + self.operation
55+
56+
kw = {fn: safe_value}
57+
return querySet.filter(**kw)
58+
59+
60+
class TypedFilter(SimpleFilter):
61+
allowedTypes = None
62+
63+
def __init__(self, field, allowedTypes=None, *args, **kw):
64+
SimpleFilter.__init__(self, field, *args, **kw)
65+
66+
if allowedTypes is not None:
67+
self.allowedTypes = allowedTypes
68+
69+
def clean(self, value):
70+
if type(value) not in self.allowedTypes:
71+
err = "Type %r not supported by this filter" % type(value)
72+
raise TypeError(err)
73+
74+
return value
75+
76+
77+
class IntegerFilter(TypedFilter):
78+
allowedTypes = [int]
79+
80+
class StringFilter(TypedFilter):
81+
allowedTypes = [unicode, str]
82+
83+
84+
class DateTimeFilter(TypedFilter):
85+
allowedTypes = [datetime, date]
86+
87+
88+
class DateFilter(TypedFilter):
89+
allowedTypes = [date]
90+
91+
92+
class BooleanFilter(TypedFilter):
93+
allowedTypes = [bool]

datable/core/formats.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
JSON = 0
2+
XLS = 1
3+
CSV = 2
4+
HTML = 3
5+
6+
_extensions = {
7+
XLS: 'xls',
8+
CSV: 'csv',
9+
HTML: 'html'
10+
}
11+
12+
13+
_mimetypes = {
14+
XLS: 'application/vnd.ms-excel',
15+
CSV: 'text/csv',
16+
HTML: 'text/html'
17+
}
18+
19+
class UnknownFormat(Exception):
20+
pass
21+
22+
23+
def getExtension(output):
24+
return _extensions.get(output)
25+
26+
27+
def getMimetype(output):
28+
return _mimetypes.get(output)

0 commit comments

Comments
 (0)