Skip to content

Commit

Permalink
Uploading a csv
Browse files Browse the repository at this point in the history
  • Loading branch information
Felipe Álvarez committed Sep 24, 2015
1 parent e380184 commit d89789e
Show file tree
Hide file tree
Showing 7 changed files with 163 additions and 10 deletions.
16 changes: 16 additions & 0 deletions backend/forms.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
from django import forms
from promises_instances.csv_loader import DDAHCSVProcessor


class CSVUploadForm(forms.Form):
csv_file = forms.FileField()

def __init__(self, instance, *args, **kwargs):
self.instance = instance
return super(CSVUploadForm, self).__init__(*args, **kwargs)

def upload(self):
file_ = self.cleaned_data['csv_file']

processor = DDAHCSVProcessor(file_, self.instance)
processor.work()
8 changes: 8 additions & 0 deletions backend/templates/csv_upload.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
<form enctype="multipart/form-data" class="uniForm" id="wayfinder_map_form" method="POST" action="">

{{form.errors}}
{{ form.non_field_errors }}

{{form.as_p}}
{% csrf_token %}
</form>
15 changes: 15 additions & 0 deletions backend/templates/instance_detail.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
The instance {{instance}}

<div>
{% for category in instance.categories.all %}
<div>
<h2>{{category.name}}</h2>
{% for promise in category.promises.all %}
<div>
{{promise.name}}
</div>
{% endfor %}
</div>
{% endfor %}

</div>
63 changes: 63 additions & 0 deletions backend/tests/login_tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,11 @@
from ddah_web.models import DDAHInstanceWeb
from django.test.utils import override_settings
from django.conf import settings
from backend.forms import CSVUploadForm
import codecs
import os
from django.core.files.uploadedfile import SimpleUploadedFile


PASSWORD = 'feroz'
@override_settings(ROOT_URLCONF=settings.ROOT_URLCONF_HOST)
Expand All @@ -26,3 +31,61 @@ def test_get_home(self):
self.assertEquals(response.status_code, 200)
self.assertEquals(response.context['instances'][0], self.instance)
self.assertEquals(len(response.context['instances']), 1)

def test_get_instance_view(self):
url = reverse('backend:instance', kwargs={'slug': self.instance.label})
response = self.client.get(url)
self.assertRedirects(response, reverse('login') + '?next=' + url)
self.client.login(username=self.user.username, password=PASSWORD)
response = self.client.get(url)
self.assertEquals(response.status_code, 200)
self.assertEquals(response.context['instance'], self.instance)
url = reverse('backend:instance', kwargs={'slug': self.instance2.label})
response = self.client.get(url)
self.assertEquals(response.status_code, 401)


@override_settings(ROOT_URLCONF=settings.ROOT_URLCONF_HOST)
class CSVUploadTestCase(TestCase):
def setUp(self):
self.user = User.objects.create_user(username="fiera", password=PASSWORD)
self.other_user = User.objects.create_user(username="benito", password=PASSWORD)
self.instance = DDAHInstanceWeb.objects.create(label='label', title='the title')
self.instance2 = DDAHInstanceWeb.objects.create(label='label2', title='the title2')
self.instance.users.add(self.user)
self.instance2.users.add(self.other_user)
self.current_dir = os.path.dirname(os.path.realpath(__file__))
self.file_ = codecs.open(os.path.join(self.current_dir,'../../promises_instances/tests', 'fixtures', 'example_data.csv'))


def atest_form(self):
form = CSVUploadForm(instance=self.instance)
file_ = codecs.open(os.path.join(self.current_dir,'../../promises_instances/tests', 'fixtures', 'example_data.csv'))
form.csv_file = file_
self.assertTrue(form.is_valid())
form.upload()
self.assertTrue(self.instance.promises.all())
self.assertTrue(self.instance.categories.all())

def test_get_csv_upload_view(self):
url = reverse('backend:csv_upload', kwargs={'slug': self.instance.label})
response = self.client.get(url)
self.assertRedirects(response, reverse('login') + '?next=' + url)
self.client.login(username=self.user.username, password=PASSWORD)
response = self.client.get(url)
self.assertEquals(response.status_code, 200)
self.assertIsInstance(response.context['form'], CSVUploadForm)

def test_post_csv_upload_view(self):
url = reverse('backend:csv_upload', kwargs={'slug': self.instance.label})
response = self.client.post(url, {'file': self.file_})
self.assertRedirects(response, reverse('login') + '?next=' + url)
self.client.login(username=self.user.username, password=PASSWORD)
file_ = codecs.open(os.path.join(self.current_dir,'../../promises_instances/tests', 'fixtures', 'example_data.csv'))
data = {'csv_file': file_}

response = self.client.post(url, data)
self.assertRedirects(response, reverse('backend:instance', kwargs={'slug': self.instance.label}))
self.assertTrue(self.instance.promises.all())
self.assertTrue(self.instance.categories.all())

6 changes: 4 additions & 2 deletions backend/urls.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
from django.conf.urls import patterns, url
from ddah_web.views import DDAHInstanceWebView, DDAHInstanceWebJSONView, FlatPageView
from django.http import HttpResponse
from .views import BackendHomeView
from .views import BackendHomeView, InstanceDetailView, CSVUploadView


urlpatterns = patterns('',
url(r'^hola/?$', BackendHomeView.as_view(), name='home'),
url(r'^/?$', BackendHomeView.as_view(), name='home'),
url(r'^detail/(?P<slug>[\w-]+)/?$', InstanceDetailView.as_view(), name='instance'),
url(r'^detail/(?P<slug>[\w-]+)/upload/?$', CSVUploadView.as_view(), name='csv_upload'),
)
64 changes: 57 additions & 7 deletions backend/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,18 +2,68 @@
from ddah_web.models import DDAHInstanceWeb
from django.contrib.auth.decorators import login_required
from django.utils.decorators import method_decorator
from django.views.generic.detail import DetailView
from django.views.generic.base import View
from django.http import HttpResponse
from django.views.generic.edit import FormView
from backend.forms import CSVUploadForm
from django.shortcuts import get_object_or_404
from django.core.urlresolvers import reverse

# Create your views here.
class BackendHomeView(ListView):
model = DDAHInstanceWeb
template_name = 'home.html'
context_object_name = 'instances'

class BackendBase(View):
@method_decorator(login_required)
def dispatch(self, *args, **kwargs):
return super(BackendBase, self).dispatch(*args, **kwargs)


class InstanceBase(View):
@method_decorator(login_required)
def dispatch(self, *args, **kwargs):
return super(BackendHomeView, self).dispatch(*args, **kwargs)
# if self.request.user not in
instance = self.get_object()
if self.request.user not in instance.users.all():
return HttpResponse('Unauthorized', status=401)
return super(InstanceBase, self).dispatch(*args, **kwargs)


class BackendHomeView(ListView, BackendBase):
model = DDAHInstanceWeb
template_name = 'home.html'
context_object_name = 'instances'

def get_queryset(self):
qs = super(BackendHomeView, self).get_queryset()
qs = qs.filter(users=self.request.user)
return qs
return qs


class InstanceDetailView(DetailView, InstanceBase):
model = DDAHInstanceWeb
template_name = 'instance_detail.html'
context_object_name = 'instance'
slug_field = 'label'


class CSVUploadView(FormView, InstanceBase):
template_name = 'csv_upload.html'
form_class = CSVUploadForm

@method_decorator(login_required)
def dispatch(self, *args, **kwargs):
self.instance = get_object_or_404(DDAHInstanceWeb, label=self.kwargs['slug'])
if self.request.user not in self.instance.users.all():
return HttpResponse('Unauthorized', status=401)
return super(InstanceBase, self).dispatch(*args, **kwargs)

def get_form_kwargs(self):
kwargs = super(CSVUploadView, self).get_form_kwargs()
kwargs.update({'instance': self.instance})
return kwargs

def form_valid(self, form):
form.upload()
return super(CSVUploadView, self).form_valid(form)

def get_success_url(self):
return reverse('backend:instance', kwargs={'slug': self.instance.label})
1 change: 0 additions & 1 deletion project_site/non_subdomain_urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@
)


# Your other patterns here
urlpatterns += [
url(r'^accounts/', include('django.contrib.auth.urls')),
url(r'^pages/', include('django.contrib.flatpages.urls')),
Expand Down

0 comments on commit d89789e

Please sign in to comment.