diff --git a/layerindex/urls_branch.py b/layerindex/urls_branch.py index 0e41435..2809147 100644 --- a/layerindex/urls_branch.py +++ b/layerindex/urls_branch.py @@ -7,7 +7,7 @@ from django.conf.urls import * from django.views.defaults import page_not_found from django.core.urlresolvers import reverse_lazy -from layerindex.views import LayerListView, RecipeSearchView, MachineSearchView, DistroSearchView, ClassSearchView, LayerDetailView, edit_layer_view, delete_layer_view, edit_layernote_view, delete_layernote_view, RedirectParamsView, DuplicatesView, LayerUpdateDetailView +from layerindex.views import LayerListView, RecipeSearchView, MachineSearchView, DistroSearchView, ClassSearchView, LayerDetailView, edit_layer_view, delete_layer_view, edit_layernote_view, delete_layernote_view, RedirectParamsView, DuplicatesView, LayerUpdateDetailView, layer_export_recipes_csv_view urlpatterns = [ url(r'^$', @@ -20,6 +20,9 @@ urlpatterns = [ LayerDetailView.as_view( template_name='layerindex/detail.html'), name='layer_item'), + url(r'^layer/(?P[-\w]+)/recipes/csv/$', + layer_export_recipes_csv_view, + name='layer_export_recipes_csv'), url(r'^recipes/$', RecipeSearchView.as_view( template_name='layerindex/recipes.html'), diff --git a/layerindex/views.py b/layerindex/views.py index 0b3345a..a905c34 100644 --- a/layerindex/views.py +++ b/layerindex/views.py @@ -1025,3 +1025,25 @@ class StatsView(TemplateView): machine_count=Count('layerbranch__machine', distinct=True), distro_count=Count('layerbranch__distro', distinct=True)) return context + + +def layer_export_recipes_csv_view(request, branch, slug): + import csv + layer = get_object_or_404(LayerItem, name=slug) + layerbranch = layer.get_layerbranch(branch) + + response = HttpResponse(content_type='text/csv') + response['Content-Disposition'] = 'attachment; filename="recipes_%s_%s.csv"' % (layer.name, layerbranch.branch.name) + + fieldlist = request.GET.get('fields', 'pn,pv,license').split(',') + recipe_fields = [f.name for f in Recipe._meta.get_fields() if not (f.auto_created and f.is_relation)] + for field in fieldlist: + if field not in recipe_fields: + return HttpResponse('Field %s is invalid' % field) + + writer = csv.writer(response) + for recipe in layerbranch.sorted_recipes(): + values = [getattr(recipe, field) for field in fieldlist] + writer.writerow(values) + + return response diff --git a/templates/layerindex/detail.html b/templates/layerindex/detail.html index 97363d5..b68234f 100644 --- a/templates/layerindex/detail.html +++ b/templates/layerindex/detail.html @@ -210,13 +210,13 @@