Skip to content

Commit 085e7a6

Browse files
authored
Merge pull request #19 from renderbox/develop
Prep for release v0.2.7
2 parents 8290cff + 46606c0 commit 085e7a6

File tree

4 files changed

+84
-31
lines changed

4 files changed

+84
-31
lines changed

permafrost/__version__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
VERSION = "0.2.6"
1+
VERSION = "0.2.7"

permafrost/forms.py

Lines changed: 44 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
# Permafrost Forms
2+
from django.conf import settings
23
from django.contrib.auth.models import Permission
4+
from django.core.exceptions import ValidationError
35
from django.forms import ModelForm, MultipleChoiceField, CheckboxSelectMultiple
46
from django.forms.fields import CharField, ChoiceField, BooleanField
57
from django.forms.widgets import CheckboxInput, Textarea
@@ -8,6 +10,11 @@
810

911
CHOICES = [('', _("Choose Role Type"))] + get_choices()
1012

13+
LABELS = {
14+
'name': _('Role Name'),
15+
'category': _('Role Type')
16+
}
17+
1118
def assemble_optiongroups_for_widget(permissions):
1219
choices = []
1320
optgroups = {}
@@ -40,6 +47,7 @@ class SelectPermafrostRoleTypeForm(ModelForm):
4047
class Meta:
4148
model = PermafrostRole
4249
fields = ('name', 'description', 'category',)
50+
labels = LABELS
4351

4452
def __init__(self, *args, **kwargs):
4553
super().__init__(*args, **kwargs)
@@ -55,24 +63,27 @@ class Meta:
5563
widgets = {
5664
'description': Textarea(),
5765
}
66+
labels = LABELS
5867

5968
def __init__(self, *args, **kwargs):
6069
super().__init__(*args, **kwargs)
6170

6271
self.fields['category'].choices = CHOICES
63-
category = self.initial.get('category', None)
72+
category = self.initial.get(
73+
'category',
74+
self.data.get('category', None)
75+
)
6476

6577
bootstrappify(self.fields)
6678

6779
if category:
68-
80+
6981
required_perms = get_required_by_category(category)
7082
optional_perms = get_optional_by_category(category)
7183
required_choices = assemble_optiongroups_for_widget(required_perms)
7284
optional_choices = assemble_optiongroups_for_widget(optional_perms)
7385

7486
initial = [perm.pk for perm in required_perms]
75-
7687
self.fields[f'optional_{category}_perms'] = MultipleChoiceField(label=_("Optional Permissions"), choices=optional_choices, widget=CheckboxSelectMultiple(), required=False)
7788
self.fields[f'required_{category}_perms'] = MultipleChoiceField(label=_("Required Permissions"), initial=initial, choices=required_choices, widget=CheckboxSelectMultiple(attrs={'readonly':True, 'disabled': True}), required=False)
7889

@@ -89,13 +100,42 @@ def save(self, commit=True):
89100
instance.permissions_clear()
90101
return instance
91102

103+
def clean_name(self):
104+
name = self.cleaned_data['name']
105+
name_exists = False
106+
107+
if self.instance: ## on update check if name change exists
108+
109+
if 'name' in self.changed_data:
110+
name_exists = PermafrostRole.objects.filter(
111+
112+
name=name,
113+
site__id=settings.SITE_ID,
114+
115+
).exclude(pk=self.instance.pk).first()
116+
117+
else:
118+
119+
try:
120+
name_exists = PermafrostRole.objects.get(
121+
name=name,
122+
site__id=settings.SITE_ID
123+
)
124+
except PermafrostRole.DoesNotExist:
125+
pass
126+
127+
if name_exists:
128+
raise ValidationError('Role with this name already exists')
129+
130+
# Always return field
131+
return name
132+
92133
class PermafrostRoleUpdateForm(PermafrostRoleCreateForm):
93134
"""
94135
Form used to display role detail
95136
Only allowed to edit optional permissions, name and description
96137
Category and required permissions stay locked
97138
"""
98-
category = ChoiceField(choices=CHOICES, required=False)
99139
deleted = BooleanField(required=False)
100140

101141
def __init__(self, *args, **kwargs):

permafrost/models.py

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,9 @@
1414

1515
from jsonfield import JSONField # Using this instead of the PSQL one for portability
1616

17+
import logging
18+
logger = logging.getLogger(__name__)
19+
1720

1821
###############
1922
# CHOICES
@@ -76,16 +79,28 @@
7679
def get_current_site(*args, **kwargs):
7780
return settings.SITE_ID
7881

82+
def get_permission_objects(natural_keys_list):
83+
permissions = []
84+
for item in natural_keys_list:
85+
try:
86+
permission = Permission.objects.get_by_natural_key(*item['permission'])
87+
permissions.append(permission)
88+
except:
89+
logger.warn(f'Permission not found in PERMAFROST_CATEGORIES: {item["permission"]}')
90+
pass
91+
92+
return permissions
93+
7994
def get_required_by_category(category):
8095
if 'required' in CATEGORIES[category]:
81-
return [Permission.objects.get_by_natural_key(*item['permission']) for item in CATEGORIES[category]['required']]
96+
return get_permission_objects(CATEGORIES[category]['required'])
8297
return []
8398

8499
def get_optional_by_category(category):
85100
if 'optional' in CATEGORIES[category]:
86-
return [Permission.objects.get_by_natural_key(*item['permission']) for item in CATEGORIES[category]['optional']]
101+
return get_permission_objects(CATEGORIES[category]['optional'])
87102
return []
88-
103+
89104
###############
90105
# MANAGERS
91106
###############

permafrost/templates/permafrost/permafrostrole_form.html

Lines changed: 21 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -5,26 +5,31 @@
55
{% block title %}{% if object %}{% trans 'Edit Role' %}{% else %}{% trans 'Create Role' %}{% endif %}{% endblock %}
66

77
{% block content %}
8+
<form method="POST" id="role_form">
89
<div class="d-sm-flex align-items-center justify-content-between mb-4">
9-
<h1 class="h3 mb-0 text-gray-800">
10-
{% if object %}
11-
{% trans 'Edit Permissions' %}: {{ form.initial.name }}
12-
{% else %}
13-
{% trans 'Create Role' %}
14-
{% endif %}
15-
</h1>
10+
<h2> {% trans 'Roles & Permissions' %}</h2>
11+
<a href="{% if object %}{{ object.get_absolute_url }}{% else %}{% url 'permafrost:roles-manage' %}{% endif %}" class="btn btn-success btn-outline ml-auto">{% trans 'Cancel' %}</a>
12+
<button type="submit" class="btn btn-success ml-1">
13+
{% if object %}
14+
{% trans 'Save' %}
15+
{% else %}
16+
{% trans 'Create' %}
17+
{% endif %}
18+
</button>
1619
</div>
17-
<form method="POST" id="role_form">
1820
{% csrf_token %}
1921
<div class="card">
22+
<div class="card-header py-3 d-flex flex-row align-items-center justify-content-between">
23+
<h6 class="m-0 text-primary font-weight-bold">
24+
{% if object %}
25+
{% trans 'Edit Permissions' %}: {{ form.initial.name }}
26+
{% else %}
27+
{% trans 'Create Role' %}
28+
{% endif %}
29+
</h6>
30+
</div>
2031
<div class="card-body">
21-
{% if form.subject.errors %}
22-
<ol role="alertdialog">
23-
{% for error in form.subject.errors %}
24-
<li role="alert"><strong>{{ error|escape }}</strong></li>
25-
{% endfor %}
26-
</ol>
27-
{% endif %}
32+
{{ form.non_field_errors }}
2833
{% for field in form %}
2934
<div class="fieldWrapper form-group" aria-required={% if field.field.required %}"true"{% else %}"false"{% endif %}>
3035
{{ field.label_tag }}{% if field.field.required %}<span class="required">*</span>{% endif %}
@@ -34,18 +39,11 @@ <h1 class="h3 mb-0 text-gray-800">
3439
{% if field.help_text %}
3540
<p class="help">{{ field.help_text|safe }}</p>
3641
{% endif %}
42+
{{ field.errors }}
3743
</div>
3844
{% endfor %}
3945
</div>
4046
<div class="card-footer">
41-
<a href="{% if object %}{{ object.get_absolute_url }}{% else %}{% url 'permafrost:roles-manage' %}{% endif %}" class="btn btn-primary">{% trans 'Cancel' %}</a>
42-
<button type="submit" class="btn btn-success">
43-
{% if object %}
44-
{% trans 'Save' %}
45-
{% else %}
46-
{% trans 'Create' %}
47-
{% endif %}
48-
</button>
4947
</div>
5048
</div>
5149
</form>

0 commit comments

Comments
 (0)