diff --git a/apps/map/forms.py b/apps/map/forms.py index 147adca..006a26a 100644 --- a/apps/map/forms.py +++ b/apps/map/forms.py @@ -88,7 +88,6 @@ class BaseCaseStudyForm(forms.models.ModelForm): self.helper.form_id = 'case-study-form' self.helper.form_class = 'form-horizontal' self.helper.form_method = 'post' - self.helper.form_action = 'add' self.helper.label_class = 'col-md-3' self.helper.field_class = 'col-md-9' self.helper.include_media = False @@ -110,7 +109,6 @@ class ShortCaseStudyForm(BaseCaseStudyForm): def __init__(self, *args, **kwargs): super(ShortCaseStudyForm, self).__init__(*args, **kwargs) - self.helper.form_action = reverse('short-form') self.helper.add_input(Submit('submit', _('Submit'), css_class='btn-success center-block')) # Duplicate code from long form, below... diff --git a/apps/map/urls.py b/apps/map/urls.py index 4f8f841..f6bcfc9 100644 --- a/apps/map/urls.py +++ b/apps/map/urls.py @@ -16,6 +16,7 @@ urlpatterns = [ url(r'^case-study/create/success/?$', views.FormSuccess.as_view(), name='form-success'), url(r'^case-study/draft/?$', views.Drafts.as_view(), name='drafts'), url(r'^case-study/(?P[-\w]+)/?$', views.CaseStudyDetail.as_view(), name='detail'), + url(r'^case-study/edit/(?P[\d]+)/?$', views.EditCaseStudy.as_view(), name='edit'), url(r'^map/?$', views.Map.as_view(), name='map'), # API diff --git a/apps/map/views.py b/apps/map/views.py index 959edd9..3dd2b63 100644 --- a/apps/map/views.py +++ b/apps/map/views.py @@ -6,10 +6,11 @@ from django.core.mail import send_mail from django.db.models import Q from django.http import Http404, HttpResponse from django.urls import reverse +from django.urls import reverse_lazy from django.views import View from django.views.generic import DetailView from django.views.generic.base import TemplateView -from django.views.generic.edit import CreateView +from django.views.generic.edit import CreateView, UpdateView from dal import autocomplete @@ -47,34 +48,45 @@ class PointOfInterest(LoginRequiredMixin, CreateView): form_class = PointOfInterest -class BaseForm(LoginRequiredMixin, CreateView): - """View for base case study form.""" - template_name = 'map/form-case_study.html' - success_url = '/case-study/create/success/' - model = CaseStudy - - def send_email(self): - """Sends email to moderator to approve case study.""" +def send_email(study_id): + """Sends email to moderator to approve case study.""" + try: send_mail( 'New case study submitted', NOTIFY_MESSAGE % ( settings.SITE_URL, - reverse('admin:map_casestudy_change', args=[self.object.id]) + reverse('admin:map_casestudy_change', args=[study_id]) ), 'noreply@ojuso.org', [settings.DATABASE_EMAIL], fail_silently=False, ) - def form_valid(self, form): + except: + # XXX This is bad. We should do something more useful with the error + # than this. + pass + + +def delete_user_draft(user_id): + """ Delete the draft of a given user """ + + try: + draft = CaseStudyDraft.objects.get(author=user_id) + draft.delete() + except CaseStudyDraft.DoesNotExist: + pass + + +class FilesHandlerMixin: + def remove_bad_fields(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) - self.object = form.save() - + def add_file_refs(self, form): self.object.official_project_documents.set(form.cleaned_data.get( 'official_project_documents_files', [] )) @@ -88,31 +100,35 @@ class BaseForm(LoginRequiredMixin, CreateView): 'images_files', [] )) + def form_valid(self, form): + self.remove_bad_fields(form) self.object.author = self.request.user + self.object = form.save() + self.add_file_refs(form) self.object.save() - # Don't error if the email can't be sent - try: - self.send_email() - except: - pass - - # 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): +class BaseCreateForm(LoginRequiredMixin, FilesHandlerMixin, CreateView): + """View for base case study form.""" + template_name = 'map/form-case_study.html' + success_url = reverse_lazy('form-success') + model = CaseStudy + + def form_valid(self, form): + super().form_valid(form) + + send_email(self.object.id) + delete_user_draft(self.request.user) + + +class ShortForm(BaseCreateForm): """View for short version of case study form.""" form_class = ShortCaseStudyForm -class LongForm(BaseForm): +class LongForm(BaseCreateForm): """View for long version of case study form.""" form_class = LongCaseStudyForm @@ -127,6 +143,18 @@ class CaseStudyDetail(DetailView): context_object_name = "case_study" + +class BaseEditForm(LoginRequiredMixin, FilesHandlerMixin, UpdateView): + """View for base case study form.""" + template_name = 'map/form-case_study.html' + success_url = reverse_lazy('form-success') + model = CaseStudy + + +class EditCaseStudy(BaseEditForm): + form_class = ShortCaseStudyForm + + class SpatialRefSysAutocomplete(autocomplete.Select2QuerySetView): def get_queryset(self): qs = SpatialRefSys.objects.all() diff --git a/ojusomap/templates/auth/user_detail.html b/ojusomap/templates/auth/user_detail.html index 6f35860..7e5de95 100644 --- a/ojusomap/templates/auth/user_detail.html +++ b/ojusomap/templates/auth/user_detail.html @@ -37,7 +37,9 @@ {{ case.entry_name }} {% if case.approved %}Yes{% else %}No{% endif %} - View | Edit + + View | + Edit {% endfor %}