Restructure Alliance Auth package (#867)

* Refactor allianceauth into its own package

* Add setup

* Add missing default_app_config declarations

* Fix timerboard namespacing

* Remove obsolete future imports

* Remove py2 mock support

* Remove six

* Add experimental 3.7 support and multiple Dj versions

* Remove python_2_unicode_compatible

* Add navhelper as local package

* Update requirements
This commit is contained in:
Basraah
2017-09-19 09:46:40 +10:00
committed by GitHub
parent d10580b56b
commit 786859294d
538 changed files with 1197 additions and 1523 deletions

2
allianceauth/srp/__init__.py Executable file
View File

@@ -0,0 +1,2 @@
default_app_config = 'allianceauth.srp.apps.SRPConfig'

7
allianceauth/srp/admin.py Executable file
View File

@@ -0,0 +1,7 @@
from django.contrib import admin
from allianceauth.srp.models import SrpFleetMain
from allianceauth.srp.models import SrpUserRequest
admin.site.register(SrpFleetMain)
admin.site.register(SrpUserRequest)

6
allianceauth/srp/apps.py Normal file
View File

@@ -0,0 +1,6 @@
from django.apps import AppConfig
class SRPConfig(AppConfig):
name = 'allianceauth.srp'
label = 'srp'

View File

@@ -0,0 +1,27 @@
from allianceauth.services.hooks import MenuItemHook, UrlHook
from allianceauth import hooks
from . import urls
class SrpMenu(MenuItemHook):
def __init__(self):
MenuItemHook.__init__(self, 'Ship Replacement',
'fa fa-money fa-fw grayiconecolor',
'srp:management',
navactive=['srp:'])
def render(self, request):
if request.user.has_perm('srp.access_srp'):
return MenuItemHook.render(self, request)
return ''
@hooks.register('menu_item_hook')
def register_menu():
return SrpMenu()
@hooks.register('url_hook')
def register_url():
return UrlHook(urls, 'srp', r'^srp/')

28
allianceauth/srp/form.py Executable file
View File

@@ -0,0 +1,28 @@
from django import forms
from django.utils.translation import ugettext_lazy as _
class SrpFleetMainForm(forms.Form):
fleet_name = forms.CharField(required=True, label=_("Fleet Name"))
fleet_time = forms.DateTimeField(required=True, label=_("Fleet Time"))
fleet_doctrine = forms.CharField(required=True, label=_("Fleet Doctrine"))
class SrpFleetUserRequestForm(forms.Form):
additional_info = forms.CharField(required=False, max_length=25, label=_("Additional Info"))
killboard_link = forms.CharField(
label=_("zKillboard Link"),
max_length=255,
required=True
)
def clean_killboard_link(self):
data = self.cleaned_data['killboard_link']
if "zkillboard.com" not in data:
raise forms.ValidationError(_("Invalid Link. Please use zKillboard.com"))
return data
class SrpFleetMainUpdateForm(forms.Form):
fleet_aar_link = forms.CharField(required=True, label=_("After Action Report Link"))

View File

@@ -0,0 +1,36 @@
from django.conf import settings
import requests
import logging
logger = logging.getLogger(__name__)
class SRPManager:
def __init__(self):
pass
@staticmethod
def get_kill_id(killboard_link):
num_set = '0123456789'
kill_id = ''.join([c for c in killboard_link if c in num_set])
return kill_id
@staticmethod
def get_kill_data(kill_id):
url = ("https://www.zkillboard.com/api/killID/%s/" % kill_id)
headers = {
'User-Agent': "%s Alliance Auth" % settings.DOMAIN,
'Content-Type': 'application/json',
}
r = requests.get(url, headers=headers)
result = r.json()[0]
if result:
ship_type = result['victim']['shipTypeID']
logger.debug("Ship type for kill ID %s is determined to be %s" % (kill_id, ship_type))
ship_value = result['zkb']['totalValue']
logger.debug("total loss value for kill id %s is %s" % (kill_id, ship_value))
victim_name = result['victim']['characterName']
return ship_type, ship_value, victim_name
else:
raise ValueError("Invalid Kill ID")

View File

@@ -0,0 +1,48 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.10.1 on 2016-09-05 21:40
from __future__ import unicode_literals
from django.db import migrations, models
import django.db.models.deletion
import django.utils.timezone
class Migration(migrations.Migration):
initial = True
dependencies = [
('eveonline', '0001_initial'),
]
operations = [
migrations.CreateModel(
name='SrpFleetMain',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('fleet_name', models.CharField(default=b'', max_length=254)),
('fleet_doctrine', models.CharField(default=b'', max_length=254)),
('fleet_time', models.DateTimeField()),
('fleet_srp_code', models.CharField(default=b'', max_length=254)),
('fleet_srp_status', models.CharField(default=b'', max_length=254)),
('fleet_srp_aar_link', models.CharField(default=b'', max_length=254)),
('fleet_commander', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='eveonline.EveCharacter')),
],
),
migrations.CreateModel(
name='SrpUserRequest',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('killboard_link', models.CharField(default=b'', max_length=254)),
('after_action_report_link', models.CharField(default=b'', max_length=254)),
('additional_info', models.CharField(default=b'', max_length=254)),
('srp_status', models.CharField(default=b'', max_length=254)),
('srp_total_amount', models.BigIntegerField(default=0)),
('kb_total_loss', models.BigIntegerField(default=0)),
('srp_ship_name', models.CharField(default=b'', max_length=254)),
('post_time', models.DateTimeField(default=django.utils.timezone.now)),
('character', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='eveonline.EveCharacter')),
('srp_fleet_main', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='srp.SrpFleetMain')),
],
),
]

View File

@@ -0,0 +1,20 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.10.5 on 2017-01-18 20:21
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('srp', '0001_initial'),
]
operations = [
migrations.AlterField(
model_name='srpuserrequest',
name='srp_status',
field=models.CharField(choices=[('Pending', 'Pending'), ('Approved', 'Approved'), ('Rejected', 'Rejected')], default='Pending', max_length=8),
),
]

View File

@@ -0,0 +1,64 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.10.5 on 2017-03-22 23:35
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('srp', '0002_srpuserrequest_srp_status_choices'),
]
operations = [
migrations.AlterModelOptions(
name='srpfleetmain',
options={'permissions': (('access_srp', 'Can access SRP module'),)},
),
migrations.AlterField(
model_name='srpfleetmain',
name='fleet_doctrine',
field=models.CharField(default='', max_length=254),
),
migrations.AlterField(
model_name='srpfleetmain',
name='fleet_name',
field=models.CharField(default='', max_length=254),
),
migrations.AlterField(
model_name='srpfleetmain',
name='fleet_srp_aar_link',
field=models.CharField(default='', max_length=254),
),
migrations.AlterField(
model_name='srpfleetmain',
name='fleet_srp_code',
field=models.CharField(default='', max_length=254),
),
migrations.AlterField(
model_name='srpfleetmain',
name='fleet_srp_status',
field=models.CharField(default='', max_length=254),
),
migrations.AlterField(
model_name='srpuserrequest',
name='additional_info',
field=models.CharField(default='', max_length=254),
),
migrations.AlterField(
model_name='srpuserrequest',
name='after_action_report_link',
field=models.CharField(default='', max_length=254),
),
migrations.AlterField(
model_name='srpuserrequest',
name='killboard_link',
field=models.CharField(default='', max_length=254),
),
migrations.AlterField(
model_name='srpuserrequest',
name='srp_ship_name',
field=models.CharField(default='', max_length=254),
),
]

View File

50
allianceauth/srp/models.py Executable file
View File

@@ -0,0 +1,50 @@
from django.db import models
from django.utils import timezone
from allianceauth.eveonline.models import EveCharacter
class SrpFleetMain(models.Model):
fleet_name = models.CharField(max_length=254, default="")
fleet_doctrine = models.CharField(max_length=254, default="")
fleet_time = models.DateTimeField()
fleet_srp_code = models.CharField(max_length=254, default="")
fleet_srp_status = models.CharField(max_length=254, default="")
fleet_commander = models.ForeignKey(EveCharacter)
fleet_srp_aar_link = models.CharField(max_length=254, default="")
def __str__(self):
return self.fleet_name
@property
def total_cost(self):
return sum([int(r.srp_total_amount) for r in self.srpuserrequest_set.all()])
@property
def pending_requests(self):
return self.srpuserrequest_set.filter(srp_status='Pending').count()
class Meta:
permissions = (('access_srp', 'Can access SRP module'),)
class SrpUserRequest(models.Model):
SRP_STATUS_CHOICES = (
('Pending', 'Pending'),
('Approved', 'Approved'),
('Rejected', 'Rejected'),
)
killboard_link = models.CharField(max_length=254, default="")
after_action_report_link = models.CharField(max_length=254, default="")
additional_info = models.CharField(max_length=254, default="")
srp_status = models.CharField(max_length=8, default="Pending", choices=SRP_STATUS_CHOICES)
srp_total_amount = models.BigIntegerField(default=0)
character = models.ForeignKey(EveCharacter)
srp_fleet_main = models.ForeignKey(SrpFleetMain)
kb_total_loss = models.BigIntegerField(default=0)
srp_ship_name = models.CharField(max_length=254, default="")
post_time = models.DateTimeField(default=timezone.now)
def __str__(self):
return self.character.character_name + ' SRP request for ' + self.srp_ship_name

View File

@@ -0,0 +1,55 @@
{% extends "registered/base.html" %}
{% load bootstrap %}
{% load staticfiles %}
{% load i18n %}
{% block title %}Alliance Auth - SRP Fleet Create{% endblock %}
{% block page_title %}{% trans "SRP Fleet Create" %}{% endblock page_title %}
{% block extra_css %}
{% include 'bundles/jquery-datetimepicker-css.html' %}
{% endblock extra_css %}
{% block content %}
<div class="col-lg-12">
<h1 class="page-header text-center">{% trans "Create SRP Fleet" %}</h1>
<div class="container-fluid">
<div class="col-md-4 col-md-offset-4">
<div class="row">
{% if completed == False %}
<form class="form-signin" role="form" action="" method="POST">
{% csrf_token %}
{{ form|bootstrap }}
<br/>
<button class="btn btn-lg btn-primary btn-block" type="submit">{% trans "Create SRP Fleet" %}</button>
</form>
{% else %}
<div class="alert alert-info" role="alert">{% blocktrans %}Give this link to the line members{% endblocktrans %}.</div>
<div class="alert alert-info" role="alert">
http://{{ request.get_host }}{% url 'srp:request' completed_srp_code %}</div>
<div class="text-center">
<a href="{% url 'srp:management' %}" class="btn btn-primary btn-lg">{% trans "Continue" %}</a>
</div>
{% endif %}
</div>
</div>
</div>
</div>
{% endblock content %}
{% block extra_javascript %}
{% include 'bundles/jquery-datetimepicker-js.html' %}
{% endblock %}
{% block extra_script %}
$('#id_fleet_time').datetimepicker({
maskInput: true,
format: 'Y-m-d H:i'
});
{% endblock extra_script %}

View File

@@ -0,0 +1,208 @@
{% extends "registered/base.html" %}
{% load bootstrap %}
{% load staticfiles %}
{% load i18n %}
{% load humanize %}
{% block title %}Alliance Auth{% endblock %}
{% block page_title %}Srp Fleet Data{% endblock page_title %}
{% block extra_css %}
{% include 'bundles/x-editable.css.html' %}
<link href="{% static 'css/checkbox.css' %}" rel="stylesheet" type="text/css">
<style>
.radio label, .checkbox label {
padding-left: 10px;
}
.editable {
width:150px;
text-align: center;
}
.editableform .form-control {
width: 95%;
text-align: center;
margin-left: 10px;
}
.editable-input {
width: 95%;
}
.radio, .checkbox {
margin-top: 0px;
margin-bottom: 0px;
}
.editable-error-block {
white-space: nowrap;
}
.editable-click, a.editable-click, a.editable-click:hover {
border-bottom: none;
}
.tooltip-inner {
white-space:pre;
max-width: none;
}
</style>
{% endblock extra_css %}
{% block content %}
<div class="col-lg-12">
<div class="row">
<h1 class="page-header text-center">{% trans "SRP Fleet Data" %}
<div class="text-right">
{% if perms.auth.srp_management %}
{% if fleet_status == "Completed" %}
<a href="{% url 'srp:mark_uncompleted' fleet_id %}" class="btn btn-warning">
{% trans "Mark Incomplete" %}
</a>
{% else %}
<a href="{% url 'srp:mark_completed' fleet_id %}" class="btn btn-success">
{% trans "Mark Completed" %}
</a>
{% endif %}
{% endif %}
</div>
</h1>
{% if srpfleetrequests %}
<form method="POST">
{% csrf_token %}
<div class="alert alert-info" role="alert">
<div class="text-right">
<b><span style="padding-right:2.5em">{% trans "Total Losses:" %} {{ srpfleetrequests.count }}</span></b>
<b><span style="padding-right:2.5em">{% trans "Total ISK Cost:" %} {{ totalcost | intcomma }}</span></b>
{% if perms.auth.srp_management %}
<button type="submit" title="Approve" class="btn btn-success" formaction="{% url 'srp:request_approve' %}">
<span class="glyphicon glyphicon-ok"></span>
</button>
<button type="submit" title="Reject" class="btn btn-warning" formaction="{% url 'srp:request_reject' %}">
<span class="glyphicon glyphicon-remove"></span>
</button>
<button type="submit" title="Remove" onclick="return confirm('{% trans "Are you sure you want to delete SRP requests?" %}')" class="btn btn-danger" formaction="{% url 'srp:request_remove' %}">
<span class="glyphicon glyphicon-trash"></span>
</button>
{% endif %}
</div>
</div>
<table class="table">
<tr>
<th class="text-center">{% trans "Pilot Name" %}</th>
<th class="text-center">{% trans "Killboard Link" %}</th>
<th class="text-center">{% trans "Additional Info" %}</th>
<th class="text-center">{% trans "Ship Type" %}</th>
<th class="text-center">{% trans "Killboard Loss Amt" %}</th>
<th class="text-center">{% trans "SRP ISK Cost" %}
{% blocktrans %}<i class="glyphicon glyphicon-question-sign" rel="tooltip" title="Click value to edit
Enter to save&next
ESC to cancel"
id="blah"></i></th>{% endblocktrans %}
<th class="text-center">{% trans "Post Time" %}</th>
<th class="text-center">{% trans "Status" %}</th>
{% if perms.auth.srp_management %}
<th class="text-center">{% trans "Actions" %}</th>
{% endif %}
</tr>
{% for srpfleetrequest in srpfleetrequests %}
<tr>
<td class="text-center">{{ srpfleetrequest.character.character_name }}</td>
<td class="text-center">
<a href="{{ srpfleetrequest.killboard_link }}"
target="_blank" class="label label-warning">Link</a>
</td>
<td class="text-center">{{ srpfleetrequest.additional_info }}</td>
<td class="text-center">{{ srpfleetrequest.srp_ship_name }}</td>
<td class="text-center">{{ srpfleetrequest.kb_total_loss | intcomma }} ISK</td>
<td class="srp" data-name="srp_total_amount" data-type="number" data-pk="{{srpfleetrequest.id}}" data-url="{% url 'srp:request_update_amount' srpfleetrequest.id %}" data-params="{csrfmiddlewaretoken:'{{csrf_token}}'}" class="text-center">{{ srpfleetrequest.srp_total_amount | intcomma }} ISK</td>
<td class="text-center">{{ srpfleetrequest.post_time | date:"Y-m-d H:i" }}</td>
<td class="text-center">
{% if srpfleetrequest.srp_status == "Approved" %}
<div class="label label-success">
{% trans "Approved" %}
</div>
{% elif srpfleetrequest.srp_status == "Rejected" %}
<div class="label label-danger">
{% trans "Rejected" %}
</div>
{% else %}
<div class="label label-warning">
{% trans "Pending" %}
</div>
{% endif %}
</td>
{% if perms.auth.srp_management %}
<td class="text-center">
<div class="checkbox">
<label style="font-size: 1.5em">
<input type="checkbox" name="{{srpfleetrequest.id}}">
<span class="cr"><i class="cr-icon fa fa-check"></i></span>
</label>
</div>
</td>
{% endif %}
</tr>
{% endfor %}
</table>
<div class="alert alert-info" role="alert">
<div class="text-right">
<b><span style="padding-right:2.5em">{% trans "Total Losses:" %} {{ srpfleetrequests.count }}</span></b>
<b><span style="padding-right:2.5em">{% trans "Total ISK Cost:" %} {{ totalcost | intcomma }}</span></b>
{% if perms.auth.srp_management %}
<button type="submit" title="Approve" class="btn btn-success" formaction="{% url 'srp:request_approve' %}">
<span class="glyphicon glyphicon-ok"></span>
</button>
<button type="submit" title="Reject" class="btn btn-warning" formaction="{% url 'srp:request_reject' %}">
<span class="glyphicon glyphicon-remove"></span>
</button>
<button type="submit" title="Remove" onclick="return confirm('{% trans "Are you sure you want to delete SRP requests?" %}')" class="btn btn-danger" formaction="{% url 'srp:request_remove' %}">
<span class="glyphicon glyphicon-trash"></span>
</button>
{% endif %}
</div>
</div>
</form>
{% else %}
<div class="alert alert-warning text-center">{% trans "No SRP requests for this fleet." %}</div>
{% endif %}
</div>
</div>
{% endblock content %}
{% block extra_javascript %}
{% include 'bundles/x-editable-js.html' %}
{% endblock %}
{% block extra_script %}
$(document).ready(function() {
$.fn.editable.defaults.mode = 'inline';
$.fn.editable.defaults.showbuttons = false;
$.fn.editable.defaults.highlight = "#AAFF80";
$('.srp').editable({
display: function(value, response) {
return false;
},
success: function(response, newValue) {
newValue = parseInt(newValue);
newvalue = newValue.toLocaleString() + " ISK";
$(this).html(newvalue.bold());
},
validate: function(value) {
if (value === null || value === '') {
return 'Empty values not allowed';
}
}
});
$('.srp').on('hidden', function(e, reason){
if(reason === 'save' || reason === 'nochange') {
var $next = $(this).closest('tr').next().find('.editable');
setTimeout(function() {
$next.editable('show');
}, 400);
}
});
});
$(document).ready(function(){
$("[rel=tooltip]").tooltip({ placement: 'top'});
});
{% endblock extra_script %}

View File

@@ -0,0 +1,125 @@
{% extends "registered/base.html" %}
{% load bootstrap %}
{% load staticfiles %}
{% load i18n %}
{% load humanize %}
{% block title %}Alliance Auth{% endblock %}
{% block page_title %}{% trans "Srp Management" %}{% endblock page_title %}
{% block extra_css %}{% endblock extra_css %}
{% block content %}
<div class="col-lg-12">
<div class="row">
<h1 class="page-header text-center">{% trans "SRP Management" %}
<div class="text-right">
{% if perms.auth.srp_management %}
<a href="{% url 'srp:all' %}" class="btn btn-primary">
{% trans "View All" %}
</a>
<a href="{% url 'srp:add' %}" class="btn btn-success">
{% trans "Add SRP Fleet" %}
</a>
{% endif %}
</div>
</h1>
<div class="alert alert-info" role="alert">
<div class="text-right">
<b>{% trans "Total ISK Cost:" %} {{ totalcost | intcomma }}</b>
</div>
</div>
{% if srpfleets %}
<table class="table">
<tr>
<th class="text-center">{% trans "Fleet Name" %}</th>
<th class="text-center">{% trans "Fleet Time" %}</th>
<th class="text-center">{% trans "Fleet Doctrine" %}</th>
<th class="text-center">{% trans "Fleet Commander" %}</th>
<th class="text-center">{% trans "Fleet AAR" %}</th>
<th class="text-center">{% trans "Fleet SRP Code" %}</th>
<th class="text-center">{% trans "Fleet ISK Cost" %}</th>
<th class="text-center">{% trans "SRP Status" %}</th>
<th class="text-center">{% trans "Pending Requests" %}</th>
<th width="100px" class="text-center">{% trans "Actions" %}</th>
</tr>
{% for srpfleet in srpfleets %}
<tr>
<td class="text-center">
<div class="label label-info">
{{ srpfleet.fleet_name }}
</div>
</td>
<td class="text-center">{{ srpfleet.fleet_time | date:"Y-m-d H:i" }}</td>
<td class="text-center">{{ srpfleet.fleet_doctrine }}</td>
<td class="text-center">
<div class="label label-success">
{{ srpfleet.fleet_commander.character_name }}
</div>
</td>
<td class="text-center">
{% if srpfleet.fleet_srp_aar_link %}
<a href="{{ srpfleet.fleet_srp_aar_link }}" target="_blank" class="label label-primary">{% trans 'Link' %}</a>
{% endif %}
</td>
<td class="text-center">
{% if srpfleet.fleet_srp_code %}
<a class="label label-warning" href="{% url 'srp:request' srpfleet.fleet_srp_code %}">{{ srpfleet.fleet_srp_code }}</a>
{% else %}
<div class="label label-danger">
{% trans "Disabled" %}
</div>
{% endif %}
</td>
<td class="text-center">ISK: {{ srpfleet.total_cost | intcomma }}</td>
<td class="text-center">
{% if srpfleet.fleet_srp_status == "" %}
<div class="label label-warning">
{% trans "Pending" %}
</div>
{% else %}
<div class="label label-success">
{% trans "Completed" %}
</div>
{% endif %}
</td>
<td class="text-center">
<div class="label label-warning">{{ srpfleet.pending_requests }}</div>
</td>
<td class="text-center">
<a href="{% url 'srp:fleet' srpfleet.id %}" class="btn btn-primary" title="View">
<span class="glyphicon glyphicon-eye-open"></span>
</a>
{% if perms.auth.srp_management %}
<a href="{% url 'srp:edit' srpfleet.id %}" class="btn btn-info" title="Edit">
<span class="glyphicon glyphicon-pencil"></span>
</a>
<a href="{% url 'srp:remove' srpfleet.id %}" onclick="return confirm('{% trans "Are you sure you want to delete this SRP code and its contents?" %}')" class="btn btn-danger" title="Remove">
<span class="glyphicon glyphicon-trash"></span>
</a>
{% if srpfleet.fleet_srp_code %}
<a href="{% url 'srp:disable' srpfleet.id %}" class="btn btn-warning" title="Disable">
<span class="glyphicon glyphicon-remove-sign"></span>
</a>
{% else %}
<a href="{% url 'srp:enable' srpfleet.id %}" class="btn btn-success" title="Enable">
<span class="glyphicon glyphicon-ok-sign"></span>
</a>
{% endif %}
{% endif %}
</td>
</tr>
{% endfor %}
</table>
{% else %}
<div class="alert alert-warning text-center">{% trans "No SRP fleets created." %}</div>
{% endif %}
</div>
</div>
{% endblock content %}

View File

@@ -0,0 +1,31 @@
{% extends "registered/base.html" %}
{% load bootstrap %}
{% load staticfiles %}
{% load i18n %}
{% block title %}SRP Request{% endblock %}
{% block page_title %}{% trans "SRP Request" %}{% endblock page_title %}
{% block content %}
<div class="col-lg-12">
<h1 class="page-header text-center">{% trans "Create SRP Request" %}</h1>
<div class="container-fluid">
<div class="col-md-4 col-md-offset-4">
<div class="row">
<form class="form-signin" role="form" action="" method="POST">
{% csrf_token %}
{{ form|bootstrap }}
<br/>
<button class="btn btn-lg btn-primary btn-block" type="submit">{% trans "Create SRP Request" %}
</button>
</form>
</div>
</div>
</div>
</div>
{% endblock content %}

View File

@@ -0,0 +1,35 @@
{% extends "registered/base.html" %}
{% load bootstrap %}
{% load staticfiles %}
{% load i18n %}
{% block title %}Alliance Auth - Update AAR Link{% endblock %}
{% block page_title %}{% trans "Update AAR Link" %}{% endblock page_title %}
{% block content %}
<div class="col-lg-12">
<h1 class="page-header text-center">{% trans "Update AAR Link" %}</h1>
<div class="container-fluid">
<div class="col-md-4 col-md-offset-4">
<div class="row">
{% if no_fleet_id %}
<div class="alert alert-danger" role="alert">{% trans "SRP Fleet Does Not Exist" %}</div>
{% else %}
<form class="form-signin" role="form" action="" method="POST">
{% csrf_token %}
{{ form|bootstrap }}
<br/>
<button class="btn btn-lg btn-primary btn-block" type="submit">{% trans "Update AAR Link" %}
</button>
</form>
{% endif %}
</div>
</div>
</div>
</div>
{% endblock content %}

1
allianceauth/srp/tests.py Executable file
View File

@@ -0,0 +1 @@
# Create your tests here.

32
allianceauth/srp/urls.py Normal file
View File

@@ -0,0 +1,32 @@
from django.conf.urls import url
from . import views
app_name = 'srp'
urlpatterns = [
# SRP URLS
url(r'^$', views.srp_management, name='management'),
url(r'^all/$', views.srp_management_all, name='all'),
url(r'^(\w+)/view$', views.srp_fleet_view, name='fleet'),
url(r'^add/$', views.srp_fleet_add_view, name='add'),
url(r'^(\w+)/edit$', views.srp_fleet_edit_view, name='edit'),
url(r'^(\w+)/request', views.srp_request_view, name='request'),
# SRP URLS
url(r'^(\w+)/remove$', views.srp_fleet_remove, name='remove'),
url(r'^(\w+)/disable$', views.srp_fleet_disable, name='disable'),
url(r'^(\w+)/enable$', views.srp_fleet_enable, name='enable'),
url(r'^(\w+)/complete$', views.srp_fleet_mark_completed,
name='mark_completed'),
url(r'^(\w+)/incomplete$', views.srp_fleet_mark_uncompleted,
name='mark_uncompleted'),
url(r'^request/remove/', views.srp_request_remove,
name="request_remove"),
url(r'request/approve/', views.srp_request_approve,
name='request_approve'),
url(r'request/reject/', views.srp_request_reject,
name='request_reject'),
url(r'^request/(\w+)/update', views.srp_request_update_amount,
name="request_update_amount"),
]

364
allianceauth/srp/views.py Executable file
View File

@@ -0,0 +1,364 @@
import logging
import uuid
from django.contrib import messages
from django.contrib.auth.decorators import login_required
from django.contrib.auth.decorators import permission_required
from django.contrib.humanize.templatetags.humanize import intcomma
from django.http import JsonResponse
from django.shortcuts import render, redirect, get_object_or_404
from django.utils import timezone
from django.utils.translation import ugettext_lazy as _
from allianceauth.eveonline.managers import EveManager
from allianceauth.notifications import notify
from .form import SrpFleetMainForm
from .form import SrpFleetMainUpdateForm
from .form import SrpFleetUserRequestForm
from .models import SrpFleetMain
from .models import SrpUserRequest
from .managers import SRPManager
logger = logging.getLogger(__name__)
def random_string(string_length=10):
"""Returns a random string of length string_length."""
random = str(uuid.uuid4()) # Convert UUID format to a Python string.
random = random.upper() # Make all characters uppercase.
random = random.replace("-", "") # Remove the UUID '-'.
return random[0:string_length] # Return the random string.
@login_required
@permission_required('srp.access_srp')
def srp_management(request):
logger.debug("srp_management called by user %s" % request.user)
fleets = SrpFleetMain.objects.filter(fleet_srp_status="")
totalcost = sum([int(fleet.total_cost) for fleet in fleets])
context = {"srpfleets": fleets, "totalcost": totalcost}
return render(request, 'srp/management.html', context=context)
@login_required
@permission_required('srp.access_srp')
def srp_management_all(request):
logger.debug("srp_management_all called by user %s" % request.user)
fleets = SrpFleetMain.objects.all()
totalcost = sum([int(fleet.total_cost) for fleet in fleets])
context = {"srpfleets": SrpFleetMain.objects.all(), "totalcost": totalcost}
return render(request, 'srp/management.html', context=context)
@login_required
@permission_required('srp.access_srp')
def srp_fleet_view(request, fleet_id):
logger.debug("srp_fleet_view called by user %s for fleet id %s" % (request.user, fleet_id))
fleet_main = get_object_or_404(SrpFleetMain, id=fleet_id)
context = {"fleet_id": fleet_id, "fleet_status": fleet_main.fleet_srp_status,
"srpfleetrequests": fleet_main.srpuserrequest_set.order_by('srp_ship_name'),
"totalcost": fleet_main.total_cost}
return render(request, 'srp/data.html', context=context)
@login_required
@permission_required('auth.srp_management')
def srp_fleet_add_view(request):
logger.debug("srp_fleet_add_view called by user %s" % request.user)
completed = False
completed_srp_code = ""
if request.method == 'POST':
form = SrpFleetMainForm(request.POST)
logger.debug("Request type POST contains form valid: %s" % form.is_valid())
if form.is_valid():
srp_fleet_main = SrpFleetMain()
srp_fleet_main.fleet_name = form.cleaned_data['fleet_name']
srp_fleet_main.fleet_doctrine = form.cleaned_data['fleet_doctrine']
srp_fleet_main.fleet_time = form.cleaned_data['fleet_time']
srp_fleet_main.fleet_srp_code = random_string(8)
srp_fleet_main.fleet_commander = request.user.profile.main_character
srp_fleet_main.save()
completed = True
completed_srp_code = srp_fleet_main.fleet_srp_code
logger.info("Created SRP Fleet %s by user %s" % (srp_fleet_main.fleet_name, request.user))
messages.success(request, _('Created SRP fleet %(fleetname)s.') % {"fleetname": srp_fleet_main.fleet_name})
else:
logger.debug("Returning blank SrpFleetMainForm")
form = SrpFleetMainForm()
render_items = {'form': form, "completed": completed, "completed_srp_code": completed_srp_code}
return render(request, 'srp/add.html', context=render_items)
@login_required
@permission_required('auth.srp_management')
def srp_fleet_remove(request, fleet_id):
logger.debug("srp_fleet_remove called by user %s for fleet id %s" % (request.user, fleet_id))
srpfleetmain = get_object_or_404(SrpFleetMain, id=fleet_id)
srpfleetmain.delete()
logger.info("SRP Fleet %s deleted by user %s" % (srpfleetmain.fleet_name, request.user))
messages.success(request, _('Removed SRP fleet %(fleetname)s.') % {"fleetname": srpfleetmain.fleet_name})
return redirect("srp:management")
@login_required
@permission_required('auth.srp_management')
def srp_fleet_disable(request, fleet_id):
logger.debug("srp_fleet_disable called by user %s for fleet id %s" % (request.user, fleet_id))
srpfleetmain = get_object_or_404(SrpFleetMain, id=fleet_id)
srpfleetmain.fleet_srp_code = ""
srpfleetmain.save()
logger.info("SRP Fleet %s disabled by user %s" % (srpfleetmain.fleet_name, request.user))
messages.success(request, _('Disabled SRP fleet %(fleetname)s.') % {"fleetname": srpfleetmain.fleet_name})
return redirect("srp:management")
@login_required
@permission_required('auth.srp_management')
def srp_fleet_enable(request, fleet_id):
logger.debug("srp_fleet_enable called by user %s for fleet id %s" % (request.user, fleet_id))
srpfleetmain = get_object_or_404(SrpFleetMain, id=fleet_id)
srpfleetmain.fleet_srp_code = random_string(8)
srpfleetmain.save()
logger.info("SRP Fleet %s enable by user %s" % (srpfleetmain.fleet_name, request.user))
messages.success(request, _('Enabled SRP fleet %(fleetname)s.') % {"fleetname": srpfleetmain.fleet_name})
return redirect("srp:management")
@login_required
@permission_required('auth.srp_management')
def srp_fleet_mark_completed(request, fleet_id):
logger.debug("srp_fleet_mark_completed called by user %s for fleet id %s" % (request.user, fleet_id))
srpfleetmain = get_object_or_404(SrpFleetMain, id=fleet_id)
srpfleetmain.fleet_srp_status = "Completed"
srpfleetmain.save()
logger.info("Marked SRP Fleet %s as completed by user %s" % (srpfleetmain.fleet_name, request.user))
messages.success(request,
_('Marked SRP fleet %(fleetname)s as completed.') % {"fleetname": srpfleetmain.fleet_name})
return redirect("srp:fleet", fleet_id)
@login_required
@permission_required('auth.srp_management')
def srp_fleet_mark_uncompleted(request, fleet_id):
logger.debug("srp_fleet_mark_uncompleted called by user %s for fleet id %s" % (request.user, fleet_id))
srpfleetmain = get_object_or_404(SrpFleetMain, id=fleet_id)
srpfleetmain.fleet_srp_status = ""
srpfleetmain.save()
logger.info("Marked SRP Fleet %s as incomplete for user %s" % (fleet_id, request.user))
messages.success(request,
_('Marked SRP fleet %(fleetname)s as incomplete.') % {"fleetname": srpfleetmain.fleet_name})
return redirect("srp:fleet", fleet_id)
@login_required
@permission_required('srp.access_srp')
def srp_request_view(request, fleet_srp):
logger.debug("srp_request_view called by user %s for fleet srp code %s" % (request.user, fleet_srp))
if SrpFleetMain.objects.filter(fleet_srp_code=fleet_srp).exists() is False:
logger.error("Unable to locate SRP Fleet using code %s for user %s" % (fleet_srp, request.user))
messages.error(request,
_('Unable to locate SRP code with ID %(srpfleetid)s') % {"srpfleetid": fleet_srp})
return redirect("srp:management")
if request.method == 'POST':
form = SrpFleetUserRequestForm(request.POST)
logger.debug("Request type POST contains form valid: %s" % form.is_valid())
if form.is_valid():
if SrpUserRequest.objects.filter(killboard_link=form.cleaned_data['killboard_link']).exists():
messages.error(request,
_("This Killboard link has already been posted."))
return redirect("srp:management")
character = request.user.profile.main_character
srp_fleet_main = SrpFleetMain.objects.get(fleet_srp_code=fleet_srp)
post_time = timezone.now()
srp_request = SrpUserRequest()
srp_request.killboard_link = form.cleaned_data['killboard_link']
srp_request.additional_info = form.cleaned_data['additional_info']
srp_request.character = character
srp_request.srp_fleet_main = srp_fleet_main
try:
srp_kill_link = SRPManager.get_kill_id(srp_request.killboard_link)
(ship_type_id, ship_value, victim_name) = SRPManager.get_kill_data(srp_kill_link)
except ValueError:
logger.debug("User %s Submitted Invalid Killmail Link %s or server could not be reached" % (
request.user, srp_request.killboard_link))
# THIS SHOULD BE IN FORM VALIDATION
messages.error(request,
_(
"Your SRP request Killmail link is invalid. Please make sure you are using zKillboard."))
return redirect("srp:management")
if request.user.character_ownerships.filter(character__character_name=victim_name).exists():
srp_request.srp_ship_name = EveManager.get_itemtype(ship_type_id).name
srp_request.kb_total_loss = ship_value
srp_request.post_time = post_time
srp_request.save()
logger.info("Created SRP Request on behalf of user %s for fleet name %s" % (
request.user, srp_fleet_main.fleet_name))
messages.success(request,
_('Submitted SRP request for your %(ship)s.') % {"ship": srp_request.srp_ship_name})
return redirect("srp:management")
else:
messages.error(request,
_(
"%(charname)s does not belong to your Auth account. Please add the API key for this character and try again")
% {"charname": victim_name})
return redirect("srp:management")
else:
logger.debug("Returning blank SrpFleetUserRequestForm")
form = SrpFleetUserRequestForm()
render_items = {'form': form}
return render(request, 'srp/request.html', context=render_items)
@login_required
@permission_required('auth.srp_management')
def srp_request_remove(request):
numrequests = len(request.POST) - 1
logger.debug("srp_request_remove called by user %s for %s srp request id's" % (request.user, numrequests))
stored_fleet_view = None
for srp_request_id in request.POST:
if numrequests == 0:
messages.warning(request, _("No SRP requests selected"))
return redirect("srp:management")
if srp_request_id == "csrfmiddlewaretoken":
continue
if SrpUserRequest.objects.filter(id=srp_request_id).exists():
srpuserrequest = SrpUserRequest.objects.get(id=srp_request_id)
stored_fleet_view = srpuserrequest.srp_fleet_main.id
srpuserrequest.delete()
logger.info("Deleted SRP request id %s for user %s" % (srp_request_id, request.user))
if stored_fleet_view is None:
logger.error("Unable to delete srp requests for user %s - request matching id not found." % (request.user))
messages.error(request, _('Unable to locate selected SRP request.'))
return redirect("srp:management")
else:
messages.success(request, _('Deleted %(numrequests)s SRP requests') % {"numrequests": numrequests})
return redirect("srp:fleet", stored_fleet_view)
@login_required
@permission_required('auth.srp_management')
def srp_request_approve(request):
numrequests = len(request.POST) - 1
logger.debug("srp_request_approve called by user %s for %s srp request id's" % (request.user, numrequests))
stored_fleet_view = None
for srp_request_id in request.POST:
if numrequests == 0:
messages.warning(request, _("No SRP requests selected"))
return redirect("srp:management")
if srp_request_id == "csrfmiddlewaretoken":
continue
if SrpUserRequest.objects.filter(id=srp_request_id).exists():
srpuserrequest = SrpUserRequest.objects.get(id=srp_request_id)
stored_fleet_view = srpuserrequest.srp_fleet_main.id
srpuserrequest.srp_status = "Approved"
if srpuserrequest.srp_total_amount == 0:
srpuserrequest.srp_total_amount = srpuserrequest.kb_total_loss
srpuserrequest.save()
logger.info("Approved SRP request id %s for character %s by user %s" % (
srp_request_id, srpuserrequest.character, request.user))
notify(
srpuserrequest.character.character_ownership.user,
'SRP Request Approved',
level='success',
message='Your SRP request for a %s lost during %s has been approved for %s ISK.' % (
srpuserrequest.srp_ship_name, srpuserrequest.srp_fleet_main.fleet_name,
intcomma(srpuserrequest.srp_total_amount))
)
if stored_fleet_view is None:
logger.error("Unable to approve srp request on behalf of user %s - request matching id not found." % (request.user))
messages.error(request, _('Unable to locate selected SRP request.'))
return redirect("srp:management")
else:
messages.success(request, _('Approved %(numrequests)s SRP requests') % {"numrequests": numrequests})
return redirect("srp:fleet", stored_fleet_view)
@login_required
@permission_required('auth.srp_management')
def srp_request_reject(request):
numrequests = len(request.POST) - 1
logger.debug("srp_request_reject called by user %s for %s srp request id's" % (request.user, numrequests))
stored_fleet_view = None
for srp_request_id in request.POST:
if numrequests == 0:
messages.warning(request, _("No SRP requests selected"))
return redirect("srp:management")
if srp_request_id == "csrfmiddlewaretoken":
continue
if SrpUserRequest.objects.filter(id=srp_request_id).exists():
srpuserrequest = SrpUserRequest.objects.get(id=srp_request_id)
stored_fleet_view = srpuserrequest.srp_fleet_main.id
srpuserrequest.srp_status = "Rejected"
srpuserrequest.save()
logger.info("SRP request id %s for character %s rejected by %s" % (
srp_request_id, srpuserrequest.character, request.user))
notify(
srpuserrequest.character.character_ownership.user,
'SRP Request Rejected',
level='danger',
message='Your SRP request for a %s lost during %s has been rejected.' % (
srpuserrequest.srp_ship_name, srpuserrequest.srp_fleet_main.fleet_name)
)
if stored_fleet_view is None:
logger.error("Unable to reject SRP request on behalf of user %s - request matching id not found." % (request.user))
messages.error(request, _('Unable to locate selected SRP request'))
return redirect("srp:management")
else:
messages.success(request, _('Rejected %(numrequests)s SRP requests.') % {"numrequests": numrequests})
return redirect("srp:fleet", stored_fleet_view)
@login_required
@permission_required('auth.srp_management')
def srp_request_update_amount(request, fleet_srp_request_id):
logger.debug("srp_request_update_amount called by user %s for fleet srp request id %s" % (
request.user, fleet_srp_request_id))
if SrpUserRequest.objects.filter(id=fleet_srp_request_id).exists() is False:
logger.error("Unable to locate SRP request id %s for user %s" % (fleet_srp_request_id, request.user))
messages.error(request,
_('Unable to locate SRP request with ID %(requestid)s') % {"requestid": fleet_srp_request_id})
return redirect("srp:management")
srp_request = SrpUserRequest.objects.get(id=fleet_srp_request_id)
srp_request.srp_total_amount = request.POST['value']
srp_request.save()
logger.info("Updated srp request id %s total to %s by user %s" % (
fleet_srp_request_id, request.POST['value'], request.user))
return JsonResponse({"success": True, "pk": fleet_srp_request_id, "newValue": request.POST['value']})
@login_required
@permission_required('auth.srp_management')
def srp_fleet_edit_view(request, fleet_id):
logger.debug("srp_fleet_edit_view called by user %s for fleet id %s" % (request.user, fleet_id))
srpfleetmain = get_object_or_404(SrpFleetMain, id=fleet_id)
if request.method == 'POST':
form = SrpFleetMainUpdateForm(request.POST)
logger.debug("Request type POST contains form valid: %s" % form.is_valid())
if form.is_valid():
srpfleetmain.fleet_srp_aar_link = form.cleaned_data['fleet_aar_link']
srpfleetmain.save()
logger.info("User %s edited SRP Fleet %s" % (request.user, srpfleetmain.fleet_name))
messages.success(request,
_('Saved changes to SRP fleet %(fleetname)s') % {"fleetname": srpfleetmain.fleet_name})
return redirect("srp:management")
else:
logger.debug("Returning blank SrpFleetMainUpdateForm")
form = SrpFleetMainUpdateForm()
return render(request, 'srp/update.html', context={'form': form})