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
  • Loading branch information
chandra-tacc committed Feb 5, 2025
1 parent 82a2b3b commit bb0618c
Show file tree
Hide file tree
Showing 27 changed files with 346 additions and 458 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'),
]
57 changes: 13 additions & 44 deletions apcd_cms/src/apps/admin_exception/views.py
Original file line number Diff line number Diff line change
@@ -1,29 +1,28 @@
from django.http import HttpResponseRedirect, HttpResponse, JsonResponse
from django.core.paginator import Paginator, EmptyPage
from django.views.generic.base import TemplateView
from django.template import loader
from django.http import HttpResponseRedirect, JsonResponse
from django.views.generic.base import TemplateView, View
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
import logging
import json
import json

logger = logging.getLogger(__name__)


class AdminExceptionsTable(TemplateView):
template_name = 'list_admin_exception.html'

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


class AdminExceptionsApi(APCDAdminAccessAPIMixin, BaseAPIView):

def get(self, *args, **kwargs):
exception_content = get_all_exceptions()

Expand Down Expand Up @@ -144,14 +143,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 +171,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 +191,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'),
]
26 changes: 12 additions & 14 deletions apcd_cms/src/apps/admin_extension/views.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
from django.http import HttpResponseRedirect, 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
from datetime import date as datetimeDate
from datetime import datetime
import logging
Expand All @@ -18,16 +18,19 @@ class AdminExtensionsTable(TemplateView):

template_name = 'list_admin_extension.html'

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)


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 get_extensions_list_json(self, extensions, *args, **kwargs):
context = {}

Expand Down Expand Up @@ -90,7 +93,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 +137,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 +164,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

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>/', RegistrationsApi.as_view(), name='admin_regis_update_api'),
]
72 changes: 33 additions & 39 deletions apcd_cms/src/apps/admin_regis_table/views.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
from django.http import HttpResponse, HttpResponseRedirect, JsonResponse
from django.http import HttpResponseRedirect, JsonResponse
from django.views.generic.base import TemplateView
from django.template import loader
from apps.utils.apcd_database import (
delete_registration_entity,
delete_registration_contact,
Expand All @@ -18,6 +17,7 @@
_set_registration_for_listing,
)
from apps.components.paginator.paginator import paginator
from apps.base.base import BaseAPIView, APCDAdminAccessAPIMixin
import logging
from datetime import date as datetimeDate
import json
Expand All @@ -28,6 +28,13 @@
class RegistrationsTable(TemplateView):
template_name = 'list_registrations.html'

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


class RegistrationsApi(APCDAdminAccessAPIMixin, BaseAPIView):
def _get_first_registration_entry(self, reg_id):
registrations = get_registrations(reg_id=reg_id)
if len(registrations) > 0:
Expand All @@ -49,7 +56,7 @@ def post(self, request, reg_id):
# Find the deleted ones.
entity_ids_to_delete = existing_entity_ids - updated_entity_ids
contact_ids_to_delete = existing_contact_ids - updated_contact_ids

def _err_msg(resp):
if hasattr(resp, 'pgerror'):
return resp.pgerror
Expand All @@ -64,7 +71,7 @@ def _err_msg(resp):
delete_resp = delete_registration_entity(reg_id, id)
if _err_msg(delete_resp):
errors.append(str(delete_resp))

for id in contact_ids_to_delete:
delete_resp = delete_registration_contact(reg_id, id)
if _err_msg(delete_resp):
Expand All @@ -88,50 +95,39 @@ def _err_msg(resp):
response = JsonResponse({'status': 'error', 'errors': description}, status=400)
else:
response = JsonResponse({'status': 'success', 'reg_id': reg_id}, status=200)

return response

def get(self, request, *args, **kwargs):
try:
if request.GET.get('reg_id'):
reg_id = int(request.GET.get('reg_id'))
registration = self._get_first_registration_entry(reg_id)
registrations_entities = get_registration_entities(reg_id=reg_id)
registrations_contacts = get_registration_contacts(reg_id=reg_id)
return JsonResponse({'response': _set_registration(registration, registrations_entities, registrations_contacts)})
else:
registrations_content = get_registrations()
context = self.get_registration_list_json(registrations_content, *args, **kwargs)
return JsonResponse({'response': context})
except Exception as e:
logger.error("An error occurred: %s", str(e))
return JsonResponse({
'status': 'error',
'message': 'Internal server error',
}, status=500)

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

def get_registration_list_json(self, registrations_content, *args, **kwargs):
if request.GET.get('reg_id'):
reg_id = int(request.GET.get('reg_id'))
registration = self._get_first_registration_entry(reg_id)
registrations_entities = get_registration_entities(reg_id=reg_id)
registrations_contacts = get_registration_contacts(reg_id=reg_id)
return JsonResponse({'response': _set_registration(registration, registrations_entities, registrations_contacts)})
else:
registrations_content = get_registrations()
try:
page_num = int(request.GET.get('page'))
except:
page_num = 1
context = RegistrationsApi.get_registration_list_json(registrations_content, request.GET.get('status'),
request.GET.get('org'), page_num, *args, **kwargs)
return JsonResponse({'response': context})

@staticmethod
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']

try:
page_num = int(self.request.GET.get('page'))
except:
page_num = 1

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
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
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:
Expand All @@ -141,8 +137,6 @@ def getDate(row):
context['org_options'].append(org_name)

queryStr = ''
status_filter = self.request.GET.get('status')
org_filter = self.request.GET.get('org')

context['selected_status'] = None
if status_filter is not None and status_filter != 'All':
Expand All @@ -157,7 +151,7 @@ def getDate(row):
registration_table_entries = table_filter(org_filter.replace("(", "").replace(")", ""), registration_table_entries, 'biz_name')

context['query_str'] = queryStr
page_info = paginator(self.request, registration_table_entries)
page_info = paginator(page_num, registration_table_entries)
context['page'] = [
{
'biz_name': obj['biz_name'],
Expand Down
11 changes: 5 additions & 6 deletions apcd_cms/src/apps/admin_submissions/urls.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,11 @@
from django.urls import path
from django.views.generic import TemplateView
from apps.admin_submissions.views import AdminSubmissionsTable
from apps.admin_submissions.views import AdminSubmissionsTable, AdminSubmissionsApi

app_name = 'administration'
urlpatterns = [
path('list-submissions/', TemplateView.as_view(template_name='list_admin_submissions.html'), name="admin_submissions"),
path('list-submissions/api/', AdminSubmissionsTable.as_view(), name="admin_submissions_api"),
path('list-submissions/api/options', AdminSubmissionsTable.as_view(), name='admin_submissions_api_options'),
path('view_log', AdminSubmissionsTable.as_view(), name='admin-submissions-view-log'),
path('list-submissions/', AdminSubmissionsTable.as_view(), name="admin_submissions"),
path('list-submissions/api/', AdminSubmissionsApi.as_view(), name="admin_submissions_api"),
path('list-submissions/api/options', AdminSubmissionsApi.as_view(), name='admin_submissions_api_options'),
path('view_log', AdminSubmissionsApi.as_view(), name='admin-submissions-view-log'),

]
Loading

0 comments on commit bb0618c

Please sign in to comment.