diff --git a/alliance_auth/__init__.py b/alliance_auth/__init__.py
index e69de29b..631dfacb 100644
--- a/alliance_auth/__init__.py
+++ b/alliance_auth/__init__.py
@@ -0,0 +1,3 @@
+from util import bootstrap_permissions
+
+bootstrap_permissions()
\ No newline at end of file
diff --git a/alliance_auth/settings.py b/alliance_auth/settings.py
index e3d52316..9ce39b9e 100644
--- a/alliance_auth/settings.py
+++ b/alliance_auth/settings.py
@@ -58,6 +58,7 @@ INSTALLED_APPS = (
'registration',
'services',
'eveonline',
+ 'groupmanagement'
)
MIDDLEWARE_CLASSES = (
diff --git a/alliance_auth/urls.py b/alliance_auth/urls.py
index 201ed049..339fce63 100644
--- a/alliance_auth/urls.py
+++ b/alliance_auth/urls.py
@@ -34,6 +34,19 @@ urlpatterns = patterns('',
url(r'^characters/', 'eveonline.views.characters_view', name='auth_characters'),
url(r'^main_character_change/(\w+)/$', 'eveonline.views.main_character_change', name='auth_main_character_change'),
+ # Group management
+ url(r'^groups/', 'groupmanagement.views.groups_view', name='auth_groups'),
+ url(r'^group/management/', 'groupmanagement.views.group_management', name='auth_group_management'),
+ url(r'^group/request_add/(\w+)', 'groupmanagement.views.group_request_add', name='auth_group_request_add'),
+ url(r'^group/request/accept/(\w+)', 'groupmanagement.views.group_accept_request', name='auth_group_accept_request'),
+ url(r'^group/request/reject/(\w+)', 'groupmanagement.views.group_reject_request', name='auth_group_reject_request'),
+
+ url(r'^group/request_leave/(\w+)', 'groupmanagement.views.group_request_leave', name='auth_group_request_leave'),
+ url(r'group/leave_request/accept/(\w+)', 'groupmanagement.views.group_leave_accept_request',
+ name='auth_group_leave_accept_request'),
+ url(r'^group/leave_request/reject/(\w+)', 'groupmanagement.views.group_leave_reject_request',
+ name='auth_group_leave_reject_request'),
+
# Service Urls
url(r'^services/', 'services.views.services_view', name='auth_services'),
diff --git a/authentication/models.py b/authentication/models.py
index 862e91b2..5b5c9134 100644
--- a/authentication/models.py
+++ b/authentication/models.py
@@ -15,4 +15,4 @@ class AuthServicesInfo(models.Model):
user = models.ForeignKey(User)
def __str__(self):
- return self.user.username
\ No newline at end of file
+ return self.user.username + ' - AuthInfo'
\ No newline at end of file
diff --git a/eveonline/models.py b/eveonline/models.py
index 59a36f72..3bf56ed1 100644
--- a/eveonline/models.py
+++ b/eveonline/models.py
@@ -23,4 +23,4 @@ class EveApiKeyPair(models.Model):
user = models.ForeignKey(User)
def __str__(self):
- return self.user.username
\ No newline at end of file
+ return self.user.username + " - ApiKeyPair"
\ No newline at end of file
diff --git a/eveonline/views.py b/eveonline/views.py
index 3f39c803..f217dcc4 100644
--- a/eveonline/views.py
+++ b/eveonline/views.py
@@ -17,6 +17,7 @@ from util.common_task import remove_user_from_group
from util.common_task import deactivate_services
from util.common_task import generate_corp_group_name
+
@login_required
def add_api_key(request):
if request.method == 'POST':
diff --git a/groupmanagement/__init__.py b/groupmanagement/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/groupmanagement/admin.py b/groupmanagement/admin.py
new file mode 100644
index 00000000..9946163d
--- /dev/null
+++ b/groupmanagement/admin.py
@@ -0,0 +1,6 @@
+from django.contrib import admin
+from models import GroupDescription
+from models import GroupRequest
+
+admin.site.register(GroupDescription)
+admin.site.register(GroupRequest)
diff --git a/groupmanagement/models.py b/groupmanagement/models.py
new file mode 100644
index 00000000..eb2c7f9f
--- /dev/null
+++ b/groupmanagement/models.py
@@ -0,0 +1,23 @@
+from django.db import models
+from django.contrib.auth.models import User
+from django.contrib.auth.models import Group
+from eveonline.models import EveCharacter
+
+
+class GroupDescription(models.Model):
+ description = models.CharField(max_length=512)
+ group = models.ForeignKey(Group, unique=True)
+
+ def __str__(self):
+ return self.group.name + " - Description"
+
+
+class GroupRequest(models.Model):
+ status = models.CharField(max_length=254)
+ leave_request = models.BooleanField(default=0)
+ user = models.ForeignKey(User)
+ group = models.ForeignKey(Group)
+ main_char = models.ForeignKey(EveCharacter)
+
+ def __str__(self):
+ return self.user.username + ":" + self.group.name
\ No newline at end of file
diff --git a/groupmanagement/tests.py b/groupmanagement/tests.py
new file mode 100644
index 00000000..7ce503c2
--- /dev/null
+++ b/groupmanagement/tests.py
@@ -0,0 +1,3 @@
+from django.test import TestCase
+
+# Create your tests here.
diff --git a/groupmanagement/views.py b/groupmanagement/views.py
new file mode 100644
index 00000000..f1c9fed5
--- /dev/null
+++ b/groupmanagement/views.py
@@ -0,0 +1,145 @@
+from django.template import RequestContext
+from django.shortcuts import HttpResponseRedirect
+from django.shortcuts import render_to_response
+from django.contrib.auth.decorators import login_required
+from django.contrib.auth.decorators import permission_required
+from django.contrib.auth.models import Group
+from django.contrib.auth.models import User
+
+from models import GroupDescription
+from models import GroupRequest
+
+from authentication.managers import AuthServicesInfoManager
+from eveonline.managers import EveManager
+
+
+@login_required
+@permission_required('auth.group_management')
+def group_management(request):
+ acceptrequests = []
+ leaverequests = []
+
+ for grouprequest in GroupRequest.objects.all():
+ if grouprequest.leave_request:
+ leaverequests.append(grouprequest)
+ else:
+ acceptrequests.append(grouprequest)
+
+ render_items = {'acceptrequests': acceptrequests, 'leaverequests': leaverequests}
+
+ return render_to_response('registered/groupmanagement.html',
+ render_items, context_instance=RequestContext(request))
+
+
+@login_required
+@permission_required('auth.group_management')
+def group_accept_request(request, group_request_id):
+ try:
+ group_request = GroupRequest.objects.get(id=group_request_id)
+ group, created = Group.objects.get_or_create(name=group_request.group.name)
+ request.user.groups.add(group)
+ request.user.save()
+ group_request.delete()
+ except:
+ pass
+
+ return HttpResponseRedirect("/group/management/")
+
+
+@login_required
+@permission_required('auth.group_management')
+def group_reject_request(request, group_request_id):
+ try:
+ group_request = GroupRequest.objects.get(id=group_request_id)
+
+ if group_request:
+ group_request.delete()
+ except:
+ pass
+
+ return HttpResponseRedirect("/group/management/")
+
+
+@login_required
+@permission_required('auth.group_management')
+def group_leave_accept_request(request, group_request_id):
+ try:
+ group_request = GroupRequest.objects.get(id=group_request_id)
+ group, created = Group.objects.get_or_create(name=group_request.group.name)
+ request.user.groups.remove(group)
+ request.user.save()
+ group_request.delete()
+ except:
+ pass
+
+ return HttpResponseRedirect("/group/management/")
+
+
+@login_required
+@permission_required('auth.group_management')
+def group_leave_reject_request(request, group_request_id):
+ try:
+ group_request = GroupRequest.objects.get(id=group_request_id)
+
+ if group_request:
+ group_request.delete()
+ except:
+ pass
+
+ return HttpResponseRedirect("/group/management/")
+
+@login_required
+def groups_view(request):
+
+ paired_list = []
+
+ for group in Group.objects.all():
+ # Check if group is a corp
+ if "Corp" in group.name:
+ pass
+ else:
+ # Get the descriptionn
+ groupDesc = GroupDescription.objects.filter(group=group)
+ groupRequest = GroupRequest.objects.filter(user=request.user).filter(group=group)
+
+ if groupDesc:
+ if groupRequest:
+ paired_list.append((group, groupDesc[0], groupRequest[0]))
+ else:
+ paired_list.append((group, groupDesc[0], ""))
+ else:
+ if groupRequest:
+ paired_list.append((group, "", groupRequest[0]))
+ else:
+ paired_list.append((group, "", ""))
+
+ render_items = {'pairs': paired_list}
+ return render_to_response('registered/groups.html',
+ render_items, context_instance=RequestContext(request))
+
+@login_required
+def group_request_add(request, group_id):
+ auth_info = AuthServicesInfoManager.get_auth_service_info(request.user)
+ grouprequest = GroupRequest()
+ grouprequest.status = 'pending'
+ grouprequest.group = Group.objects.get(id=group_id)
+ grouprequest.user = request.user
+ grouprequest.main_char = EveManager.get_character_by_id(auth_info.main_char_id)
+ grouprequest.leave_request = False
+ grouprequest.save()
+
+ return HttpResponseRedirect("/groups")
+
+
+@login_required
+def group_request_leave(request, group_id):
+ auth_info = AuthServicesInfoManager.get_auth_service_info(request.user)
+ grouprequest = GroupRequest()
+ grouprequest.status = 'pending'
+ grouprequest.group = Group.objects.get(id=group_id)
+ grouprequest.user = request.user
+ grouprequest.main_char = EveManager.get_character_by_id(auth_info.main_char_id)
+ grouprequest.leave_request = True
+ grouprequest.save()
+
+ return HttpResponseRedirect("/groups")
\ No newline at end of file
diff --git a/templates/public/base.html b/templates/public/base.html
index 8f285f3c..54c3ca0b 100644
--- a/templates/public/base.html
+++ b/templates/public/base.html
@@ -65,6 +65,9 @@
Api Keys
+
+ Groups
+
Services
@@ -78,6 +81,11 @@
Change Password
+ {% if perms.auth.group_management %}
+
+ Group Management
+
+ {% endif %}
diff --git a/templates/registered/addapikey.html b/templates/registered/addapikey.html
index 159be68d..9f809683 100644
--- a/templates/registered/addapikey.html
+++ b/templates/registered/addapikey.html
@@ -4,7 +4,7 @@
{% block title %}Alliance Auth{% endblock %}
-{% block page_title %}Something something here{% endblock page_title %}
+{% block page_title %}Add Api Key{% endblock page_title %}
{% block extra_css %}{% endblock extra_css %}
{% block content %}
diff --git a/templates/registered/apikeymanagment.html b/templates/registered/apikeymanagment.html
index 1c6a8ed8..4bb5902c 100644
--- a/templates/registered/apikeymanagment.html
+++ b/templates/registered/apikeymanagment.html
@@ -4,7 +4,7 @@
{% block title %}Alliance Auth{% endblock %}
-{% block page_title %}Something something here{% endblock page_title %}
+{% block page_title %}API Key Management{% endblock page_title %}
{% block extra_css %}{% endblock extra_css %}
{% block content %}
diff --git a/templates/registered/characters.html b/templates/registered/characters.html
index 6e43ab7a..9c855410 100644
--- a/templates/registered/characters.html
+++ b/templates/registered/characters.html
@@ -3,7 +3,7 @@
{% block title %}Alliance Auth{% endblock %}
-{% block page_title %}Something something here{% endblock page_title %}
+{% block page_title %}Characters{% endblock page_title %}
{% block extra_css %}{% endblock extra_css %}
{% block content %}
diff --git a/templates/registered/groupmanagement.html b/templates/registered/groupmanagement.html
new file mode 100644
index 00000000..c0aeef0d
--- /dev/null
+++ b/templates/registered/groupmanagement.html
@@ -0,0 +1,75 @@
+{% extends "public/base.html" %}
+{% load staticfiles %}
+
+{% block title %}Alliance Auth{% endblock %}
+
+{% block page_title %}Groups Management{% endblock page_title %}
+{% block extra_css %}{% endblock extra_css %}
+
+{% block content %}
+
+
+
+
+
+
+ RequestID |
+ CharacterName |
+ GroupName |
+ Action |
+
+
+ {% for acceptrequest in acceptrequests %}
+
+ {{ acceptrequest.id }} |
+ {{ acceptrequest.main_char.character_name }} |
+ {{ acceptrequest.group.name }} |
+
+
+
+
+
+
+
+
+ |
+
+ {% endfor %}
+
+
+
+
+ RequestID |
+ CharacterName |
+ GroupName |
+ Action |
+
+
+ {% for leaverequest in leaverequests %}
+
+ {{ leaverequest.id }} |
+ {{ leaverequest.main_char.character_name }} |
+ {{ leaverequest.group.name }} |
+
+
+
+
+
+
+
+
+ |
+
+ {% endfor %}
+
+
+
+{% endblock content %}
diff --git a/templates/registered/groups.html b/templates/registered/groups.html
new file mode 100644
index 00000000..59a57e55
--- /dev/null
+++ b/templates/registered/groups.html
@@ -0,0 +1,59 @@
+{% extends "public/base.html" %}
+{% load staticfiles %}
+
+{% block title %}Alliance Auth{% endblock %}
+
+{% block page_title %}Available{% endblock page_title %}
+{% block extra_css %}{% endblock extra_css %}
+
+{% block content %}
+
+
+ {% if perms.auth.alliance_member %}
+
+
+ GroupID |
+ GroupName |
+ GroupDesc |
+ Action |
+
+
+ {% for pair in pairs %}
+
+ {{ pair.0.id }} |
+ {{ pair.0.name }} |
+ {{ pair.1.description }} |
+
+ {% if pair.0 in user.groups.all %}
+ {% if pair.2 == ""%}
+
+
+
+ {% else %}
+
+ {% endif %}
+ {% elif pair.2 == "" %}
+
+
+
+ {% else %}
+
+ {% endif %}
+ |
+
+ {% endfor %}
+
+ {% else %}
+
You are not in the alliance
+ {% endif %}
+
+
+{% endblock content %}
diff --git a/templates/registered/services.html b/templates/registered/services.html
index 81028d3e..f08f128a 100644
--- a/templates/registered/services.html
+++ b/templates/registered/services.html
@@ -3,7 +3,7 @@
{% block title %}Alliance Auth{% endblock %}
-{% block page_title %}Something something here{% endblock page_title %}
+{% block page_title %}Services Management{% endblock page_title %}
{% block extra_css %}{% endblock extra_css %}
{% block content %}
@@ -56,6 +56,7 @@
{% endifequal %}
+
Mumble |
{{ authinfo.mumble_username }} |
diff --git a/util/__init__.py b/util/__init__.py
index d9380613..e18ac2cc 100644
--- a/util/__init__.py
+++ b/util/__init__.py
@@ -3,6 +3,12 @@ from django.contrib.auth.models import User
from django.contrib.auth.models import Permission
+def bootstrap_permissions():
+ ct = ContentType.objects.get_for_model(User)
+ stored_permission, created = Permission.objects.get_or_create(codename="group_management",
+ content_type=ct, name="group_management")
+
+
def add_member_permission(user, permission):
ct = ContentType.objects.get_for_model(User)
stored_permission, created = Permission.objects.get_or_create(codename=permission,