Skip to content

Commit ab745b6

Browse files
committed
Merge pull request #7 from Christophe31/master
Small update I needed (perf + queryset filtering)
2 parents ab4145b + 7dd0957 commit ab745b6

File tree

5 files changed

+43
-6
lines changed

5 files changed

+43
-6
lines changed

README.rst

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,34 @@ The ``mime`` field is the ``Content-Type`` needed for the response. ``file_ext``
188188

189189
If an export uses this format, visiting the export's view page ``/exports/<export slug>`` will offer a file download, named ``<export slug>.csv``.
190190

191+
Filtering exports
192+
~~~~~~~~~~~~~~~~~
193+
194+
To restrict entries access, you can use a class method or a static method ``export_queryset`` which will get the request object
195+
and returns the queryset of items to display.
196+
197+
::
198+
199+
from django.contrib.auth.models import User
200+
from django.db import models
201+
202+
class Client(models.Model):
203+
name = models.CharField(max_length=63)
204+
users = models.ManyToManyField(User)
205+
206+
207+
class ClientData(models.Model):
208+
client = models.ForeignKey('Client')
209+
address = models.CharField(max_length=255)
210+
money_hidden_in_the_garden = models.IntegerField()
211+
212+
@classmethod
213+
def export_queryset(cls, request):
214+
qs = cls.objects.all()
215+
if not request.user.is_superuser:
216+
qs = qs.filter(client__in=request.user.client_set.all())
217+
return qs
218+
191219

192220
Using your own views
193221
~~~~~~~~~~~~~~~~~~~~

data_exports/forms.py

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ class ExportForm(forms.ModelForm):
1010

1111
class Meta:
1212
model = Export
13+
exclude = ()
1314

1415
def __init__(self, *args, **kwargs):
1516
super(ExportForm, self).__init__(*args, **kwargs)
@@ -24,9 +25,16 @@ class ColumnForm(forms.ModelForm):
2425

2526
class Meta:
2627
model = Column
28+
exclude = ()
2729

2830

2931
class ColumnFormSet(forms.models.BaseInlineFormSet):
32+
def get_choices(self):
33+
# avoid multiple choices generation for django 1.6+
34+
if not hasattr(self, "_choices"):
35+
model = self.instance.model.model_class()
36+
self._choices = [(u'', '---------')] + get_choices(model)
37+
return self._choices
3038

3139
def add_fields(self, form, index):
3240
"""Filter the form's column choices
@@ -37,9 +45,7 @@ def add_fields(self, form, index):
3745
3846
"""
3947
super(ColumnFormSet, self).add_fields(form, index)
40-
model = self.instance.model.model_class()
41-
choices = get_choices(model)
42-
form.fields['column'].choices = [(u'', '---------')] + choices
48+
form.fields['column'].choices = self.get_choices()
4349

4450

4551
def get_choices(model, prefixes=[]):

data_exports/templates/data_exports/export_detail_csv.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
{% load i18n getter_tags %}{% if export.column_set.exists %}{% for column in export.column_set.all %}{% if column.label %}{{ column.label }}{% else %}{{ column }}{% endif %};{% endfor %}
1+
{% load i18n getter_tags %}{% if export.column_set.exists %}{% for column in export.column_set.all %}{% if column.label %}{{ column.label }}{% else %}{{ column }}{% endif %};{% endfor %}
22
{% for obj in data %}{% for column in export.column_set.all %}"{{ obj|getattribute:column.column|nice_display }}";{% endfor %}
33
{% endfor %}
44
{% else %}

data_exports/views.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,10 @@ class ExportView(DetailView):
1616
def get_context_data(self, **kwargs):
1717
context = super(ExportView, self).get_context_data(**kwargs)
1818
model = self.object.model.model_class()
19-
context['data'] = model.objects.all()
19+
qs = model.objects.all()
20+
if hasattr(model, "export_queryset"):
21+
qs = model.export_queryset(self.request)
22+
context['data'] = qs
2023
return context
2124

2225
def render_to_response(self, context, **kwargs):

tox.ini

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ commands =
77
python setup.py develop
88
coverage run --branch --source=data_exports {envbindir}/django-admin.py test --settings=data_exports.test_settings data_exports
99
coverage report --omit=data_exports/tests*,data_exports/migrations/*
10-
flake8 data_exports --exclude=migrations/
10+
flake8 data_exports --exclude=migrations
1111
deps =
1212
coverage
1313
flake8

0 commit comments

Comments
 (0)