forked from rc/aircox
		
	work on player: integrate vuejs + noscript; remove TemplateMixin for Component and ExposedData; rewrite most of the player; clean up files; do lot of other things
This commit is contained in:
		
							
								
								
									
										0
									
								
								aircox_cms/views/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								aircox_cms/views/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
								
								
									
										111
									
								
								aircox_cms/views/components.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										111
									
								
								aircox_cms/views/components.py
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,111 @@
 | 
			
		||||
import json
 | 
			
		||||
 | 
			
		||||
from django.db import models
 | 
			
		||||
from django.template.loader import render_to_string
 | 
			
		||||
from django.utils.safestring import mark_safe
 | 
			
		||||
 | 
			
		||||
from wagtail.wagtailcore.utils import camelcase_to_underscore
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class Component:
 | 
			
		||||
    """
 | 
			
		||||
    A Component is a small part of a rendered web page. It can be used
 | 
			
		||||
    to create elements configurable by users.
 | 
			
		||||
    """
 | 
			
		||||
    template_name = ""
 | 
			
		||||
    """
 | 
			
		||||
    [class] Template file path
 | 
			
		||||
    """
 | 
			
		||||
    hide = False
 | 
			
		||||
    """
 | 
			
		||||
    The component can be hidden because there is no reason to display it
 | 
			
		||||
    (e.g. empty list)
 | 
			
		||||
    """
 | 
			
		||||
 | 
			
		||||
    @classmethod
 | 
			
		||||
    def snake_name(cl):
 | 
			
		||||
        if not hasattr(cl, '_snake_name'):
 | 
			
		||||
            cl._snake_name = camelcase_to_underscore(cl.__name__)
 | 
			
		||||
        return cl._snake_name
 | 
			
		||||
 | 
			
		||||
    def get_context(self, request, page):
 | 
			
		||||
        """
 | 
			
		||||
        Context attributes:
 | 
			
		||||
        * self: section being rendered
 | 
			
		||||
        * page: current page being rendered
 | 
			
		||||
        * request: request used to render the current page
 | 
			
		||||
 | 
			
		||||
        Other context attributes usable in the default section template:
 | 
			
		||||
        * content: **safe string** set as content of the section
 | 
			
		||||
        * hide: DO NOT render the section, render only an empty string
 | 
			
		||||
        """
 | 
			
		||||
        return {
 | 
			
		||||
            'self': self,
 | 
			
		||||
            'page': page,
 | 
			
		||||
            'request': request,
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
    def render(self, request, page, context, *args, **kwargs):
 | 
			
		||||
        """
 | 
			
		||||
        Render the component. ``Page`` is the current page being
 | 
			
		||||
        rendered.
 | 
			
		||||
        """
 | 
			
		||||
        # use a different object
 | 
			
		||||
        context_ = self.get_context(request, *args, page=page, **kwargs)
 | 
			
		||||
        if self.hide:
 | 
			
		||||
            return ''
 | 
			
		||||
 | 
			
		||||
        if context:
 | 
			
		||||
            context_.update({
 | 
			
		||||
                k: v for k, v in context.items()
 | 
			
		||||
                if k not in context_
 | 
			
		||||
            })
 | 
			
		||||
 | 
			
		||||
        context_['page'] = page
 | 
			
		||||
        return render_to_string(self.template_name, context_)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class ExposedData:
 | 
			
		||||
    """
 | 
			
		||||
    Data object that aims to be exposed to Javascript. This provides
 | 
			
		||||
    various utilities.
 | 
			
		||||
    """
 | 
			
		||||
    model = None
 | 
			
		||||
    """
 | 
			
		||||
    [class attribute] Related model/class object that is to be exposed
 | 
			
		||||
    """
 | 
			
		||||
    fields = {}
 | 
			
		||||
    """
 | 
			
		||||
    [class attribute] Fields of the model to be exposed, as a dict of
 | 
			
		||||
        ``{ exposed_field: model_field }``
 | 
			
		||||
 | 
			
		||||
    ``model_field`` can either be a function(exposed, object) or a field
 | 
			
		||||
    name.
 | 
			
		||||
    """
 | 
			
		||||
    data = None
 | 
			
		||||
    """
 | 
			
		||||
    Exposed data of the instance
 | 
			
		||||
    """
 | 
			
		||||
 | 
			
		||||
    def __init__(self, object = None, **kwargs):
 | 
			
		||||
        self.data = {}
 | 
			
		||||
        if object:
 | 
			
		||||
            self.from_object(object)
 | 
			
		||||
        self.data.update(kwargs)
 | 
			
		||||
 | 
			
		||||
    def from_object(self, object):
 | 
			
		||||
        fields = type(self).fields
 | 
			
		||||
        for k,v in fields.items():
 | 
			
		||||
            if self.data.get(k) != None:
 | 
			
		||||
                continue
 | 
			
		||||
            v = v(self, object) if callable(v) else \
 | 
			
		||||
                getattr(object, v) if hasattr(object, v) else \
 | 
			
		||||
                None
 | 
			
		||||
            self.data[k] = v
 | 
			
		||||
 | 
			
		||||
    def to_json(self):
 | 
			
		||||
        """
 | 
			
		||||
        Return a json string of encoded data.
 | 
			
		||||
        """
 | 
			
		||||
        return mark_safe(json.dumps(self.data))
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user