From a8b9e02ea54639a68707547940250d6e09017d54 Mon Sep 17 00:00:00 2001 From: Levi Date: Sun, 26 Jun 2016 14:50:48 -0500 Subject: [PATCH] started hosting permissions --- dynamicweb/settings/base.py | 8 +++++ hosting/migrations/0026_auto_20160625_0028.py | 19 ++++++++++++ hosting/models.py | 14 ++++++++- hosting/templates/emails/new_booked_vm.html | 1 + hosting/templates/emails/new_booked_vm.txt | 1 + hosting/templates/emails/vm_charged.html | 1 + hosting/templates/emails/vm_charged.txt | 1 + membership/models.py | 5 +++ requirements.txt | 1 + utils/mixins.py | 31 +++++++++++++++++++ 10 files changed, 81 insertions(+), 1 deletion(-) create mode 100644 hosting/migrations/0026_auto_20160625_0028.py create mode 100644 utils/mixins.py diff --git a/dynamicweb/settings/base.py b/dynamicweb/settings/base.py index ab2d6763..7ab11944 100644 --- a/dynamicweb/settings/base.py +++ b/dynamicweb/settings/base.py @@ -57,6 +57,7 @@ INSTALLED_APPS = ( 'stored_messages', 'mptt', 'parler', + 'guardian', 'taggit', 'taggit_autosuggest', # 'django_select2', @@ -182,6 +183,10 @@ DATABASES = { } +AUTHENTICATION_BACKENDS = ( + 'django.contrib.auth.backends.ModelBackend', + 'guardian.backends.ObjectPermissionBackend', +) # Internationalization @@ -460,3 +465,6 @@ if DEBUG: from .local import * else: from .prod import * + + +GUARDIAN_GET_INIT_ANONYMOUS_USER = 'membership.models.get_anonymous_user_instance' diff --git a/hosting/migrations/0026_auto_20160625_0028.py b/hosting/migrations/0026_auto_20160625_0028.py new file mode 100644 index 00000000..7f98eea9 --- /dev/null +++ b/hosting/migrations/0026_auto_20160625_0028.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.4 on 2016-06-25 00:28 +from __future__ import unicode_literals + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('hosting', '0025_auto_20160621_0522'), + ] + + operations = [ + migrations.AlterModelOptions( + name='virtualmachineplan', + options={'permissions': (('view_virtualmachineplan', 'View Virtual Machine Plan'), ('cancel_virtualmachineplan', 'Cancel Virtual Machine Plan'))}, + ), + ] diff --git a/hosting/models.py b/hosting/models.py index 887f0777..c8980aa9 100644 --- a/hosting/models.py +++ b/hosting/models.py @@ -10,6 +10,7 @@ from stored_messages.settings import stored_messages_settings from membership.models import StripeCustomer from utils.models import BillingAddress +from utils.mixins import AssignPermissionsMixin from .managers import VMPlansManager @@ -82,7 +83,7 @@ class VirtualMachineType(models.Model): } -class VirtualMachinePlan(models.Model): +class VirtualMachinePlan(AssignPermissionsMixin, models.Model): PENDING_STATUS = 'pending' ONLINE_STATUS = 'online' @@ -104,6 +105,10 @@ class VirtualMachinePlan(models.Model): (NODEJS, 'Debian, NodeJS'), ) + permissions = ('virtualmachineplan.view_virtualmachineplan', + 'virtualmachineplan.cancel_virtualmachineplan', + 'virtualmachineplan.change_virtualmachineplan') + cores = models.IntegerField() memory = models.IntegerField() disk_size = models.IntegerField() @@ -116,6 +121,12 @@ class VirtualMachinePlan(models.Model): objects = VMPlansManager() + class Meta: + permissions = ( + ('view_virtualmachineplan', 'View Virtual Machine Plan'), + ('cancel_virtualmachineplan', 'Cancel Virtual Machine Plan'), + ) + def __str__(self): return self.name @@ -142,6 +153,7 @@ class VirtualMachinePlan(models.Model): @classmethod def create(cls, data, user): instance = cls.objects.create(**data) + instance.assign_permissions(user) return instance @staticmethod diff --git a/hosting/templates/emails/new_booked_vm.html b/hosting/templates/emails/new_booked_vm.html index 0a3d2742..0f9b4f6e 100644 --- a/hosting/templates/emails/new_booked_vm.html +++ b/hosting/templates/emails/new_booked_vm.html @@ -1,3 +1,4 @@ +{% load static from staticfiles %} diff --git a/hosting/templates/emails/new_booked_vm.txt b/hosting/templates/emails/new_booked_vm.txt index 0a3d2742..0f9b4f6e 100644 --- a/hosting/templates/emails/new_booked_vm.txt +++ b/hosting/templates/emails/new_booked_vm.txt @@ -1,3 +1,4 @@ +{% load static from staticfiles %} diff --git a/hosting/templates/emails/vm_charged.html b/hosting/templates/emails/vm_charged.html index b8837645..33568d05 100644 --- a/hosting/templates/emails/vm_charged.html +++ b/hosting/templates/emails/vm_charged.html @@ -1,3 +1,4 @@ +{% load static from staticfiles %} diff --git a/hosting/templates/emails/vm_charged.txt b/hosting/templates/emails/vm_charged.txt index b8837645..33568d05 100644 --- a/hosting/templates/emails/vm_charged.txt +++ b/hosting/templates/emails/vm_charged.txt @@ -1,3 +1,4 @@ +{% load static from staticfiles %} diff --git a/membership/models.py b/membership/models.py index 0b528c3f..0feaf467 100644 --- a/membership/models.py +++ b/membership/models.py @@ -16,6 +16,11 @@ REGISTRATION_MESSAGE = {'subject': "Validation mail", 'from': 'test@test.com'} +def get_anonymous_user_instance(User): + return User.register('Anonymous', None, 'anonymous@ungleich.ch') + + + class MyUserManager(BaseUserManager): def create_user(self, email, name, password=None): """ diff --git a/requirements.txt b/requirements.txt index 4bd93ee0..4619fae8 100644 --- a/requirements.txt +++ b/requirements.txt @@ -19,6 +19,7 @@ django-polymorphic model-mommy pycryptodome django-stored-messages +django-guardian #PLUGINS djangocms_flash diff --git a/utils/mixins.py b/utils/mixins.py new file mode 100644 index 00000000..ebcb221a --- /dev/null +++ b/utils/mixins.py @@ -0,0 +1,31 @@ +from guardian.shortcuts import assign_perm + + +class AssignPermissionsMixin(object): + permissions = tuple() + user = None + obj = None + kwargs = dict() + + def assign_permissions(self, user): + for permission in self.permissions: + assign_perm(permission, user, self) + + # def save(self, *args, **kwargs): + # self.kwargs = kwargs + # self.get_objs() + + # create = False + # if not self.pk: + # create = True + + # super(AssignPermissionsMixin, self).save(*args, **kwargs) + + # if create: + # self.assign_permissions() + + # def get_objs(self): + # self.user = self.kwargs.pop('user', None) + # self.obj = self.kwargs.pop('obj', None) + # assert self.user, 'Se necesita el parĂ¡metro user para poder asignar los permisos' + # assert self.obj, 'Se necesita el parĂ¡metro obj para poder asignar los permisos'