Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
66 commits
Select commit Hold shift + click to select a range
990bc73
fix admin:cascade_texteditor_config
haricot Jun 16, 2019
ae3e605
setting clipboards timestamp
haricot Jun 17, 2019
2a477bd
add_link_item anchor cms-show-clips-lib
haricot Jun 17, 2019
4140149
add static admin js
haricot Jun 17, 2019
d882348
WIP clipsboard library
haricot Jun 21, 2019
59af7cb
Remove duplicate import instrides
haricot Jun 29, 2019
937b520
Add templates folder library_clips
haricot Jun 29, 2019
49d2598
Merge branch 'drafts/refactor-entangled' into drafts/refactor-entangled
haricot Jun 30, 2019
c034398
refactor clipboard library
haricot Jul 1, 2019
7ba439f
add missing files clipboard library
haricot Jul 1, 2019
ee59a4e
clean code
haricot Jul 1, 2019
a3cd2dc
clean code
haricot Jul 1, 2019
2035afb
rearrange files location, cleaned code
haricot Jul 1, 2019
16ce3bd
add req base.txt djangocms-transfer
haricot Jul 1, 2019
0172bc9
Update cms_toolbars
haricot Jul 1, 2019
f2dc0f3
update title clipboard library
haricot Jul 1, 2019
acc1bc3
update views.py import
haricot Jul 1, 2019
35e3d51
optimize, cleaned code
haricot Jul 1, 2019
a3f228b
Up req/base.txt jsonfield2 for django2
haricot Jul 1, 2019
e44198d
fix missing charctere }
haricot Jul 1, 2019
5618ab2
up req setup.py jsonfield2
haricot Jul 1, 2019
ba852ef
refactor and clean code
haricot Jul 3, 2019
a1f0cca
clean code app_settings.py
haricot Jul 3, 2019
96a34d3
Merge branch 'releases/1.0.x' into clipboard_library
haricot Jul 24, 2019
11b0373
Update strides.py
haricot Jul 24, 2019
23bcd6f
Update strides.py
haricot Jul 24, 2019
165f0fb
Merge branch 'releases/1.0.x' into clipboard_library
haricot Jul 25, 2019
2df3154
Delete mixins.py
haricot Oct 14, 2019
77de929
Delete README.md
haricot Oct 14, 2019
4a263b1
Create README.md
haricot Oct 14, 2019
8e972d2
Update README.md
haricot Oct 14, 2019
10ebdde
Merge pull request #15 from jrief/master
haricot Oct 14, 2019
99b6fdc
Create pyproject.toml
haricot Oct 14, 2019
46d3de5
Update pyproject.toml
haricot Oct 14, 2019
11c8b4c
add "a-color-picker": "^1.2.1"
haricot Oct 14, 2019
031380d
Update pyproject.toml
haricot Oct 14, 2019
1321f7b
refixed stride cosmic ray #338
haricot Oct 14, 2019
0590f74
add fallback Tag svg with three plugin_type color
haricot Oct 16, 2019
5961ac9
Add files via upload
haricot Oct 16, 2019
2f56374
add div for fallback templatetags logic ui
haricot Oct 16, 2019
34c7531
Update image.html
haricot Oct 16, 2019
ac73c81
Update cascade_tags.py
haricot Oct 16, 2019
e529309
fixed KeyError: 'image_size'
haricot Oct 16, 2019
960b086
logic for picture and jumbotron
haricot Oct 16, 2019
8aa24d9
Update picture.html
haricot Oct 16, 2019
3746604
add fallback jumbotron logic
haricot Oct 16, 2019
e612a32
add fallback jumbotron logic
haricot Oct 16, 2019
f69b453
add icons fallback (type image/picture/jumbortron)
haricot Oct 16, 2019
fa4837c
Update cascade_tags.py
haricot Oct 16, 2019
a0f612d
Update cascade_tags.py
haricot Oct 16, 2019
2f3956b
Update cascade_tags.py
haricot Oct 16, 2019
24d52f5
Delete utils_backport_cms34.py
haricot Oct 16, 2019
de4d381
Update cascade_tags.py
haricot Oct 16, 2019
4ee7256
Update cascade_tags.py
haricot Oct 17, 2019
bb8043f
Update cascade_tags.py
haricot Oct 17, 2019
5800211
Update cascade_tags.py
haricot Oct 17, 2019
7eab3da
Update cascade_tags.py
haricot Oct 17, 2019
08cc001
Update cascade_tags.py
haricot Oct 17, 2019
cc6f87f
Update cascade_tags.py
haricot Oct 17, 2019
b902922
Update cascade_tags.py
haricot Oct 17, 2019
ba172dc
Update placeholder_json_cms_cascade.json
haricot Oct 17, 2019
d2feb7c
fixed multiple cascade_clips folder
haricot Oct 19, 2019
3eee025
clean code
haricot Oct 21, 2019
771fa37
Update clipboards_library.js
haricot Oct 21, 2019
351da05
Merge branch 'master' into clipboard_library
haricot Nov 4, 2019
56de3a3
Merge branch 'master' into clipboard_library
haricot Jan 13, 2020
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
23 changes: 22 additions & 1 deletion cmsplugin_cascade/app_settings.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@

class AppSettings(object):

def _setting(self, name, default=None):
Expand Down Expand Up @@ -163,6 +162,28 @@ def RESPONSIVE_IMAGE_STEP_SIZE(self):
"""
return 50

@property
def CASCADE_CLIPBOARD_LIBRARY(self):
if self._setting('CASCADE_CLIPS_LIBRARY'):
import os
import pathlib
from django.contrib.staticfiles import finders
relative_path_clipboard_Libary='cascade/admin/library_clips/'
path = finders.find(relative_path_clipboard_Libary)
data={}
if path:
list_folders_top=next(os.walk(path))[1]
for n, i in enumerate(list_folders_top, 1):
clips_=[]
list_subfolder_path=os.path.join(path, i)
files_path=list(pathlib.Path(list_subfolder_path).glob('**/*.json'))
for p in files_path:
timestamp=int(os.path.getctime(list_subfolder_path))
clips_.append( str(pathlib.Path(relative_path_clipboard_Libary).joinpath(p.relative_to(path))))
data.update({ str(n):{'folder_name':i ,'list_json_files': clips_, 'timestamp' : timestamp }})
return self._setting('CASCADE_CLIPBOARD_LIBRARY', (data, ))


import sys # noqa
app_settings = AppSettings()
app_settings.__name__ = __name__
Expand Down
1 change: 0 additions & 1 deletion cmsplugin_cascade/apps.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@ def ready(self):
if stylesSet != 'default:{}'.format(reverse('admin:cascade_texteditor_config')):
msg = "settings.CKEDITOR_SETTINGS['stylesSet'] should be `format_lazy('default:{}', reverse_lazy('admin:cascade_texteditor_config'))`"
raise ImproperlyConfigured(msg)

pre_migrate.connect(self.__class__.pre_migrate, sender=self)
post_migrate.connect(self.__class__.post_migrate, sender=self)

Expand Down
1 change: 1 addition & 0 deletions cmsplugin_cascade/bootstrap4/buttons.py
Original file line number Diff line number Diff line change
Expand Up @@ -180,4 +180,5 @@ def render(self, context, instance, placeholder):
context = self.super(BootstrapButtonPlugin, self).render(context, instance, placeholder)
return context


plugin_pool.register_plugin(BootstrapButtonPlugin)
63 changes: 3 additions & 60 deletions cmsplugin_cascade/clipboard/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,17 +6,15 @@
from django.utils.html import format_html
from django.utils.translation import ugettext_lazy as _

from cms.api import add_plugin
from cms.models.placeholderpluginmodel import PlaceholderReference
from cms.plugin_pool import plugin_pool
from cms.utils import get_language_from_request

from jsonfield.fields import JSONField
from djangocms_text_ckeditor.models import Text
from djangocms_text_ckeditor.utils import plugin_tags_to_id_list, replace_plugin_tags

from cmsplugin_cascade.models import CascadeElement, CascadeClipboard

from cmsplugin_cascade.models import CascadeClipboard
from cmsplugin_cascade.clipboard.library.utils import deserialize_to_clipboard

class JSONAdminWidget(widgets.Textarea):
def __init__(self):
Expand Down Expand Up @@ -76,7 +74,7 @@ def save_model(self, request, obj, form, change):
messages.add_message(request, messages.INFO, _("Persisted content has been restored to CMS clipboard."))
super().save_model(request, obj, form, change)
if request.POST.get('restore_clipboard'):
self._deserialize_to_clipboard(request, obj.data)
deserialize_to_clipboard(request, obj.data)


def _serialize_from_clipboard(self, language):
Expand Down Expand Up @@ -104,58 +102,3 @@ def populate_data(parent, data):
plugin_qs = clipboard.cmsplugin_set.all()
populate_data(None, data['plugins'])
return data

def _deserialize_to_clipboard(self, request, data):
"""
Restore clipboard by creating plugins from given data.
"""
def plugins_from_data(placeholder, parent, data):
for plugin_type, data, children_data in data:
try:
plugin_class = plugin_pool.get_plugin(plugin_type)
except Exception:
messages.add_message(request, messages.ERROR, "Unable create plugin of type: {}".format(plugin_type))
continue
kwargs = dict(data)
inlines = kwargs.pop('inlines', [])
shared_glossary = kwargs.pop('shared_glossary', None)
try:
instance = add_plugin(placeholder, plugin_class, language, target=parent, **kwargs)
except Exception:
messages.add_message(request, messages.ERROR, "Unable to create structure for plugin: {}".format(plugin_class.name))
continue
if isinstance(instance, CascadeElement):
instance.plugin_class.add_inline_elements(instance, inlines)
instance.plugin_class.add_shared_reference(instance, shared_glossary)

# for some unknown reasons add_plugin sets instance.numchild to 0,
# but fixing and save()-ing 'instance' executes some filters in an unwanted manner
plugins_from_data(placeholder, instance, children_data)

if isinstance(instance, Text):
# we must convert the old plugin IDs into the new ones,
# otherwise links are not displayed
id_dict = dict(zip(
plugin_tags_to_id_list(instance.body),
(t[0] for t in instance.get_children().values_list('id'))
))
instance.body = replace_plugin_tags(instance.body, id_dict)
instance.save()

language = get_language_from_request(request)

clipboard = request.toolbar.clipboard
ref_plugin = clipboard.cmsplugin_set.first()
if ref_plugin is None:
# the clipboard is empty
root_plugin = add_plugin(clipboard, 'PlaceholderPlugin', language, name='clipboard')
else:
# remove old entries from the clipboard
try:
root_plugin = ref_plugin.cms_placeholderreference
except PlaceholderReference.DoesNotExist:
root_plugin = add_plugin(clipboard, 'PlaceholderPlugin', language, name='clipboard')
else:
inst = ref_plugin.get_plugin_instance()[0]
inst.placeholder_ref.get_plugins().delete()
plugins_from_data(root_plugin.placeholder_ref, None, data['plugins'])
18 changes: 18 additions & 0 deletions cmsplugin_cascade/clipboard/library/urls.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
from cmsplugin_cascade.clipboard.library import views
from django.conf.urls import url
from django.conf import settings


if getattr(settings, 'CASCADE_CLIPS_LIBRARY', None):
extra_cascade_patterns = [url(r'cascade_copytoclipboard/$',
views.CascadeCopyToClipboard.as_view(),
name='cascade_copytoclipboard'),
url(r'cascade_clips/(\d+)/$',
views.CascadeLibClips,
name='cascade_clips'),
url(r'cascade_clips_folder/(\d+)/$',
views.CascadeLibClipsFolder,
name='cascade_clips_folder'),
]
else:
extra_cascade_patterns = []
97 changes: 97 additions & 0 deletions cmsplugin_cascade/clipboard/library/utils.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
from cms.api import add_plugin
from cms.utils import get_language_from_request
from cms.models.placeholderpluginmodel import PlaceholderReference
from cms.plugin_pool import plugin_pool
from djangocms_transfer.datastructures import ArchivedPlugin
#from djangocms_transfer.forms import _get_parsed_data
from djangocms_text_ckeditor.models import Text
from cmsplugin_cascade.models import CascadeElement
from djangocms_text_ckeditor.utils import plugin_tags_to_id_list, replace_plugin_tags
from django.contrib import messages

def _object_version_data_hook_cascade(data, for_page=False):
if not data:
return data
if 'plugin_type' in data:
return ArchivedPlugin(**data)
return data


def _get_parsed_data_cascade(file_obj, for_page=False):
import io
import json

with io.open(file_obj, encoding='utf-8-sig') as json_data:
raw = json_data
json_to_dict = json.load(raw, object_hook=_object_version_data_hook_cascade)
return json_to_dict


def deserialize_to_clipboard(request, data):
"""
Restore clipboard by creating plugins from given data.
"""

def plugins_from_data(placeholder, parent, data):
#language = 'en'
for plugin_type, data, children_data in data:
try:
plugin_class = plugin_pool.get_plugin(plugin_type)
except Exception:
messages.add_message(request, messages.ERROR, "Unable create plugin of type: {}".format(plugin_type))
continue
kwargs = dict(data)
inlines = kwargs.pop('inlines', [])
shared_glossary = kwargs.pop('shared_glossary', None)
try:
instance = add_plugin(placeholder, plugin_class, language, target=parent, **kwargs)
except Exception:
messages.add_message(request, messages.ERROR, "Unable to create structure for plugin: {}".format(plugin_class.name))
continue
if isinstance(instance, CascadeElement):
instance.plugin_class.add_inline_elements(instance, inlines)
instance.plugin_class.add_shared_reference(instance, shared_glossary)

plugins_from_data(placeholder, instance, children_data)

if isinstance(instance, Text):
# we must convert the old plugin IDs into the new ones,
# otherwise links are not displayed
id_dict = dict(zip(
plugin_tags_to_id_list(instance.body),
(t[0] for t in instance.get_children().values_list('id'))
))
instance.body = replace_plugin_tags(instance.body, id_dict)
instance.save()

language = get_language_from_request(request)

if hasattr(request, 'toolbar'):
clipboard = request.toolbar.clipboard
try:
clipboard.cmsplugin_set.first().delete()
except BaseException:
pass

ref_plugin = clipboard.cmsplugin_set.first()

if ref_plugin is None:
# the clipboard is empty
root_plugin = add_plugin(
clipboard,
'PlaceholderPlugin',
language,
name='clipboard')
else:
# remove old entries from the clipboard
try:
root_plugin = ref_plugin.cms_placeholderreference
except PlaceholderReference.DoesNotExist:
root_plugin = add_plugin(
clipboard, 'PlaceholderPlugin', language, name='clipboard')
else:
inst = ref_plugin.get_plugin_instance()[0]
inst.placeholder_ref.get_plugins().delete()
if 'plugins' in data:
data = data['plugins']
plugins_from_data(root_plugin.placeholder_ref, None, data)
109 changes: 109 additions & 0 deletions cmsplugin_cascade/clipboard/library/views.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
import json
from cms.utils import get_language_from_request
from django.http import JsonResponse, HttpResponse
from django.conf import settings
from django.contrib.staticfiles import finders
from django.views import View
from djangocms_transfer.importer import import_plugins
from django.shortcuts import render
from cmsplugin_cascade import app_settings
from cms.models import Placeholder
from cmsplugin_cascade.cms_toolbars import CascadeToolbar
from cmsplugin_cascade.clipboard.library.utils import deserialize_to_clipboard, _get_parsed_data_cascade
from django.contrib.auth.decorators import login_required
from cms.models import CMSPlugin

try:
from cms.toolbar.utils import get_plugin_tree_as_json
except BaseException:
from cmsplugin_cascade.clipslib.utils_backport_cms34 import get_plugin_tree_as_json

if getattr(settings, 'CASCADE_CLIPS_LIBRARY', None):
class CascadeCopyToClipboard(View):
template_name = "cascade/admin/library_clips/clipboard_cascade.html"

def post(self, request, *args, **kwargs):
for k, v in enumerate(app_settings.CASCADE_CLIPBOARD_LIBRARY):
for g, r in v.items():
if request._post.get('paramater'):
relative_path_clipboard = request._post.get(
'paramater')
path = finders.find(relative_path_clipboard)
data = _get_parsed_data_cascade(path)
language = get_language_from_request(request)
if 'plugins' in data:
if 'plugins' == next(iter(data)):
deserialize_to_clipboard(request, data)

# Placeholder plugins import
placeholder = request.toolbar.clipboard
tree_order = placeholder.get_plugin_tree_order(
language, parent_id=request.toolbar.clipboard.pk)
plugins = request.toolbar.clipboard.get_plugins_list()
else:
language = get_language_from_request(request)

if hasattr(request, 'toolbar'):
clipboard = request.toolbar.clipboard
try:
clipboard.cmsplugin_set.first().delete()
except BaseException:
pass

import_plugins(
plugins=data,
placeholder=Placeholder.objects.all()[0],
language=language,
root_plugin_id=None
)
tree_order = Placeholder.objects.all()[0].get_plugin_tree_order(language, parent_id=None)
root_plug=CMSPlugin.objects.get(pk=tree_order[0])

plugins = [root_plug]

placeholder = request.toolbar.clipboard
tree_order = placeholder.get_plugin_tree_order(
language, parent_id=request.toolbar.clipboard.pk)

data_plug = json.loads(
get_plugin_tree_as_json(
request,
plugins))

data = {
"target_placeholder_id" : placeholder.pk,
"plugin_id": request.toolbar.clipboard.cmsplugin_set.first().pk,
"placeholder_id": request.toolbar.clipboard.pk,
"type": "plugin",
"plugin_order": ['__COPY__'],
"plugin_type": "PlaceholderPlugin",
"plugin_parent": "None",
"move_a_copy": True,
"html": data_plug['html'],
"data": data_plug}
return JsonResponse(data)

@login_required
def CascadeLibClipsFolder(request, pk=None):
context = {'folder_id': str(pk)}
context.update(
{'clips': app_settings.CASCADE_CLIPBOARD_LIBRARY[0],
'csrf': request.toolbar.csrf_token()})
return HttpResponse(
render(
request,
"cascade/admin/library_clips/folder_clips.html",
context))

@login_required
def CascadeLibClips(request, pk=None,):
if not pk:
pk = 1
context = {'folder_id': str(pk), 'folder_name': app_settings.CASCADE_CLIPBOARD_LIBRARY[0][str(
pk)]['folder_name'], 'title_clips': CascadeToolbar.clips_title}
context.update({'clips': app_settings.CASCADE_CLIPBOARD_LIBRARY[0]})
return HttpResponse(
render(
request,
"cascade/admin/library_clips/library_clips.html",
context))
1 change: 1 addition & 0 deletions cmsplugin_cascade/cms_plugins.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,3 +23,4 @@
except ImportError:
# otherwise just use the named module as plugin
import_module('{}'.format(module))

Loading