From 2749a8a6b8bf88114283541fca293c0da25e284d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Miko=C5=82ajczyk?= Date: Wed, 21 Mar 2012 13:16:27 +0100 Subject: [PATCH] Few updates, mongodb support, still no docs ;) --- grid/__init__.py | 116 ++++++++++++++++-- grid/templates/grid/header.html | 20 +++ .../templates}/grid/object_list.html | 19 ++- grid/templates/grid/object_list_poczta.html | 60 +++++++++ .../templates}/grid/paginator.html | 20 ++- grid/templates/grid/row.html | 17 +++ grid/templatetags/dict.py | 41 ++++++- grid/templatetags/list.py | 8 ++ grid/templatetags/meta.py | 8 ++ grid/templatetags/request.py | 8 +- templates/grid/row.html | 6 - 11 files changed, 284 insertions(+), 39 deletions(-) mode change 100644 => 100755 grid/__init__.py create mode 100755 grid/templates/grid/header.html rename {templates => grid/templates}/grid/object_list.html (61%) mode change 100644 => 100755 create mode 100755 grid/templates/grid/object_list_poczta.html rename {templates => grid/templates}/grid/paginator.html (60%) mode change 100644 => 100755 create mode 100644 grid/templates/grid/row.html mode change 100644 => 100755 grid/templatetags/dict.py create mode 100644 grid/templatetags/list.py create mode 100644 grid/templatetags/meta.py delete mode 100644 templates/grid/row.html diff --git a/grid/__init__.py b/grid/__init__.py old mode 100644 new mode 100755 index b9687fa..70b93f0 --- a/grid/__init__.py +++ b/grid/__init__.py @@ -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): @@ -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) @@ -39,17 +44,16 @@ 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: @@ -57,9 +61,34 @@ def __init__(self, request, per_page = 50, queryset = None, order_by = None): 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): @@ -74,4 +103,67 @@ def url(self): url = self.request.get_full_path() if not self.request.GET: url += "?" - return url \ No newline at end of file + 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 \ No newline at end of file diff --git a/grid/templates/grid/header.html b/grid/templates/grid/header.html new file mode 100755 index 0000000..ad6f0bd --- /dev/null +++ b/grid/templates/grid/header.html @@ -0,0 +1,20 @@ +{% for col in grid.columns %} +{% load dict %} + + {% if col.colname == "__delete__" %} + + {% else %} + {% if col.sortable %} + + {{ col.label }} + + {% else %} + {{ col.label }} + {% endif %} + {% endif %} + +{% endfor %} diff --git a/templates/grid/object_list.html b/grid/templates/grid/object_list.html old mode 100644 new mode 100755 similarity index 61% rename from templates/grid/object_list.html rename to grid/templates/grid/object_list.html index 4132d66..fea471d --- a/templates/grid/object_list.html +++ b/grid/templates/grid/object_list.html @@ -1,16 +1,13 @@
- + {% if title %} +
+
{{ title }}
+
+ {% endif %} +
- {% for col in grid.columns %} - - {% endfor %} + {% include header_template|default:"grid/header.html" %} @@ -29,4 +26,6 @@ {% if grid.paginator.num_pages > 1 %} {% include paginator_template|default:"grid/paginator.html" %} {% endif %} + + \ No newline at end of file diff --git a/grid/templates/grid/object_list_poczta.html b/grid/templates/grid/object_list_poczta.html new file mode 100755 index 0000000..2fb57ef --- /dev/null +++ b/grid/templates/grid/object_list_poczta.html @@ -0,0 +1,60 @@ +
+ {% if title %} +
+
{{ title }}
+
+{% endif %} +
+
- {% if col.sortable %} - {{ col.label }} - {% else %} - {{ col.label }} - {% endif %} -
+ + + {% include header_template|default:"grid/header.html" %} + + +
+
+
+ + + {% if grid.page.object_list %} + {% for row in grid.page.object_list %} + {% include row_template|default:"grid/row.html" %} + {% endfor %} + {% else %} + + + + {% endif %} + +
Brak rekordów do wyświetlenia
+
+ {% if grid.paginator.num_pages > 1 %} + {% include paginator_template|default:"grid/paginator.html" %} +{% endif %} + + + + {% if foldery %} + + + + + + + {% else %} + + + + + + {% endif %} + +
+
+
+
+ +
+
+ + \ No newline at end of file diff --git a/templates/grid/paginator.html b/grid/templates/grid/paginator.html old mode 100644 new mode 100755 similarity index 60% rename from templates/grid/paginator.html rename to grid/templates/grid/paginator.html index 984dc7e..727cc17 --- a/templates/grid/paginator.html +++ b/grid/templates/grid/paginator.html @@ -1,4 +1,6 @@ {% load request %} +{% load list %} +{% load admin_list %}