Skip to content

Commit

Permalink
Merge branch 'develop-4' into develop-4
Browse files Browse the repository at this point in the history
  • Loading branch information
fsbraun authored Sep 21, 2024
2 parents dc8f8bc + 2bbb328 commit 4ba3b40
Show file tree
Hide file tree
Showing 15 changed files with 233 additions and 85 deletions.
97 changes: 89 additions & 8 deletions djangocms_blog/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,20 +9,22 @@
from django.apps import apps
from django.conf import settings
from django.contrib import admin, messages
from django.contrib.admin.options import InlineModelAdmin, TO_FIELD_VAR
from django.contrib.admin import helpers
from django.contrib.admin.options import InlineModelAdmin, TO_FIELD_VAR, get_content_type_for_model, IS_POPUP_VAR
from django.contrib.admin.utils import unquote
from django.contrib.sites.models import Site
from django.core.exceptions import ObjectDoesNotExist
from django.db import models
from django.db.models import Prefetch, signals
from django.http import Http404, HttpResponseRedirect
from django.template.response import TemplateResponse
from django.urls import NoReverseMatch, path
from django.utils.translation import gettext_lazy as _, ngettext as __
from django.views.generic import RedirectView
from parler.admin import TranslatableAdmin

from .cms_config import BlogCMSConfig
from .forms import CategoryAdminForm
from .forms import AppConfigForm, CategoryAdminForm
from .models import BlogCategory, BlogConfig, Post, PostContent
from .settings import get_setting
from .utils import is_versioning_enabled
Expand Down Expand Up @@ -129,17 +131,19 @@ def _app_config_select(self, request, obj):
:return: False if no preselected value is available (more than one or no apphook
config is present), apphook config instance if exactly one apphook
config is defined or apphook config defined in the request or in the current
object, False otherwise
object, None otherwise
"""
if not obj and not request.GET.get("app_config", False):
if BlogConfig.objects.count() == 1:
return BlogConfig.objects.first()
if request.POST.get("app_config", False):
return BlogConfig.objects.get(pk=int(request.POST.get("app_config", False)))
return None
elif obj and getattr(obj, "app_config", False):
return getattr(obj, "app_config")
elif request.GET.get("app_config", False):
return BlogConfig.objects.get(pk=int(request.GET.get("app_config", False)))
return False
return BlogConfig.objects.get(pk=int(request.GET.get("app_config")))
return None

def _set_config_defaults(self, request, form, obj=None):
"""
Expand Down Expand Up @@ -167,7 +171,7 @@ def _set_config_defaults(self, request, form, obj=None):
def get_fieldsets(self, request, obj=None):
"""
If the apphook config must be selected first, returns a fieldset with just the
app config field and help text
app config field and help text
:param request:
:param obj:
:return:
Expand Down Expand Up @@ -212,14 +216,91 @@ def get_config_data(self, request, obj, name):
return_value = getattr(config, name)
return return_value

def get_form(self, request, obj=None, **kwargs):
def render_app_config_form(self, request, form):
"""
Provides a flexible way to get the right form according to the context
Render the app config form
"""
admin_form = helpers.AdminForm(
form,
form.fieldsets,
{},
model_admin=self,
)
app_label = self.opts.app_label
context = {
**self.admin_site.each_context(request),
"title": _("Add %s") % self.opts.verbose_name,
"adminform": admin_form,
"errors": helpers.AdminErrorList(form, []),
"media": self.media,
"show_save": True,
"show_save_and_add": False,
"show_save_and_add_another": False,
"show_save_and_continue": False,
"add": True,
"change": False,
"opts": self.opts,
"content_type_id": get_content_type_for_model(self.model).pk,
"save_as": self.save_as,
"save_on_top": self.save_on_top,
"to_field_var": TO_FIELD_VAR,
"is_popup_var": IS_POPUP_VAR,
"app_label": app_label,
"has_add_permission": self.has_add_permission(request),
"has_change_permission": self.has_change_permission(request),
"has_view_permission": self.has_view_permission(request),
"has_delete_permission": self.has_delete_permission(request),
"has_editable_inline_admin_formsets": False,
}

if self.add_form_template is not None:
form_template = self.add_form_template
else:
form_template = self.change_form_template
request.current_app = self.admin_site.name

return TemplateResponse(
request,
form_template
or [
"admin/%s/%s/change_form.html" % (app_label, self.opts.model_name),
"admin/%s/change_form.html" % app_label,
"admin/change_form.html",
],
context,
)

def changeform_view(self, request, object_id=None, form_url="", extra_context=None):
"""
Override the changeform_view to set the app_config field to the correct value
For the add view it checks whether the app_config is set; if not, a special form
to select the namespace is shown, which is reloaded after namespace selection.
If only one namespace exists, the current is selected and the normal form
is used.
"""
if object_id is None:
# Add new object
if request.method == "GET" or "app_config" in request.POST:
app_config_default = self._app_config_select(request, None)
if not app_config_default:
if request.method == "POST":
form = AppConfigForm(request.POST)
else:
form = AppConfigForm(initial={"app_config": None, "language": request.GET.get("language")})
return self.render_app_config_form(request, form)
elif "author" not in request.POST:
get = copy.copy(request.GET) # Make a copy to modify
get["app_config"] = app_config_default.pk
request.GET = get
request.method = "GET"

return super().changeform_view(request, object_id, form_url, extra_context)

def get_form_x(self, request, obj=None, **kwargs):
"""
Provides a flexible way to get the right form according to the context
"""
form = super().get_form(request, obj, **kwargs)
if "app_config" not in form.base_fields:
Expand Down
5 changes: 4 additions & 1 deletion djangocms_blog/cms_appconfig.py
Original file line number Diff line number Diff line change
Expand Up @@ -296,7 +296,10 @@ def schemaorg_type(self):
return self.gplus_type

def __str__(self):
return f"{self.namespace}: {self.get_app_title()} / {self.object_name}"
try:
return f"{self.namespace}: {self.get_app_title()} / {self.object_name}"
except Exception as e:
return str(e)


def get_app_instance(request):
Expand Down
10 changes: 5 additions & 5 deletions djangocms_blog/cms_menus.py
Original file line number Diff line number Diff line change
Expand Up @@ -175,8 +175,8 @@ def modify(self, request, nodes, namespace, root_id, post_cut, breadcrumb):
return nodes


menu_pool.register_modifier(BlogNavModifier)
menu_pool.register_menu(BlogCategoryMenu)
# menu_pool.register_modifier(BlogNavModifier)
# menu_pool.register_menu(BlogCategoryMenu)


def clear_menu_cache(**kwargs):
Expand All @@ -186,6 +186,6 @@ def clear_menu_cache(**kwargs):
menu_pool.clear(all=True)


post_save.connect(clear_menu_cache, sender=BlogCategory)
post_delete.connect(clear_menu_cache, sender=BlogCategory)
post_delete.connect(clear_menu_cache, sender=BlogConfig)
# post_save.connect(clear_menu_cache, sender=BlogCategory)
# post_delete.connect(clear_menu_cache, sender=BlogCategory)
# post_delete.connect(clear_menu_cache, sender=BlogConfig)
15 changes: 14 additions & 1 deletion djangocms_blog/forms.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
from django import forms
from django.conf import settings
from django.contrib.auth import get_user_model
from django.core.validators import MaxLengthValidator
from django.utils.functional import cached_property
from django.utils.translation import gettext_lazy as _

from parler.forms import TranslatableModelForm
from taggit_autosuggest.widgets import TagAutoSuggest

Expand Down Expand Up @@ -182,3 +183,15 @@ def __init__(self, *args, **kwargs):
self.initial["main_image_full"] = self.app_config.default_image_full
if not self.initial.get("main_image_thumbnail", ""):
self.initial["main_image_thumbnail"] = self.app_config.default_image_thumbnail


class AppConfigForm(forms.Form):
app_config = forms.ModelChoiceField(
queryset=BlogConfig.objects.all(),
label=_("App Config"),
required=True,
help_text=_("Select the app config to apply to the new post."),
)
language = forms.CharField(widget=forms.HiddenInput(), required=False)

fieldsets = [(None, {"fields": ("app_config", "language")})]
6 changes: 3 additions & 3 deletions djangocms_blog/migrations/0001_initial.py
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
import cms.models.fields
import django.utils.timezone
import djangocms_text_ckeditor.fields
import filer.fields.image
import meta.models
import taggit_autosuggest.managers
from django.conf import settings
from django.db import migrations, models
from filer.settings import FILER_IMAGE_MODEL

from djangocms_blog.models import HTMLField
from djangocms_blog.models import thumbnail_model

ACTUAL_FILER_IMAGE_MODEL = FILER_IMAGE_MODEL or "filer.Image"
Expand Down Expand Up @@ -243,7 +243,7 @@ class Migration(migrations.Migration):
),
("title", models.CharField(max_length=255, verbose_name="Title")),
("slug", models.SlugField(verbose_name="slug", blank=True)),
("abstract", djangocms_text_ckeditor.fields.HTMLField(verbose_name="Abstract")),
("abstract", HTMLField(verbose_name="Abstract")),
("meta_description", models.TextField(default="", verbose_name="Post meta description", blank=True)),
("meta_keywords", models.TextField(default="", verbose_name="Post meta keywords", blank=True)),
(
Expand All @@ -256,7 +256,7 @@ class Migration(migrations.Migration):
blank=True,
),
),
("post_text", djangocms_text_ckeditor.fields.HTMLField(default="", verbose_name="Text", blank=True)),
("post_text", HTMLField(default="", verbose_name="Text", blank=True)),
(
"master",
models.ForeignKey(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@

import django.db.models.deletion
import django.db.models.expressions
import djangocms_text_ckeditor.fields
import filer.fields.image
import meta.models
import parler.fields
Expand Down Expand Up @@ -642,7 +641,7 @@ class Migration(migrations.Migration):
),
(
"abstract",
djangocms_text_ckeditor.fields.HTMLField(blank=True, default="", verbose_name="abstract"),
djangocms_blog.models.HTMLField(blank=True, default="", verbose_name="abstract"),
),
],
options={
Expand Down Expand Up @@ -690,7 +689,7 @@ class Migration(migrations.Migration):
("subtitle", models.CharField(blank=True, default="", max_length=767, verbose_name="subtitle")),
(
"abstract",
djangocms_text_ckeditor.fields.HTMLField(blank=True, default="", verbose_name="abstract"),
djangocms_blog.models.HTMLField(blank=True, default="", verbose_name="abstract"),
),
("meta_description", models.TextField(blank=True, default="", verbose_name="post meta description")),
("meta_keywords", models.TextField(blank=True, default="", verbose_name="post meta keywords")),
Expand All @@ -704,7 +703,7 @@ class Migration(migrations.Migration):
verbose_name="post meta title",
),
),
("post_text", djangocms_text_ckeditor.fields.HTMLField(blank=True, default="", verbose_name="text")),
("post_text", djangocms_blog.models.HTMLField(blank=True, default="", verbose_name="text")),
("post", models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to="djangocms_blog.post")),
],
options={
Expand Down
5 changes: 3 additions & 2 deletions djangocms_blog/migrations/0006_auto_20150214_1907.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import djangocms_text_ckeditor.fields
from django.db import migrations

from djangocms_blog.models import HTMLField


class Migration(migrations.Migration):
dependencies = [
Expand All @@ -11,7 +12,7 @@ class Migration(migrations.Migration):
migrations.AlterField(
model_name="posttranslation",
name="abstract",
field=djangocms_text_ckeditor.fields.HTMLField(verbose_name="Abstract", blank=True, default=""),
field=HTMLField(verbose_name="Abstract", blank=True, default=""),
preserve_default=True,
),
]
7 changes: 3 additions & 4 deletions djangocms_blog/migrations/0007_auto_20150719_0933.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,11 @@
import django.db.models.deletion
import django.utils.timezone
import djangocms_text_ckeditor.fields
import filer.fields.image
from django.conf import settings
from django.db import migrations, models
from filer.settings import FILER_IMAGE_MODEL

from djangocms_blog.models import thumbnail_model
from djangocms_blog.models import HTMLField, thumbnail_model

ACTUAL_FILER_IMAGE_MODEL = FILER_IMAGE_MODEL or "filer.Image"

Expand Down Expand Up @@ -168,7 +167,7 @@ class Migration(migrations.Migration):
migrations.AlterField(
model_name="posttranslation",
name="abstract",
field=djangocms_text_ckeditor.fields.HTMLField(verbose_name="abstract"),
field=HTMLField(verbose_name="abstract"),
preserve_default=True,
),
migrations.AlterField(
Expand Down Expand Up @@ -204,7 +203,7 @@ class Migration(migrations.Migration):
migrations.AlterField(
model_name="posttranslation",
name="post_text",
field=djangocms_text_ckeditor.fields.HTMLField(blank=True, verbose_name="text", default=""),
field=HTMLField(blank=True, verbose_name="text", default=""),
preserve_default=True,
),
migrations.AlterField(
Expand Down
4 changes: 2 additions & 2 deletions djangocms_blog/migrations/0008_auto_20150814_0831.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import djangocms_text_ckeditor.fields
from django.db import migrations

import djangocms_blog.models

class Migration(migrations.Migration):
dependencies = [
Expand All @@ -11,7 +11,7 @@ class Migration(migrations.Migration):
migrations.AlterField(
model_name="posttranslation",
name="abstract",
field=djangocms_text_ckeditor.fields.HTMLField(default=b"", verbose_name="abstract", blank=True),
field=djangocms_blog.models.HTMLField(default=b"", verbose_name="abstract", blank=True),
preserve_default=True,
),
]
5 changes: 3 additions & 2 deletions djangocms_blog/migrations/0040_auto_20211128_1503.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
# Generated by Django 3.0.14 on 2021-11-28 14:03

import django.db.models.deletion
import djangocms_text_ckeditor.fields
import filer.fields.image
from django.conf import settings
from django.db import migrations, models

import djangocms_blog.models


class Migration(migrations.Migration):
dependencies = [
Expand Down Expand Up @@ -57,7 +58,7 @@ class Migration(migrations.Migration):
migrations.AddField(
model_name="blogcategorytranslation",
name="abstract",
field=djangocms_text_ckeditor.fields.HTMLField(blank=True, default="", verbose_name="abstract"),
field=djangocms_blog.models.HTMLField(blank=True, default="", verbose_name="abstract"),
),
migrations.AddField(
model_name="post",
Expand Down
5 changes: 2 additions & 3 deletions djangocms_blog/migrations/0043_postcontent.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
# Generated by Django 3.2 on 2023-02-03 12:15

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

import djangocms_blog.models
Expand Down Expand Up @@ -58,7 +57,7 @@ class Migration(migrations.Migration):
("subtitle", models.CharField(blank=True, default="", max_length=767, verbose_name="subtitle")),
(
"abstract",
djangocms_text_ckeditor.fields.HTMLField(blank=True, default="", verbose_name="abstract"),
djangocms_blog.models.HTMLField(blank=True, default="", verbose_name="abstract"),
),
("meta_description", models.TextField(blank=True, default="", verbose_name="post meta description")),
("meta_keywords", models.TextField(blank=True, default="", verbose_name="post meta keywords")),
Expand All @@ -72,7 +71,7 @@ class Migration(migrations.Migration):
verbose_name="post meta title",
),
),
("post_text", djangocms_text_ckeditor.fields.HTMLField(blank=True, default="", verbose_name="text")),
("post_text", djangocms_blog.models.HTMLField(blank=True, default="", verbose_name="text")),
("post", models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to="djangocms_blog.post")),
],
bases=(djangocms_blog.models.BlogMetaMixin, models.Model),
Expand Down
Loading

0 comments on commit 4ba3b40

Please sign in to comment.