diff --git a/scipost/forms.py b/scipost/forms.py index 5b99fda70aedbef279084c4bc0e09ad3170d8d93..7fca3c331787cb9c581f302af4702ba247196c49 100644 --- a/scipost/forms.py +++ b/scipost/forms.py @@ -4,6 +4,7 @@ from django.contrib.auth.models import User, Group from django.contrib.auth.password_validation import validate_password from django.core.exceptions import ValidationError from django.core.urlresolvers import reverse_lazy +from django.utils import timezone from django.utils.http import is_safe_url from django_countries import countries @@ -378,10 +379,21 @@ class UnavailabilityPeriodForm(forms.ModelForm): fields = ['start', 'end'] def __init__(self, *args, **kwargs): - super(UnavailabilityPeriodForm, self).__init__(*args, **kwargs) + super().__init__(*args, **kwargs) self.fields['start'].widget.attrs.update({'placeholder': 'YYYY-MM-DD'}) self.fields['end'].widget.attrs.update({'placeholder': 'YYYY-MM-DD'}) + def clean_end(self): + now = timezone.now() + start = self.cleaned_data['start'] + end = self.cleaned_data['end'] + if start > end: + self.add_error('end', 'The start date you have entered is later than the end date.') + + if end < now.date(): + self.add_error('end', 'You have entered an end date in the past.') + return end + class RemarkForm(forms.Form): remark = forms.CharField(widget=forms.Textarea(), label='') diff --git a/scipost/models.py b/scipost/models.py index 886fe252800b6f70c7fd4dc4574a008a1a9b599d..9bd5f46d8b07baef13f563c7d0feb7da0ffa7c0d 100644 --- a/scipost/models.py +++ b/scipost/models.py @@ -161,7 +161,7 @@ class Contributor(models.Model): class UnavailabilityPeriod(models.Model): - contributor = models.ForeignKey(Contributor, on_delete=models.CASCADE) + contributor = models.ForeignKey('scipost.Contributor', on_delete=models.CASCADE) start = models.DateField() end = models.DateField() diff --git a/scipost/templates/scipost/personal_page.html b/scipost/templates/scipost/personal_page.html index 883f8dcdfa54f0006aa954ec0574c7fa7cf2763b..7956a555a79b7407bf26aa11a112cc02f705dc83 100644 --- a/scipost/templates/scipost/personal_page.html +++ b/scipost/templates/scipost/personal_page.html @@ -158,16 +158,23 @@ </div> <div class="col-md-4 offset-md-1"> {% if unavailabilities %} - <h3>Your unavailability periods in our records (YYYY-DD-MM):</h3> - <table class="availabilities"> + <h3>Your unavailability periods in our records</h3> + <p class="text-muted">(YYYY-DD-MM)</p> + <table class="table"> <tr> <th>Start</th> - <th>End</th> + <th colspan="2">End</th> </tr> {% for unav in unavailabilities %} <tr> <td>{{ unav.start }}</td> <td>{{ unav.end }}</td> + <td> + <form action="{% url 'scipost:delete_unavailable_period' unav.id %}" method="post"> + {% csrf_token %} + <input class="btn btn-danger" type="submit" value="Delete" /> + </form> + </td> </tr> {% endfor %} </table> diff --git a/scipost/templates/scipost/unavailability_period_form.html b/scipost/templates/scipost/unavailability_period_form.html new file mode 100644 index 0000000000000000000000000000000000000000..fc4b11d94fad505d3e50293f9104bd09a166ad68 --- /dev/null +++ b/scipost/templates/scipost/unavailability_period_form.html @@ -0,0 +1,26 @@ +{% extends 'scipost/_personal_page_base.html' %} + +{% block breadcrumb_items %} + {{block.super}} + <span class="breadcrumb-item">Mark a period as unavailable</span> +{% endblock %} + +{% load bootstrap %} + +{% block pagetitle %}: Mark a period as unavailable{% endblock pagetitle %} + +{% block content %} + +<div class="row"> + <div class="col-lg-8 offset-lg-2"> + <h1 class="highlight">Mark a period as unavailable</h1> + + <form method="post"> + {% csrf_token %} + {{form|bootstrap}} + <input type="submit" class="btn btn-secondary" value="Submit" /> + </form> + </div> +</div> + +{% endblock content %} diff --git a/scipost/urls.py b/scipost/urls.py index ac5f3ab49fd370739874923df4f9d863bb3268a0..307e602b55e23ded0f1586c407be8ceb15a47131 100644 --- a/scipost/urls.py +++ b/scipost/urls.py @@ -133,11 +133,13 @@ urlpatterns = [ url(r'^update_personal_data$', views.update_personal_data, name='update_personal_data'), # Unavailabilities - url(r'^mark_unavailable_period$', views.mark_unavailable_period, - name='mark_unavailable_period'), + url(r'^unavailable_period$', views.mark_unavailable_period, name='mark_unavailable_period'), + url(r'^unavailable_period/(?P<period_id>[0-9]+)/delete$', views.delete_unavailable_period, + name='delete_unavailable_period'), # Contributor info - url(r'^contributor/(?P<contributor_id>[0-9]+)$', views.contributor_info, name="contributor_info"), + url(r'^contributor/(?P<contributor_id>[0-9]+)$', views.contributor_info, + name="contributor_info"), # Authorship claims url(r'^claim_authorships$', views.claim_authorships, name="claim_authorships"), diff --git a/scipost/views.py b/scipost/views.py index 6d2321837bff512e105000408ab8f625fe5a0b55..d7b30e9a456ac1817cb90bf956498194a506be9c 100644 --- a/scipost/views.py +++ b/scipost/views.py @@ -7,7 +7,6 @@ from django.contrib.auth import login, logout, update_session_auth_hash from django.contrib.auth.decorators import login_required from django.contrib.auth.models import Group from django.contrib.auth.views import password_reset, password_reset_confirm -from django.core.exceptions import MultipleObjectsReturned, ObjectDoesNotExist from django.core import mail from django.core.mail import EmailMessage, EmailMultiAlternatives from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger @@ -15,6 +14,7 @@ from django.core.urlresolvers import reverse from django.db.models import Q from django.shortcuts import redirect from django.template import Context, Template +from django.views.decorators.http import require_POST from django.views.generic.list import ListView from django.db.models import Prefetch @@ -703,28 +703,34 @@ def logout_view(request): return redirect(reverse('scipost:index')) +@login_required def mark_unavailable_period(request): - if request.method == 'POST': - unav_form = UnavailabilityPeriodForm(request.POST) - errormessage = None - if unav_form.is_valid(): - now = timezone.now() - if unav_form.cleaned_data['start'] > unav_form.cleaned_data['end']: - errormessage = 'The start date you have entered is later than the end date.' - elif unav_form.cleaned_data['end'] < now.date(): - errormessage = 'You have entered an end date in the past.' - if errormessage is not None: - return render(request, 'scipost/error.html', - context={'errormessage': errormessage}) - else: - unav = UnavailabilityPeriod( - contributor=request.user.contributor, - start=unav_form.cleaned_data['start'], - end=unav_form.cleaned_data['end']) - unav.save() - else: - errormessage = 'Please enter valid dates (format: YYYY-MM-DD).' - return render(request, 'scipost/error.html', context={'errormessage': errormessage}) + ''' + Mark period unavailable for Contributor using this view. + ''' + unav_form = UnavailabilityPeriodForm(request.POST or None) + if unav_form.is_valid(): + unav = unav_form.save(commit=False) + unav.contributor = request.user.contributor + unav.save() + messages.success(request, 'Unavailability period registered') + return redirect('scipost:personal_page') + + # Template acts as a backup in case the form is invalid. + context = {'form': unav_form} + return render(request, 'scipost/unavailability_period_form.html', context) + + +@require_POST +@login_required +def delete_unavailable_period(request, period_id): + ''' + Delete period unavailable registered. + ''' + unav = get_object_or_404(UnavailabilityPeriod, + contributor=request.user.contributor, id=int(period_id)) + unav.delete() + messages.success(request, 'Unavailability period deleted') return redirect('scipost:personal_page')