Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • smasch/scheduling-system
1 result
Show changes
Commits on Source (14)
Showing
with 378 additions and 50 deletions
......@@ -70,6 +70,10 @@ def get_subject_columns(request, subject_list_type):
add_column(result, "Resigned", "resigned", study_subject_columns, "yes_no_filter", study.columns)
add_column(result, "Endpoint Reached", "endpoint_reached", study_subject_columns, "yes_no_filter", study.columns)
add_column(result, "Postponed", "postponed", study_subject_columns, "yes_no_filter", study.columns)
add_column(result, "Next of keen", "next_of_keen_name", subject_columns, "string_filter")
add_column(result, "Next of keen phone", "next_of_keen_phone", subject_columns, "string_filter")
add_column(result, "Next of keen address", "next_of_keen_address", subject_columns, "string_filter")
add_column(result, "Brain donation agreement", "brain_donation_agreement", study_subject_columns, "yes_no_filter", study.columns)
add_column(result, "Excluded", "excluded", study_subject_columns, "yes_no_filter", study.columns)
add_column(result, "Info sent", "information_sent", study_subject_columns, "yes_no_filter", study.columns)
add_column(result, "Type", "type", study_subject_columns, "type_filter", study.columns)
......@@ -113,6 +117,12 @@ def get_subjects_order(subjects_to_be_ordered, order_column, order_direction, co
result = subjects_to_be_ordered.order_by(order_direction + 'subject__last_name')
elif order_column == "address":
result = subjects_to_be_ordered.order_by(order_direction + 'subject__address')
elif order_column == "next_of_keen_name":
result = subjects_to_be_ordered.order_by(order_direction + 'subject__next_of_keen_name')
elif order_column == "next_of_keen_phone":
result = subjects_to_be_ordered.order_by(order_direction + 'subject__next_of_keen_phone')
elif order_column == "next_of_keen_address":
result = subjects_to_be_ordered.order_by(order_direction + 'subject__next_of_keen_address')
elif order_column == "nd_number":
result = subjects_to_be_ordered.order_by(order_direction + 'nd_number')
elif order_column == "referral":
......@@ -144,6 +154,8 @@ def get_subjects_order(subjects_to_be_ordered, order_column, order_direction, co
result = subjects_to_be_ordered.order_by(order_direction + 'subject__social_security_number')
elif order_column == "postponed":
result = subjects_to_be_ordered.order_by(order_direction + 'postponed')
elif order_column == "brain_donation_agreement":
result = subjects_to_be_ordered.order_by(order_direction + 'brain_donation_agreement')
elif order_column == "excluded":
result = subjects_to_be_ordered.order_by(order_direction + 'excluded')
elif order_column == "type":
......@@ -242,6 +254,12 @@ def get_subjects_filtered(subjects_to_be_filtered, filters):
result = result.filter(subject__last_name__icontains=value)
elif column == "address":
result = result.filter(subject__address__icontains=value)
elif column == "next_of_keen_name":
result = result.filter(subject__next_of_keen_name__icontains=value)
elif column == "next_of_keen_phone":
result = result.filter(subject__next_of_keen_phone__icontains=value)
elif column == "next_of_keen_address":
result = result.filter(subject__next_of_keen_address__icontains=value)
elif column == "nd_number":
result = result.filter(nd_number__icontains=value)
elif column == "referral":
......@@ -254,6 +272,8 @@ def get_subjects_filtered(subjects_to_be_filtered, filters):
result = result.filter(resigned=(value == "true"))
elif column == "endpoint_reached":
result = result.filter(endpoint_reached=(value == "true"))
elif column == "brain_donation_agreement":
result = result.filter(brain_donation_agreement=(value == "true"))
elif column == "postponed":
result = result.filter(postponed=(value == "true"))
elif column == "excluded":
......@@ -402,6 +422,9 @@ def serialize_subject(study_subject):
"first_name": study_subject.subject.first_name,
"last_name": study_subject.subject.last_name,
"address": study_subject.subject.pretty_address(),
"next_of_keen_name": study_subject.subject.next_of_keen_name,
"next_of_keen_phone": study_subject.subject.next_of_keen_phone,
"next_of_keen_address": study_subject.subject.next_of_keen_address,
"date_born": study_subject.subject.date_born,
"datetime_contact_reminder": contact_reminder,
"last_contact_attempt": last_contact_attempt_string,
......@@ -414,6 +437,7 @@ def serialize_subject(study_subject):
"resigned": bool_to_yes_no(study_subject.resigned),
"endpoint_reached": bool_to_yes_no(study_subject.endpoint_reached),
"postponed": bool_to_yes_no(study_subject.postponed),
"brain_donation_agreement": bool_to_yes_no(study_subject.brain_donation_agreement),
"excluded": bool_to_yes_no(study_subject.excluded),
"information_sent": bool_to_yes_no(study_subject.information_sent),
"health_partner_first_name": health_partner_first_name,
......
......@@ -161,6 +161,7 @@ def prepare_study_subject_fields(fields, study):
prepare_field(fields, study.columns, 'nd_number')
prepare_field(fields, study.columns, 'datetime_contact_reminder')
prepare_field(fields, study.columns, 'postponed')
prepare_field(fields, study.columns, 'brain_donation_agreement')
prepare_field(fields, study.columns, 'flying_team')
prepare_field(fields, study.columns, 'mpower_id')
prepare_field(fields, study.columns, 'comments')
......
# -*- coding: utf-8 -*-
# Generated by Django 1.11.5 on 2020-03-19 13:01
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('web', '0140_auto_20190528_0953'),
]
operations = [
migrations.AlterModelOptions(
name='appointmenttypelink',
options={'permissions': [('view_daily_planning', 'Can see daily planning')]},
),
migrations.AlterField(
model_name='appointmenttype',
name='calendar_font_color',
field=models.CharField(default=b'#00000', max_length=2000, verbose_name=b'Calendar font color'),
),
]
# -*- coding: utf-8 -*-
# Generated by Django 1.11.5 on 2020-03-19 14:15
from __future__ import unicode_literals
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('web', '0141_auto_20200319_1301'),
]
operations = [
migrations.AlterModelOptions(
name='appointment',
options={'permissions': [('send_sample_mail_for_appointments', 'Can send sample collection list')]},
),
]
# -*- coding: utf-8 -*-
# Generated by Django 1.11.5 on 2020-03-19 14:46
from __future__ import unicode_literals
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('web', '0142_auto_20200319_1415'),
]
operations = [
migrations.AlterModelOptions(
name='appointment',
options={'permissions': [('send_sample_mail_for_appointments', 'Can send sample collection list'), ('view_statistics', 'Can see statistics')]},
),
]
# -*- coding: utf-8 -*-
# Generated by Django 1.11.5 on 2020-03-19 15:18
from __future__ import unicode_literals
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('web', '0143_auto_20200319_1446'),
]
operations = [
migrations.AlterModelOptions(
name='subject',
options={'permissions': [('send_sample_mail_for_appointments', 'Can send sample collection list'), ('export_subjects', 'Can export subject data to excel/csv')]},
),
]
# -*- coding: utf-8 -*-
# Generated by Django 1.11.5 on 2020-03-19 13:01
from __future__ import unicode_literals
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('web', '0144_auto_20200319_1518'),
]
operations = [
migrations.RunSQL("insert into web_workerstudyrole_permissions(workerstudyrole_id, permission_id) "
"select web_workerstudyrole.id, auth_permission.id from web_workerstudyrole,auth_permission "
"where codename='view_daily_planning';"),
migrations.RunSQL("insert into web_workerstudyrole_permissions(workerstudyrole_id, permission_id) "
"select web_workerstudyrole.id, auth_permission.id from web_workerstudyrole,auth_permission "
"where codename='change_flyingteam';"),
migrations.RunSQL("insert into web_workerstudyrole_permissions(workerstudyrole_id, permission_id) "
"select web_workerstudyrole.id, auth_permission.id from web_workerstudyrole,auth_permission "
"where codename='export_subjects';"),
]
# -*- coding: utf-8 -*-
# Generated by Django 1.11.5 on 2020-03-20 09:32
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('web', '0145_add_permissions_to_existing_workers'),
]
operations = [
migrations.AddField(
model_name='studycolumns',
name='brain_donation_agreement',
field=models.BooleanField(default=False, verbose_name=b'Brain donation agreement'),
),
migrations.AddField(
model_name='studysubject',
name='brain_donation_agreement',
field=models.BooleanField(default=False, verbose_name=b'Brain donation agreement'),
),
migrations.AddField(
model_name='subject',
name='next_of_keen_address',
field=models.TextField(blank=True, max_length=2000, verbose_name=b'Next of keen address'),
),
migrations.AddField(
model_name='subject',
name='next_of_keen_name',
field=models.CharField(blank=True, max_length=50, verbose_name=b'Next of keen'),
),
migrations.AddField(
model_name='subject',
name='next_of_keen_phone',
field=models.CharField(blank=True, max_length=50, verbose_name=b'Next of keen phone'),
),
migrations.AddField(
model_name='subjectcolumns',
name='next_of_keen_address',
field=models.BooleanField(default=False, max_length=1, verbose_name=b'Next of keen address'),
),
migrations.AddField(
model_name='subjectcolumns',
name='next_of_keen_name',
field=models.BooleanField(default=False, max_length=1, verbose_name=b'Next of keen'),
),
migrations.AddField(
model_name='subjectcolumns',
name='next_of_keen_phone',
field=models.BooleanField(default=False, max_length=1, verbose_name=b'Next of keen phone'),
),
]
......@@ -11,6 +11,10 @@ from . import ConfigurationItem
class Appointment(models.Model):
class Meta:
app_label = 'web'
permissions = [
("send_sample_mail_for_appointments", "Can send sample collection list"),
("view_statistics", "Can see statistics"),
]
APPOINTMENT_STATUS_SCHEDULED = 'SCHEDULED'
APPOINTMENT_STATUS_FINISHED = 'FINISHED'
......
......@@ -2,6 +2,10 @@ from django.db import models
class AppointmentTypeLink(models.Model):
class Meta:
permissions = [
("view_daily_planning", "Can see daily planning"),
]
appointment = models.ForeignKey("web.Appointment", on_delete=models.CASCADE)
appointment_type = models.ForeignKey("web.AppointmentType", on_delete=models.CASCADE)
date_when = models.DateTimeField(null=True, default=None)
......
# coding=utf-8
from django.db import models
from web.models.constants import BOOL_CHOICES
class StudyColumns(models.Model):
class Meta:
......@@ -81,7 +79,7 @@ class StudyColumns(models.Model):
excluded = models.BooleanField(default=False, verbose_name='Excluded')
endpoint_reached = models.BooleanField(default=True, verbose_name='Endpoint reached')
resign_reason = models.BooleanField(default=True, verbose_name='Endpoint reached comments')
referral_letter = models.BooleanField(
......@@ -117,4 +115,9 @@ class StudyColumns(models.Model):
vouchers = models.BooleanField(
default=False,
verbose_name='Vouchers',
)
\ No newline at end of file
)
brain_donation_agreement = models.BooleanField(
default=False,
verbose_name='Brain donation agreement',
)
......@@ -164,6 +164,11 @@ class StudySubject(models.Model):
verbose_name='PD in family',
default=None,
)
brain_donation_agreement = models.BooleanField(
default=False,
verbose_name='Brain donation agreement',
)
resigned = models.BooleanField(
verbose_name='Resigned',
default=False,
......
# coding=utf-8
import logging
from django.db import models
from django.db.models.signals import post_save
from django.dispatch import receiver
from constants import SEX_CHOICES, COUNTRY_OTHER_ID
from web.models import Country, Visit, Appointment
from . import Language
from django.db.models.signals import post_save
from django.dispatch import receiver
logger = logging.getLogger(__name__)
class Subject(models.Model):
class Subject(models.Model):
class Meta:
app_label = 'web'
permissions = [
("send_sample_mail_for_appointments", "Can send sample collection list"),
("export_subjects", "Can export subject data to excel/csv"),
]
sex = models.CharField(max_length=1,
choices=SEX_CHOICES,
......@@ -96,6 +101,21 @@ class Subject(models.Model):
verbose_name='Country'
)
next_of_keen_name = models.CharField(max_length=50,
blank=True,
verbose_name='Next of keen'
)
next_of_keen_phone = models.CharField(max_length=50,
blank=True,
verbose_name='Next of keen phone'
)
next_of_keen_address = models.TextField(max_length=2000,
blank=True,
verbose_name='Next of keen address'
)
dead = models.BooleanField(
verbose_name='Deceased',
default=False,
......@@ -103,7 +123,7 @@ class Subject(models.Model):
)
def pretty_address(self):
return u'{} ({}), {}. {}'.format(self.address, self.postal_code, self.city, self.country)
return u'{} ({}), {}. {}'.format(self.address, self.postal_code, self.city, self.country)
def mark_as_dead(self):
self.dead = True
......@@ -130,8 +150,8 @@ class Subject(models.Model):
return "%s %s" % (self.first_name, self.last_name)
#SIGNALS
# SIGNALS
@receiver(post_save, sender=Subject)
def set_as_deceased(sender, instance, **kwargs):
if instance.dead:
instance.mark_as_dead()
\ No newline at end of file
if instance.dead:
instance.mark_as_dead()
......@@ -83,3 +83,18 @@ class SubjectColumns(models.Model):
default=True,
verbose_name='Deceased',
)
next_of_keen_name = models.BooleanField(max_length=1,
default=False,
verbose_name='Next of keen',
)
next_of_keen_phone = models.BooleanField(max_length=1,
default=False,
verbose_name='Next of keen phone',
)
next_of_keen_address = models.BooleanField(max_length=1,
default=False,
verbose_name='Next of keen address',
)
......@@ -16,12 +16,14 @@
</a>
</li>
<li data-desc="daily_planning">
<a href="{% url 'web.views.daily_planning' %}">
<i class="fa fa-clock-o"></i>
<span>Daily Planning</span>
</a>
</li>
{% if "view_daily_planning" in permissions %}
<li data-desc="daily_planning">
<a href="{% url 'web.views.daily_planning' %}">
<i class="fa fa-clock-o"></i>
<span>Daily Planning</span>
</a>
</li>
{% endif %}
{% if "change_worker" in permissions %}
<li data-desc="workers">
......@@ -32,44 +34,63 @@
</li>
{% endif %}
<li data-desc="equipment_and_rooms" class="treeview">
<a href="{% url 'web.views.equipment_and_rooms' %}">
<i class="fa fa-building-o"></i> <span>Equipment &amp; Rooms</span>
<span class="pull-right-container">
{% if equipment_perms %}
<li data-desc="equipment_and_rooms" class="treeview">
<a href="{% url 'web.views.equipment_and_rooms' %}">
<i class="fa fa-building-o"></i> <span>Equipment &amp; Rooms</span>
<span class="pull-right-container">
<i class="fa fa-angle-left pull-right"></i>
</span>
</a>
<ul class="treeview-menu">
<li data-desc="equipment_items"><a href="{% url 'web.views.equipment' %}">Equipment items</a></li>
{% if "change_appointmenttype" in permissions %}
<li data-desc="appointment_types"><a href="{% url 'web.views.appointment_types' %}">Appointment Types</a></li>
{% endif %}
<li data-desc="flying_teams"><a href="{% url 'web.views.equipment_and_rooms.flying_teams' %}">Flying teams</a></li>
<li data-desc="kit_requests"><a href="{% url 'web.views.kit_requests' %}">Kit requests</a></li>
<li data-desc="rooms"><a href="{% url 'web.views.equipment_and_rooms.rooms' %}">Rooms</a></li>
</ul>
</li>
</a>
<ul class="treeview-menu">
{% if "change_item" in permissions %}
<li data-desc="equipment_items"><a href="{% url 'web.views.equipment' %}">Equipment items</a></li>
{% endif %}
{% if "change_appointmenttype" in permissions %}
<li data-desc="appointment_types"><a href="{% url 'web.views.appointment_types' %}">Appointment
Types</a></li>
{% endif %}
{% if "change_flyingteam" in permissions %}
<li data-desc="flying_teams"><a href="{% url 'web.views.equipment_and_rooms.flying_teams' %}">Flying
teams</a></li>
{% endif %}
{% if "send_sample_mail_for_appointments" in permissions %}
<li data-desc="kit_requests"><a href="{% url 'web.views.kit_requests' %}">Kit requests</a></li>
{% endif %}
{% if "change_room" in permissions %}
<li data-desc="rooms"><a href="{% url 'web.views.equipment_and_rooms.rooms' %}">Rooms</a></li>
{% endif %}
</ul>
</li>
{% endif %}
<li data-desc="statistics">
<a href="{% url 'web.views.statistics' %}">
<i class="fa fa-bar-chart" aria-hidden="true"></i>
<span>Statistics</span>
</a>
</li>
{% if "view_statistics" in permissions %}
<li data-desc="statistics">
<a href="{% url 'web.views.statistics' %}">
<i class="fa fa-bar-chart" aria-hidden="true"></i>
<span>Statistics</span>
</a>
</li>
{% endif %}
<li data-desc="mail_templates">
<a href="{% url 'web.views.mail_templates' %}">
<i class="fa fa-envelope-o"></i>
<span>Mail templates</span>
</a>
</li>
<li data-desc="export">
<a href="{% url 'web.views.export' %}">
<i class="fa fa-file-excel-o"></i>
<span>Export</span>
</a>
</li>
{% if "change_mailtemplate" in permissions %}
<li data-desc="mail_templates">
<a href="{% url 'web.views.mail_templates' %}">
<i class="fa fa-envelope-o"></i>
<span>Mail templates</span>
</a>
</li>
{% endif %}
{% if "export_subjects" in permissions %}
<li data-desc="export">
<a href="{% url 'web.views.export' %}">
<i class="fa fa-file-excel-o"></i>
<span>Export</span>
</a>
</li>
{% endif %}
{% if study.has_vouchers and "change_voucher" in permissions%}
<li data-desc="vouchers">
......
......@@ -204,6 +204,11 @@
$("#confirm-dead-resigned-mark-dialog").modal("show");
return false;
}
var brainDonation = $("#id_study_subject-brain_donation_agreement").is(":checked");
if (brainDonation && ($("#id_subject-next_of_keen_phone").val() === '' || $("#id_subject-next_of_keen_address").val() === '' || $("#id_subject-next_of_keen_name").val() === '')) {
alert("Next of keen data must be entered when brain donation agreement is in place");
return false;
}
});
$("#confirm-save").click(function () {
confirmed = true;
......
import logging
from django.urls import reverse
from web.tests import LoggedInTestCase
logger = logging.getLogger(__name__)
class DailyPlanningViewTests(LoggedInTestCase):
def test_visit_details_request(self):
self.login_as_admin()
response = self.client.get(reverse('web.views.daily_planning'))
self.assertEqual(response.status_code, 200)
def test_visit_details_request_without_permissions(self):
self.login_as_staff()
response = self.client.get(reverse('web.views.daily_planning'))
self.assertEqual(response.status_code, 302)
......@@ -10,7 +10,14 @@ logger = logging.getLogger(__name__)
class EquipmentTests(LoggedInTestCase):
def test_list_without_permissions(self):
self.login_as_staff()
response = self.client.get(reverse('web.views.equipment'))
self.assertEqual(response.status_code, 302)
def test_equipment_requests(self):
self.login_as_admin()
pages = [
'web.views.equipment',
'web.views.equipment_add',
......@@ -21,6 +28,7 @@ class EquipmentTests(LoggedInTestCase):
self.assertEqual(response.status_code, 200)
def test_equipment_edit_request(self):
self.login_as_admin()
item = create_item()
page = reverse('web.views.equipment_edit',
kwargs={'equipment_id': str(item.id)})
......@@ -28,6 +36,7 @@ class EquipmentTests(LoggedInTestCase):
self.assertEqual(response.status_code, 200)
def test_equipment_delete_request(self):
self.login_as_admin()
item = create_item()
page = reverse('web.views.equipment_delete',
kwargs={'equipment_id': str(item.id)})
......@@ -35,6 +44,7 @@ class EquipmentTests(LoggedInTestCase):
self.assertEqual(response.status_code, 302)
def test_equipment_add(self):
self.login_as_admin()
page = reverse('web.views.equipment_add')
data = {
'name': 'The mysterious potion',
......@@ -48,6 +58,7 @@ class EquipmentTests(LoggedInTestCase):
self.assertEqual(len(freshly_created), 1)
def test_equipment_edit(self):
self.login_as_admin()
item = create_item()
page = reverse('web.views.equipment_edit',
kwargs={'equipment_id': str(item.id)})
......@@ -64,6 +75,7 @@ class EquipmentTests(LoggedInTestCase):
self.assertEqual(getattr(freshly_edited, key, ''), data[key])
def test_equipment_delete(self):
self.login_as_admin()
item = create_item()
page = reverse('web.views.equipment_delete',
kwargs={'equipment_id': str(item.id)})
......
......@@ -9,26 +9,47 @@ from web.views.export import subject_to_row_for_fields, DROP_OUT_FIELD
class TestExportView(LoggedInTestCase):
def test_export_subjects_to_csv(self):
self.login_as_admin()
create_study_subject()
response = self.client.get(reverse('web.views.export_to_csv', kwargs={'data_type': "subjects"}))
self.assertEqual(response.status_code, 200)
def test_export_subjects_to_csv_without_permission(self):
response = self.client.get(reverse("web.views.mail_templates"))
create_study_subject()
response = self.client.get(reverse('web.views.export_to_csv', kwargs={'data_type': "subjects"}))
self.assertEqual(response.status_code, 302)
def test_render_export(self):
self.login_as_admin()
create_study_subject()
response = self.client.get(reverse('web.views.export'))
self.assertEqual(response.status_code, 200)
def test_render_export_without_permission(self):
create_study_subject()
response = self.client.get(reverse('web.views.export'))
self.assertEqual(response.status_code, 302)
def test_export_appointments_to_csv(self):
self.login_as_admin()
create_appointment()
response = self.client.get(reverse('web.views.export_to_csv', kwargs={'data_type': "appointments"}))
self.assertEqual(response.status_code, 200)
def test_export_subjects_to_excel(self):
self.login_as_admin()
create_study_subject()
response = self.client.get(reverse('web.views.export_to_excel', kwargs={'data_type': "subjects"}))
self.assertEqual(response.status_code, 200)
def test_export_subjects_to_excel_without_permission(self):
create_study_subject()
response = self.client.get(reverse('web.views.export_to_excel', kwargs={'data_type': "subjects"}))
self.assertEqual(response.status_code, 302)
def test_export_appointments_to_excel(self):
self.login_as_admin()
appointment = create_appointment()
appointment.visit = None
appointment.save()
......
......@@ -17,6 +17,7 @@ class FlyingTeamTests(LoggedInTestCase):
return 'Random' + ''.join(random.choice(letters) for x in range(15))
def test_flying_team_requests(self):
self.login_as_admin()
pages = [
'web.views.equipment_and_rooms.flying_teams',
'web.views.equipment_and_rooms.flying_teams_add',
......@@ -26,7 +27,18 @@ class FlyingTeamTests(LoggedInTestCase):
response = self.client.get(reverse(page))
self.assertEqual(response.status_code, 200)
def test_flying_team_requests_without_permission(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, 302)
def test_flying_team_add(self):
self.login_as_admin()
page = reverse('web.views.equipment_and_rooms.flying_teams_add')
data = {
'place': self.generate_more_or_less_random_name()
......@@ -38,6 +50,7 @@ class FlyingTeamTests(LoggedInTestCase):
self.assertEqual(len(freshly_created), 1)
def test_flying_team_edit(self):
self.login_as_admin()
flying_team = create_flying_team()
page = reverse('web.views.equipment_and_rooms.flying_teams_edit',
kwargs={'flying_team_id': str(flying_team.id)})
......@@ -51,6 +64,7 @@ class FlyingTeamTests(LoggedInTestCase):
self.assertEqual(freshly_edited.place, data["place"])
def test_flying_team_edit_request(self):
self.login_as_admin()
flying_team = create_flying_team()
page = reverse('web.views.equipment_and_rooms.flying_teams_edit',
kwargs={'flying_team_id': str(flying_team.id)})
......