Skip to content

Instantly share code, notes, and snippets.

@hirokiky
Created March 22, 2015 07:35
Show Gist options
  • Save hirokiky/956864167029a7d65dca to your computer and use it in GitHub Desktop.
Save hirokiky/956864167029a7d65dca to your computer and use it in GitHub Desktop.
weiwei's widget
class WidgetForm(object):
def is_valid(self):
pass
def __str__(self):
widget_forms = {
widget_code: modelformset_factory(widget_class)
for widget_code, widget_class in widgets.widgets.items()
}
default_widgets = [widget_forms[name] for name in widgets.default_widgets]
# TODO: Add default widgets, TOC, Text.
return render_to_string(
"weiwei/forms/widget_form.html",
{"widgets": widgets.widgets,
"widget_forms": widget_forms,
"default_widgets": default_widgets}
)
@property
def media(self):
return forms.Media(js=[static('weiwei/js/widget_form.js')])
class Widget(models.Model):
page = models.ForeignKey(Page)
order = models.IntegerField("order of widgets")
creation_date = models.DateTimeField(auto_now_add=True)
changed_date = models.DateTimeField(auto_now=True)
class Meta:
abstract = True
@classmethod
def verbose_name(cls):
return cls._meta.verbose_name.title()
class PageTreeWidget(Widget):
""" Child Pages Widget.
"""
class TextWidget(Widget):
""" Text Widget.
"""
var add_deleting_for_widegt = function(node){
/**
* Function to add event listener to delete corresponding widget.
*/
node.addEventListener("click", function(event) {
event.target.parentElement.remove();
});
};
/**
* Bind deletion for default widgets
*/
Array.prototype.forEach.call(document.getElementsByClassName("weiwei-widget-delete"), function(node) {
add_deleting_for_widegt(node);
});
/**
* Creation button for new widgets
*/
Array.prototype.forEach.call(document.getElementsByClassName("weiwei-widget-add"), function(node) {
node.addEventListener("click", function(event) {
var parent = event.target.parentElement;
var select_element = parent.getElementsByClassName("weiwei-widget-select")[0];
var selected_widget_name = select_element.options[select_element.selectedIndex].value;
var originals_element = parent.getElementsByClassName("weiwei-widget-originals")[0];
var form_element = originals_element.getElementsByClassName(selected_widget_name)[0];
var copied_form_element = form_element.cloneNode(true);
// Add deletion for this widget.
var del_element = copied_form_element.getElementsByClassName("weiwei-widget-delete")[0];
add_deleting_for_widegt(del_element);
var forms_element = parent.getElementsByClassName("weiwei-widget-forms")[0];
forms_element.appendChild(copied_form_element);
});
});
from weiwei import models
widgets = {
"page_tree_widget": models.PageTreeWidget,
"text_widget": models.TextWidget,
}
default_widgets = ["page_tree_widget", "text_widget"]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment