You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

95 lines
3.1 KiB

import csv
from io import TextIOWrapper
from django.urls import reverse
from django.http import HttpResponse, HttpResponseRedirect
from django.shortcuts import render, get_object_or_404
from django.views import View
from django.views.generic import TemplateView
from django.views.generic.list import ListView
from django.contrib.auth.mixins import LoginRequiredMixin
from .permissions import SuperUserMixin
from .forms import ProjectForm
from .models import Document, Project
class IndexView(TemplateView):
template_name = 'index.html'
class ProjectView(LoginRequiredMixin, TemplateView):
def get_template_names(self):
project = get_object_or_404(Project, pk=self.kwargs['project_id'])
return [project.get_template_name()]
class ProjectsView(LoginRequiredMixin, TemplateView):
model = Project
paginate_by = 100
template_name = 'projects.html'
def get(self, request, *args, **kwargs):
form = ProjectForm()
return render(request, self.template_name, {'form': form})
def post(self, request, *args, **kwargs):
form = ProjectForm(request.POST)
if form.is_valid():
project = form.save()
return HttpResponseRedirect(reverse('upload', args=[project.id]))
else:
return render(request, self.template_name, {'form': form})
class DatasetView(SuperUserMixin, LoginRequiredMixin, ListView):
template_name = 'admin/dataset.html'
paginate_by = 5
def get_queryset(self):
project = get_object_or_404(Project, pk=self.kwargs['project_id'])
return project.documents.all()
class LabelView(SuperUserMixin, LoginRequiredMixin, TemplateView):
template_name = 'admin/label.html'
class StatsView(SuperUserMixin, LoginRequiredMixin, TemplateView):
template_name = 'admin/stats.html'
class DataUpload(SuperUserMixin, LoginRequiredMixin, TemplateView):
model = Project
template_name = 'admin/dataset_upload.html'
def post(self, request, *args, **kwargs):
project = get_object_or_404(Project, pk=kwargs.get('project_id'))
try:
form_data = TextIOWrapper(request.FILES['csv_file'].file, encoding='utf-8')
reader = csv.reader(form_data)
for line in reader:
text = line[0]
Document(text=text, project=project).save()
return HttpResponseRedirect(reverse('dataset', args=[project.id]))
except:
print("failed")
return HttpResponseRedirect(reverse('dataset-upload', args=[project.id]))
class DataDownload(SuperUserMixin, LoginRequiredMixin, View):
def get(self, request, *args, **kwargs):
project_id = self.kwargs['project_id']
project = get_object_or_404(Project, pk=project_id)
docs = project.get_documents(is_null=False).distinct()
filename = '_'.join(project.name.lower().split())
response = HttpResponse(content_type='text/csv')
response['Content-Disposition'] = 'attachment; filename="{}.csv"'.format(filename)
writer = csv.writer(response)
for d in docs:
writer.writerows(d.make_dataset())
return response