mirror of
https://gitlab.com/allianceauth/allianceauth.git
synced 2025-07-09 12:30:15 +02:00
Added more stuff and multiple api keys
This commit is contained in:
parent
7521d9fc4d
commit
eacb3d03b8
@ -6,12 +6,15 @@ Note2: Most importantly though it works....
|
||||
|
||||
Requirments:
|
||||
django 1.6.1
|
||||
django-evolution
|
||||
django-bootstrap-form
|
||||
|
||||
python-mysql-connector
|
||||
python-mysqld
|
||||
django-evolution
|
||||
python-passlib
|
||||
python-evelink
|
||||
python-openfire
|
||||
|
||||
bcrypt
|
||||
|
||||
Services Interaction:
|
||||
|
@ -53,6 +53,7 @@ INSTALLED_APPS = (
|
||||
'django.contrib.messages',
|
||||
'django.contrib.staticfiles',
|
||||
'django_evolution',
|
||||
'bootstrapform',
|
||||
'authentication',
|
||||
'portal',
|
||||
'registration',
|
||||
@ -154,8 +155,8 @@ ALLIANCE_ID = 0
|
||||
ALLIANCE_NAME = ''
|
||||
|
||||
# Jabber Prosody Info
|
||||
OPENFIRE_ADDRESS = "http://someaddress.com:9090/"
|
||||
OPENFIRE_SECRET_KEY = "somesecretkey"
|
||||
OPENFIRE_ADDRESS = "http://something.com:9090/"
|
||||
OPENFIRE_SECRET_KEY = "somekey"
|
||||
|
||||
# Mumble settings
|
||||
MUMBLE_SERVER_ID = 1
|
@ -20,8 +20,9 @@ urlpatterns = patterns('',
|
||||
url(r'^logout_user/', 'authentication.views.logout_user', name='auth_logout_user'),
|
||||
|
||||
# None views
|
||||
url(r'^main_character_change/(\d+)/$', 'portal.views.main_character_change', name='auth_main_character_change'),
|
||||
url(r'^main_character_change/(\w+)/$', 'portal.views.main_character_change', name='auth_main_character_change'),
|
||||
url(r'^activate_forum/$', 'portal.views.activate_forum', name='auth_activate_forum'),
|
||||
url(r'^activate_jabber/$', 'portal.views.activate_jabber', name='auth_activate_jabber'),
|
||||
url(r'^activate_mumble/$', 'portal.views.activate_mumble', name='auth_activate_mumble'),
|
||||
url(r'^delete_api_pair/(\w+)/$', 'portal.views.api_key_removal', name='auth_api_key_removal')
|
||||
)
|
||||
|
@ -5,7 +5,7 @@ from django.contrib.auth.models import AbstractBaseUser
|
||||
|
||||
class AllianceUserManager(BaseUserManager):
|
||||
|
||||
def create_user(self, username, email , password=None):
|
||||
def create_user(self, username, email, password=None):
|
||||
"""
|
||||
Creates and saves a User with the given email, date of
|
||||
birth and password.
|
||||
@ -22,27 +22,6 @@ class AllianceUserManager(BaseUserManager):
|
||||
user.set_password(password)
|
||||
user.save(using=self._db)
|
||||
return user
|
||||
|
||||
def create_user_withapi(self, username, email, password, api_id, api_key):
|
||||
"""
|
||||
Creates and saves a User with the given email, date of
|
||||
birth and password.
|
||||
"""
|
||||
|
||||
if not username:
|
||||
raise ValueError('Users must have a username')
|
||||
|
||||
if not email:
|
||||
raise ValueError('Users must have an email address')
|
||||
|
||||
user = AllianceUser()
|
||||
user.set_username(username)
|
||||
user.set_email(email)
|
||||
user.set_password(password)
|
||||
user.api_id = api_id
|
||||
user.api_key = api_key
|
||||
user.save(using=self._db)
|
||||
return user
|
||||
|
||||
def create_superuser(self, username, email, password):
|
||||
"""
|
||||
@ -95,8 +74,6 @@ class AllianceUser(AbstractBaseUser):
|
||||
is_admin = models.BooleanField(default=False)
|
||||
is_moderator = models.BooleanField(default=False)
|
||||
is_banned = models.BooleanField(default=False)
|
||||
api_id = models.CharField(max_length=254)
|
||||
api_key = models.CharField(max_length=254)
|
||||
main_char_id = models.IntegerField(default=0)
|
||||
|
||||
# Login information stuff
|
||||
|
@ -1,29 +1,31 @@
|
||||
from models import EveCharacter
|
||||
from models import EveApiKeyPair
|
||||
from services.eveapi_manager import EveApiManager
|
||||
|
||||
|
||||
class EveCharacterManager():
|
||||
class EveManager():
|
||||
|
||||
def __init__(self):
|
||||
pass
|
||||
|
||||
def create_character(self, character_id, character_name, corporation_id,
|
||||
corporation_name, corporation_ticker, alliance_id,
|
||||
alliance_name, allianceuser_owner):
|
||||
|
||||
eve_char = EveCharacter();
|
||||
eve_char.character_id = character_id
|
||||
eve_char.character_name = character_name
|
||||
eve_char.corporation_id = corporation_id
|
||||
eve_char.corporation_name = corporation_name
|
||||
eve_char.corporation_ticker = corporation_ticker
|
||||
eve_char.alliance_id = alliance_id
|
||||
eve_char.alliance_name = alliance_name
|
||||
eve_char.allianceuser_owner = allianceuser_owner
|
||||
|
||||
eve_char.save()
|
||||
alliance_name, user, api_id):
|
||||
|
||||
def create_characters_from_list(self, chars, owner):
|
||||
if not EveCharacter.objects.filter(character_id=character_id).exists():
|
||||
eve_char = EveCharacter();
|
||||
eve_char.character_id = character_id
|
||||
eve_char.character_name = character_name
|
||||
eve_char.corporation_id = corporation_id
|
||||
eve_char.corporation_name = corporation_name
|
||||
eve_char.corporation_ticker = corporation_ticker
|
||||
eve_char.alliance_id = alliance_id
|
||||
eve_char.alliance_name = alliance_name
|
||||
eve_char.user = user
|
||||
eve_char.api_id = api_id
|
||||
eve_char.save()
|
||||
|
||||
def create_characters_from_list(self, chars, user, api_id):
|
||||
evemanager = EveApiManager()
|
||||
|
||||
for char in chars.result:
|
||||
@ -35,13 +37,42 @@ class EveCharacterManager():
|
||||
evemanager.get_corporation_ticker_from_id(chars.result[char]['corp']['id']),
|
||||
chars.result[char]['alliance']['id'],
|
||||
chars.result[char]['alliance']['name'],
|
||||
owner)
|
||||
user, api_id)
|
||||
|
||||
def create_api_keypair(self, api_id, api_key, user_id):
|
||||
if not EveApiKeyPair.objects.filter(api_id=api_id).exists():
|
||||
api_pair = EveApiKeyPair()
|
||||
api_pair.api_id = api_id
|
||||
api_pair.api_key = api_key
|
||||
api_pair.user = user_id
|
||||
api_pair.save()
|
||||
|
||||
def get_api_key_pairs(self, user_id):
|
||||
if EveApiKeyPair.objects.filter(user=user_id).exists():
|
||||
return EveApiKeyPair.objects.filter(user=user_id)
|
||||
|
||||
def delete_api_key_pair(self, api_id, user_id):
|
||||
if EveApiKeyPair.objects.filter(api_id=api_id).exists():
|
||||
# Check that its owned by our user_id
|
||||
apikeypair = EveApiKeyPair.objects.get(api_id=api_id)
|
||||
if apikeypair.user.id == user_id:
|
||||
apikeypair.delete()
|
||||
|
||||
def delete_characters_by_api_id(self, api_id, user_id):
|
||||
if EveCharacter.objects.filter(api_id=api_id).exists():
|
||||
# Check that its owned by our user_id
|
||||
characters = EveCharacter.objects.filter(api_id=api_id)
|
||||
|
||||
for char in characters:
|
||||
if char.user.id == user_id:
|
||||
char.delete()
|
||||
|
||||
|
||||
def check_if_character_exist(self, char_name):
|
||||
return EveCharacter.objects.filter(character_name=char_name).exists()
|
||||
|
||||
def get_characters_by_owner_id(self, owner_id):
|
||||
return EveCharacter.objects.all().filter(allianceuser_owner=owner_id)
|
||||
def get_characters_by_owner_id(self, user_id):
|
||||
return EveCharacter.objects.all().filter(user_id=user_id)
|
||||
|
||||
def get_character_by_id(self, char_id):
|
||||
if EveCharacter.objects.filter(character_id = char_id).exists():
|
||||
|
@ -11,4 +11,11 @@ class EveCharacter(models.Model):
|
||||
corporation_ticker = models.CharField(max_length=254)
|
||||
alliance_id = models.CharField(max_length=254)
|
||||
alliance_name = models.CharField(max_length=254)
|
||||
allianceuser_owner = models.ForeignKey(AllianceUser)
|
||||
api_id = models.CharField(max_length=254)
|
||||
user = models.ForeignKey(AllianceUser)
|
||||
|
||||
|
||||
class EveApiKeyPair(models.Model):
|
||||
api_id = models.CharField(max_length=254)
|
||||
api_key = models.CharField(max_length=254)
|
||||
user = models.ForeignKey(AllianceUser)
|
@ -3,7 +3,8 @@ from django.shortcuts import render_to_response, HttpResponseRedirect
|
||||
from django.template import RequestContext
|
||||
from django.contrib.auth.decorators import login_required
|
||||
|
||||
from evespecific.managers import EveCharacterManager
|
||||
from services.eveapi_manager import EveApiManager
|
||||
from evespecific.managers import EveManager
|
||||
from authentication.models import AllianceUserManager
|
||||
from services.phpbb3_manager import Phpbb3Manager
|
||||
from services.jabber_manager import JabberManager
|
||||
@ -23,25 +24,43 @@ def dashboard_view(request):
|
||||
|
||||
@login_required
|
||||
def characters_view(request):
|
||||
characterManager = EveCharacterManager()
|
||||
evemanager = EveManager()
|
||||
|
||||
render_items = {'characters':characterManager.get_characters_by_owner_id(request.user.id)}
|
||||
render_items = {'characters': evemanager.get_characters_by_owner_id(request.user.id)}
|
||||
return render_to_response('registered/characters.html', render_items, context_instance=RequestContext(request))
|
||||
|
||||
|
||||
@login_required
|
||||
def api_key_management_view(request):
|
||||
api = EveApiManager()
|
||||
evemanager = EveManager()
|
||||
|
||||
if request.method == 'POST':
|
||||
form = UpdateKeyForm(request.POST)
|
||||
|
||||
if form.is_valid():
|
||||
evemanager.create_api_keypair(form.cleaned_data['api_id'],
|
||||
form.cleaned_data['api_key'],
|
||||
request.user)
|
||||
|
||||
return HttpResponseRedirect("/")
|
||||
# Grab characters associated with the key pair
|
||||
|
||||
characters = api.get_characters_from_api(form.cleaned_data['api_id'], form.cleaned_data['api_key'])
|
||||
evemanager.create_characters_from_list(characters, request.user, form.cleaned_data['api_id'])
|
||||
return HttpResponseRedirect("/api_key_management/")
|
||||
else:
|
||||
form = UpdateKeyForm(initial={'api_id':request.user.api_id,'api_key':request.user.api_key})
|
||||
form = UpdateKeyForm()
|
||||
context = {'form': form, 'apikeypairs': evemanager.get_api_key_pairs(request.user.id)}
|
||||
return render_to_response('registered/apikeymanagment.html', context,
|
||||
context_instance=RequestContext(request))
|
||||
|
||||
return render_to_response('registered/apikeymanagment.html', {'form':form}, context_instance=RequestContext(request))
|
||||
|
||||
@login_required
|
||||
def api_key_removal(request, api_id):
|
||||
evemanager = EveManager()
|
||||
evemanager.delete_api_key_pair(api_id, request.user.id)
|
||||
evemanager.delete_characters_by_api_id(api_id, request.user.id)
|
||||
return HttpResponseRedirect("/api_key_management/")
|
||||
|
||||
@login_required
|
||||
def applications_view(request):
|
||||
@ -51,7 +70,7 @@ def applications_view(request):
|
||||
@login_required
|
||||
def main_character_change(request, id):
|
||||
userManager = AllianceUserManager()
|
||||
characterManager = EveCharacterManager()
|
||||
characterManager = EveManager()
|
||||
if characterManager.check_if_character_owned_by_user(id,request.user.id) == True:
|
||||
userManager.update_user_main_character(id,request.user.id)
|
||||
return HttpResponseRedirect("/")
|
||||
@ -65,7 +84,7 @@ def activate_forum(request):
|
||||
|
||||
if userManager.check_if_user_exist(request.user.id):
|
||||
# Valid now we get the main characters
|
||||
characterManager = EveCharacterManager()
|
||||
characterManager = EveManager()
|
||||
character = characterManager.get_character_by_id(request.user.main_char_id)
|
||||
|
||||
if forumManager.check_user(character.character_name) == False:
|
||||
@ -80,7 +99,7 @@ def activate_jabber(request):
|
||||
userManager = AllianceUserManager()
|
||||
jabberManager = JabberManager()
|
||||
if userManager.check_if_user_exist(request.user.id):
|
||||
characterManager = EveCharacterManager()
|
||||
characterManager = EveManager()
|
||||
character = characterManager.get_character_by_id(request.user.main_char_id)
|
||||
|
||||
jabberManager.add_user(character.character_name,"test")
|
||||
@ -93,11 +112,11 @@ def activate_jabber(request):
|
||||
@login_required
|
||||
def activate_mumble(request):
|
||||
userManager = AllianceUserManager()
|
||||
characterManager = EveCharacterManager()
|
||||
characterManager = EveManager()
|
||||
mumbleManager = MumbleManager()
|
||||
|
||||
if userManager.check_if_user_exist(request.user.id):
|
||||
characterManager = EveCharacterManager()
|
||||
characterManager = EveManager()
|
||||
character = characterManager.get_character_by_id(request.user.main_char_id)
|
||||
|
||||
mumbleManager.create_user(character.character_name, "test")
|
||||
|
@ -3,6 +3,6 @@ from django import forms
|
||||
class RegistrationForm(forms.Form):
|
||||
username = forms.CharField(max_length=16, required = True)
|
||||
password = forms.CharField(widget=forms.PasswordInput())
|
||||
email = forms.CharField(max_length=254, required = True)
|
||||
api_id = forms.CharField(max_length=254, required = True)
|
||||
email = forms.CharField(max_length=254, required = True)
|
||||
api_id = forms.CharField(max_length=254, required = True)
|
||||
api_key = forms.CharField(max_length=254, required = True)
|
@ -2,7 +2,7 @@ from django.http import Http404,HttpResponseRedirect
|
||||
from django.shortcuts import render_to_response, render
|
||||
from django.template import RequestContext
|
||||
from authentication.models import AllianceUserManager
|
||||
from evespecific.managers import EveCharacterManager
|
||||
from evespecific.managers import EveManager
|
||||
from services.eveapi_manager import EveApiManager
|
||||
|
||||
from forms import RegistrationForm
|
||||
@ -10,7 +10,7 @@ from forms import RegistrationForm
|
||||
|
||||
def register(request):
|
||||
api = EveApiManager()
|
||||
charmanager = EveCharacterManager()
|
||||
evemanager = EveManager()
|
||||
|
||||
if request.method == 'POST':
|
||||
form = RegistrationForm(request.POST)
|
||||
@ -18,18 +18,18 @@ def register(request):
|
||||
if form.is_valid():
|
||||
usermanager = AllianceUserManager()
|
||||
if not usermanager.check_if_user_exist_by_name(form.cleaned_data['username']):
|
||||
user = usermanager.create_user_withapi(
|
||||
user = usermanager.create_user(
|
||||
form.cleaned_data['username'],
|
||||
form.cleaned_data['email'],
|
||||
form.cleaned_data['password'],
|
||||
form.cleaned_data['api_id'],
|
||||
form.cleaned_data['api_key']
|
||||
form.cleaned_data['password']
|
||||
)
|
||||
|
||||
# Populate character data
|
||||
# Create api key object
|
||||
evemanager.create_api_keypair(form.cleaned_data['api_id'], form.cleaned_data['api_key'], user)
|
||||
|
||||
# Populate character data
|
||||
characters = api.get_characters_from_api(form.cleaned_data['api_id'], form.cleaned_data['api_key'])
|
||||
charmanager.create_characters_from_list(characters, user)
|
||||
evemanager.create_characters_from_list(characters, user, form.cleaned_data['api_id'])
|
||||
return HttpResponseRedirect("/dashboard")
|
||||
|
||||
else:
|
||||
|
@ -24,11 +24,9 @@ class EveApiManager():
|
||||
def get_corporation_ticker_from_id(self, corp_id):
|
||||
ticker = ""
|
||||
try:
|
||||
print corp_id
|
||||
api = evelink.api.API()
|
||||
corp = evelink.corp.Corp(api)
|
||||
response = corp.corporation_sheet(corp_id)
|
||||
print response
|
||||
ticker = response[0]['ticker']
|
||||
except evelink.api.APIError as error:
|
||||
print error
|
||||
|
@ -48,8 +48,8 @@
|
||||
|
||||
<div class="container-fluid">
|
||||
<div class="row">
|
||||
|
||||
{% if user.is_authenticated %}
|
||||
|
||||
{% if user.is_authenticated %}
|
||||
<div class="col-sm-3 col-md-2 sidebar">
|
||||
<ul class="nav nav-sidebar">
|
||||
<li><a href="{% url 'auth_dashboard' %}">Overview</a></li>
|
||||
@ -59,11 +59,11 @@
|
||||
<li><a href="#">Help</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
{% block content %}
|
||||
{% endblock content %}
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
{% block content %}
|
||||
{% endblock content %}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Bootstrap core JavaScript
|
||||
|
@ -1,26 +1,24 @@
|
||||
{% extends "public/base.html" %}
|
||||
|
||||
{% load bootstrap %}
|
||||
{% block title %}Alliance Auth{% endblock %}
|
||||
|
||||
{% block page_title %}Login Page{% endblock page_title %}
|
||||
|
||||
{% block content %}
|
||||
<div class="container">
|
||||
<div class="row-fluid">
|
||||
<div class="center-block" style="center">
|
||||
<p>
|
||||
{% if error %}
|
||||
<div class="alert alert-danger" role="alert">Username/Password Invalid</div>
|
||||
{% endif %}
|
||||
<form class="form-signin" role="form" action="{% url 'auth_login_user' %}" method="POST">
|
||||
{% csrf_token %}
|
||||
<h2 class="form-signin-heading">Please sign in</h2>
|
||||
{{form.as_p}}
|
||||
<button class="btn btn-lg btn-primary btn-block" type="submit">Sign in</button>
|
||||
</form>
|
||||
<p><a href="{% url 'auth_register' %}">Register Here</a>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-md-4"></div>
|
||||
<div class="col-md-4">
|
||||
{% if error %}
|
||||
<div class="alert alert-danger" role="alert">Username/Password Invalid</div>
|
||||
{% endif %}
|
||||
<form class="form-signin" role="form" action="{% url 'auth_login_user' %}" method="POST">
|
||||
{% csrf_token %}
|
||||
<h2 class="form-signin-heading">Please sign in</h2>
|
||||
{{form|bootstrap}}
|
||||
<button class="btn btn-lg btn-primary btn-block" type="submit">Sign in</button>
|
||||
</form>
|
||||
<p><a href="{% url 'auth_register' %}">Register Here</a></p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{% endblock content %}
|
||||
|
@ -1,36 +1,22 @@
|
||||
{% extends "public/base.html" %}
|
||||
|
||||
{% load bootstrap %}
|
||||
{% block title %}Alliance Auth{% endblock %}
|
||||
|
||||
{% block page_title %}Register Page{% endblock page_title %}
|
||||
|
||||
{% block content %}
|
||||
<div class="container">
|
||||
<div class="row-fluid">
|
||||
<div class="center-block" style="center">
|
||||
<p>
|
||||
{% if error %}
|
||||
<div class="alert alert-danger" role="alert">Username Already Registered</div>
|
||||
{% endif %}
|
||||
<form action="{% url 'auth_register' %}" method="POST">
|
||||
{% csrf_token %}
|
||||
<h2 class="form-signin-heading">Register Account</h2>
|
||||
<p>
|
||||
Username:<br/>
|
||||
{{form.username.errors}}
|
||||
{{form.username}}<br/> Email:<br/>
|
||||
{{form.email.errors}}
|
||||
{{form.email}}<br/> Password:<br/>
|
||||
{{form.password.errors}}
|
||||
{{form.password}}<br/>Api ID: <br/>
|
||||
{{form.api_id.errors}}
|
||||
{{form.api_id}}<br/>Api Key: <br/>
|
||||
{{form.api_key.errors}}
|
||||
{{form.api_key}}<br/>
|
||||
</p>
|
||||
<input type="submit" value="submit" />
|
||||
</form>
|
||||
</p>
|
||||
<div class="row">
|
||||
<div class="col-md-4"></div>
|
||||
<div class="col-md-4">
|
||||
{% if error %}
|
||||
<div class="alert alert-danger" role="alert">Username Already Registered</div>
|
||||
{% endif %}
|
||||
<form action="{% url 'auth_register' %}" method="POST">
|
||||
{% csrf_token %}
|
||||
<h2 class="form-signin-heading">Register Account</h2>
|
||||
{{ form|bootstrap }}
|
||||
<button class="btn btn-lg btn-primary btn-block" type="submit">Register</button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -1,4 +1,5 @@
|
||||
{% extends "public/base.html" %}
|
||||
{% load bootstrap %}
|
||||
{% load staticfiles %}
|
||||
|
||||
{% block title %}Alliance Auth{% endblock %}
|
||||
@ -8,25 +9,34 @@
|
||||
|
||||
{% block content %}
|
||||
<div class="col-sm-9 col-sm-offset-3 col-md-10 col-md-offset-2 main">
|
||||
<p> ONE API KEY ONLY ONE SERIOUSLY ONE! BECUASE ONE</p>
|
||||
<div class="row-fluid">
|
||||
<div class="center-block" style="center">
|
||||
<p>
|
||||
<form action="{% url 'auth_api_key_management' %}" method="POST">
|
||||
{% csrf_token %}
|
||||
<h2 class="form-signin-heading">Update Api:</h2>
|
||||
<p>
|
||||
API_ID:<br/>
|
||||
{{form.api_id.errors}}
|
||||
{{form.api_id}}<br/>API_KEY:<br/>
|
||||
{{form.api_key.errors}}
|
||||
{{form.api_key}}<br/>
|
||||
</p>
|
||||
<input type="submit" value="submit" class="btn btn-default"/>
|
||||
<button type="button" class="btn btn-primary">Refresh</button>
|
||||
</form>
|
||||
</p>
|
||||
</div>
|
||||
<div class="row">
|
||||
<h1 class="page-header text-center">API Key Management</h1>
|
||||
<table class="table table-bordered">
|
||||
<tr>
|
||||
<th class="text-center">API ID</th>
|
||||
<th class="text-center">API Key</th>
|
||||
<th class="text-center">Action</th>
|
||||
</tr>
|
||||
{% for pair in apikeypairs %}
|
||||
<tr>
|
||||
<td class="text-center">{{ pair.api_id }}</td>
|
||||
<td class="text-center">{{ pair.api_key }}</td>
|
||||
<td class="text-center">
|
||||
<a href="/delete_api_pair/{{ pair.api_id }}">
|
||||
<button type="button" class="btn btn-danger"><span class="glyphicon glyphicon-remove"></span></button>
|
||||
</a>
|
||||
<a href="{% url 'auth_activate_forum' %}">
|
||||
<button type="button" class="btn btn-primary"><span class="glyphicon glyphicon-refresh"></span></button>
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</table>
|
||||
<form class="form-signin" role="form" action="{% url 'auth_api_key_management' %}" method="POST">
|
||||
{% csrf_token %}
|
||||
{{ form|bootstrap_horizontal }}
|
||||
<button class="btn btn-lg btn-primary btn-block" type="submit">Create Key</button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
@ -8,9 +8,8 @@
|
||||
|
||||
{% block content %}
|
||||
<div class="col-sm-9 col-sm-offset-3 col-md-10 col-md-offset-2 main">
|
||||
{% for character in characters %}
|
||||
<div class="row">
|
||||
<div class="col-md-offset-2 col-md-8 col-lg-offset-3 col-lg-6">
|
||||
{% for character in characters %}
|
||||
<div class="well well-sm profile">
|
||||
<div class="col-sm-12">
|
||||
<div class="col-xs-12 col-sm-8">
|
||||
@ -25,13 +24,12 @@
|
||||
</figure>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-offset-8">
|
||||
<div class="col-md-offset-8">
|
||||
<a href="/main_character_change/{{character.character_id}}"><button type="button" class="btn btn-primary">Make Primary</button></a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
|
||||
{% endblock content %}
|
||||
|
Loading…
x
Reference in New Issue
Block a user