Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feat/optional group #4

Open
wants to merge 4 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 10 additions & 6 deletions djangocms_conditional/cms_plugins.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,17 @@
from cms.plugin_base import CMSPluginBase
from cms.plugin_pool import plugin_pool
from django.contrib.auth.models import User, AnonymousUser
from django.utils.translation import ugettext_lazy as _
from django.utils.translation import gettext_lazy as _

from .models import ConditionalPluginModel, MODE_IN_GROUP, MODE_NOT_IN_GROUP, MODE_NOT_IN_GROUP_PLUS_ANON, \
MODE_ANONYMOUS
from .forms import ConditionalPluginForm


class ConditionalContainerPlugin(CMSPluginBase):
name = _(u'Conditional content')
name = _('Conditional content')
model = ConditionalPluginModel
form = ConditionalPluginForm
allow_children = True
cache = False
render_template = 'djangocms_conditional/conditional.html'
Expand All @@ -27,17 +29,19 @@ def render(self, context, instance, placeholder):
user = AnonymousUser() # Should never happen

# This could be coded more efficiently, but is this way for clarity
if instance.mode == MODE_IN_GROUP:
if user.is_superuser:
context['instance'] = instance
elif instance.mode == MODE_IN_GROUP:
if user.groups.filter(id=instance.permitted_group.id).exists():
context['instance'] = instance
elif instance.mode == MODE_NOT_IN_GROUP:
if not (user.is_anonymous() or user.groups.filter(id=instance.permitted_group.id).exists()):
if not (user.is_anonymous or user.groups.filter(id=instance.permitted_group.id).exists()):
context['instance'] = instance
elif instance.mode == MODE_ANONYMOUS:
if user.is_anonymous():
if user.is_anonymous:
context['instance'] = instance
elif instance.mode == MODE_NOT_IN_GROUP_PLUS_ANON:
if user.is_anonymous() or not user.groups.filter(id=instance.permitted_group.id).exists():
if user.is_anonymous or not user.groups.filter(id=instance.permitted_group.id).exists():
context['instance'] = instance

return context
Expand Down
20 changes: 20 additions & 0 deletions djangocms_conditional/forms.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
from django import forms
from django.utils.translation import gettext as _
from .models import MODE_IN_GROUP, MODE_NOT_IN_GROUP, MODE_NOT_IN_GROUP_PLUS_ANON


class ConditionalPluginForm(forms.ModelForm):
fields = "__all__"

def clean(self):
cleaned_data = super().clean()
permitted_group = cleaned_data.get("permitted_group")
mode = cleaned_data.get("mode")
modes_that_require_group = [
MODE_IN_GROUP,
MODE_NOT_IN_GROUP,
MODE_NOT_IN_GROUP_PLUS_ANON
]

if mode in modes_that_require_group and permitted_group is None:
self.add_error("permitted_group", _("You must choose a group when using this mode."))
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
# Generated by Django 4.2.11 on 2024-04-23 14:49

from django.db import migrations, models
import django.db.models.deletion


class Migration(migrations.Migration):
dependencies = [
("auth", "0012_alter_user_first_name_max_length"),
("cms", "0022_auto_20180620_1551"),
("djangocms_conditional", "0002_conditionalpluginmodel_mode"),
]

operations = [
migrations.AlterField(
model_name="conditionalpluginmodel",
name="cmsplugin_ptr",
field=models.OneToOneField(
auto_created=True,
on_delete=django.db.models.deletion.CASCADE,
parent_link=True,
primary_key=True,
related_name="%(app_label)s_%(class)s",
serialize=False,
to="cms.cmsplugin",
),
),
migrations.AlterField(
model_name="conditionalpluginmodel",
name="mode",
field=models.CharField(
choices=[
("in_group", "Users in group"),
("not_in_group", "Users not in group"),
(
"not_in_group_plus_anon",
"Anonymous users and users not in group",
),
("anonymous", "Anonymous users"),
],
default="in_group",
help_text="Conditional access type",
max_length=40,
),
),
migrations.AlterField(
model_name="conditionalpluginmodel",
name="permitted_group",
field=models.ForeignKey(
null=True, blank=True, on_delete=django.db.models.deletion.SET_NULL, to="auth.group"
),
),
]
23 changes: 12 additions & 11 deletions djangocms_conditional/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,7 @@
from cms.models import CMSPlugin
from django.contrib.auth.models import Group
from django.db import models
from django.utils.encoding import python_2_unicode_compatible
from django.utils.translation import ugettext_lazy as _
from django.utils.translation import gettext_lazy as _


MODE_IN_GROUP = 'in_group'
Expand All @@ -12,21 +11,23 @@
MODE_ANONYMOUS = 'anonymous'


@python_2_unicode_compatible
class ConditionalPluginModel(CMSPlugin):

permitted_group = models.ForeignKey(Group, null=False, blank=False)
permitted_group = models.ForeignKey(Group, null=True, blank=True, on_delete=models.SET_NULL)
mode = models.CharField(max_length=40,
default='in_group',
help_text=_(u"Conditional access type"),
choices=((MODE_IN_GROUP, _(u'Users in group')),
(MODE_NOT_IN_GROUP, _(u'Users not in group')),
help_text=_("Conditional access type"),
choices=((MODE_IN_GROUP, _('Users in group')),
(MODE_NOT_IN_GROUP, _('Users not in group')),
(MODE_NOT_IN_GROUP_PLUS_ANON, _('Anonymous users and users not in group')),
(MODE_ANONYMOUS, _('Anonymous users')),
))

def __str__(self):
return _(u'Conditional access %s group="%s"') % (
self.mode,
self.permitted_group.name,
)
if self.permitted_group is not None:
return _('%s: %s') % (
self.get_mode_display(),
self.permitted_group.name,
)
else:
return self.get_mode_display()
16 changes: 8 additions & 8 deletions docs/conf.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,8 +46,8 @@
master_doc = 'index'

# General information about the project.
project = u'djangocms-conditional'
copyright = u'2017, Roy Hooper'
project = 'djangocms-conditional'
copyright = '2017, Roy Hooper'

# The version info for the project you're documenting, acts as replacement for
# |version| and |release|, also used in various other places throughout the
Expand Down Expand Up @@ -192,8 +192,8 @@
# Grouping the document tree into LaTeX files. List of tuples
# (source start file, target name, title, author, documentclass [howto/manual]).
latex_documents = [
('index', 'djangocms-conditional.tex', u'djangocms-conditional Documentation',
u'Iacopo Spalletti', 'manual'),
('index', 'djangocms-conditional.tex', 'djangocms-conditional Documentation',
'Iacopo Spalletti', 'manual'),
]

# The name of an image file (relative to this directory) to place at the top of
Expand Down Expand Up @@ -222,8 +222,8 @@
# One entry per manual page. List of tuples
# (source start file, name, description, authors, manual section).
man_pages = [
('index', 'djangocms-conditional', u'djangocms-conditional Documentation',
[u'Iacopo Spalletti'], 1)
('index', 'djangocms-conditional', 'djangocms-conditional Documentation',
['Iacopo Spalletti'], 1)
]

# If true, show URL addresses after external links.
Expand All @@ -236,8 +236,8 @@
# (source start file, target name, title, author,
# dir menu entry, description, category)
texinfo_documents = [
('index', 'djangocms-conditional', u'djangocms-conditional Documentation',
u'Iacopo Spalletti', 'djangocms-conditional', 'One line description of project.',
('index', 'djangocms-conditional', 'djangocms-conditional Documentation',
'Iacopo Spalletti', 'djangocms-conditional', 'One line description of project.',
'Miscellaneous'),
]

Expand Down
6 changes: 3 additions & 3 deletions tests/test_models.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,14 +24,14 @@ def setup_plugin(self, group, mode='in_group'):
parent_plugin = add_plugin(
placeholder,
ConditionalContainerPlugin,
u'en',
'en',
permitted_group=group,
mode=mode
)
parent_plugin.save()

text_content = u"Child plugin"
text_plugin = add_plugin(placeholder, u"TextPlugin", u"en", body=text_content, target=parent_plugin,)
text_content = "Child plugin"
text_plugin = add_plugin(placeholder, "TextPlugin", "en", body=text_content, target=parent_plugin,)
text_plugin.save()

parent_plugin.child_plugin_instances = [text_plugin]
Expand Down