Move templates and urls to apps.

Implement url hooks.
Many apps are now removable.
Default to assuming services have been migrated.
This commit is contained in:
Adarnof
2017-06-07 22:49:46 -04:00
parent 9cc9a36766
commit 97fe2ddfd0
62 changed files with 685 additions and 469 deletions

View File

@@ -0,0 +1,27 @@
from services.hooks import MenuItemHook, UrlHook
from alliance_auth import hooks
from hrapplications import urls
class ApplicationsMenu(MenuItemHook):
def __init__(self):
MenuItemHook.__init__(self,
'Applications',
'fa fa-file-o fa-fw grayiconecolor',
'hrapplications:index',
navactive=['hrapplications:'])
@hooks.register('menu_item_hook')
def register_menu():
return ApplicationsMenu()
class ApplicationsUrls(UrlHook):
def __init__(self):
UrlHook.__init__(self, urls, 'hrapplications', r'^hr/')
@hooks.register('url_hook')
def register_url():
return ApplicationsUrls()

View File

@@ -0,0 +1,27 @@
{% extends "registered/base.html" %}
{% load staticfiles %}
{% load i18n %}
{% block title %}Choose a Corp{% endblock %}
{% block page_title %}{% trans "Choose a Corp" %}{% endblock page_title %}
{% block content %}
<div class="col-lg-12">
<h1 class="page-header text-center">{% trans "Choose a Corp" %}</h1>
{% if choices %}
<div class="panel panel-primary">
<div class="panel-heading">{% trans "Available Corps" %}</div>
<table class="table table-responsive">
{% for choice in choices %}
<tr>
<td class="text-center">
<a href="{% url 'hrapplications:create_view' choice.0 %}" class="btn btn-primary" title="Apply">{{ choice.1 }}</a>
</td>
</tr>
{% endfor %}
</table>
</div>
{% else %}
<div class="alert alert-danger">{% trans "No corps are accepting applications at this time." %}</div>
{% endif %}
</div>
{% endblock content %}

View File

@@ -0,0 +1,33 @@
{% extends "registered/base.html" %}
{% load staticfiles %}
{% load i18n %}
{% block title %}Apply To {{ corp.corporation_name }}{% endblock title %}
{% block page_title %}{% trans "Apply To" %} {{ corp.corporation_name }}{% endblock page_title %}
{% block content %}
<div class="col-lg-12">
<h1 class="page-header text-center">{% trans "Apply To" %} {{ corp.corporation_name }}</h1>
<div class="container-fluid">
<div class="col-md-4 col-md-offset-4">
<div class="row">
<form class="form-signin">
{% csrf_token %}
{% for question in questions %}
<div class="form-group">
<label class="control-label" for="id_{{ question.pk }}">{{ question.title }}</label>
<div class=" ">
{% if question.help_text %}
<div cass="text-center">{{ question.help_text }}</div>
{% endif %}
<textarea class="form-control" cols="40" id="id_{{ question.pk }}" name="{{ question.pk }}" rows="10"></textarea>
</div>
</div>
{% endfor %}
<button class="btn btn-lg btn-primary btn-block" type="submit" formmethod="post">{% trans "Submit" %}</button>
</form>
</div>
</div>
</div>
</div>
{% endblock %}

View File

@@ -0,0 +1,198 @@
{% extends "registered/base.html" %}
{% load bootstrap %}
{% load staticfiles %}
{% load i18n %}
{% block title %}Alliance Auth{% endblock %}
{% block page_title %}{% trans "HR Application Management" %}{% endblock page_title %}
{% block extra_css %}{% endblock extra_css %}
{% block content %}
<div class="col-lg-12">
<h1 class="page-header text-center">{% trans "Personal Applications" %}
<div class="text-right">
{% if create %}
<a href="{% url 'hrapplications:create_view' %}">
<button type="button" class="btn btn-success">{% trans "Create Application" %}</button>
</a>
{% else %}
<button type="button" class="btn btn-success" disabled>{% trans "Create Application" %}</button>
{% endif %}
</div>
</h1>
{% if personal_apps %}
<div class="panel panel-default">
<table class="table table-condensed">
<tr>
<th class="text-center">{% trans "Username" %}</th>
<th class="text-center">{% trans "Corporation" %}
<th class="text-center">{% trans "Status" %}</th>
<th class="text-center">{% trans "Actions" %}</th>
</tr>
{% for personal_app in personal_apps %}
<tr>
<td class="text-center">{{ personal_app.user.username }}</td>
<td class="text-center">{{ personal_app.form.corp.corporation_name }}</td>
<td class="text-center">
{% if personal_app.approved == None %}
<div class="label label-warning">{% trans "Pending" %}</div>
{% elif personal_app.approved == True %}
<div class="label label-success">{% trans "Approved" %}</div>
{% else %}
<div class="label label-danger">{% trans "Rejected" %}</div>
{% endif %}
</td>
<td class="text-center">
<a href="{% url 'hrapplications:personal_view' personal_app.id %}"
class="btn btn-primary">
<span class="glyphicon glyphicon-eye-open"></span>
</a>
{% if personal_app.approved == None %}
<a href="{% url 'hrapplications:personal_removal' personal_app.id %}"
class="btn btn-danger">
<span class="glyphicon glyphicon-remove"></span>
</a>
{% endif %}
</td>
</tr>
{% endfor %}
</table>
</div>
{% endif %}
{% if perms.auth.human_resources %}
<h1 class="page-header text-center">{% trans "Application Management" %}
<div class="text-right">
<!-- Button trigger modal -->
<button type="button" class="btn btn-primary btn-sm" data-toggle="modal" data-target="#myModal">
{% trans "Search Applications" %}
</button>
</div>
</h1>
<ul class="nav nav-tabs">
<li class="active"><a data-toggle="tab" href="#pending">{% trans "Pending" %}</a></li>
<li><a data-toggle="tab" href="#reviewed">{% trans "Reviewed" %}</a></li>
</ul>
<div class="tab-content">
<div id="pending" class="tab-pane fade in active panel panel-default">
<div class="panel-body">
{% if applications %}
<table class="table">
<tr>
<th class="text-center">{% trans "Date" %}</th>
<th class="text-center">{% trans "Username" %}</th>
<th class="text-center">{% trans "Main Character" %}</th>
<th class="text-center">{% trans "Corporation" %}</th>
<th class="text-center">{% trans "Status" %}</th>
<th class="text-center">{% trans "Actions" %}</th>
</tr>
{% for app in applications %}
<tr>
<td class="text-center">{{ app.created }}</td>
<td class="text-center">{{ app.user.username }}</td>
<td class="text-center">{{ app.main_character }}</td>
<td class="text-center">{{ app.form.corp.corporation_name }}</td>
<td class="text-center">
{% if app.approved == None %}
{% if app.reviewer_str %}
<div class="label label-info">{% trans "Reviewer:" %} {{ app.reviewer_str }}</div>
{% else %}
<div class="label label-warning">{% trans "Pending" %}</div>
{% endif %}
{% elif app.approved == True %}
<div class="label label-success">{% trans "Approved" %}</div>
{% else %}
<div class="label label-danger">{% trans "Rejected" %}</div>
{% endif %}
</td>
<td class="text-center">
<a href="{% url 'hrapplications:view' app.id %}"
class="btn btn-primary">
<span class="glyphicon glyphicon-eye-open"></span>
</a>
</td>
</tr>
{% endfor %}
</table>
{% else %}
<div class="alert alert-warning text-center">{% trans "No pending applications." %}</div>
{% endif %}
</div>
</div>
<div id="reviewed" class="tab-pane fade panel panel-default">
<div class="panel-body">
{% if finished_applications %}
<table class="table">
<tr>
<th class="text-center">{% trans "Date" %}</th>
<th class="text-center">{% trans "Username" %}</th>
<th class="text-center">{% trans "Main Character" %}</th>
<th class="text-center">{% trans "Corporation" %}</th>
<th class="text-center">{% trans "Status" %}</th>
<th class="text-center">{% trans "Actions" %}</th>
</tr>
{% for app in finished_applications %}
<tr>
<td class="text-center">{{ app.created }}</td>
<td class="text-center">{{ app.user.username }}</td>
<td class="text-center">{{ app.main_character }}</td>
<td class="text-center">{{ app.form.corp.corporation_name }}</td>
<td class="text-center">
{% if app.approved == None %}
{% if app.reviewer_str %}
<div class="label label-info">{% trans "Reviewer:" %} {{ app.reviewer_str }}</div>
{% else %}
<div class="label label-warning">{% trans "Pending" %}</div>
{% endif %}
{% elif app.approved == True %}
<div class="label label-success">{% trans "Approved" %}</div>
{% else %}
<div class="label label-danger">{% trans "Rejected" %}</div>
{% endif %}
</td>
<td class="text-center">
<a href="{% url 'hrapplications:view' app.id %}"
class="btn btn-primary">
<span class="glyphicon glyphicon-eye-open"></span>
</a>
</td>
</tr>
{% endfor %}
</table>
{% else %}
<div class="alert alert-warning text-center">{% trans "No reviewed applications." %}</div>
{% endif %}
</div>
</div>
</div>
{% endif %}
</div>
{% if perms.auth.human_resources %}
<!-- Modal -->
<div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"
aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal"><span aria-hidden="true">&times;</span><span
class="sr-only">{% trans "Close" %}</span></button>
<h4 class="modal-title" id="myModalLabel">{% trans "Application Search" %}</h4>
</div>
<div class="modal-body">
<form class="form-signin" role="form"
action={% url 'hrapplications:search' %} method="POST">
{% csrf_token %}
{{ search_form|bootstrap }}
<br/>
<button class="btn btn-lg btn-primary btn-block" type="submit">{% trans "Search" %}</button>
</form>
</div>
<div class="modal-footer">
</div>
</div>
</div>
</div>
{% endif %}
{% endblock content %}

View File

@@ -0,0 +1,85 @@
{% extends "registered/base.html" %}
{% load bootstrap %}
{% load staticfiles %}
{% load i18n %}
{% block title %}Alliance Auth{% endblock %}
{% block page_title %}HR Application Management{% endblock page_title %}
{% block extra_css %}{% endblock extra_css %}
{% block content %}
<div class="col-lg-12">
{% if perms.auth.human_resources %}
<h1 class="page-header text-center">{% trans "Application Search Results" %}
<div class="text-right">
<!-- Button trigger modal -->
<button type="button" class="btn btn-primary btn-sm" data-toggle="modal" data-target="#myModal">
{% trans "Search Applications" %}
</button>
</div>
</h1>
<div class="container-fluid">
<table class="table table-bordered">
<tr>
<th class="text-center">{% trans "Application ID" %}</th>
<th class="text-center">{% trans "Username" %}</th>
<th class="text-center">{% trans "Main Character" %}</th>
<th class="text-center">{% trans "Corporation" %}</th>
<th class="text-center">{% trans "Status" %}</th>
<th class="text-center">{% trans "Actions" %}</th>
</tr>
{% for app in applications %}
<tr>
<td class="text-center">{{ app.id }}</td>
<td class="text-center">{{ app.user }}</td>
<td class="text-center">{{ app.main_character }}</td>
<td class="text-center">{{ app.form.corp }}</td>
<td class="text-center">
{% if app.approved == None %}
<div class="label label-warning">{% trans "Pending" %}</div>
{% elif app.approved == True %}
<div class="label label-success">{% trans "Approved" %}</div>
{% else %}
<div class="label label-danger">{% trans "Rejected" %}</div>
{% endif %}
</td>
<td class="text-center">
<a href="{% url 'hrapplications:view' app.id %}" class="btn btn-primary">
<span class="glyphicon glyphicon-eye-open"></span>
</a>
</td>
</tr>
{% endfor %}
</table>
</div>
{% endif %}
</div>
{% if perms.auth.human_resources %}
<!-- Modal -->
<div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"
aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal"><span aria-hidden="true">&times;</span><span
class="sr-only">{% trans "Close" %}</span></button>
<h4 class="modal-title" id="myModalLabel">{% trans "Application Search" %}</h4>
</div>
<div class="modal-body">
<form class="form-signin" role="form"
action={% url 'hrapplications:search' %} method="POST">
{% csrf_token %}
{{ search_form|bootstrap }}
<br/>
<button class="btn btn-lg btn-primary btn-block" type="submit">{% trans "Search" %}</button>
</form>
</div>
<div class="modal-footer">
</div>
</div>
</div>
</div>
{% endif %}
{% endblock content %}

View File

@@ -0,0 +1,164 @@
{% extends "registered/base.html" %}
{% load staticfiles %}
{% load bootstrap %}
{% load i18n %}
{% load eveonline_extras %}
{% block title %}Alliance Auth - {% trans "View Application" %}{% endblock %}
{% block page_title %}{% trans "View Application" %}{% endblock page_title %}
{% block extra_css %}{% endblock extra_css %}
{% block content %}
<div class="col-lg-12">
<h1 class="page-header text-center">{% trans "View Application" %}</h1>
<div class="container-fluid">
<div class="col-md-6 col-md-offset-3">
<div class="row">
{% if app.approved %}
<div class="alert alert-success text-center">{% trans "Approved" %}</div>
{% elif app.approved == False %}
<div class="alert alert-danger text-center">{% trans "Denied" %}</div>
{% else %}
<div class="alert alert-warning text-center">{% trans "Pending" %}</div>
{% endif %}
{% if app.reviewer_str %}
<div class="alert alert-info text-center">{% trans "Reviewer:" %} {{ app.reviewer_str }}</div>
{% endif %}
</div>
<div class="row">
<div class="panel panel-info">
<div class="panel-heading">{% trans "Applicant" %}</div>
<table class="table">
<tr>
<th class="text-center">{% trans "User" %}</th>
<th class="text-center">{% trans "Main Character" %}</th>
</tr>
<tr>
<td class="text-center">{{ app.user }}</td>
<td class="text-center">{{ app.main_character }}</td>
</tr>
</table>
</div>
<div class="panel panel-info">
<div class="panel-heading">{% trans "Characters" %}</div>
<table class="table">
<tr>
<th class="text-center"></th>
<th class="text-center">{% trans "Name" %}</th>
<th class="text-center">{% trans "Corp" %}</th>
<th class="text-center">{% trans "Alliance" %}</th>
</tr>
{% for char in app.characters %}
<tr>
<td class="text-center">
<img class="ra-avatar img-responsive img-circle"
src="https://image.eveonline.com/Character/{{ char.character_id }}_32.jpg">
</td>
<td class="text-center">{{ char.character_name }}</td>
<td class="text-center">{{ char.corporation_name }}</td>
<td class="text-center">{{ char.alliance_name }}</td>
</tr>
{% endfor %}
</table>
</div>
</div>
<div class="row">
{% for response in responses %}
<div class="panel panel-default">
<div class="panel-heading">{{ response.question.title }}</div>
<div class="alert">{{ response.answer|linebreaksbr }}</div>
</div>
{% endfor %}
</div>
{% if buttons %}
{% if perms.auth.human_resources %}
<div class="row">
<div class="panel panel-primary">
<div class="panel-heading">{% trans "Actions" %}</div>
<div class="panel-body text-center">
{% if app.approved == None %}
{% if app.reviewer == user %}
{% if perms.hrapplications.approve_application %}
<a href="{% url 'hrapplications:approve' app.id %}"
class="btn btn-success">{% trans "Approve" %}</a>
{% endif %}
{% if perms.hrapplications.reject_application %}
<a href="{% url 'hrapplications:reject' app.id %}"
class="btn btn-danger">{% trans "Reject" %}</a>
{% endif %}
{% if perms.hrapplications.delete_application %}
<a href="{% url 'hrapplications:remove' app.id %}"
class="btn btn-danger">{% trans "Delete" %}</a>
{% endif %}
{% elif not app.reviewer %}
<a href="{% url 'hrapplications:mark_in_progress' app.id %}"
class="btn btn-warning">{% trans "Mark in Progress" %}</a>
{% endif %}
{% endif %}
{% if perms.hrapplications.add_applicationcomment %}
<button type="button" class="btn btn-primary" data-toggle="modal"
data-target="#myModal">{% trans "Comment" %}</button>
{% endif %}
</div>
</div>
</div>
<div class="panel-group" id="accordion" role="tablist" aria-multiselectable="true">
<div class="panel panel-default">
<div class="panel-heading" role="tab" id="headingThree">
<h4 class="panel-title">
<a class="collapsed" data-toggle="collapse" data-parent="#accordion"
href="#collapseThree" aria-expanded="false"
aria-controls="collapseThree">
{% trans 'Comments' %} ({{ comments.count }})
</a>
</h4>
</div>
<div id="collapseThree" class="panel-collapse collapse" role="tabpanel"
aria-labelledby="headingThree">
<div class="panel-body">
{% for comment in comments %}
<div class="panel panel-default">
<div class="panel-heading" role="tab" id="">
<div class="panel-title">
<div class="pull-right">{{ comment.created }}</div>
<div class="pull-left">{% if comment.user.profile.main_character %}{{ comment.user.profile.main_character }}{% else %}{{ comment.user }}{% endif %}</div>
<div class="clearfix"></div>
</div>
</div>
<div class="panel-body">{{ comment.text|linebreaks }}</div>
</div>
{% endfor %}
</div>
</div>
</div>
</div>
{% endif %}
{% endif %}
</div>
</div>
</div>
{% if perms.hrapplications.add_applicationcomment %}
<div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"
aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal">
<span aria-hidden="true">&times;</span><span class="sr-only">{% trans "Close" %}</span>
</button>
<h4 class="modal-title" id="myModalLabel">{% trans "Add Comment" %}</h4>
</div>
<div class="modal-body">
<form class="form-signin" role="form" action="" method="POST">
{% csrf_token %}
{{ comment_form|bootstrap }}
<br/>
<button class="btn btn-lg btn-primary btn-block" type="submit">{% trans "Add Comment" %}</button>
</form>
</div>
<div class="modal-footer"></div>
</div>
</div>
</div>
{% endif %}
{% endblock %}

30
hrapplications/urls.py Normal file
View File

@@ -0,0 +1,30 @@
from django.conf.urls import url
import hrapplications.views
app_name = 'hrapplications'
urlpatterns = [
url(r'^$', hrapplications.views.hr_application_management_view,
name="index"),
url(r'^create/$', hrapplications.views.hr_application_create_view,
name="create_view"),
url(r'^create/(\d+)', hrapplications.views.hr_application_create_view,
name="create_view"),
url(r'^remove/(\w+)', hrapplications.views.hr_application_remove,
name="remove"),
url(r'view/(\w+)', hrapplications.views.hr_application_view,
name="view"),
url(r'personal/view/(\w+)', hrapplications.views.hr_application_personal_view,
name="personal_view"),
url(r'personal/removal/(\w+)',
hrapplications.views.hr_application_personal_removal,
name="personal_removal"),
url(r'approve/(\w+)', hrapplications.views.hr_application_approve,
name="approve"),
url(r'reject/(\w+)', hrapplications.views.hr_application_reject,
name="reject"),
url(r'search/', hrapplications.views.hr_application_search,
name="search"),
url(r'mark_in_progress/(\w+)', hrapplications.views.hr_application_mark_in_progress,
name="mark_in_progress"),
]

View File

@@ -10,7 +10,6 @@ from hrapplications.models import ApplicationResponse
from hrapplications.models import ApplicationComment
from hrapplications.forms import HRApplicationCommentForm
from hrapplications.forms import HRApplicationSearchForm
from eveonline.models import EveCharacter
import logging
@@ -44,7 +43,7 @@ def hr_application_management_view(request):
'search_form': HRApplicationSearchForm(),
'create': create_application_test(request.user)
}
return render(request, 'registered/hrapplicationmanagement.html', context=context)
return render(request, 'hrapplications/management.html', context=context)
@login_required
@@ -67,14 +66,14 @@ def hr_application_create_view(request, form_id=None):
return redirect('auth_hrapplications_view')
else:
questions = app_form.questions.all()
return render(request, 'registered/hrapplicationcreate.html',
return render(request, 'hrapplications/create.html',
context={'questions': questions, 'corp': app_form.corp})
else:
choices = []
for app_form in ApplicationForm.objects.all():
if not Application.objects.filter(user=request.user).filter(form=app_form).exists():
choices.append((app_form.id, app_form.corp.corporation_name))
return render(request, 'registered/hrapplicationcorpchoice.html', context={'choices': choices})
return render(request, 'hrapplications/corpchoice.html', context={'choices': choices})
@login_required
@@ -89,7 +88,7 @@ def hr_application_personal_view(request, app_id):
'comments': ApplicationComment.objects.filter(application=app),
'comment_form': HRApplicationCommentForm(),
}
return render(request, 'registered/hrapplicationview.html', context=context)
return render(request, 'hrapplications/view.html', context=context)
else:
logger.warn("User %s not authorized to view %s" % (request.user, app))
return redirect('auth_hrapplications_view')
@@ -140,7 +139,7 @@ def hr_application_view(request, app_id):
'comments': ApplicationComment.objects.filter(application=app),
'comment_form': form,
}
return render(request, 'registered/hrapplicationview.html', context=context)
return render(request, 'hrapplications/view.html', context=context)
@login_required
@@ -232,11 +231,11 @@ def hr_application_search(request):
context = {'applications': applications, 'search_form': HRApplicationSearchForm()}
return render(request, 'registered/hrapplicationsearchview.html', context=context)
return render(request, 'hrapplications/searchview.html', context=context)
else:
logger.debug("Form invalid - returning for user %s to retry." % request.user)
context = {'applications': None, 'search_form': form}
return render(request, 'registered/hrapplicationsearchview.html', context=context)
return render(request, 'hrapplications/searchview.html', context=context)
else:
logger.debug("Returning empty search form for user %s" % request.user)
@@ -258,4 +257,4 @@ def hr_application_mark_in_progress(request, app_id):
else:
logger.warn(
"User %s unable to mark %s in progress: already being reviewed by %s" % (request.user, app, app.reviewer))
return redirect("auth_hrapplication_view", app_id)
return redirect("hrapplications:view", app_id)