ojuso-map/apps/map/views.py

206 lines
5.7 KiB
Python
Raw Normal View History

import json
from django.conf import settings
from django.contrib.auth.mixins import LoginRequiredMixin
from django.core.mail import send_mail
from django.db.models import Q
from django.http import Http404, HttpResponse
from django.urls import reverse
2018-04-14 02:40:42 +00:00
from django.views import View
from django.views.generic import DetailView
from django.views.generic.base import TemplateView
2017-10-09 23:58:36 +00:00
from django.views.generic.edit import CreateView
from dal import autocomplete
from apps.files.models import File
from .models import CaseStudy, CaseStudyDraft, SpatialRefSys, PointOfInterest
from .forms import ShortCaseStudyForm, LongCaseStudyForm, PointOfInterest
2018-04-14 02:40:42 +00:00
NOTIFY_MESSAGE = """
Hello,
Someone has submitted a new case study to the Ojuso website. Please
follow the below link to look over and approve it:
%s%s
Case Study Robot
"""
2017-06-16 16:06:22 +00:00
class Map(TemplateView):
template_name = "map/index.html"
2017-06-16 16:06:22 +00:00
class Create(LoginRequiredMixin, TemplateView):
template_name = "map/form-selector.html"
2017-06-16 16:06:22 +00:00
class PointOfInterest(LoginRequiredMixin, CreateView):
"""View for base case study form."""
template_name = 'map/form-poi.html'
success_url = '/case-study/create/success/'
model = PointOfInterest
form_class = PointOfInterest
2017-10-09 23:58:36 +00:00
class BaseForm(LoginRequiredMixin, CreateView):
"""View for base case study form."""
template_name = 'map/form-case_study.html'
success_url = '/case-study/create/success/'
2017-10-09 23:58:36 +00:00
model = CaseStudy
def send_email(self):
"""Sends email to moderator to approve case study."""
send_mail(
'New case study submitted',
NOTIFY_MESSAGE % (
settings.SITE_URL,
reverse('admin:map_casestudy_change', args=[self.object.id])
),
'noreply@ojuso.org',
[settings.DATABASE_EMAIL],
fail_silently=False,
)
def form_valid(self, form):
form.cleaned_data.pop('official_project_documents', None)
form.cleaned_data.pop('other_documents', None)
form.cleaned_data.pop('shapefiles', None)
form.cleaned_data.pop('images', None)
2018-04-23 05:15:33 +00:00
self.object = form.save()
2018-04-23 05:15:33 +00:00
self.object.official_project_documents.set(form.cleaned_data.get(
'official_project_documents_files', []
))
self.object.other_documents.set(form.cleaned_data.get(
2018-04-23 05:15:33 +00:00
'other_documents_files', []
))
self.object.shapefiles.set(form.cleaned_data.get(
2018-04-23 05:15:33 +00:00
'shapefiles_files', []
))
self.object.images.set(form.cleaned_data.get(
'images_files', []
))
2018-04-23 05:15:33 +00:00
2018-05-30 03:16:22 +00:00
self.object.author = self.request.user
self.object.save()
self.send_email()
# Delete the corresponding draft
try:
draft = CaseStudyDraft.objects.get(author=self.request.user)
draft.delete()
except CaseStudyDraft.DoesNotExist:
pass
return super().form_valid(form)
class ShortForm(BaseForm):
2017-10-09 23:58:36 +00:00
"""View for short version of case study form."""
form_class = ShortCaseStudyForm
class LongForm(BaseForm):
2017-10-09 23:58:36 +00:00
"""View for long version of case study form."""
form_class = LongCaseStudyForm
2017-10-09 23:58:36 +00:00
class FormSuccess(TemplateView):
template_name = 'map/form-success.html'
class CaseStudyDetail(DetailView):
template_name = "map/detail.html"
model = CaseStudy
context_object_name = "case_study"
2018-04-14 02:40:42 +00:00
class SpatialRefSysAutocomplete(autocomplete.Select2QuerySetView):
def get_queryset(self):
qs = SpatialRefSys.objects.all()
if self.q:
qs = qs.filter(
Q(auth_name__icontains=self.q)
| Q(auth_srid__icontains=self.q)
)
return qs
2018-05-01 02:23:36 +00:00
class Drafts(LoginRequiredMixin, View):
2018-04-14 02:40:42 +00:00
"""Retrieve or save a draft."""
def get_object(self, request):
try:
return CaseStudyDraft.objects.get(author=request.user)
except:
return None
def get(self, request):
draft = self.get_object(request)
2018-04-14 02:40:42 +00:00
if draft == None:
return HttpResponse(status=404) # Not Found
else:
return HttpResponse(draft.data, content_type="application/json")
def put(self, request):
# Find an existing object is there is one
draft = self.get_object(request)
2018-04-14 02:40:42 +00:00
if draft == None:
# If there isn't, create a new draft...
draft = CaseStudyDraft(author=request.user, data=request.body.decode())
2018-04-14 02:40:42 +00:00
draft.save()
return HttpResponse(status=201) # Created
else:
draft.data = request.body.decode()
2018-04-14 02:40:42 +00:00
draft.save()
return HttpResponse(status=200) # OK
def delete(self, request):
draft = self.get_object(request)
2018-04-23 05:15:33 +00:00
2018-04-14 02:40:42 +00:00
if draft != None:
data = json.loads(draft.data)
for k in [ 'official_project_documents', 'other_documents',
'shapefiles', 'images' ]:
2018-05-01 05:08:40 +00:00
try:
keyname = k + '_files'
field = data['data']['form'][keyname]
# Ignore empty fields
if field['value'] == '':
continue
file_list = json.loads(field['value'])
# Delete those items
for item in file_list:
try:
f = File.objects.get(id=item['id'])
if f.user != self.request.user:
continue
f.delete()
except File.DoesNotExist:
continue
except:
continue
2018-04-14 02:40:42 +00:00
draft.delete()
2018-04-23 05:15:33 +00:00
2018-04-14 02:40:42 +00:00
return HttpResponse(status=204)