diff --git a/alliance_auth/settings.py.example b/alliance_auth/settings.py.example index c19e87ce..9268722b 100755 --- a/alliance_auth/settings.py.example +++ b/alliance_auth/settings.py.example @@ -215,6 +215,14 @@ ALLIANCE_EXEC_CORP_ID = '' ALLIANCE_EXEC_CORP_VCODE = '' ALLIANCE_BLUE_STANDING = 5.0 +##################### +# HR Configuration +##################### +# JACK_KNIFE_URL - Url for the audit page of API Jack knife +# Should seriously replace with your own. +##################### +JACK_KNIFE_URL = 'http://ridetheclown.com/eveapi/audit.php' + ##################### # Forum Configuration ##################### diff --git a/alliance_auth/urls.py b/alliance_auth/urls.py index 57c17c04..3ea2bf27 100755 --- a/alliance_auth/urls.py +++ b/alliance_auth/urls.py @@ -70,10 +70,17 @@ urlpatterns = patterns('', name="auth_hrapplication_remove"), url(r'hr_application_view/(\w+)', 'hrapplications.views.hr_application_view', name="auth_hrapplication_view"), - url(r'hr_application_personal_view/', 'hrapplications.views.hr_application_personal_view', + url(r'hr_application_personal_view/(\w+)', 'hrapplications.views.hr_application_personal_view', name="auth_hrapplication_personal_view"), - url(r'hr_application_personal_removal/', 'hrapplications.views.hr_application_personal_removal', + url(r'hr_application_personal_removal/(\w+)', + 'hrapplications.views.hr_application_personal_removal', name="auth_hrapplication_personal_removal"), + url(r'hr_application_approve/(\w+)', 'hrapplications.views.hr_application_approve', + name="auth_hrapplication_approve"), + url(r'hr_application_reject/(\w+)', 'hrapplications.views.hr_application_reject', + name="auth_hrapplication_reject"), + url(r'hr_application_search/', 'hrapplications.views.hr_application_search', + name="auth_hrapplication_search"), # Service Urls url(r'^services/', 'services.views.services_view', name='auth_services'), @@ -100,9 +107,12 @@ urlpatterns = patterns('', name='auth_reset_mumble_password'), # Ipboard service control - url(r'^activate_ipboard/$', 'services.views.activate_ipboard_forum', name='auth_activate_ipboard'), - url(r'^deactivate_ipboard/$', 'services.views.deactivate_ipboard_forum', name='auth_deactivate_ipboard'), - url(r'^reset_ipboard_password/$', 'services.views.reset_ipboard_password', name='auth_reset_ipboard_password'), + url(r'^activate_ipboard/$', 'services.views.activate_ipboard_forum', + name='auth_activate_ipboard'), + url(r'^deactivate_ipboard/$', 'services.views.deactivate_ipboard_forum', + name='auth_deactivate_ipboard'), + url(r'^reset_ipboard_password/$', 'services.views.reset_ipboard_password', + name='auth_reset_ipboard_password'), # Tools url(r'^tool/fleet_formatter_tool/$', 'services.views.fleet_formatter_view', diff --git a/hrapplications/admin.py b/hrapplications/admin.py old mode 100644 new mode 100755 index f7616085..b150827c --- a/hrapplications/admin.py +++ b/hrapplications/admin.py @@ -3,6 +3,5 @@ from django.contrib import admin from models import HRApplication from models import HRApplicationComment - admin.site.register(HRApplication) admin.site.register(HRApplicationComment) \ No newline at end of file diff --git a/hrapplications/forms.py b/hrapplications/forms.py old mode 100644 new mode 100755 index 15cac565..8fa9671a --- a/hrapplications/forms.py +++ b/hrapplications/forms.py @@ -17,4 +17,13 @@ class HRApplicationForm(forms.Form): corp = forms.ChoiceField(choices=allchoices, required=True, label="Corp") is_a_spi = forms.ChoiceField(choices=[('Yes', 'Yes'), ('No', 'No')], required=True, label='Are you a spy?') about = forms.CharField(widget=forms.Textarea, required=False, label="About You") - extra = forms.CharField(widget=forms.Textarea, required=False, label="Extra Application Info") \ No newline at end of file + extra = forms.CharField(widget=forms.Textarea, required=False, label="Extra Application Info") + + +class HRApplicationCommentForm(forms.Form): + app_id = forms.CharField(widget=forms.TextInput(attrs={'readonly': 'True'})) + comment = forms.CharField(widget=forms.Textarea, required=False, label="Comment", max_length=254) + + +class HRApplicationSearchForm(forms.Form): + search_string = forms.CharField(max_length=254, required=True, label="Search String") \ No newline at end of file diff --git a/hrapplications/models.py b/hrapplications/models.py old mode 100644 new mode 100755 index 47f0fa5b..b37173db --- a/hrapplications/models.py +++ b/hrapplications/models.py @@ -2,6 +2,7 @@ from django.db import models from django.contrib.auth.models import User from eveonline.models import EveCorporationInfo +from eveonline.models import EveCharacter class HRApplication(models.Model): @@ -15,12 +16,19 @@ class HRApplication(models.Model): corp = models.ForeignKey(EveCorporationInfo) user = models.ForeignKey(User) + approved_denied = models.NullBooleanField(blank=True, null=True) + reviewer_user = models.ForeignKey(User, blank=True, null=True, related_name="review_user") + reviewer_character = models.ForeignKey(EveCharacter, blank=True, null=True) + def __str__(self): return self.character_name + " - Application" class HRApplicationComment(models.Model): - date = models.DateTimeField(auto_now=True) - comment = models.TextField(default="") + comment = models.CharField(max_length=254, default="") + application = models.ForeignKey(HRApplication) + commenter_user = models.ForeignKey(User) + commenter_character = models.ForeignKey(EveCharacter) - user = models.ForeignKey(User) \ No newline at end of file + def __str__(self): + return str(self.application.character_name) + " - Comment" \ No newline at end of file diff --git a/hrapplications/views.py b/hrapplications/views.py old mode 100644 new mode 100755 index dc576b4b..0d1676d5 --- a/hrapplications/views.py +++ b/hrapplications/views.py @@ -5,7 +5,10 @@ from django.contrib.auth.decorators import login_required from django.shortcuts import HttpResponseRedirect from models import HRApplication +from models import HRApplicationComment from forms import HRApplicationForm +from forms import HRApplicationCommentForm +from forms import HRApplicationSearchForm from eveonline.models import EveCorporationInfo from eveonline.models import EveCharacter from authentication.models import AuthServicesInfo @@ -24,13 +27,11 @@ def hr_application_management_view(request): if auth_info.main_char_id != "": main_char = EveCharacter.objects.get(character_id=auth_info.main_char_id) corp = EveCorporationInfo.objects.get(corporation_id=main_char.corporation_id) - corp_applications = HRApplication.objects.filter(corp=corp) + corp_applications = HRApplication.objects.filter(corp=corp).filter(approved_denied=None) - if HRApplication.objects.filter(user=request.user).exists(): - personal_app = HRApplication.objects.get(user=request.user) - - context = {'personal_app': personal_app, - 'applications': corp_applications} + context = {'personal_apps': HRApplication.objects.all().filter(user=request.user), + 'applications': corp_applications, + 'search_form': HRApplicationSearchForm()} return render_to_response('registered/hrapplicationmanagement.html', context, context_instance=RequestContext(request)) @@ -63,10 +64,13 @@ def hr_application_create_view(request): @login_required -def hr_application_personal_view(request): - if HRApplication.objects.filter(user=request.user).exists(): - application = HRApplication.objects.get(user=request.user) - +def hr_application_personal_view(request, app_id): + if HRApplication.objects.filter(id=app_id).exists(): + application = HRApplication.objects.get(id=app_id) + if application.user != request.user: + application = HRApplication() + else: + application = HRApplication() context = {'application': application} return render_to_response('registered/hrapplicationview.html', @@ -74,10 +78,11 @@ def hr_application_personal_view(request): @login_required -def hr_application_personal_removal(request): - if HRApplication.objects.filter(user=request.user).exists(): - application = HRApplication.objects.get(user=request.user) - application.delete() +def hr_application_personal_removal(request, app_id): + if HRApplication.objects.filter(id=app_id).exists(): + application = HRApplication.objects.get(id=app_id) + if application.user == request.user: + application.delete() return HttpResponseRedirect("/hr_application_management/") @@ -85,10 +90,29 @@ def hr_application_personal_removal(request): @login_required @permission_required('auth.human_resources') def hr_application_view(request, app_id): + if request.method == 'POST': + form = HRApplicationCommentForm(request.POST) + if form.is_valid(): + auth_info = AuthServicesInfo.objects.get(user=request.user) + + comment = HRApplicationComment() + comment.application = HRApplication.objects.get(id=int(form.cleaned_data['app_id'])) + comment.commenter_user = request.user + comment.commenter_character = EveCharacter.objects.get(character_id=auth_info.main_char_id) + comment.comment = form.cleaned_data['comment'] + comment.save() + + else: + form = HRApplicationCommentForm() + if HRApplication.objects.filter(id=app_id).exists(): application = HRApplication.objects.get(id=app_id) + comments = HRApplicationComment.objects.all().filter(application=application) + else: + application = HRApplication() + comments = [] - context = {'application': application} + context = {'application': application, 'comments': comments, 'comment_form': form} return render_to_response('registered/hrapplicationview.html', context, context_instance=RequestContext(request)) @@ -102,4 +126,55 @@ def hr_application_remove(request, app_id): if application: application.delete() - return HttpResponseRedirect("/hr_application_management/") \ No newline at end of file + return HttpResponseRedirect("/hr_application_management/") + + +@login_required +@permission_required('auth.human_resources') +def hr_application_approve(request, app_id): + if HRApplication.objects.filter(id=app_id).exists(): + auth_info = AuthServicesInfo.objects.get(user=request.user) + application = HRApplication.objects.get(id=app_id) + application.approved_denied = True + application.reviewer_user = request.user + application.reviewer_character = EveCharacter.objects.get(character_id=auth_info.main_char_id) + application.save() + + return HttpResponseRedirect("/hr_application_management/") + + +@login_required +@permission_required('auth.human_resources') +def hr_application_reject(request, app_id): + if HRApplication.objects.filter(id=app_id).exists(): + auth_info = AuthServicesInfo.objects.get(user=request.user) + application = HRApplication.objects.get(id=app_id) + application.approved_denied = False + application.reviewer_user = request.user + application.reviewer_character = EveCharacter.objects.get(character_id=auth_info.main_char_id) + application.save() + + return HttpResponseRedirect("/hr_application_management/") + + +@login_required +@permission_required('auth.human_resources') +def hr_application_search(request): + if request.method == 'POST': + form = HRApplicationSearchForm(request.POST) + if form.is_valid(): + # Really dumb search and only checks character name + # This can be improved but it does the job for now + searchstring = form.cleaned_data['search_string'] + applications = [] + + for application in HRApplication.objects.all(): + if searchstring in application.character_name: + applications.append(application) + + context = {'applications': applications, 'search_form': HRApplicationSearchForm()} + + return render_to_response('registered/hrapplicationsearchview.html', + context, context_instance=RequestContext(request)) + else: + return HttpResponseRedirect("/hr_application_management/") \ No newline at end of file diff --git a/templates/registered/hrapplicationmanagement.html b/templates/registered/hrapplicationmanagement.html old mode 100644 new mode 100755 index c55f5e87..4c7584c1 --- a/templates/registered/hrapplicationmanagement.html +++ b/templates/registered/hrapplicationmanagement.html @@ -11,46 +11,66 @@
Application ID | Username | Main Character | -Corporation | +Corporation + | Status | Actions |
---|---|---|---|---|---|---|
{{ personal_app.id }} | {{ personal_app.user.username }} | {{ personal_app.character_name }} | {{ personal_app.corp.corporation_name }} |
-
+ {% if personal_app.approved_denied == None %}
+ Pending
+ {% elif personal_app.approved_denied == True %}
+ Approved
+ {% else %}
+ Rejected
+ {% endif %}
+ |
+ + - - - + + {% if personal_app.approved_denied == None %} + + + + {% endif %} |
Username | Main Character | Corporation | +Status | Actions | {{ app.user.username }} | {{ app.character_name }} | {{ app.corp.corporation_name }} | +
+ {% if app.approved_denied == None %}
+ Pending
+ {% elif app.approved_denied == True %}
+ Approved
+ {% else %}
+ Rejected
+ {% endif %}
+ |
- - - | {% endfor %} @@ -83,4 +109,30 @@ {% endif %} + {% if perms.auth.human_resources %} + + + {% endif %} {% endblock content %} diff --git a/templates/registered/hrapplicationsearchview.html b/templates/registered/hrapplicationsearchview.html new file mode 100755 index 00000000..15e5098c --- /dev/null +++ b/templates/registered/hrapplicationsearchview.html @@ -0,0 +1,85 @@ +{% extends "public/base.html" %} +{% load bootstrap %} +{% load staticfiles %} + +{% block title %}Alliance Auth{% endblock %} + +{% block page_title %}HR Application Management{% endblock page_title %} +{% block extra_css %}{% endblock extra_css %} + +{% block content %} +
---|
Application ID | +Username | +Main Character | +Corporation | +Status | +Actions | +
---|---|---|---|---|---|
{{ app.id }} | +{{ app.user.username }} | +{{ app.character_name }} | +{{ app.corp.corporation_name }} | +
+ {% if app.approved_denied == None %}
+ Pending
+ {% elif app.approved_denied == True %}
+ Approved
+ {% else %}
+ Rejected
+ {% endif %}
+ |
+ + + + + | +