diff --git a/PyRIGS/settings.py b/PyRIGS/settings.py index 7f371f3d..54a3d228 100644 --- a/PyRIGS/settings.py +++ b/PyRIGS/settings.py @@ -218,8 +218,6 @@ TIME_ZONE = 'Europe/London' FORMAT_MODULE_PATH = 'PyRIGS.formats' -USE_I18N = True - USE_L10N = True USE_TZ = True @@ -264,3 +262,10 @@ TERMS_OF_HIRE_URL = "http://www.nottinghamtec.co.uk/terms.pdf" AUTHORISATION_NOTIFICATION_ADDRESS = 'productions@nottinghamtec.co.uk' DEFAULT_AUTO_FIELD = 'django.db.models.AutoField' + +SECURE_HSTS_SECONDS = 3600 +SECURE_HSTS_INCLUDE_SUBDOMAINS = True +SECURE_CONTENT_TYPE_NOSNIFF = True +SESSION_COOKIE_SECURE = env('SESSION_COOKIE_SECURE_ENABLED', True) +CSRF_COOKIE_SECURE = env('CSRF_COOKIE_SECURE_ENABLED', True) +SECURE_HSTS_PRELOAD = True diff --git a/PyRIGS/tests/base.py b/PyRIGS/tests/base.py index d1669d5e..bcf1824c 100644 --- a/PyRIGS/tests/base.py +++ b/PyRIGS/tests/base.py @@ -63,7 +63,7 @@ def screenshot_failure(func): if not pathlib.Path("screenshots").is_dir(): os.mkdir("screenshots") self.driver.save_screenshot(screenshot_file) - print("Error in test {} is at path {}".format(screenshot_name, screenshot_file), file=sys.stderr) + print(f"Error in test {screenshot_name} is at path {screenshot_file}", file=sys.stderr) raise e return wrapper_func diff --git a/PyRIGS/tests/test_unit.py b/PyRIGS/tests/test_unit.py index 3ab38567..12207d7d 100644 --- a/PyRIGS/tests/test_unit.py +++ b/PyRIGS/tests/test_unit.py @@ -59,8 +59,8 @@ class TestSampleDataGenerator(TestCase): assert Asset.objects.all().count() > 50 assert Event.objects.all().count() > 100 call_command('deleteSampleData') - assert Asset.objects.all().count() == 0 - assert Event.objects.all().count() == 0 + assert not Asset.objects.all().exists() + assert not Event.objects.all().exists() @override_settings(DEBUG=True) @@ -76,9 +76,9 @@ def test_unauthenticated(client): # Nothing should be available to the unauthen assertTemplateUsed(response, 'login_redirect.html') else: if "embed" in str(url): - expected_url = "{0}?next={1}".format(reverse('login_embed'), request_url) + expected_url = f"{reverse('login_embed')}?next={request_url}" else: - expected_url = "{0}?next={1}".format(reverse('login'), request_url) + expected_url = f"{reverse('login')}?next={request_url}" assertRedirects(response, expected_url) call_command('deleteSampleData') diff --git a/RIGS/forms.py b/RIGS/forms.py index 2f548632..9a5f60b6 100644 --- a/RIGS/forms.py +++ b/RIGS/forms.py @@ -131,7 +131,7 @@ class BaseClientEventAuthorisationForm(forms.ModelForm): def clean(self): if self.cleaned_data.get('amount') != self.instance.event.total: self.add_error('amount', 'The amount authorised must equal the total for the event (inc VAT).') - return super(BaseClientEventAuthorisationForm, self).clean() + return super().clean() class Meta: abstract = True @@ -179,7 +179,7 @@ class EventRiskAssessmentForm(forms.ModelForm): unexpected_values.append(f"
  • {self._meta.model._meta.get_field(field).help_text}
  • ") if len(unexpected_values) > 0 and not self.cleaned_data.get('supervisor_consulted'): raise forms.ValidationError(f"Your answers to these questions: require consulting with a supervisor.", code='unusual_answers') - return super(EventRiskAssessmentForm, self).clean() + return super().clean() class Meta: model = models.RiskAssessment diff --git a/RIGS/templatetags/filters.py b/RIGS/templatetags/filters.py index b2480d40..73a8c148 100644 --- a/RIGS/templatetags/filters.py +++ b/RIGS/templatetags/filters.py @@ -171,7 +171,7 @@ def title_spaced(string): @register.filter(needs_autoescape=True) def namewithnotes(obj, url, autoescape=True): if hasattr(obj, 'notes') and obj.notes is not None and len(obj.notes) > 0: - return mark_safe(obj.name + " ".format(reverse(url, kwargs={'pk': obj.pk}))) + return mark_safe(obj.name + f" ") else: return obj.name @@ -183,7 +183,7 @@ def linkornone(target, namespace=None, autoescape=True): link = namespace + "://" + target else: link = target - return mark_safe("{}".format(link, str(target))) + return mark_safe(f"{target}") else: return "None" diff --git a/RIGS/tests/pages.py b/RIGS/tests/pages.py index 7745c0c1..a2765830 100644 --- a/RIGS/tests/pages.py +++ b/RIGS/tests/pages.py @@ -114,7 +114,7 @@ class CreateEvent(FormPage): } def select_event_type(self, type_name): - self.find_element(By.XPATH, '//button[.="{}"]'.format(type_name)).click() + self.find_element(By.XPATH, f'//button[.="{type_name}"]').click() def item_row(self, ID): return rigs_regions.ItemRow(self, self.find_element(By.ID, "item-" + ID)) diff --git a/RIGS/tests/test_unit.py b/RIGS/tests/test_unit.py index 3c038e46..461fcaca 100644 --- a/RIGS/tests/test_unit.py +++ b/RIGS/tests/test_unit.py @@ -259,7 +259,7 @@ class TestPrintPaperwork(TestCase): def test_login_redirect(client, django_user_model): request_url = reverse('event_embed', kwargs={'pk': 1}) - expected_url = "{0}?next={1}".format(reverse('login_embed'), request_url) + expected_url = f"{reverse('login_embed')}?next={request_url}" # Request the page and check it redirects response = client.get(request_url, follow=True) @@ -372,7 +372,8 @@ def test_ra_redirect(admin_client, admin_user, ra): class TestMarkdownTemplateTags(TestCase): - markdown = open(os.path.join(settings.BASE_DIR, "RIGS/tests/sample.md")).read() + with open(os.path.join(settings.BASE_DIR, "RIGS/tests/sample.md")) as f: + markdown = f.read() def test_html_safe(self): html = markdown_filter(self.markdown) diff --git a/RIGS/views/hs.py b/RIGS/views/hs.py index 622b5ad7..225be858 100644 --- a/RIGS/views/hs.py +++ b/RIGS/views/hs.py @@ -73,7 +73,7 @@ class EventRiskAssessmentEdit(generic.UpdateView): return reverse('ra_detail', kwargs={'pk': self.object.pk}) def get_context_data(self, **kwargs): - context = super(EventRiskAssessmentEdit, self).get_context_data(**kwargs) + context = super().get_context_data(**kwargs) rpk = self.kwargs.get('pk') ra = models.RiskAssessment.objects.get(pk=rpk) context['event'] = ra.event @@ -88,7 +88,7 @@ class EventRiskAssessmentDetail(generic.DetailView): template_name = 'hs/risk_assessment_detail.html' def get_context_data(self, **kwargs): - context = super(EventRiskAssessmentDetail, self).get_context_data(**kwargs) + context = super().get_context_data(**kwargs) context['page_title'] = f"Risk Assessment for Event {self.object.event.display_id} {self.object.event.name}" return context @@ -98,7 +98,7 @@ class EventChecklistDetail(generic.DetailView): template_name = 'hs/event_checklist_detail.html' def get_context_data(self, **kwargs): - context = super(EventChecklistDetail, self).get_context_data(**kwargs) + context = super().get_context_data(**kwargs) context['page_title'] = f"Event Checklist for Event {self.object.event.display_id} {self.object.event.name}" return context @@ -116,7 +116,7 @@ class EventChecklistEdit(generic.UpdateView): return reverse('ec_detail', kwargs={'pk': self.object.pk}) def get_context_data(self, **kwargs): - context = super(EventChecklistEdit, self).get_context_data(**kwargs) + context = super().get_context_data(**kwargs) pk = self.kwargs.get('pk') ec = models.EventChecklist.objects.get(pk=pk) context['event'] = ec.event @@ -223,7 +223,7 @@ class HSList(generic.ListView): return models.Event.objects.all().exclude(status=models.Event.CANCELLED).order_by('-start_date').select_related('riskassessment').prefetch_related('checklists') def get_context_data(self, **kwargs): - context = super(HSList, self).get_context_data(**kwargs) + context = super().get_context_data(**kwargs) context['page_title'] = 'H&S Overview' return context diff --git a/training/models.py b/training/models.py index 9f6fddc8..694af080 100644 --- a/training/models.py +++ b/training/models.py @@ -369,7 +369,7 @@ class TrainingLevelQualification(models.Model, RevisionMixin): return str(self) def get_absolute_url(self): - return reverse('trainee_detail', kwargs={'pk': self.trainee.pk}) + return reverse('trainee_detail', kwargs={'pk': self.trainee_id}) class Meta: unique_together = ["trainee", "level"] diff --git a/training/templatetags/tags.py b/training/templatetags/tags.py index a43ee8fe..30c18fbc 100644 --- a/training/templatetags/tags.py +++ b/training/templatetags/tags.py @@ -43,7 +43,7 @@ def confirm_button(user, trainee, level): if level.user_has_requirements(trainee): string = "Awaiting Confirmation" if models.Trainee.objects.get(pk=user.pk).is_supervisor or user.has_perm('training.add_traininglevelqualification'): - string += "Confirm".format(reverse('confirm_level', kwargs={'pk': trainee.pk, 'level_pk': level.pk})) + string += f"Confirm" return mark_safe(string) else: return "" diff --git a/versioning/urls.py b/versioning/urls.py index f0551eb0..65081497 100644 --- a/versioning/urls.py +++ b/versioning/urls.py @@ -30,15 +30,15 @@ for app in [apps.get_app_config(label) for label in ("RIGS", "assets", "training modelname = model.__name__.lower() if appname == 'rigboard': urlpatterns += [ - path('{}//history/'.format(modelname), - permission_required_with_403('{}.change_{}'.format(app.label, modelname))( + path(f'{modelname}//history/', + permission_required_with_403(f'{app.label}.change_{modelname}')( views.VersionHistory.as_view()), - name='{}_history'.format(modelname), kwargs={'model': model, 'app': appname, }), + name=f'{modelname}_history', kwargs={'model': model, 'app': appname, }), ] else: urlpatterns += [ - path('{}/{}//history/'.format(appname, modelname), - permission_required_with_403('{}.change_{}'.format(app.label, modelname))( + path(f'{appname}/{modelname}//history/', + permission_required_with_403('{app.label}.change_{modelname}')( views.VersionHistory.as_view()), - name='{}_history'.format(modelname), kwargs={'model': model, 'app': appname, }), + name=f'{modelname}_history', kwargs={'model': model, 'app': appname, }), ] diff --git a/versioning/views.py b/versioning/views.py index d9353971..354d7ccd 100644 --- a/versioning/views.py +++ b/versioning/views.py @@ -27,10 +27,10 @@ class VersionHistory(generic.ListView): return get_object_or_404(self.kwargs['model'], pk=self.kwargs['pk']) def get_context_data(self, **kwargs): - context = super(VersionHistory, self).get_context_data(**kwargs) + context = super().get_context_data(**kwargs) context['object'] = self.get_object() if self.kwargs['app'] != 'rigboard': - context['override'] = 'base_{}.html'.format(self.kwargs['app']) + context['override'] = f'base_{self.kwargs["app"]}.html' return context @@ -59,10 +59,10 @@ class ActivityTable(generic.ListView): return RIGSVersion.objects.get_for_multiple_models(filter_models(self.kwargs.get('models'), self.request.user)).order_by("-revision__date_created") def get_context_data(self, **kwargs): - context = super(ActivityTable, self).get_context_data(**kwargs) - context['page_title'] = "{} Activity Stream".format(title(self.kwargs['app'])) + context = super().get_context_data(**kwargs) + context['page_title'] = f"{title(self.kwargs['app'])} Activity Stream" if self.kwargs['app'] != 'rigboard': - context['override'] = 'base_{}.html'.format(self.kwargs['app']) + context['override'] = f'base_{self.kwargs["app"]}.html' return context @@ -77,7 +77,7 @@ class ActivityFeed(generic.ListView): # Appears on homepage def get_context_data(self, **kwargs): # Call the base implementation first to get a context - context = super(ActivityFeed, self).get_context_data(**kwargs) + context = super().get_context_data(**kwargs) context['page_title'] = "Activity Feed" maxTimeDelta = datetime.timedelta(hours=1)