From bb87fdd9588a878e3c33b059d6fd36ecfb7819a7 Mon Sep 17 00:00:00 2001 From: Adarnof Date: Mon, 27 Feb 2017 18:34:16 -0500 Subject: [PATCH] temp commit --- authentication/admin.py | 32 ++++++++++++++++++++++++++++++-- authentication/backends.py | 23 +++++++++++++++++++++++ authentication/models.py | 34 ++++++++++++++++++++++++++++++++++ 3 files changed, 87 insertions(+), 2 deletions(-) create mode 100644 authentication/backends.py diff --git a/authentication/admin.py b/authentication/admin.py index 06b255ff..999fb28d 100644 --- a/authentication/admin.py +++ b/authentication/admin.py @@ -4,8 +4,8 @@ from django.contrib import admin from django.contrib.auth.admin import UserAdmin as BaseUserAdmin from django.contrib.auth.models import User from django.utils.text import slugify - -from authentication.models import AuthServicesInfo +from django import forms +from authentication.models import AuthServicesInfo, State, get_none_state from eveonline.models import EveCharacter from alliance_auth.hooks import get_hooks from services.hooks import ServicesHook @@ -97,3 +97,31 @@ try: admin.site.unregister(User) finally: admin.site.register(User, UserAdmin) + + +class StateForm(forms.ModelForm): + def _is_none_state(self): + instance = getattr(self, 'instance', None) + if instance and instance.pk: + return instance == get_none_state() + + def __init__(self, *args, **kwargs): + super(StateForm, self).__init__(*args, **kwargs) + if _is_none_state(): + self.fields['name'].widget.attrs['readonly'] = True + + def clean_name(self): + if self._is_none_state(): + return instance.name + return self.cleaned_data['name'] + + +@admin.register(State) +class StateAdmin(admin.ModelAdmin): + form = StateForm + + @staticmethod + def has_delete_permission(request, obj=None): + if obj == get_none_state(): + return False + diff --git a/authentication/backends.py b/authentication/backends.py new file mode 100644 index 00000000..8666a31e --- /dev/null +++ b/authentication/backends.py @@ -0,0 +1,23 @@ +from django.contrib.auth.backends import ModelBackend +from django.contrib.auth.models import Permission +from authentication.models import UserProfile + + +class StateBackend(ModelBackend): + @staticmethod + def _get_state_permissions(user_obj): + profile_state_field = UserProfile._meta.get_field('state') + user_state_query = 'state__%s__user' % profile_state_field.related_query_name() + return Permission.objects.filter(**{user_state_query: user_obj}) + + def get_state_permission(self, user_obj, obj=None): + return self._get_permissions(user_obj, obj, 'state') + + def get_all_permissions(self, user_obj, obj=None): + if not user_obj.is_active or user_obj.is_anonymous or obj is not None: + return set() + if not hasattr(user_obj, '_perm_cache'): + user_obj._perm_cache = self.get_user_permissions(user_obj) + user_obj._perm_cache.update(self.get_group_permissions(user_obj)) + user_obj._perm_cache.update(self.get_state_permissions(user_obj)) + return user_obj._perm_cache diff --git a/authentication/models.py b/authentication/models.py index 98c398de..d5366466 100755 --- a/authentication/models.py +++ b/authentication/models.py @@ -3,6 +3,7 @@ from django.utils.encoding import python_2_unicode_compatible from django.db import models from django.contrib.auth.models import User from authentication.states import MEMBER_STATE, BLUE_STATE, NONE_STATE +from eveonline.models import EveCharacter @python_2_unicode_compatible @@ -22,3 +23,36 @@ class AuthServicesInfo(models.Model): def __str__(self): return self.user.username + ' - AuthInfo' + + +@python_2_unicode_compatible +class State(models.Model): + name = models.CharField(_('name'), max_length=20, unique=True) + permissions = models.ManyToManyField( + Permission, + verbose_name=_('permissions'), + blank=True, + ) + priority = models.IntegerField(unique=True) + + class Meta: + ordering = ['priority'] + + def __str__(self): + return self.name + + +def get_none_state(): + return State.objects.get_or_create(name='None')[0] + + +@python_2_unicode_compatible +class UserProfile(models.Model): + class Meta: + default_permissions = ('change',) + + user = models.OneToOneField(User, related_name='profile', on_delete=models.CASCADE) + main_character = models.ForeignKey(EveCharacter, on_delete=models.CASCADE) + state = models.ForeignKey(State, on_delete=models.SET(get_none_state)) + owner_hash = models.CharField(max_length=28, unique=True) + owner_token = models.ForeignKey(Token, on_delete=models.SET_NULL)