mirror of
https://github.com/nottinghamtec/PyRIGS.git
synced 2026-01-17 05:22:16 +00:00
Create 'upcoming events list' with very limited data
UoN users (with nottingham.ac.uk emails) are allowed to access this page only. Not a huge fan of the implementation, hoping someone (maybe future me) comes up with a less nasty implementation
This commit is contained in:
@@ -121,3 +121,7 @@ def nottinghamtec_address_required(function):
|
|||||||
return function(request, *args, **kwargs)
|
return function(request, *args, **kwargs)
|
||||||
|
|
||||||
return wrap
|
return wrap
|
||||||
|
|
||||||
|
|
||||||
|
def not_estates():
|
||||||
|
return user_passes_test_with_403(lambda u: not u.email.endswith('@nottingham.ac.uk'))
|
||||||
@@ -6,6 +6,8 @@ from django.contrib.staticfiles.urls import staticfiles_urlpatterns
|
|||||||
from django.urls import path
|
from django.urls import path
|
||||||
from django.views.generic import TemplateView
|
from django.views.generic import TemplateView
|
||||||
|
|
||||||
|
from PyRIGS.decorators import not_estates
|
||||||
|
|
||||||
from PyRIGS import views
|
from PyRIGS import views
|
||||||
|
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
@@ -14,17 +16,17 @@ urlpatterns = [
|
|||||||
path('assets/', include('assets.urls')),
|
path('assets/', include('assets.urls')),
|
||||||
path('training/', include('training.urls')),
|
path('training/', include('training.urls')),
|
||||||
|
|
||||||
path('', login_required(views.Index.as_view()), name='index'),
|
path('', not_estates()(views.Index.as_view()), name='index'),
|
||||||
|
|
||||||
# API
|
# API
|
||||||
path('api/<str:model>/', login_required(views.SecureAPIRequest.as_view()),
|
path('api/<str:model>/', not_estates()(views.SecureAPIRequest.as_view()),
|
||||||
name="api_secure"),
|
name="api_secure"),
|
||||||
path('api/<str:model>/<int:pk>/', login_required(views.SecureAPIRequest.as_view()),
|
path('api/<str:model>/<int:pk>/', not_estates()(views.SecureAPIRequest.as_view()),
|
||||||
name="api_secure"),
|
name="api_secure"),
|
||||||
|
|
||||||
path('closemodal/', views.CloseModal.as_view(), name='closemodal'),
|
path('closemodal/', views.CloseModal.as_view(), name='closemodal'),
|
||||||
path('search/', login_required(views.Search.as_view()), name='search'),
|
path('search/', not_estates()(views.Search.as_view()), name='search'),
|
||||||
path('search_help/', login_required(views.SearchHelp.as_view()), name='search_help'),
|
path('search_help/', not_estates()(views.SearchHelp.as_view()), name='search_help'),
|
||||||
|
|
||||||
path('', include('users.urls')),
|
path('', include('users.urls')),
|
||||||
|
|
||||||
|
|||||||
5
RIGS/templates/estates/estates_event_list.html
Normal file
5
RIGS/templates/estates/estates_event_list.html
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
{% extends 'base_client.html' %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
{% include 'estates/estates_event_table.html' %}
|
||||||
|
{% endblock %}
|
||||||
78
RIGS/templates/estates/estates_event_table.html
Normal file
78
RIGS/templates/estates/estates_event_table.html
Normal file
@@ -0,0 +1,78 @@
|
|||||||
|
{% load namewithnotes from filters %}
|
||||||
|
{% load markdown_tags %}
|
||||||
|
<div class="table-responsive">
|
||||||
|
<table class="table mb-0" id="event_table">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th scope="col">#</th>
|
||||||
|
<th scope="col">Dates & Times</th>
|
||||||
|
<th scope="col">Event Details</th>
|
||||||
|
<th scope="col">Status</th>
|
||||||
|
<th scope="col">Member In Charge</th>
|
||||||
|
<th scope="col">Power Plan</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
{% for event in events %}
|
||||||
|
<tr {% if event.cancelled %}style="opacity: 50% !important;"{% endif %} id="event_row">
|
||||||
|
<!---Number-->
|
||||||
|
<th scope="row" id="event_number">{{ event.display_id }}</th>
|
||||||
|
<!--Dates & Times-->
|
||||||
|
<td id="event_dates" style="text-align: justify;">
|
||||||
|
<span class="text-nowrap">Start: <strong>{{ event.start_date|date:"D d/m/Y" }}
|
||||||
|
{% if event.has_start_time %}
|
||||||
|
{{ event.start_time|date:"H:i" }}
|
||||||
|
{% endif %}</strong>
|
||||||
|
</span>
|
||||||
|
{% if event.end_date %}
|
||||||
|
<br>
|
||||||
|
<span class="text-nowrap">End: {% if event.end_date != event.start_date %}<strong>{{ event.end_date|date:"D d/m/Y" }}{% endif %}
|
||||||
|
{% if event.has_end_time %}
|
||||||
|
{{ event.end_time|date:"H:i" }}
|
||||||
|
{% endif %}</strong>
|
||||||
|
</span>
|
||||||
|
{% endif %}
|
||||||
|
</td>
|
||||||
|
<!---Details-->
|
||||||
|
<td id="event_details" class="w-100">
|
||||||
|
<h4>
|
||||||
|
{{ event.name }}
|
||||||
|
{% if event.venue %}
|
||||||
|
<small>at {{ event.venue }}</small>
|
||||||
|
{% endif %}
|
||||||
|
</h4>
|
||||||
|
{% if event.is_rig and not event.cancelled %}
|
||||||
|
<h5>
|
||||||
|
{{ event.person.name }}
|
||||||
|
{% if event.organisation %}
|
||||||
|
for {{ event.organisation.name }}
|
||||||
|
{% endif %}
|
||||||
|
</h5>
|
||||||
|
{% endif %}
|
||||||
|
{% if not event.cancelled and event.description %}
|
||||||
|
<p>{{ event.description|markdown }}</p>
|
||||||
|
{% endif %}
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
{{ event.get_status_display }}
|
||||||
|
</td>
|
||||||
|
<!---MIC-->
|
||||||
|
<td id="event_mic" class="text-nowrap">
|
||||||
|
{% if event.mic %}
|
||||||
|
{{ event.mic }}
|
||||||
|
{% elif event.is_rig %}
|
||||||
|
<span class="fas fa-user-slash"></span>
|
||||||
|
{% endif %}
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
{{ event.riskassessment.power_plan|default:"Pending" }}
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
{% empty %}
|
||||||
|
<tr class="bg-warning">
|
||||||
|
<td colspan="4">No events found</td>
|
||||||
|
</tr>
|
||||||
|
{% endfor %}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
27
RIGS/urls.py
27
RIGS/urls.py
@@ -4,7 +4,7 @@ from django.views.decorators.clickjacking import xframe_options_exempt
|
|||||||
from django.views.generic import RedirectView
|
from django.views.generic import RedirectView
|
||||||
|
|
||||||
from PyRIGS.decorators import (api_key_required, has_oembed,
|
from PyRIGS.decorators import (api_key_required, has_oembed,
|
||||||
permission_required_with_403)
|
permission_required_with_403, not_estates)
|
||||||
from . import views
|
from . import views
|
||||||
|
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
@@ -42,21 +42,22 @@ urlpatterns = [
|
|||||||
name='venue_update'),
|
name='venue_update'),
|
||||||
|
|
||||||
# Rigboard
|
# Rigboard
|
||||||
path('rigboard/', login_required(views.RigboardIndex.as_view()), name='rigboard'),
|
path('rigboard/', not_estates()(views.RigboardIndex.as_view()), name='rigboard'),
|
||||||
path('rigboard/calendar/', login_required()(views.WebCalendar.as_view()),
|
path('rigboard/calendar/', not_estates()(views.WebCalendar.as_view()),
|
||||||
name='web_calendar'),
|
name='web_calendar'),
|
||||||
re_path(r'^rigboard/calendar/(?P<view>(month|week|day))/$',
|
re_path(r'^rigboard/calendar/(?P<view>(month|week|day))/$',
|
||||||
login_required()(views.WebCalendar.as_view()), name='web_calendar'),
|
not_estates()(views.WebCalendar.as_view()), name='web_calendar'),
|
||||||
re_path(r'^rigboard/calendar/(?P<view>(month|week|day))/(?P<date>(\d{4}-\d{2}-\d{2}))/$',
|
re_path(r'^rigboard/calendar/(?P<view>(month|week|day))/(?P<date>(\d{4}-\d{2}-\d{2}))/$',
|
||||||
login_required()(views.WebCalendar.as_view()), name='web_calendar'),
|
not_estates()(views.WebCalendar.as_view()), name='web_calendar'),
|
||||||
path('rigboard/archive/', RedirectView.as_view(permanent=True, pattern_name='event_archive')),
|
path('rigboard/archive/', RedirectView.as_view(permanent=True, pattern_name='event_archive')),
|
||||||
|
|
||||||
|
path('estates/', login_required()(views.EstatesEventList.as_view()), name='estates'),
|
||||||
|
|
||||||
path('event/<int:pk>/', has_oembed(oembed_view="event_oembed")(views.EventDetail.as_view()),
|
path('event/<int:pk>/', has_oembed(oembed_view="event_oembed")(views.EventDetail.as_view()),
|
||||||
name='event_detail'),
|
name='event_detail'),
|
||||||
path('event/create/', permission_required_with_403('RIGS.add_event')(views.EventCreate.as_view()),
|
path('event/create/', permission_required_with_403('RIGS.add_event')(views.EventCreate.as_view()),
|
||||||
name='event_create'),
|
name='event_create'),
|
||||||
path('event/archive/', login_required()(views.EventArchive.as_view()),
|
path('event/archive/', not_estates()(views.EventArchive.as_view()),
|
||||||
name='event_archive'),
|
name='event_archive'),
|
||||||
path('event/<int:pk>/embed/',
|
path('event/<int:pk>/embed/',
|
||||||
xframe_options_exempt(login_required(login_url='/user/login/embed/')(views.EventEmbed.as_view())),
|
xframe_options_exempt(login_required(login_url='/user/login/embed/')(views.EventEmbed.as_view())),
|
||||||
@@ -75,7 +76,7 @@ urlpatterns = [
|
|||||||
|
|
||||||
path('event/<int:pk>/ra/', permission_required_with_403('RIGS.add_riskassessment')(views.EventRiskAssessmentCreate.as_view()),
|
path('event/<int:pk>/ra/', permission_required_with_403('RIGS.add_riskassessment')(views.EventRiskAssessmentCreate.as_view()),
|
||||||
name='event_ra'),
|
name='event_ra'),
|
||||||
path('event/ra/<int:pk>/', login_required(views.EventRiskAssessmentDetail.as_view()),
|
path('event/ra/<int:pk>/', not_estates()(views.EventRiskAssessmentDetail.as_view()),
|
||||||
name='ra_detail'),
|
name='ra_detail'),
|
||||||
path('event/ra/<int:pk>/edit/', permission_required_with_403('RIGS.change_riskassessment')(views.EventRiskAssessmentEdit.as_view()),
|
path('event/ra/<int:pk>/edit/', permission_required_with_403('RIGS.change_riskassessment')(views.EventRiskAssessmentEdit.as_view()),
|
||||||
name='ra_edit'),
|
name='ra_edit'),
|
||||||
@@ -85,7 +86,7 @@ urlpatterns = [
|
|||||||
|
|
||||||
path('event/<int:pk>/checklist/', permission_required_with_403('RIGS.add_eventchecklist')(views.EventChecklistCreate.as_view()),
|
path('event/<int:pk>/checklist/', permission_required_with_403('RIGS.add_eventchecklist')(views.EventChecklistCreate.as_view()),
|
||||||
name='event_ec'),
|
name='event_ec'),
|
||||||
path('event/checklist/<int:pk>/', login_required(views.EventChecklistDetail.as_view()),
|
path('event/checklist/<int:pk>/', not_estates()(views.EventChecklistDetail.as_view()),
|
||||||
name='ec_detail'),
|
name='ec_detail'),
|
||||||
path('event/checklist/<int:pk>/edit/', permission_required_with_403('RIGS.change_eventchecklist')(views.EventChecklistEdit.as_view()),
|
path('event/checklist/<int:pk>/edit/', permission_required_with_403('RIGS.change_eventchecklist')(views.EventChecklistEdit.as_view()),
|
||||||
name='ec_edit'),
|
name='ec_edit'),
|
||||||
@@ -94,20 +95,20 @@ urlpatterns = [
|
|||||||
|
|
||||||
path('event/<int:pk>/power/', permission_required_with_403('RIGS.add_powertestrecord')(views.PowerTestCreate.as_view()),
|
path('event/<int:pk>/power/', permission_required_with_403('RIGS.add_powertestrecord')(views.PowerTestCreate.as_view()),
|
||||||
name='event_pt'),
|
name='event_pt'),
|
||||||
path('event/power/<int:pk>/', login_required(views.PowerTestDetail.as_view()),
|
path('event/power/<int:pk>/', not_estates()(views.PowerTestDetail.as_view()),
|
||||||
name='pt_detail'),
|
name='pt_detail'),
|
||||||
path('event/power/<int:pk>/edit/', permission_required_with_403('RIGS.change_powertestrecord')(views.PowerTestEdit.as_view()),
|
path('event/power/<int:pk>/edit/', permission_required_with_403('RIGS.change_powertestrecord')(views.PowerTestEdit.as_view()),
|
||||||
name='pt_edit'),
|
name='pt_edit'),
|
||||||
path('event/power/<int:pk>/review/', permission_required_with_403('RIGS.review_power')(views.MarkReviewed.as_view()),
|
path('event/power/<int:pk>/review/', permission_required_with_403('RIGS.review_power')(views.MarkReviewed.as_view()),
|
||||||
name='pt_review', kwargs={'model': 'PowerTestRecord'}),
|
name='pt_review', kwargs={'model': 'PowerTestRecord'}),
|
||||||
|
|
||||||
path('event/<int:pk>/checkin/', login_required(views.EventCheckIn.as_view()),
|
path('event/<int:pk>/checkin/', not_estates()(views.EventCheckIn.as_view()),
|
||||||
name='event_checkin'),
|
name='event_checkin'),
|
||||||
path('event/checkout/', login_required(views.EventCheckOut.as_view()),
|
path('event/checkout/', not_estates()(views.EventCheckOut.as_view()),
|
||||||
name='event_checkout'),
|
name='event_checkout'),
|
||||||
path('event/<int:pk>/checkin/edit/', login_required(views.EventCheckInEdit.as_view()),
|
path('event/<int:pk>/checkin/edit/', not_estates()(views.EventCheckInEdit.as_view()),
|
||||||
name='edit_checkin'),
|
name='edit_checkin'),
|
||||||
path('event/<int:pk>/checkin/add/', login_required(views.EventCheckInOverride.as_view()),
|
path('event/<int:pk>/checkin/add/', not_estates()(views.EventCheckInOverride.as_view()),
|
||||||
name='event_checkin_override'),
|
name='event_checkin_override'),
|
||||||
|
|
||||||
path('event/<int:pk>/thread/', permission_required_with_403('RIGS.change_event')(views.CreateForumThread.as_view()), name='event_thread'),
|
path('event/<int:pk>/thread/', permission_required_with_403('RIGS.change_event')(views.CreateForumThread.as_view()), name='event_thread'),
|
||||||
|
|||||||
@@ -26,6 +26,7 @@ from django.utils import timezone
|
|||||||
from django.utils.decorators import method_decorator
|
from django.utils.decorators import method_decorator
|
||||||
from django.views import generic
|
from django.views import generic
|
||||||
from django.views.decorators.csrf import csrf_exempt
|
from django.views.decorators.csrf import csrf_exempt
|
||||||
|
from django.contrib.auth.mixins import UserPassesTestMixin
|
||||||
|
|
||||||
from PyRIGS import decorators
|
from PyRIGS import decorators
|
||||||
from PyRIGS.views import OEmbedView, is_ajax, ModalURLMixin, PrintView, get_related
|
from PyRIGS.views import OEmbedView, is_ajax, ModalURLMixin, PrintView, get_related
|
||||||
@@ -422,3 +423,17 @@ class RecieveForumWebhook(generic.View):
|
|||||||
event.save()
|
event.save()
|
||||||
return HttpResponse(status=202)
|
return HttpResponse(status=202)
|
||||||
return HttpResponse(status=204)
|
return HttpResponse(status=204)
|
||||||
|
|
||||||
|
class EstatesEventList(UserPassesTestMixin, generic.TemplateView):
|
||||||
|
template_name = 'estates/estates_event_list.html'
|
||||||
|
|
||||||
|
def get_context_data(self, **kwargs):
|
||||||
|
# get super context
|
||||||
|
context = super().get_context_data(**kwargs)
|
||||||
|
# call out method to get current events
|
||||||
|
context['events'] = models.Event.objects.current_events().filter(venue__on_campus=True, dry_hire=False, is_rig=True)
|
||||||
|
context['page_title'] = "Upcoming Campus Events"
|
||||||
|
return context
|
||||||
|
|
||||||
|
def test_func(self):
|
||||||
|
return self.request.user.email.endswith('@nottingham.ac.uk')
|
||||||
@@ -2,7 +2,7 @@ from django.contrib.auth.decorators import login_required
|
|||||||
from django.urls import path, register_converter
|
from django.urls import path, register_converter
|
||||||
from django.views.decorators.clickjacking import xframe_options_exempt
|
from django.views.decorators.clickjacking import xframe_options_exempt
|
||||||
|
|
||||||
from PyRIGS.decorators import has_oembed, permission_required_with_403
|
from PyRIGS.decorators import has_oembed, permission_required_with_403, not_estates
|
||||||
from PyRIGS.views import OEmbedView
|
from PyRIGS.views import OEmbedView
|
||||||
from . import views, converters
|
from . import views, converters
|
||||||
|
|
||||||
@@ -10,8 +10,8 @@ register_converter(converters.AssetIDConverter, 'asset')
|
|||||||
register_converter(converters.ListConverter, 'list')
|
register_converter(converters.ListConverter, 'list')
|
||||||
|
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
path('', login_required(views.AssetList.as_view()), name='asset_index'),
|
path('', not_estates()(views.AssetList.as_view()), name='asset_index'),
|
||||||
path('asset/list/', login_required(views.AssetList.as_view()), name='asset_list'),
|
path('asset/list/', not_estates()(views.AssetList.as_view()), name='asset_list'),
|
||||||
path('asset/id/<asset:pk>/', has_oembed(oembed_view="asset_oembed")(views.AssetDetail.as_view()), name='asset_detail'),
|
path('asset/id/<asset:pk>/', has_oembed(oembed_view="asset_oembed")(views.AssetDetail.as_view()), name='asset_detail'),
|
||||||
path('asset/create/', permission_required_with_403('assets.add_asset')
|
path('asset/create/', permission_required_with_403('assets.add_asset')
|
||||||
(views.AssetCreate.as_view()), name='asset_create'),
|
(views.AssetCreate.as_view()), name='asset_create'),
|
||||||
@@ -19,26 +19,26 @@ urlpatterns = [
|
|||||||
(views.AssetEdit.as_view()), name='asset_update'),
|
(views.AssetEdit.as_view()), name='asset_update'),
|
||||||
path('asset/id/<asset:pk>/duplicate/', permission_required_with_403('assets.add_asset')
|
path('asset/id/<asset:pk>/duplicate/', permission_required_with_403('assets.add_asset')
|
||||||
(views.AssetDuplicate.as_view()), name='asset_duplicate'),
|
(views.AssetDuplicate.as_view()), name='asset_duplicate'),
|
||||||
path('asset/id/<asset:pk>/label', login_required(views.GenerateLabel.as_view()), name='generate_label'),
|
path('asset/id/<asset:pk>/label', not_estates()(views.GenerateLabel.as_view()), name='generate_label'),
|
||||||
path('asset/<list:ids>/list/label', views.GenerateLabels.as_view(), name='generate_labels'),
|
path('asset/<list:ids>/list/label', views.GenerateLabels.as_view(), name='generate_labels'),
|
||||||
|
|
||||||
path('cables/list/', login_required(views.CableList.as_view()), name='cable_list'),
|
path('cables/list/', not_estates()(views.CableList.as_view()), name='cable_list'),
|
||||||
path('cabletype/list/', login_required(views.CableTypeList.as_view()), name='cable_type_list'),
|
path('cabletype/list/', not_estates()(views.CableTypeList.as_view()), name='cable_type_list'),
|
||||||
path('cabletype/create/', permission_required_with_403('assets.add_cable_type')(views.CableTypeCreate.as_view()), name='cable_type_create'),
|
path('cabletype/create/', permission_required_with_403('assets.add_cable_type')(views.CableTypeCreate.as_view()), name='cable_type_create'),
|
||||||
path('cabletype/<int:pk>/update/', permission_required_with_403('assets.change_cable_type')(views.CableTypeUpdate.as_view()), name='cable_type_update'),
|
path('cabletype/<int:pk>/update/', permission_required_with_403('assets.change_cable_type')(views.CableTypeUpdate.as_view()), name='cable_type_update'),
|
||||||
path('cabletype/<int:pk>/detail/', login_required(views.CableTypeDetail.as_view()), name='cable_type_detail'),
|
path('cabletype/<int:pk>/detail/', not_estates()(views.CableTypeDetail.as_view()), name='cable_type_detail'),
|
||||||
|
|
||||||
path('asset/id/<str:pk>/embed/',
|
path('asset/id/<str:pk>/embed/',
|
||||||
xframe_options_exempt(
|
xframe_options_exempt(
|
||||||
login_required(login_url='/user/login/embed/')(views.AssetEmbed.as_view())),
|
login_required(login_url='/user/login/embed/')(views.AssetEmbed.as_view())),
|
||||||
name='asset_embed'),
|
name='asset_embed'),
|
||||||
path('asset/id/<str:pk>/oembed_json/', views.AssetOEmbed.as_view(), name='asset_oembed'),
|
path('asset/id/<str:pk>/oembed_json/', views.AssetOEmbed.as_view(), name='asset_oembed'),
|
||||||
|
|
||||||
path('asset/audit/', permission_required_with_403('assets.change_asset')(views.AssetAuditList.as_view()), name='asset_audit_list'),
|
path('asset/audit/', permission_required_with_403('assets.change_asset')(views.AssetAuditList.as_view()), name='asset_audit_list'),
|
||||||
path('asset/id/<str:pk>/audit/', permission_required_with_403('assets.change_asset')(views.AssetAudit.as_view()), name='asset_audit'),
|
path('asset/id/<str:pk>/audit/', permission_required_with_403('assets.change_asset')(views.AssetAudit.as_view()), name='asset_audit'),
|
||||||
|
|
||||||
path('supplier/list/', login_required(views.SupplierList.as_view()), name='supplier_list'),
|
path('supplier/list/', not_estates()(views.SupplierList.as_view()), name='supplier_list'),
|
||||||
path('supplier/<int:pk>/', login_required(views.SupplierDetail.as_view()), name='supplier_detail'),
|
path('supplier/<int:pk>/', not_estates()(views.SupplierDetail.as_view()), name='supplier_detail'),
|
||||||
path('supplier/create/', permission_required_with_403('assets.add_supplier')
|
path('supplier/create/', permission_required_with_403('assets.add_supplier')
|
||||||
(views.SupplierCreate.as_view()), name='supplier_create'),
|
(views.SupplierCreate.as_view()), name='supplier_create'),
|
||||||
path('supplier/<int:pk>/edit/', permission_required_with_403('assets.change_supplier')
|
path('supplier/<int:pk>/edit/', permission_required_with_403('assets.change_supplier')
|
||||||
|
|||||||
@@ -1,33 +1,34 @@
|
|||||||
from django.urls import path
|
from django.urls import path
|
||||||
|
|
||||||
from django.contrib.auth.decorators import login_required
|
|
||||||
from training.decorators import is_supervisor
|
from training.decorators import is_supervisor
|
||||||
|
|
||||||
from training import views, models
|
from training import views, models
|
||||||
from versioning.views import VersionHistory
|
from versioning.views import VersionHistory
|
||||||
|
|
||||||
urlpatterns = [
|
from PyRIGS.decorators import not_estates
|
||||||
path('items/', login_required(views.ItemList.as_view()), name='item_list'),
|
|
||||||
path('items/export/', login_required(views.ItemListExport.as_view()), name='item_list_export'),
|
|
||||||
path('item/<int:pk>/qualified_users/', login_required(views.ItemQualifications.as_view()), name='item_qualification'),
|
|
||||||
|
|
||||||
path('trainee/list/', login_required(views.TraineeList.as_view()), name='trainee_list'),
|
urlpatterns = [
|
||||||
path('trainee/<int:pk>/', login_required(views.TraineeDetail.as_view()),
|
path('items/', not_estates()(views.ItemList.as_view()), name='item_list'),
|
||||||
|
path('items/export/', not_estates()(views.ItemListExport.as_view()), name='item_list_export'),
|
||||||
|
path('item/<int:pk>/qualified_users/', not_estates()(views.ItemQualifications.as_view()), name='item_qualification'),
|
||||||
|
|
||||||
|
path('trainee/list/', not_estates()(views.TraineeList.as_view()), name='trainee_list'),
|
||||||
|
path('trainee/<int:pk>/', not_estates()(views.TraineeDetail.as_view()),
|
||||||
name='trainee_detail'),
|
name='trainee_detail'),
|
||||||
path('trainee/<int:pk>/history', login_required(VersionHistory.as_view()), name='trainee_history', kwargs={'model': models.Trainee, 'app': 'training'}), # Not picked up automatically because proxy model (I think)
|
path('trainee/<int:pk>/history', not_estates()(VersionHistory.as_view()), name='trainee_history', kwargs={'model': models.Trainee, 'app': 'training'}), # Not picked up automatically because proxy model (I think)
|
||||||
path('trainee/<int:pk>/add_qualification/', is_supervisor()(views.AddQualification.as_view()),
|
path('trainee/<int:pk>/add_qualification/', is_supervisor()(views.AddQualification.as_view()),
|
||||||
name='add_qualification'),
|
name='add_qualification'),
|
||||||
path('trainee/edit_qualification/<int:pk>/', is_supervisor()(views.EditQualification.as_view()),
|
path('trainee/edit_qualification/<int:pk>/', is_supervisor()(views.EditQualification.as_view()),
|
||||||
name='edit_qualification'),
|
name='edit_qualification'),
|
||||||
|
|
||||||
path('levels/', login_required(views.LevelList.as_view()), name='level_list'),
|
path('levels/', not_estates()(views.LevelList.as_view()), name='level_list'),
|
||||||
path('level/<int:pk>/', login_required(views.LevelDetail.as_view()), name='level_detail'),
|
path('level/<int:pk>/', not_estates()(views.LevelDetail.as_view()), name='level_detail'),
|
||||||
path('level/<int:pk>/user/<int:u>/', login_required(views.LevelDetail.as_view()), name='level_detail'),
|
path('level/<int:pk>/user/<int:u>/', not_estates()(views.LevelDetail.as_view()), name='level_detail'),
|
||||||
path('level/<int:pk>/add_requirement/', is_supervisor()(views.AddLevelRequirement.as_view()), name='add_requirement'),
|
path('level/<int:pk>/add_requirement/', is_supervisor()(views.AddLevelRequirement.as_view()), name='add_requirement'),
|
||||||
path('level/remove_requirement/<int:pk>/', is_supervisor()(views.RemoveRequirement.as_view()), name='remove_requirement'),
|
path('level/remove_requirement/<int:pk>/', is_supervisor()(views.RemoveRequirement.as_view()), name='remove_requirement'),
|
||||||
|
|
||||||
path('trainee/<int:pk>/level/<int:level_pk>/confirm', is_supervisor()(views.ConfirmLevel.as_view()), name='confirm_level'),
|
path('trainee/<int:pk>/level/<int:level_pk>/confirm', is_supervisor()(views.ConfirmLevel.as_view()), name='confirm_level'),
|
||||||
path('trainee/<int:pk>/item_record', login_required(views.TraineeItemDetail.as_view()), name='trainee_item_detail'),
|
path('trainee/<int:pk>/item_record', not_estates()(views.TraineeItemDetail.as_view()), name='trainee_item_detail'),
|
||||||
|
|
||||||
path('session_log', is_supervisor()(views.SessionLog.as_view()), name='session_log'),
|
path('session_log', is_supervisor()(views.SessionLog.as_view()), name='session_log'),
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ from django.urls import path
|
|||||||
from django.views.decorators.clickjacking import xframe_options_exempt
|
from django.views.decorators.clickjacking import xframe_options_exempt
|
||||||
from registration.backends.default.views import RegistrationView
|
from registration.backends.default.views import RegistrationView
|
||||||
|
|
||||||
from PyRIGS.decorators import permission_required_with_403
|
from PyRIGS.decorators import permission_required_with_403, not_estates
|
||||||
from users import forms, views
|
from users import forms, views
|
||||||
|
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
@@ -14,11 +14,11 @@ urlpatterns = [
|
|||||||
path('user/login/', LoginView.as_view(authentication_form=forms.CheckApprovedForm), name='login'),
|
path('user/login/', LoginView.as_view(authentication_form=forms.CheckApprovedForm), name='login'),
|
||||||
path('user/login/embed/', xframe_options_exempt(views.LoginEmbed.as_view()), name='login_embed'),
|
path('user/login/embed/', xframe_options_exempt(views.LoginEmbed.as_view()), name='login_embed'),
|
||||||
# User editing
|
# User editing
|
||||||
path('user/edit/', login_required(views.ProfileUpdateSelf.as_view()),
|
path('user/edit/', not_estates()(views.ProfileUpdateSelf.as_view()),
|
||||||
name='profile_update_self'),
|
name='profile_update_self'),
|
||||||
path('user/reset_api_key', login_required(views.ResetApiKey.as_view(permanent=False)),
|
path('user/reset_api_key', not_estates()(views.ResetApiKey.as_view(permanent=False)),
|
||||||
name='reset_api_key'),
|
name='reset_api_key'),
|
||||||
path('user/', login_required(views.ProfileDetail.as_view()), name='profile_detail'),
|
path('user/', not_estates()(views.ProfileDetail.as_view()), name='profile_detail'),
|
||||||
path('user/<int:pk>/',
|
path('user/<int:pk>/',
|
||||||
permission_required_with_403('RIGS.view_profile')(views.ProfileDetail.as_view()),
|
permission_required_with_403('RIGS.view_profile')(views.ProfileDetail.as_view()),
|
||||||
name='profile_detail'),
|
name='profile_detail'),
|
||||||
|
|||||||
Reference in New Issue
Block a user