Skip to content

Commit

Permalink
Few updates, mongodb support, still no docs ;)
Browse files Browse the repository at this point in the history
  • Loading branch information
Mateusz Mikołajczyk committed Mar 21, 2012
1 parent 248f186 commit 2749a8a
Show file tree
Hide file tree
Showing 11 changed files with 284 additions and 39 deletions.
116 changes: 104 additions & 12 deletions grid/__init__.py 100644 → 100755
@@ -1,4 +1,6 @@
#-*- coding: utf-8 -*-
from django.core.paginator import Paginator
from django.db import models

class GridColumn(object):
def __init__(self, request, colname, label, is_sortable = False):
Expand Down Expand Up @@ -26,6 +28,9 @@ def __init__(self, request, per_page = 50, queryset = None, order_by = None):
self.request = request
self.queryset = queryset
self._paginator = None
self.custom_columns = {}
self.pageno = int(request.GET.get("page", 1))
self.adjacent_pages = 5

meta = getattr(self, "Meta", None)

Expand All @@ -39,27 +44,51 @@ def __init__(self, request, per_page = 50, queryset = None, order_by = None):
sortable = getattr(meta, "sortable", ())
nonsortable = getattr(meta, "nonsortable", ())
_model_columns = meta.model._meta.get_all_field_names()
##
# Autor: Toudi
##
self._model_columns = _model_columns
self.meta = meta
self.sortable = sortable
self.nonsortable = nonsortable
_columns = getattr(meta, "columns", _model_columns)
for col in _columns:
col_sortable = False
label = col
if col in _model_columns:
label = meta.model._meta.get_field(col).verbose_name
col_sortable = True
if sortable or nonsortable:
if col in nonsortable or (sortable and col not in sortable):
col_sortable = False
self._columns.append(GridColumn(request, col, label, col_sortable))
self.custom_columns = getattr(meta, "custom_columns", {})
self.setColumns(_columns)

self.queryset = queryset
if order:
self.queryset = self.queryset.order_by(order)

self._paginator = Paginator(self.queryset.all(), per_page)

##
# Autor: Toudi
##
def setColumns(self, _columns = []):
self._columns = []
for col in _columns:
col_sortable = False
if type(col) == str or type(col) == unicode:
label = col
if col in self._model_columns:
label = self.meta.model._meta.get_field(col).verbose_name
col_sortable = True
if self.sortable or self.nonsortable:
if col in self.nonsortable or (self.sortable and col not in self.sortable):
col_sortable = False
else:
label = col[1]
col = col[0]
self._columns.append(GridColumn(self.request, col, label, col_sortable))


@property
def order(self):
return self.request.GET.get("order", None)

@property
def page(self):
return self._paginator.page(self.request.GET.get("page", 1))
return self._paginator.page(self.pageno)

@property
def paginator(self):
Expand All @@ -74,4 +103,67 @@ def url(self):
url = self.request.get_full_path()
if not self.request.GET:
url += "?"
return url
return url

@property
def paginator_page_range(self):
start_page = max(self.pageno - self.adjacent_pages, 1)
end_page = min((self.page.number + self.adjacent_pages), self.paginator.num_pages)

return [n for n in range(start_page, end_page + 1)]

@property
def paginator_show_first(self):
return 1 not in self.paginator_page_range

@property
def paginator_show_last(self):
return self.paginator.num_pages not in self.paginator_page_range

class MongoGrid(Grid):

def __init__(self, request, per_page = 50, queryset = None, order_by = None, filtr = None, skip = False):
self.request = request
self.per_page = per_page
self._columns = []
self.skip = skip
findParams = {}
order = self.request.GET.get("order", order_by)
queryset = queryset.find(filtr)
self.pageno = int(request.GET.get("page", 1))
self.adjacent_pages = 5
#print(filtr)
if order:
import pymongo
order = order.split("-")
order_dir = pymongo.ASCENDING
if len(order) > 1:
order_dir = pymongo.DESCENDING
queryset = queryset.sort(order[-1], order_dir)
self.queryset = queryset

def setColumns(self, columns):
from copy import copy
for column in columns:
col = column
if type(col) == str or type(col) == unicode:
label = col
else:
label = col[1]
col = col[0]
self._columns.append(GridColumn(self.request, col, label, True))
query_count = copy(self.queryset)
page = self.pageno - 1
if self.skip:
objects = self.queryset#.limit(self.per_page).skip(page*self.per_page)
else:
objects = self.queryset.limit(self.per_page).skip(page*self.per_page)
self.objects = [o for o in objects]
self._paginator = Paginator(self.objects, self.per_page)
self._paginator._count = query_count.count()

@property
def page(self):
page = self._paginator.page(self.pageno)
page.object_list = self.objects
return page
20 changes: 20 additions & 0 deletions grid/templates/grid/header.html
@@ -0,0 +1,20 @@
{% for col in grid.columns %}
{% load dict %}
<th{% if col.colname == "__delete__" %} width="5%"{% endif %}>
{% if col.colname == "__delete__" %}
<input type="submit" name="{{ deletesubmit|default:"delete" }}" value="{{ col.label }}" />
{% else %}
{% if col.sortable %}
<a href="{{ grid.request.path }}?order={{ col.order }}&page={{ grid.page.number }}" class="sort-column"
{% if grid.order|check_order:col.colname %}
style="text-decoration: underline; {{ grid.order|check_order_by }}"
{% endif %}
>
{{ col.label }}
</a>
{% else %}
{{ col.label }}
{% endif %}
{% endif %}
</th>
{% endfor %}
19 changes: 9 additions & 10 deletions templates/grid/object_list.html → grid/templates/grid/object_list.html 100644 → 100755
@@ -1,16 +1,13 @@
<div class="table">
<table>
{% if title %}
<div class="title">
<h5>{{ title }}</h5>
</div>
{% endif %}
<table class="grid">
<thead>
<tr>
{% for col in grid.columns %}
<th>
{% if col.sortable %}
<a href="{{ grid.request.path }}?order={{ col.order }}&page={{ grid.page.number }}">{{ col.label }}</a>
{% else %}
{{ col.label }}
{% endif %}
</th>
{% endfor %}
{% include header_template|default:"grid/header.html" %}
</tr>
</thead>
<tbody>
Expand All @@ -29,4 +26,6 @@
{% if grid.paginator.num_pages > 1 %}
{% include paginator_template|default:"grid/paginator.html" %}
{% endif %}


</div>
60 changes: 60 additions & 0 deletions grid/templates/grid/object_list_poczta.html
@@ -0,0 +1,60 @@
<div class="table">
{% if title %}
<div class="title">
<h5>{{ title }}</h5>
</div>
{% endif %}
<div>
<table class="grid" style="border-right: 15px solid white;">
<thead>
<tr>
{% include header_template|default:"grid/header.html" %}
</tr>
</thead>
</table>
</div>
<div style="overflow-y: scroll; max-height: 350px; border: solid 1px; border-color: #EEE">
<table class="grid">
<tbody>
{% if grid.page.object_list %}
{% for row in grid.page.object_list %}
{% include row_template|default:"grid/row.html" %}
{% endfor %}
{% else %}
<tr>
<td colspan="{{ grid.columns|length }}" align="center">Brak rekordów do wyświetlenia</td>
</tr>
{% endif %}
</tbody>
</table>
</div>
{% if grid.paginator.num_pages > 1 %}
{% include paginator_template|default:"grid/paginator.html" %}
{% endif %}

<table style="margin-top:5px;width: 150px">
<tr class=d0>
{% if foldery %}

<td style="width: 20px"><input type="submit" onclick="$('#maile_form').attr('target', '_self');" value="" title="Usuń wiadomości" name="usun" style="background: url('{{ STATIC_URL }}resources/images/poczta/usun.png');background-repeat:no-repeat; width: 28px; height: 26px; border:0; cursor: pointer;"/></td>
<td style="width: 20px"><input type="submit" onclick="$('#maile_form').attr('target', '_self');" value="" name="odpowiedz" title="Odpowiedz" style="background: url('{{ STATIC_URL }}resources/images/poczta/odp.png');background-repeat:no-repeat; width: 28px; height: 26px; border:0; cursor: pointer"/></td>
<td style="width: 20px"><input type="submit" onclick="$('#maile_form').attr('target', '_self');" value="" name="odpowiedz_w" title="Odpowiedz wszystkim" style="background: url('{{ STATIC_URL }}resources/images/poczta/odp_w.png');background-repeat:no-repeat; width: 28px; height: 26px; border:0; cursor: pointer"/></td>
<td style="width: 20px"><input type="submit" onclick="$('#maile_form').attr('target', '_self');" value="" name="przekaz" title="Przekaż dalej" style="background: url('{{ STATIC_URL }}resources/images/poczta/przekaz.png');background-repeat:no-repeat; width: 32px; height: 26px; border:0; cursor: pointer"/></th>
<td style="width: 20px"><input type="submit" onclick="$('#maile_form').attr('target', '_self');" value="" name="dodaj_kontakt" title="Dodaj kontakt z maila" style="background: url('{{ STATIC_URL }}resources/images/poczta/dodaj_kontakt.png');background-repeat:no-repeat; width: 33px; height: 26px; border:0; cursor: pointer"/></td>
<td><a id="druk_but" title="Drukuj wiadomość" target="_blank"><img src="{{ STATIC_URL }}resources/images/poczta/drukuj.png"></a></td>
{% else %}
<td><img src="{{ STATIC_URL }}resources/images/poczta/usun_nie.png"></td>
<td><img src="{{ STATIC_URL }}resources/images/poczta/odp_nie.png"></td>
<td><img src="{{ STATIC_URL }}resources/images/poczta/odp_w_nie.png"></td>
<td><img src="{{ STATIC_URL }}resources/images/poczta/przekaz_nie.png"></td>
<td><img src="{{ STATIC_URL }}resources/images/poczta/dodaj_kontakt_nie.png"></td>
{% endif %}
</tr>
</table>
<div style="border: solid 1px; max-height: 350px; padding: 5px; border-color: #EEE">
<div id="tresc_wiadomosci">
<iframe id="myframe" name="myframe" class="autoHeigh" scrolling="auto" frameborder="0" src="" style="width: 100%; height: 350px"></iframe>
</div>
</div>

</div>
20 changes: 16 additions & 4 deletions templates/grid/paginator.html → grid/templates/grid/paginator.html 100644 → 100755
@@ -1,4 +1,6 @@
{% load request %}
{% load list %}
{% load admin_list %}
<div class="pagination pagination-left">
<div class="results">
<span>Wyniki od {{ grid.page.start_index }} do {{ grid.page.end_index }} z {{ grid.paginator.count }}</span>
Expand All @@ -7,14 +9,24 @@
{% if grid.page.has_previous %}
<li><a href="{{ request.path }}?{{ request.GET|page:grid.page.previous_page_number }}" title="Poprzednia">&laquo; Poprzednia</a></li>
{% endif %}
{% for pagenum in grid.paginator.page_range %}

{% if grid.paginator_show_first %}
<li><a href="{{ request.path }}?{{ request.GET|page:1}}" title="Pierwsza">1</a></li>
<li><a href="#">...</a></li>
{% endif %}


{% for pagenum in grid.paginator_page_range %}
{% ifequal pagenum grid.page.number %}
<li class="current">{{ pagenum }}</li>
{% else %}
{% else %}
<li><a href="{{ request.path }}?{{ request.GET|page:pagenum}}" title="Strona {{pagenum}}">{{pagenum}}</a></li>
{% endifequal %}
{% endifequal %}
{% endfor %}

{% if grid.paginator_show_last %}
<li><a href="#">...</a></li>
<li><a href="{{ request.path }}?{{ request.GET|page:grid.paginator.num_pages}}" title="Ostatnia">{{ grid.paginator.num_pages }}</a></li>
{% endif %}
{% if grid.page.has_next %}
<li><a href="{{ request.path }}?{{ request.GET|page:grid.page.next_page_number}}" title="Kolejna">Kolejna &raquo;</a></li>
{% endif %}
Expand Down
17 changes: 17 additions & 0 deletions grid/templates/grid/row.html
@@ -0,0 +1,17 @@
{% load dict %}
<tr>
{% for col in grid.columns %}

{% if grid.custom_columns|contains:col.colname %}
{% include grid.custom_columns|get:col.colname %}
{% else %}
<td>
{% if col.colname == "__delete__" %}
<input type="checkbox" name="{{ deletename|default:"id" }}" value="{% if deletename %}{{ row|get:deletename }}{% else %}{{ row|get:"id" }}{% endif %}" />
{% else %}
{{ row|get:col.colname|default:"" }}
{% endif %}
</td>
{% endif %}
{% endfor %}
</tr>
41 changes: 35 additions & 6 deletions grid/templatetags/dict.py 100644 → 100755
Expand Up @@ -2,14 +2,43 @@

register = Library()

def get(dict, key):
if type(dict) == dict:
if dict.has_key(key):
return dict[key]
def get(_dict, key):
if type(_dict) == dict:
if _dict.has_key(key):
return _dict[key]
else:
if hasattr(dict, key):
return getattr(dict, key)
if hasattr(_dict, key):
return getattr(_dict, key)

return None

def dict_contains(what, attribute):
if type(what) == dict:
return what.has_key(attribute)
return False

def get_string_id(id):
return str(id)

def getattr_filter(obj, attr):
return getattr(obj, attr)

def check_order(val, col):
if val==col or val=="-"+col:
return True
else:
return False

def check_order_by(val):
try:
s = val.split("-")[1]
return "background: url(/static/resources/images/toggle-collapse-dark.png) right no-repeat !important;"
except:
return "background: url(/static/resources/images/toggle-collapse-dark_asc.png) right no-repeat !important;"

register.filter("contains", dict_contains)
register.filter(get)
register.filter(check_order)
register.filter(check_order_by)
register.filter(get_string_id)
register.filter("getattr", getattr_filter)
8 changes: 8 additions & 0 deletions grid/templatetags/list.py
@@ -0,0 +1,8 @@
from django.template import Library

register = Library()

def limit(_list, howmany):
return _list[:howmany]

register.filter(limit)
8 changes: 8 additions & 0 deletions grid/templatetags/meta.py
@@ -0,0 +1,8 @@
from django.template import Library

register = Library()

def get_verbose_name(meta, field):
return meta.get_field(field).verbose_name

register.filter(get_verbose_name)

0 comments on commit 2749a8a

Please sign in to comment.