From 93aeb6df03ba24cde130d7c36e41a2e9990692a0 Mon Sep 17 00:00:00 2001 From: Andrew Williams Date: Wed, 6 Jun 2012 22:49:06 +0100 Subject: [PATCH] Convert CSV download to CBV, cleaned up base.py --- app/eve_api/urls.py | 4 ++-- app/eve_api/views/base.py | 42 ++++++++++++++++++++----------------- app/eve_api/views/mixins.py | 4 ++-- 3 files changed, 27 insertions(+), 23 deletions(-) diff --git a/app/eve_api/urls.py b/app/eve_api/urls.py index 207a8bc..32bd540 100644 --- a/app/eve_api/urls.py +++ b/app/eve_api/urls.py @@ -10,13 +10,13 @@ urlpatterns = patterns('', url(r'^eveapi/delete/(?P\d+)/$', login_required(views.EVEAPIDeleteView.as_view()), name="eveapi-delete"), url(r'^eveapi/refresh/(?P\d+)/$', login_required(views.EVEAPIRefreshView.as_view()), name="eveapi-refresh"), url(r'^eveapi/log/(?P\d+)/$', login_required(views.EVEAPILogView.as_view()), name="eveapi-log"), - url(r'^eveapi/access/(?P\d+)/$', login_required(views.EVEAPIAccessView.as_view()), name="eveapi-accessview"), + url(r'^eveapi/access/(?P\d+)/$', login_required(views.EVEAPIAccessView.as_view()), name="eveapi-accessview"), url(r'^character/list/$', login_required(views.EVEAPICharacterListView.as_view()), name="eveapi-characters-list"), url(r'^character/(?P\d+)/$', login_required(views.EVEAPICharacterDetailView.as_view()), name="eveapi-character"), url(r'^corporation/(?P\d+)/$', login_required(views.EVEAPICorporationView.as_view()), name="eveapi-corporation"), - url(r'^corporation/(?P\d+)/export/$', views.eveapi_corporation_members_csv, name="eveapi-corporation-members-csv"), + url(r'^corporation/(?P\d+)/export/$', login_required(views.EVEAPICorporationMembersCSV.as_view()), name="eveapi-corporation-members-csv"), url(r'^alliance/(?P\d+)/$', login_required(views.EVEAPIAllianceView.as_view()), name="eveapi-alliance"), ) diff --git a/app/eve_api/views/base.py b/app/eve_api/views/base.py index f487b0d..e10c6f0 100644 --- a/app/eve_api/views/base.py +++ b/app/eve_api/views/base.py @@ -20,7 +20,7 @@ from eve_api.forms import EVEAPIForm from eve_api.models import EVEAccount, EVEPlayerCharacter, EVEPlayerCorporation, EVEPlayerAlliance from eve_api.tasks import import_apikey_result from eve_api.utils import basic_xml_parse_doc -from eve_api.views.mixins import DetailPaginationMixin +from eve_api.views.mixins import DetailPaginationMixin, CSVResponseMixin class EVEAPICreateView(CreateView): @@ -116,9 +116,9 @@ class EVEAPIDeleteView(DeleteView): class EVEAPIRefreshView(SingleObjectMixin, View): """Force a refresh of a EVE API key, accepts requests via AJAX or normal requests""" - + model = EVEAccount - + def get(self, request, *args, **kwargs): self.object = self.get_object() if self.object.user != self.request.user and not request.user.is_superuser: @@ -132,11 +132,11 @@ class EVEAPIRefreshView(SingleObjectMixin, View): ret = [] if acc: ret = [acc] - return HttpResponse(serializers.serialize('json', ret), mimetype='application/javascript') + return HttpResponse(serializers.serialize('json', ret), mimetype='application/javascript') else: messages.add_message(self.request, messages.INFO, "Key %s has been queued to be refreshed from the API" % acc.api_user_id) - return HttpResponseRedirect('/') - + return HttpResponseRedirect('/') + class EVEAPILogView(ListView): """Shows EVE API access log for a particular API key""" @@ -232,22 +232,27 @@ class EVEAPICorporationView(DetailPaginationMixin, DetailView): return ctx -@login_required -def eveapi_corporation_members_csv(request, corporationid): +class EVEAPICorporationMembersCSV(SingleObjectMixin, CSVResponseMixin, View): - corporation = get_object_or_404(EVEPlayerCorporation, id=corporationid) - if not corporation.eveplayercharacter_set.filter(eveaccount__user=request.user, roles__name="roleDirector").count() and not request.user.is_superuser: - return HttpResponseForbidden() + model = EVEPlayerCorporation - response = HttpResponse(mimetype='text/csv') - response['Content-Disposition'] = 'attachment; filename=%s-members_export.csv' % corporation.id + def get(self, request, *args, **kwargs): + self.object = self.get_object() + if not self.object.eveplayercharacter_set.filter(eveaccount__user=request.user, roles__name="roleDirector").count() and not request.user.is_superuser: + return HttpResponseForbidden() + return super(EVEAPICorporationMembersCSV, self).get(request, *args, **kwargs) - writer = csv.writer(response) - writer.writerow(['Name', 'Skillpoints', 'Join Date', 'Last Login', 'Director?', 'Roles?', 'API Key?']) - for char in corporation.eveplayercharacter_set.all(): - writer.writerow([char.name, char.total_sp, char.corporation_date, char.last_login, char.director, char.roles.count(), char.eveaccount_set.all().count()]) + def get_csv_headers(self): + return ['Name', 'Skillpoints', 'Join Date', 'Last Login', 'Director?', 'Roles?', 'API Key?'] - return response + def get_csv_data(self): + data = [] + for char in self.object.eveplayercharacter_set.all(): + data.append([char.name, char.total_sp, char.corporation_date, char.last_login, char.director, char.roles.count(), char.eveaccount_set.all().count()]) + return data + + def get_filename(self): + return "%s-members_export.csv" % self.object.pk class EVEAPIAllianceView(DetailPaginationMixin, DetailView): @@ -273,7 +278,6 @@ class EVEAPIAccessView(DetailView): model = EVEAccount template_name = 'eve_api/accessview.html' - slug_field = 'api_user_id' @staticmethod def lowestSet(int_type): diff --git a/app/eve_api/views/mixins.py b/app/eve_api/views/mixins.py index 3b2233e..bcbcc46 100644 --- a/app/eve_api/views/mixins.py +++ b/app/eve_api/views/mixins.py @@ -45,8 +45,8 @@ class CSVResponseMixin(object): w.writerow(headings) # Rows - for row in self.data: - row = [unicode(c).encode(charset, 'replace') for c in row.values()] + for row in self.get_csv_data(): + row = [unicode(c).encode(charset, 'replace') for c in row] w.writerow(row) # Done