diff --git a/app/api/handlers/v1.py b/app/api/handlers/v1.py
index f401719..d70bb81 100644
--- a/app/api/handlers/v1.py
+++ b/app/api/handlers/v1.py
@@ -264,17 +264,32 @@ class AnnounceHandler(BaseHandler):
def read(self, request):
sid = request.GET.get('sid', None)
- to = request.GET.getlist('to')
+ users = request.GET.getlist('users')
+ groups = request.GET.getlist('groups')
+ servers = request.GET.getlist('servers')
message = request.GET.get('message', None)
subject = request.GET.get('subject', None)
- if sid and to and message:
+ if sid and message:
srv = get_object_or_404(Service, pk=sid)
if not srv.api == 'sso.services.jabber':
return {'result': 'invalid'}
api = srv.api_class
- return {'result': api.announce(api.settings['jabber_server'], message, subject, groups=to)}
+ return {'result': api.announce(api.settings['jabber_server'], message, subject, users=users, groups=groups, servers=servers) }
return {'result': 'invalid'}
+
+
+class EDKApiHandler(BaseHandler):
+ allowed_methods = ('GET',)
+
+ def read(self, request):
+
+ alliance = request.GET.get('alliance', None)
+ if not alliance:
+ return {'auth': 'missing', 'missing': 'alliance'}
+
+ objs = EVEAccount.objects.filter(characters__corporation__alliance=alliance, api_keytype=API_KEYTYPE_CORPORATION, api_status=API_STATUS_OK).extra(where=['(api_accessmask & 256) > 0'])
+ return objs.values('api_user_id', 'api_key', 'characters__id', 'characters__name', 'characters__corporation__name')
diff --git a/app/api/urls.py b/app/api/urls.py
index 3c41903..9e7bf24 100755
--- a/app/api/urls.py
+++ b/app/api/urls.py
@@ -18,6 +18,7 @@ optimer_resource = Resource(handler=OpTimerHandler, **apikeyauth)
blacklist_resource = Resource(handler=BlacklistHandler, **apikeyauth)
characters_resource = Resource(handler=CharacterHandler, **apikeyauth)
announce_resource = Resource(handler=AnnounceHandler, **apikeyauth)
+edkapi_resource = Resource(handler=EDKApiHandler, **apikeyauth)
urlpatterns = patterns('',
url(r'^1.0/user/$', user_resource),
@@ -28,6 +29,7 @@ urlpatterns = patterns('',
url(r'^1.0/optimer/$', optimer_resource),
url(r'^1.0/blacklist/$', blacklist_resource),
url(r'^1.0/announce/$', announce_resource),
+ url(r'^1.0/edkapi/$', edkapi_resource),
)
# v2 APIs
diff --git a/app/hr/templates/hr/blacklist_add.html b/app/hr/templates/hr/blacklist_add.html
new file mode 100644
index 0000000..a96ae2c
--- /dev/null
+++ b/app/hr/templates/hr/blacklist_add.html
@@ -0,0 +1,17 @@
+{% extends "base.html" %}
+{% block title %}Add Blacklist Entry{% endblock %}
+
+{% block content %}
+
Add Blacklist Entry
+
+
+{% endblock %}
+
+
diff --git a/app/hr/templates/hr/blacklist_list.html b/app/hr/templates/hr/blacklist_list.html
new file mode 100644
index 0000000..cd309a3
--- /dev/null
+++ b/app/hr/templates/hr/blacklist_list.html
@@ -0,0 +1,43 @@
+{% extends "base.html" %}
+{% load naturaltimediff %}
+{% block title %}Blacklist{% endblock %}
+
+{% block content %}
+Blacklist
+
+{% if object_list %}
+
+
+
+ | ID | Type | Value | Level | Reason | Expiry |
+
+
+ {% for obj in object_list %}
+ | {{ obj.id }} | {{ obj.get_type_display }} | {{ obj.value }} | {{ obj.get_level_display }} | {{ obj.reason }} | {{ obj.expiry_date }} |
+ {% endfor %}
+
+
+
+{% if is_paginated %}
+
+{% endif %}
+{% else %}
+No blacklist entries {% if query %}containing "{{ query }}" {% endif %}were found.
+{% endif %}
+
+{% if perms.hr.add_blacklist %}
+Add a blacklist entry
+{% endif %}
+{% endblock %}
+
diff --git a/app/hr/templates/hr/index.html b/app/hr/templates/hr/index.html
index 4a11b4b..385cfaf 100644
--- a/app/hr/templates/hr/index.html
+++ b/app/hr/templates/hr/index.html
@@ -24,4 +24,13 @@
{% endif %}
+{% if perms.add_blacklist %}
+Blacklist Management
+
+
+ - View/Search Blacklist
+ - Add Blacklist Entry
+
+{% endif %}
+
{% endblock %}
diff --git a/app/hr/urls.py b/app/hr/urls.py
index 2d3ffda..06f9cbd 100644
--- a/app/hr/urls.py
+++ b/app/hr/urls.py
@@ -19,5 +19,7 @@ urlpatterns = patterns('',
url(r'^recommendation/$', login_required(views.HrViewRecommendations.as_view()), name='hr-viewrecommendations'),
url(r'^recommendation/add/$', login_required(views.HrAddRecommendation.as_view()), name='hr-addrecommendation'),
- url(r'^blacklist/user/(?P\d+)/$', login_required(views.HrBlacklistUser.as_view()), name='hr-blacklistuser'),
+ url(r'^blacklist/$', login_required(views.HrBlacklistList.as_view()), name='hr-blacklist-list'),
+ url(r'^blacklist/add/$', login_required(views.HrAddBlacklist.as_view()), name='hr-blacklist-add'),
+ url(r'^blacklist/add/user/(?P\d+)/$', login_required(views.HrBlacklistUser.as_view()), name='hr-blacklistuser'),
)
diff --git a/app/hr/views.py b/app/hr/views.py
index 3f69e51..5bce4e5 100644
--- a/app/hr/views.py
+++ b/app/hr/views.py
@@ -1,11 +1,15 @@
from datetime import datetime, timedelta
-from django.http import HttpResponseRedirect, HttpResponse, Http404
+from django.conf import settings
+from django.db.models import Q
+from django.http import HttpResponseRedirect, HttpResponse, HttpResponseNotFound, HttpResponseForbidden, Http404
from django.shortcuts import get_object_or_404
from django.core.urlresolvers import reverse
from django.contrib import messages
from django.contrib.auth.models import User
from django.contrib.auth.decorators import login_required
+from django.forms import ModelForm
+from django.forms.extras.widgets import SelectDateWidget
from django.views.generic import TemplateView, DetailView, FormView, CreateView, ListView
from django.views.generic.detail import BaseDetailView
from django.conf import settings
@@ -375,3 +379,66 @@ class HrBlacklistUser(FormView):
update_user_access.delay(user=self.blacklist_user.id)
return HttpResponseRedirect(reverse('sso.views.user_view', args=[self.blacklist_user.username]))
+
+
+class HrBlacklistList(ListView):
+
+ model = Blacklist
+ allow_empty = True
+
+ def get_queryset(self):
+
+ obj_list = self.model.objects.all()
+
+ self.query = self.request.GET.get('q', None)
+ self.order = self.request.GET.get('o', 'id')
+
+ # Filter by the query string
+ if self.query:
+ obj_list = obj_list.filter(Q(value__icontains=self.query) | Q(reason__icontains=self.query))
+
+ # If a invalid order as been passed, correct it
+ if not self.order in ['id', 'type', 'value', 'reason', 'expiry_date']:
+ self.order = 'id'
+ return obj_list.order_by(self.order)
+
+ def get_context_data(self, **kwargs):
+ context = super(HrBlacklistList, self).get_context_data(**kwargs)
+ context['query'] = self.query
+ context['order'] = self.order
+
+ return context
+
+
+
+class HrAddBlacklist(CreateView):
+
+ model = Blacklist
+ template_name = 'hr/blacklist_add.html'
+
+ def dispatch(self, request, *args, **kwargs):
+ if not request.user.has_perm('hr.add_blacklist'):
+ return HttpResponseForbidden()
+ return super(HrAddBlacklist, self).dispatch(request, *args, **kwargs)
+
+ def get_form_class(self):
+
+ class AddBlacklistForm(ModelForm):
+ class Meta:
+ model = Blacklist
+ exclude = ('source', 'created_by')
+ widgets = {'expiry_date': SelectDateWidget()}
+
+ return AddBlacklistForm
+
+ def form_valid(self, form):
+
+ obj = form.save(commit=False)
+ obj.user = self.request.user
+ obj.source, created = BlacklistSource.objects.get_or_create(id=getattr(settings, 'BLACKLIST_DEFAULT_SOURCE', 1))
+ obj.save()
+ return HttpResponseRedirect(self.get_success_url())
+
+ def get_success_url(self):
+ return reverse('hr-blacklist-list')
+
diff --git a/app/sso/services/jabber/__init__.py b/app/sso/services/jabber/__init__.py
index 9bcc57d..49c4fe1 100644
--- a/app/sso/services/jabber/__init__.py
+++ b/app/sso/services/jabber/__init__.py
@@ -15,7 +15,8 @@ class JabberService(BaseService):
'jabber_xmlrpc_url': 'http://127.0.0.1:4560',
'jabber_announce_from': 'announcebot@pleaseignore.com',
'jabber_announce_password': 'pepperllama',
- 'jabber_announce_endpoint': 'http://127.0.0.1:5281/message'}
+ 'jabber_announce_endpoint': 'http://127.0.0.1:5281/message',
+ 'jabber_announce_servers': ['pleaseignore.com'] }
def exec_xmlrpc(self, func, **kwargs):
""" Send a XMLRPC request """
@@ -161,23 +162,24 @@ class JabberService(BaseService):
return resp.read().strip()[:2] == 'OK'
- def announce(self, server, message, subject=None, users=[], groups=[]):
+ def announce(self, server, message, subject=None, users=[], groups=[], servers=[]):
- if 'all' in groups:
- dest = ['%s/announce/all-hosts/online' % server]
- else:
- dest = []
+ dest = []
+ if len(servers):
+ if 'all' in servers:
+ dest = ['%s/announce/all-hosts/online' % self.settings['jabber_server']]
+ else:
+ dest = ['%s/announce/online' % server for server in servers]
- if len(users):
- for u in set(users):
- dest.append(u)
+ if len(users):
+ for u in set(users):
+ dest.append(u)
- elif len(groups):
- for g in groups:
- dest.extend([x for x in self.get_group_members(server, g)])
-
- dest = set(dest)
+ if len(groups):
+ for g in groups:
+ dest.extend([x for x in self.get_group_members(server, g)])
+ dest = set(dest)
if len(dest):
return self.send_message(dest, message, subject)
return False