Skip to content
Snippets Groups Projects
Commit e4ab6d2e authored by Piotr Gawron's avatar Piotr Gawron
Browse files

Merge branch '178-flying-team-management-page' into 'master'

Resolve "Flying team location management site"

Closes #178

See merge request NCER-PD/scheduling-system!118
parents 143dba58 ab50b6b8
No related branches found
No related tags found
1 merge request!118Resolve "Flying team location management site"
Pipeline #
Showing
with 330 additions and 23 deletions
...@@ -6,8 +6,9 @@ from django import forms ...@@ -6,8 +6,9 @@ from django import forms
from django.forms import ModelForm, Form from django.forms import ModelForm, Form
from django.utils.dates import MONTHS from django.utils.dates import MONTHS
from web.models import StudySubject, Worker, Appointment, Visit, AppointmentType, ContactAttempt, AppointmentTypeLink, \ from web.models import Appointment, AppointmentType, AppointmentTypeLink, \
Availability, Holiday Availability, ContactAttempt, FlyingTeam, Holiday, StudySubject, \
Worker, Visit, VoucherType, VoucherTypePrice
from web.models.constants import SUBJECT_TYPE_CHOICES from web.models.constants import SUBJECT_TYPE_CHOICES
from web.views.notifications import get_filter_locations from web.views.notifications import get_filter_locations
...@@ -368,6 +369,18 @@ def validate_availability_conflict(self, cleaned_data, availability): ...@@ -368,6 +369,18 @@ def validate_availability_conflict(self, cleaned_data, availability):
self.add_error('available_till', error) self.add_error('available_till', error)
class FlyingTeamAddForm(ModelForm):
class Meta:
model = FlyingTeam
fields = "__all__"
class FlyingTeamEditForm(ModelForm):
class Meta:
model = FlyingTeam
fields = "__all__"
class HolidayAddForm(ModelForm): class HolidayAddForm(ModelForm):
datetime_start = forms.DateTimeField(widget=forms.DateTimeInput(DATETIMEPICKER_DATE_ATTRS), datetime_start = forms.DateTimeField(widget=forms.DateTimeInput(DATETIMEPICKER_DATE_ATTRS),
initial=datetime.datetime.now().replace(hour=8, minute=0), initial=datetime.datetime.now().replace(hour=8, minute=0),
......
{% extends "_base.html" %}
{% load static %}
{% load filters %}
{% block styles %}
{{ block.super }}
<link rel="stylesheet" href="{% static 'AdminLTE/plugins/awesomplete/awesomplete.css' %}"/>
{% endblock styles %}
{% block ui_active_tab %}'equipment_and_rooms'{% endblock ui_active_tab %}
{% block page_header %}New flying team{% endblock page_header %}
{% block page_description %}{% endblock page_description %}
{% block title %}{{ block.super }} - Add new flying team{% endblock %}
{% block breadcrumb %}
{% include "equipment_and_rooms/flying_teams/breadcrumb.html" %}
{% endblock breadcrumb %}
{% block maincontent %}
<div class="box box-info">
<div class="box-header with-border">
<a href="{% url 'web.views.equipment_and_rooms.flying_teams' %}" class="btn btn-block btn-default">Go back (without changes)</a>
</div>
<form method="post" action="" class="form-horizontal">
{% csrf_token %}
<div class="box-body">
<div class="col-sm-6">
{% for field in form %}
<div class="form-group {% if field.errors %}has-error{% endif %}">
<label for="{# TODO #}" class="col-sm-4 control-label">
{{ field.label }}
</label>
<div class="col-sm-8">
{{ field|add_class:'form-control' }}
</div>
{% if field.errors %}
<span class="help-block">
{{ field.errors }}
</span>
{% endif %}
</div>
{% endfor %}
</div>
</div><!-- /.box-body -->
<div class="box-footer">
<div class="col-sm-6">
<button type="submit" class="btn btn-block btn-success">Add</button>
</div>
<div class="col-sm-6">
<a href="{% url 'web.views.equipment_and_rooms.flying_teams' %}" class="btn btn-block btn-default">Cancel</a>
</div>
</div><!-- /.box-footer -->
</form>
</div>
{% endblock %}
<li><a href="{% url 'web.views.appointments' %}"><i class="fa fa-dashboard"></i> Dashboard</a></li>
<li><a href="{% url 'web.views.equipment_and_rooms' %}">Equipment and rooms</a></li>
<li class="active"><a href="{% url 'web.views.equipment_and_rooms.flying_teams' %}">Flying teams</a></li>
{% extends "_base.html" %}
{% load static %}
{% load filters %}
{% block styles %}
{{ block.super }}
<link rel="stylesheet" href="{% static 'AdminLTE/plugins/awesomplete/awesomplete.css' %}"/>
{% endblock styles %}
{% block ui_active_tab %}'equipment_and_rooms'{% endblock ui_active_tab %}
{% block page_header %}Edit flying team{% endblock page_header %}
{% block page_description %}{% endblock page_description %}
{% block title %}{{ block.super }} - Edit flying team{% endblock %}
{% block breadcrumb %}
{% include "equipment_and_rooms/flying_teams/breadcrumb.html" %}
{% endblock breadcrumb %}
{% block maincontent %}
<div class="box box-info">
<div class="box-header with-border">
<a href="{% url 'web.views.equipment_and_rooms.flying_teams' %}" class="btn btn-block btn-default">Go back (without changes)</a>
</div>
<form method="post" action="" class="form-horizontal">
{% csrf_token %}
<div class="box-body">
<div class="col-sm-6">
{% for field in form %}
<div class="form-group {% if field.errors %}has-error{% endif %}">
<label for="{# TODO #}" class="col-sm-4 control-label">
{{ field.label }}
</label>
<div class="col-sm-8">
{{ field|add_class:'form-control' }}
</div>
{% if field.errors %}
<span class="help-block">
{{ field.errors }}
</span>
{% endif %}
</div>
{% endfor %}
</div>
</div><!-- /.box-body -->
<div class="box-footer">
<div class="col-sm-6">
<button type="submit" class="btn btn-block btn-success">Save</button>
</div>
<div class="col-sm-6">
<a href="{% url 'web.views.equipment_and_rooms.flying_teams' %}" class="btn btn-block btn-default">Cancel</a>
</div>
</div><!-- /.box-footer -->
</form>
</div>
{% endblock %}
{% extends "_base.html" %}
{% load static %}
{% block styles %}
{{ block.super }}
<!-- DataTables -->
<link rel="stylesheet" href="{% static 'AdminLTE/plugins/datatables/dataTables.bootstrap.css' %}">
{% endblock styles %}
{% block ui_active_tab %}'equipment_and_rooms'{% endblock ui_active_tab %}
{% block page_header %}Flying teams{% endblock page_header %}
{% block page_description %}management{% endblock page_description %}
{% block breadcrumb %}
{% include "equipment_and_rooms/flying_teams/breadcrumb.html" %}
{% endblock breadcrumb %}
{% block maincontent %}
<div>
<a href="{% url 'web.views.equipment_and_rooms.flying_teams_add' %}" class="btn btn-app">
<i class="fa fa-plus"></i>
Add new flying team</a>
</div>
<div class="box-body">
{% if flying_team_list %}
<table id="table" class="table table-bordered table-striped">
<thead>
<tr>
<th>No.</th>
<th>Location</th>
<th>Edit</th>
</tr>
</thead>
<tbody>
{% for flying_team in flying_team_list %}
<tr>
<td>{{ forloop.counter }}</td>
<td>{{ flying_team.place }}</td>
<td>
<a href="{% url 'web.views.equipment_and_rooms.flying_teams_edit' flying_team.id %}" type="button"
class="btn btn-block btn-default">Change</a></td>
</td>
</tr>
{% endfor %}
</tbody>
</table>
{% else %}
<p>No flying teams found.</p>
{% endif %}
{% endblock maincontent %}
...@@ -61,20 +61,6 @@ ...@@ -61,20 +61,6 @@
Edit <i class="fa fa-arrow-circle-right"></i> Edit <i class="fa fa-arrow-circle-right"></i>
</a> </a>
</div> </div>
<div class="bg-red disabled small-box">
<div class="inner">
<h4>Flying teams</h4>
<p>&nbsp;</p>
</div>
<div class="icon">
<i class="ion ion-android-car"></i>
</div>
<a href="#" class="small-box-footer">
Edit <i class="fa fa-arrow-circle-right"></i>
</a>
</div>
</div> </div>
{% endcomment %} {% endcomment %}
...@@ -93,6 +79,20 @@ ...@@ -93,6 +79,20 @@
</a> </a>
</div> </div>
<div class="bg-red small-box">
<div class="inner">
<h4>Flying teams</h4>
<p>&nbsp;</p>
</div>
<div class="icon">
<i class="ion ion-android-car"></i>
</div>
<a href="{% url 'web.views.equipment_and_rooms.flying_teams' %}" class="small-box-footer">
Manage <i class="fa fa-arrow-circle-right"></i>
</a>
</div>
{% comment %} {% comment %}
<div class="bg-yellow small-box"> <div class="bg-yellow small-box">
<div class="inner"> <div class="inner">
......
<li><a href="{% url 'web.views.appointments' %}"><i class="fa fa-dashboard"></i> Dashboard</a></li>
<li><a href="{% url 'web.views.equipment_and_rooms' %}">Equipment and rooms</a></li>
<li class="active"><a href="{% url 'web.views.kit_requests' %}">Kit requests</a></li>
...@@ -14,7 +14,7 @@ ...@@ -14,7 +14,7 @@
{% endblock styles %} {% endblock styles %}
{% block breadcrumb %} {% block breadcrumb %}
{% include "equipment_and_rooms/breadcrumb.html" %} {% include "equipment_and_rooms/kit_requests/breadcrumb.html" %}
{% endblock breadcrumb %} {% endblock breadcrumb %}
{% block maincontent %} {% block maincontent %}
......
...@@ -30,11 +30,17 @@ ...@@ -30,11 +30,17 @@
</a> </a>
</li> </li>
<li data-desc="equipment_and_rooms"> <li data-desc="equipment_and_rooms" class="treeview">
<a href="{% url 'web.views.equipment_and_rooms' %}"> <a href="{% url 'web.views.equipment_and_rooms' %}">
<i class="fa fa-building-o"></i> <i class="fa fa-building-o"></i> <span>Equipment&amp;rooms</span>
<span>Equipment&amp;rooms</span> <span class="pull-right-container">
<i class="fa fa-angle-left pull-right"></i>
</span>
</a> </a>
<ul class="treeview-menu">
<li><a href="{% url 'web.views.kit_requests' %}">Kit requests</a></li>
<li><a href="{% url 'web.views.equipment_and_rooms.flying_teams' %}">Flying teams</a></li>
</ul>
</li> </li>
<li data-desc="statistics"> <li data-desc="statistics">
...@@ -79,4 +85,4 @@ ...@@ -79,4 +85,4 @@
</ul> </ul>
</li> </li>
</ul> </ul>
\ No newline at end of file
import logging
from django.urls import reverse
from web.tests.functions import create_flying_team
from web.models import FlyingTeam
from web.tests import LoggedInTestCase
logger = logging.getLogger(__name__)
class FlyingTeamTests(LoggedInTestCase):
@staticmethod
def generate_more_or_less_random_name():
import random
letters = [chr(x) for x in range(97, 122)]
return 'Random' + ''.join(random.choice(letters) for x in range(15))
def test_flying_team_requests(self):
pages = [
'web.views.equipment_and_rooms.flying_teams',
'web.views.equipment_and_rooms.flying_teams_add',
]
for page in pages:
response = self.client.get(reverse(page))
self.assertEqual(response.status_code, 200)
def test_flying_team_add(self):
page = reverse('web.views.equipment_and_rooms.flying_teams_add')
data = {
'place': self.generate_more_or_less_random_name()
}
response = self.client.post(page, data)
self.assertEqual(response.status_code, 302)
freshly_created = FlyingTeam.objects.filter(place=data['place'])
self.assertEqual(len(freshly_created), 1)
def test_flying_team_edit(self):
flying_team = create_flying_team()
page = reverse('web.views.equipment_and_rooms.flying_teams_edit',
kwargs={'flying_team_id': str(flying_team.id)})
data = {
'place': self.generate_more_or_less_random_name()
}
response = self.client.post(page, data)
self.assertEqual(response.status_code, 302)
freshly_edited = FlyingTeam.objects.get(id=flying_team.id)
self.assertEqual(freshly_edited.place, data["place"])
def test_flying_team_edit_request(self):
flying_team = create_flying_team()
page = reverse('web.views.equipment_and_rooms.flying_teams_edit',
kwargs={'flying_team_id': str(flying_team.id)})
response = self.client.get(page)
self.assertEqual(response.status_code, 200)
...@@ -128,6 +128,9 @@ urlpatterns = [ ...@@ -128,6 +128,9 @@ urlpatterns = [
name='web.views.kit_requests_send_mail'), name='web.views.kit_requests_send_mail'),
url(r'^equipment_and_rooms/kit_requests/(?P<start_date>[\w-]+)/(?P<end_date>[\w-]+)/$', url(r'^equipment_and_rooms/kit_requests/(?P<start_date>[\w-]+)/(?P<end_date>[\w-]+)/$',
views.kit.kit_requests_send_mail, name='web.views.kit_requests_send_mail'), views.kit.kit_requests_send_mail, name='web.views.kit_requests_send_mail'),
url(r'^equipment_and_rooms/flying_teams$', views.flying_teams.flying_teams, name='web.views.equipment_and_rooms.flying_teams'),
url(r'^equipment_and_rooms/flying_teams/add$', views.flying_teams.flying_teams_add, name='web.views.equipment_and_rooms.flying_teams_add'),
url(r'^equipment_and_rooms/flying_teams/edit/(?P<flying_team_id>\d+)$', views.flying_teams.flying_teams_edit, name='web.views.equipment_and_rooms.flying_teams_edit'),
#################### ####################
# MAIL # # MAIL #
......
...@@ -70,6 +70,7 @@ import visit ...@@ -70,6 +70,7 @@ import visit
import doctor import doctor
import subject import subject
import equipment import equipment
import flying_teams
import kit import kit
import mails import mails
import statistics import statistics
......
# coding=utf-8 # coding=utf-8
from django.shortcuts import redirect
from . import wrap_response from . import wrap_response
from ..models import Item from ..models import Item
......
# coding=utf-8
from django.shortcuts import redirect, get_object_or_404
from . import wrap_response
from ..models import FlyingTeam
from ..forms.forms import FlyingTeamAddForm, FlyingTeamEditForm
def flying_teams(request):
flying_team_list = FlyingTeam.objects.order_by('-place')
context = {
'flying_team_list': flying_team_list
}
return wrap_response(request,
"equipment_and_rooms/flying_teams/index.html",
context)
def flying_teams_add(request):
if request.method == 'POST':
form = FlyingTeamAddForm(request.POST)
if form.is_valid():
form.save()
return redirect('web.views.equipment_and_rooms.flying_teams')
else:
form = FlyingTeamAddForm()
return wrap_response(request, 'equipment_and_rooms/flying_teams/add.html', {'form': form})
def flying_teams_edit(request, flying_team_id):
the_flying_team = get_object_or_404(FlyingTeam, id=flying_team_id)
if request.method == 'POST':
form = FlyingTeamEditForm(request.POST, instance=the_flying_team)
if form.is_valid():
form.save()
return redirect('web.views.equipment_and_rooms.flying_teams')
else:
form = FlyingTeamEditForm(instance=the_flying_team)
return wrap_response(request, 'equipment_and_rooms/flying_teams/edit.html', {'form': form})
...@@ -75,7 +75,7 @@ def get_kit_requests_data(request, start_date=None, end_date=None): ...@@ -75,7 +75,7 @@ def get_kit_requests_data(request, start_date=None, end_date=None):
def kit_requests(request): def kit_requests(request):
return wrap_response(request, 'equipment_and_rooms/kit_requests.html', get_kit_requests_data(request)) return wrap_response(request, 'equipment_and_rooms/kit_requests/kit_requests.html', get_kit_requests_data(request))
def send_mail(data): def send_mail(data):
...@@ -125,7 +125,7 @@ def kit_requests_send_mail(request, start_date, end_date=None): ...@@ -125,7 +125,7 @@ def kit_requests_send_mail(request, start_date, end_date=None):
messages.add_message(request, messages.SUCCESS, 'Mail sent') messages.add_message(request, messages.SUCCESS, 'Mail sent')
except: except:
messages.add_message(request, messages.ERROR, 'There was problem with sending email') messages.add_message(request, messages.ERROR, 'There was problem with sending email')
return wrap_response(request, 'equipment_and_rooms/kit_requests.html', get_kit_requests_data(request)) return wrap_response(request, 'equipment_and_rooms/kit_requests/kit_requests.html', get_kit_requests_data(request))
class KitRequestEmailSendJob(CronJobBase): class KitRequestEmailSendJob(CronJobBase):
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment