Skip to content

Commit

Permalink
WP-853: Adjust apcd backend to handle permissions error and general e…
Browse files Browse the repository at this point in the history
…rrors properly (#420)

* WP-853: Adjust apcd backend to handle permissions error and general errors properly

* more mixin usage

* Permissions and Registrations
  • Loading branch information
chandra-tacc authored Feb 10, 2025
1 parent d26f611 commit 67629ac
Show file tree
Hide file tree
Showing 35 changed files with 490 additions and 588 deletions.
9 changes: 4 additions & 5 deletions apcd_cms/src/apps/admin_exception/urls.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
from django.urls import path
from django.views.generic import TemplateView
from apps.admin_exception.views import AdminExceptionsTable, UpdateExceptionView
from apps.admin_exception.views import AdminExceptionsTable, AdminExceptionsApi, UpdateExceptionApi

app_name = 'admin_exception'
urlpatterns = [
path('list-exceptions/', TemplateView.as_view(template_name='list_admin_exception.html'), name="list_exceptions"),
path('list-exceptions/api/', AdminExceptionsTable.as_view(), name='admin_exceptions_table_api'),
path('exceptions/<int:exception_id>/', UpdateExceptionView.as_view(), name='update_exceptions'),
path('list-exceptions/', AdminExceptionsTable.as_view(), name="list_exceptions"),
path('list-exceptions/api/', AdminExceptionsApi.as_view(), name='admin_exceptions_table_api'),
path('exceptions/<int:exception_id>/', UpdateExceptionApi.as_view(), name='update_exceptions'),
]
59 changes: 11 additions & 48 deletions apcd_cms/src/apps/admin_exception/views.py
Original file line number Diff line number Diff line change
@@ -1,28 +1,21 @@
from django.http import HttpResponseRedirect, HttpResponse, JsonResponse
from django.core.paginator import Paginator, EmptyPage
from django.http import JsonResponse
from django.views.generic.base import TemplateView
from django.template import loader
from apps.utils.apcd_database import get_all_exceptions, update_exception
from apps.utils.apcd_groups import is_apcd_admin
from apps.utils.utils import title_case
from apps.utils.utils import table_filter
from apps.utils.utils import title_case, table_filter
from apps.components.paginator.paginator import paginator
from datetime import date as datetimeDate
from dateutil import parser
from django.views import View
from django.views import View
from apps.base.base import BaseAPIView, APCDAdminAccessAPIMixin, APCDAdminAccessTemplateMixin
import logging
import json
import json

logger = logging.getLogger(__name__)

class AdminExceptionsTable(TemplateView):

def dispatch(self, request, *args, **kwargs):
if not request.user.is_authenticated or not is_apcd_admin(request.user):
return HttpResponseRedirect('/')
return super(AdminExceptionsTable, self).dispatch(request, *args, **kwargs)
class AdminExceptionsTable(APCDAdminAccessTemplateMixin, TemplateView):
template_name = 'list_admin_exception.html'


class AdminExceptionsApi(APCDAdminAccessAPIMixin, BaseAPIView):

def get(self, *args, **kwargs):
exception_content = get_all_exceptions()
Expand Down Expand Up @@ -144,14 +137,14 @@ def getDate(row):
exception_table_entries = table_filter(org_filter.replace("(", "").replace(")",""), exception_table_entries, 'entity_name')

context['query_str'] = queryStr
page_info = paginator(self.request, exception_table_entries, limit)
page_info = paginator(page_num, exception_table_entries, limit)
context['page'] = [{'entity_name': obj['entity_name'], 'created_at': obj['created_at'], 'request_type': obj['request_type'],
'requestor_name': obj['requestor_name'], 'outcome': obj['outcome'], 'status': obj['status'],
'approved_threshold': obj['approved_threshold'],'approved_expiration_date': obj['approved_expiration_date'],
'notes': obj['notes'], 'exception_id': obj['exception_id'], 'view_modal_content': obj['view_modal_content'],
'requested_threshold': obj['requested_threshold'],}
for obj in page_info['page']]
page_info = paginator(self.request, exception_table_entries, limit)
page_info = paginator(page_num, exception_table_entries, limit)
context['page'] = [{'entity_name': obj['entity_name'], 'created_at': obj['created_at'], 'request_type': obj['request_type'],
'requestor_name': obj['requestor_name'], 'outcome': obj['outcome'], 'status': obj['status'],
'approved_threshold': obj['approved_threshold'],'approved_expiration_date': obj['approved_expiration_date'],
Expand All @@ -172,13 +165,8 @@ def getDate(row):

return context

class UpdateExceptionView(View):

def dispatch(self, request, *args, **kwargs):
if not request.user.is_authenticated or not is_apcd_admin(request.user):
return HttpResponseRedirect('/')
return super().dispatch(request, *args, **kwargs)

class UpdateExceptionApi(APCDAdminAccessAPIMixin, BaseAPIView):
def _err_msg(self, resp):
if hasattr(resp, 'pgerror'):
return resp.pgerror
Expand All @@ -197,28 +185,3 @@ def put(self, request, exception_id):
return JsonResponse({'message': 'Cannot edit exception'}, status=500)

return JsonResponse({'message': 'Exception updated successfully'})
class UpdateExceptionView(View):

def dispatch(self, request, *args, **kwargs):
if not request.user.is_authenticated or not is_apcd_admin(request.user):
return HttpResponseRedirect('/')
return super().dispatch(request, *args, **kwargs)

def _err_msg(self, resp):
if hasattr(resp, 'pgerror'):
return resp.pgerror
if isinstance(resp, Exception):
return str(resp)
return None

def put(self, request, exception_id):
data = json.loads(request.body)
errors = []
exception_response = update_exception(data)
if self._err_msg(exception_response):
errors.append(self._err_msg(exception_response))
if len(errors) != 0:
logger.debug(print(errors))
return JsonResponse({'message': 'Cannot edit exception'}, status=500)

return JsonResponse({'message': 'Exception updated successfully'})
9 changes: 4 additions & 5 deletions apcd_cms/src/apps/admin_extension/urls.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,10 @@
from django.urls import path
from django.views.generic import TemplateView
from apps.admin_extension.views import AdminExtensionsTable, UpdateExtensionsView
from apps.admin_extension.views import AdminExtensionsTable, AdminExtensionsApi, UpdateExtensionsApi


app_name = 'admin_extension'
urlpatterns = [
path('list-extensions/', TemplateView.as_view(template_name='list_admin_extension.html'), name="list_extensions"),
path('list-extensions/api/', AdminExtensionsTable.as_view(), name='admin_extensions_table_api'),
path('update-extension/<int:ext_id>/', UpdateExtensionsView.as_view(), name='update_extension'),
path('list-extensions/', AdminExtensionsTable.as_view(), name="list_extensions"),
path('list-extensions/api/', AdminExtensionsApi.as_view(), name='admin_extensions_table_api'),
path('update-extension/<int:ext_id>/', UpdateExtensionsApi.as_view(), name='update_extension'),
]
30 changes: 11 additions & 19 deletions apcd_cms/src/apps/admin_extension/views.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,10 @@
from django.http import HttpResponseRedirect, JsonResponse
from django.http import JsonResponse
from django.views.generic.base import TemplateView
from django.views import View
from apps.utils.apcd_database import get_all_extensions, update_extension
from apps.utils.apcd_groups import is_apcd_admin
from apps.utils.utils import table_filter
from apps.utils.utils import title_case
from apps.components.paginator.paginator import paginator
from apps.base.base import BaseAPIView, APCDAdminAccessAPIMixin, APCDAdminAccessTemplateMixin
from datetime import date as datetimeDate
from datetime import datetime
import logging
Expand All @@ -14,20 +13,18 @@
logger = logging.getLogger(__name__)


class AdminExtensionsTable(TemplateView):

class AdminExtensionsTable(APCDAdminAccessTemplateMixin, TemplateView):
template_name = 'list_admin_extension.html'



class AdminExtensionsApi(APCDAdminAccessAPIMixin, BaseAPIView):

def get(self, request, *args, **kwargs):
extension_content = get_all_extensions()
context = self.get_extensions_list_json(extension_content, *args, **kwargs)
return JsonResponse({'response': context})

def dispatch(self, request, *args, **kwargs):
if not request.user.is_authenticated or not is_apcd_admin(request.user):
return HttpResponseRedirect('/')
return super(AdminExtensionsTable, self).dispatch(request, *args, **kwargs)


def get_extensions_list_json(self, extensions, *args, **kwargs):
context = {}

Expand Down Expand Up @@ -90,7 +87,7 @@ def getDate(row):
extensions_table_entries = table_filter(org_filter.replace("(", "").replace(")",""), extensions_table_entries, 'org_name')

context['query_str'] = queryStr
page_info = paginator(self.request, extensions_table_entries)
page_info = paginator(page_num, extensions_table_entries)
context['page'] = [{'org_name': obj['org_name'], 'created': obj['created'], 'type': obj['type'], 'requestor': obj['requestor'],
'ext_outcome': obj['ext_outcome'], 'ext_status': obj['ext_status'], 'ext_id': obj['ext_id'], 'submitter_id': obj['submitter_id'],
'approved_expiration_date': obj['approved_expiration_date'], 'current_expected_date': obj['current_expected_date'],
Expand Down Expand Up @@ -134,12 +131,7 @@ def _get_applicable_data_period(value):
return None


class UpdateExtensionsView(View):
def dispatch(self, request, *args, **kwargs):
if not request.user.is_authenticated or not is_apcd_admin(request.user):
return HttpResponseRedirect('/')
return super(UpdateExtensionsView, self).dispatch(request, *args, **kwargs)

class UpdateExtensionsApi(APCDAdminAccessAPIMixin, BaseAPIView):
def _err_msg(self, resp):
if hasattr(resp, 'pgerror'):
return resp.pgerror
Expand All @@ -166,4 +158,4 @@ def put(self, request, ext_id):
logger.error(errors)
return JsonResponse({'message': 'Cannot edit extension'}, status=500)

return JsonResponse({'response': 'success'})
return JsonResponse({'response': 'success'})
9 changes: 4 additions & 5 deletions apcd_cms/src/apps/admin_regis_table/urls.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
from django.urls import path
from django.views.generic import TemplateView
from apps.admin_regis_table.views import RegistrationsTable
from apps.admin_regis_table.views import RegistrationsTable, RegistrationsApi, RegistrationsPostApi

app_name = 'admin_regis_table'
urlpatterns = [
path('list-registration-requests/', TemplateView.as_view(template_name='list_registrations.html'), name='admin_regis_table'),
path('list-registration-requests/api/', RegistrationsTable.as_view(), name='admin_regis_table_api'),
path('request-to-submit/api/<int:reg_id>/', RegistrationsTable.as_view(), name='admin_regis_update_api'),
path('list-registration-requests/', RegistrationsTable.as_view(), name='admin_regis_table'),
path('list-registration-requests/api/', RegistrationsApi.as_view(), name='admin_regis_table_api'),
path('request-to-submit/api/<int:reg_id>/', RegistrationsPostApi.as_view(), name='admin_regis_update_api'),
]
61 changes: 61 additions & 0 deletions apcd_cms/src/apps/admin_regis_table/utils.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@

from apps.components.paginator.paginator import paginator
from apps.utils.registrations_data_formatting import (
_set_registration_for_listing,
)
from apps.utils.utils import table_filter
from datetime import date as datetimeDate


def get_registration_list_json(registrations_content, status_filter, org_filter, page_num, *args, **kwargs):
context = {}

context['header'] = ['Business Name', 'Year', 'Type', 'Location', 'Registration Status', 'Actions']
context['status_options'] = ['All', 'Received', 'Processing', 'Complete', 'Withdrawn']
context['org_options'] = ['All']

def getDate(row):
date = row[1]
return date if date is not None else datetimeDate(1, 1, 1) # put 'None' date entries all together at end of listing w/ date 1-1-0001

registrations_content = sorted(registrations_content, key=lambda row: getDate(row), reverse=True) # sort registrations by newest to oldest

registration_table_entries = []
for registration in registrations_content:
registration_table_entries.append(_set_registration_for_listing(registration))
org_name = registration[5]
if org_name not in context['org_options']:
context['org_options'].append(org_name)

queryStr = ''

context['selected_status'] = None
if status_filter is not None and status_filter != 'All':
context['selected_status'] = status_filter
queryStr += f'&status={status_filter}'
registration_table_entries = table_filter(status_filter, registration_table_entries, 'reg_status')

context['selected_org'] = None
if org_filter is not None and org_filter != 'All':
context['selected_org'] = org_filter
queryStr += f'&org={org_filter}'
registration_table_entries = table_filter(org_filter.replace("(", "").replace(")", ""), registration_table_entries, 'biz_name')

context['query_str'] = queryStr
page_info = paginator(page_num, registration_table_entries)
context['page'] = [
{
'biz_name': obj['biz_name'],
'year': obj['year'],
'type': obj['type'],
'location': obj['location'],
'reg_status': obj['reg_status'],
'reg_id': obj['reg_id'],
}
for obj in page_info['page']
]
context['page_num'] = page_num
context['total_pages'] = page_info['page'].paginator.num_pages
context['pagination_url_namespaces'] = 'administration:admin_regis_table'
return context

Loading

0 comments on commit 67629ac

Please sign in to comment.