Upgrade to Pro — share decks privately, control downloads, hide ads and more …

CMS Django com magic content

CMS Django com magic content

Roger Camargo

September 30, 2017
Tweet

More Decks by Roger Camargo

Other Decks in Programming

Transcript

  1. Objetivo Criar 1000 sites dinamicamente (seguindo a ideia do wordpress/WIX)

    para os SCOUTS Premissas: - Usuários NÃO querem DECIDIR DESIGN (cores, tamanho fontes, posições das coisas) - NÃO utilizar soluções existentes (OFF TOPIC para esta apresentação) - em 2014 o Wagtail (django cms não era conhecido)
  2. Problema #1 - Um único banco de dados (MULTI TENANCY)

    - Uma aplicação apenas - 1000 sites, diferente permissões, diferente conteúdos, temas - Fácil backup/restore de/para site_id
  3. Uma base Uma aplicação 1k sites, diferente permissões, diferente conteúdo

    Fácil backup/restore de/para site_id class SingletonSiteManager (models.Manager): """ Encapsuate the SITE_ID ... """ def get_queryset(self): queryset = super(SingletonSiteManager, self).get_queryset() queryset = queryset.filter( site=Site.objects.get_current()) return queryset Solução: app para MULTI SITES
  4. Uma base Uma aplicação 1k sites, diferente permissões, diferente conteúdo

    Fácil backup/restore de/para site_id def form_valid(self, form): self.object = form.save( commit=False) self.object.save() se = SiteCreatorEngine().create_new_site( Self.object.site_domain, self.object.user) # SiteCreatorEngine _create_nginx_file _create_gunicorn_file _enable_nginx _restore_site_template Solução: app para gerar sites exec ../gunicorn my_site.wsgi:application \ --env DJANGO_SITE_ID=my_site_id
  5. Problema #2 - Que seja possível um WEB DESIGN que

    nunca viu Django na vida, contribua com a UX e aparência dos sites. - É fácil ter código de frontend em arquivos .py (ex: forms.py com atributos HTML
  6. <!-- page.html --> <form action="/contact/" method="post">{% csrf_token %} {{ forms

    }} <input type="submit" value="Submit" /> </form> Problema #2 WEB DESIGN: WTF?? How can I add my class? Change the HTML?
  7. # forms.py class NewPageSetupForm (forms.Form): name = forms.CharField( widget=forms.TextInput() active_menu

    = forms.BooleanField( widget=OnOffCheckboxInput(), required=False) Solução: floppy-forms
  8. <!-- floppyforms/onoff_checkbox.html --> <div class="row"> <div class="col-md-5"> <div class="onoffswitch"> <input

    type="{{ type }}" name="{{ name }}"> <label class="onoffswitch-label" for="{{ attrs.id }}" > <span class="onoffswitch-inner" ></span> <span class="onoffswitch-switch" ></span> </label> </div> </div> </div Solução: floppy-forms class OnOffCheckboxInput (CheckboxInput): template_name = 'floppyforms/onoff_checkbox.html'
  9. <!-- page.html --> <form action="/contact/" method="post">{% csrf_token %} {% form

    contact_form using "floppyforms/layouts/in_line.html" %} <input type="submit" value="Submit" /> </form> Solução: floppy-forms HTML totalmente manipulável por um WEB DESIGN
  10. Problema #3 - Tem bastante padrão para Django - Mas

    pouco padrão para templates / frontend com django - Muitos projetos tem o mindset: depois o designer deixa bonito /frontend/guide
  11. Solução: frontend-decouple <html lang="en"> <head> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>{%

    block title %}{% endblock %}</title> {# 3rdcss block #} {% block 3rdcss %}{% endblock 3rdcss %} {# css block #} {% block css %}{% endblock css %} {# extracss block #} {% block extracss %}{% endblock extracss %} {# top javascripts here #} {% block js_top %}{% endblock %} </head> {% block body %} <body id="top"> ... https://github.com/DjenieLabs/django-frontend-decouple
  12. Solução: frontend-decouple https://github.com/DjenieLabs/django-frontend-decouple - Fácil criação de temas - Fácil

    criação de guia de cores - Guia para criar páginas mais bonitas - Estilos para deixar templates django melhor em UX
  13. Problema #4 - Django ADMIN não é para usuário final

    - CMS mais amigável - extensível (dar autonomia para cliente)
  14. Solução: magic-content - Não faz mágica - Estrutura básica que

    entrega um CRUD + amigável que pode ser estendido - #atividades #calendário