Code Monkey home page Code Monkey logo

django-formidable's Introduction

django-formidable

docs/source/_static/formidable-logo.png

https://circleci.com/gh/peopledoc/django-formidable.svg?style=svg&circle-token=6f273f564e1e44f702aef7c1d00baff74609c791

django-formidable is a full django application which allows you to create, edit, delete and use forms.

Warnings

  • Python Compatibility : 3.6, 3.7, 3.8
  • Django compatibility : Django 2.2.
  • Django REST Framework : Compatible from the version 3.9.x to 3.11.x

See the Deprecation timeline document for more information on deprecated versions.

License

MIT License

Documentation

Latest version of the documentation: http://django-formidable.readthedocs.io/en/latest/

If you want to build the documentation locally, you can try to run one of the following:

$ make docs
$ tox -e docs

Note

A recent version of tox must be available on your system.

You can also browse the documentation locally, using the following, for example:

$ make docs serve-docs

About the model graph

On the "intro" page of the documentation, you can see a graph of the different Django models defined in the application.

To generate this graph, you'll need to have graphviz installed on your system.

When you're ready, you may initiate this generation using:

$ tox -e django_graph

Quick-Start

Install

$ pip install django-formidable

Configure

Define Roles

django-formidable allows access to a single form by different roles. The same form can thus be rendered in different ways. If you don't need to handle multiple roles you must still define at least one default role.

Define a method which returns a list of formidable.accesses.AccessObject:

def get_roles(self):
    return [
        AccessObject(id='padawan', label='Padawan'),
        AccessObject(id='jedi', label='Jedi')
    ]

Fill the settings key:

FORMIDABLE_ACCESS_RIGHTS_LOADER = 'yourproject.access_rights.get_roles'

Get context

While accessing a form for a specific role, you need to provide a way in which to get the correct context to use.

request and kwargs are fetched from the view (self.request, self.kwargs)

def get_context(request, kwargs):
    return request.user.user_type

Next fill the setting key FORMIDABLE_CONTEXT_LOADER

FORMIDABLE_CONTEXT_LOADER = 'yourprojects.access_rights.get_context'

Define URLs

URLs are defined in formidable.urls. You can load them with the following line:

url(r'^api/', include('formidable.urls', namespace='formidable'))

By default, the views are not accessible, the permissions loaded are fully restrictive. To allow any access to the view fill your settings with

FORMIDABLE_DEFAULT_PERMISSION=['rest_framework.permissions.AllowAll']

To handle special permissions, please refer to the online documentation.

django-formidable's People

Contributors

alexdashkov avatar brunobord avatar dependabot[bot] avatar greatwizard avatar mgu avatar moumoutte avatar ojh avatar robincherbonnier avatar samuelhamard avatar wo0dyn avatar yakuru avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

django-formidable's Issues

Disabled field don't send data on submit!

Infos:

  • Disabled : les data sont pas envoyés au submit
  • Readonly : les data sont quand meme envoyés au submit

Est-ce qu'on garde ce fonctionnement ou l'on passe à readonly partout ?
A savoir, readonly n'existe pas pour les select.... on doit faire un disabled et mettre en hidden la valeur qui avait été sélectionné....

Let users choose their assets for JS/l10n/widgets/and so on

Bonjour,

Je fais un ticket un peu en "To Specify" par vos soin.

Je suis interesse par la solution mise en place aussi 👍

Si l'on veut sortir formidable en "libre" ou "open source" (a voir le licensing), un utilisateur de formidable aura envie d'utiliser ses propres JS pour gerer les datetime / date / autres fields.

Il serait bon de faire en sorte de rajouter un mechanism pour load les assets/statics via le built-in Django (a minima) ou autre si vous avez mieux:
https://docs.djangoproject.com/en/1.9/topics/forms/media/

Merci

Field Validation

  • Implement base validation CRUD
  • Handle validation by field (all type of field does not accept all the validation type)
  • Comparator Validation do not accept the type of value if the field is date or text or number.

Builder en python

Fonctionnalités identique au builder JS:

  • Ajout/Suppression/Edition de champ
  • Groupe de champs (itérable)
  • Champs complexes
  • Règles

Le tout programmable, par exemple :

...
form.addField('text')
...
A définir ~

[API] Mise à jour des form sur trois niveaux de profondeur

Lors de l'édition le front nous envoie le payload complet du nouveau form.

Il faut

  • Mettre à jour les champs modifiés (Et leur dépendences [items, plus tard validation..])
  • Supprimer les champs qui n'apparaissent plus
  • Ajouter les nouveaux champs

Pour bien faire, il faut revoir ce qu'est la primary key d'un field (slug + foreign key du form), la clef primaire d'un item (key + foreign key du field) afin de se retrouver.

/!\ Attention, d'après le endpoint, l'id du form à mettre à jour est passé dans l'URL, pas dans le PayLoad Json.

Valid data for display form

Action de validation des data avant de submit un form.
Permet de récupérer les données d'erreurs sur les validations.

GET api/form/{id}/validate/

Payload: liste de clé valeur des champs

Return

Code 204 (NO CONTENT)

Tout va bien c'est valide ! \o/
Pas de contenu

Code 400

Liste des erreurs du formulaire selon https://github.com/peopledoc/people-kiki/wiki/API-Guidelines#messages-et-code-derreur

{
  "code": "validation_errors",
  "errors": [{
    "field": "name", 
    "code": "missing_field", 
    "message": "The field name is required."
  }, {
    [...]
  }]
}

Choices Presets

The main idea is to provides a way to build dynamic or static list of choices inside a fields (dropdown, checkboxes, etc..).

You can imagine multiple source to generate those kind of lists.

  • A plain text list push from the API (via front)
  • A file uploaded containing the list
  • Models from database

and so on !

The main objective is to maintain a list at one point (the list of the states in US for example) and use it in the fields. If the list contains an errors, we can edit it in one place not all the list is used.

Django Form depuis un objet Formidable

Depuis un objet Formidable, il est utile de récupére un formulaire django associé.

>>> form = Formidable.objects.create(label='test', description=u'huge form')
>>> form.fields.create(type_id=u'text', slug='input-text', label=u'my text', required=True)
>>> drop = form.fields.create(type_id=u'dropdown', slug=u'weapon', label=u'your weapon', required=False)
>>> drop.items.objects.create(key=u'gun', value=u'eagle')

>>> django_form_class = form.to_django_form_class()
>>> django_form = django_form_class(data={'input-text': u'tutu', 'weapon': 'gin'})
>>> django_form.is_valid()
False
>>> django_form.errors
{'weapon': 'gin is not a valid choices'}
>>> django_form = django_form_class(data={'input-text': u'tutu', 'weapon': 'gun'})
>>> django_form.is_valid()
True

Python Builder can edit form instead of create only

Now a day , the python builder permits to create form through django form API. But, only creation.
The goal of this ticket is to enable form editing instead of creation only

API example

class MyForm(FormidableForm):
       first_name = fields.CharField()


form = MyForm.to_formidable(label=''create')

class MyForm(FormidableForm):
       first_name = fields.CharField()
       last_name = fields.CharField()

form = MyForm.to_formidable(instance=form)

>>> form.fields.filter(slug='last_name').exists()
True

Ecrire les tests de serialization contextualise

Afin d'avoir une demo qui roxe ASAP, on merge la vue contextualise sans les tests (oui c'est mal, mais on attend que le builder python soit Ope t'entends !)

Donc la, y'a pas de tests sur la serialization contextualisees et c'est mal ! Du coup, faut le faire.

Ré-écriture du listserializer générique

La plus part des objets nested dans un field sont gérer par un list serializer qui font globalement tout le temps la même chose.

Il y a du code à factoriser pour gérer les create/update/delete dans la méthode update

Pour rappel, tout le payloads final du form est transmit au back, c'est au back de gérer les opérations...

Implementation des Fields de formattage

  • HelpText
    • Attribut help_text utilisé
    • Widget Markdown
  • Title
    • Le titre est du texte brut et est stocké dans l'attribut "label"
    • Le widget de rendu peut prendre en paramètre une balise de rendu (h1, h2, h3..)
  • Separator
    • Pas de texte particulier, par défaut la balise est affiché, peut-être configuré au niveau du widget

FieldBuilder, add correctly the disabled attribute in input file

Today, the disabled attribute in input file is always filled with different value. "False" when the input is editable, "disabled" when the field is disabled. Fill the disabled attribute with any value has effect to disabled the field every time.

Do not set the "disabled" attribute when it's not needed.

[Etude] Instanciation d'un serializer spécifique pour chaque type de field

Séparation Donnée/Logique

Chaque champs est représenté en base dans la table fields avec toutes les données disponibles pour chacun des fields. C'est à dire que la table contient tous les champs de bases des fields + les options disponibles pour chacun des types de fields.

on va retrouvé alors

label, helptext, default, type_id, placeholder, multiple, items

Chaque option n'a pas la même signification pour tel ou tel type de champs (Par exemple, les champs de type "text" n'ont que faire d'un items ou n'a pas à être "multiple"). Alors que c'est obligatoire pour un ChoiceField d'avoir cette liste items. Ou alors radioboxes est forcément "multiple=True". Le nombre de combinaisons de validations des options sont aussi nombreuses qu'il y a de type de champs.

Cela se fait déjà ressentir pour le payload attendu par l'UI d'édition. Le payload contient des clefs différentes en fonction du type de champs. Même si le client est très souple sur sa réception de données, il ne faut pas négliger les données à recevoir et à valider lors d'édition ou de création de champ dans un formulaire.

Pour le moment on ne parle que d'options dans un premier temps, mais très vite la validation par champ va pointer le bout de son nez. Et là, ça va devenir nettement plus compliqué à maintenir si on garde un serializer pour chaque type de champs.

Chaque Type de champs son sérializer.

Il faut arriver à produire un serializer spécifique à chaque type de champs pour y faire de la validation et de l'envoie de données le plus strict possible. En débrayant, on arrivera à "Contextualiser" les validations/serializations et aurevoir les IF à répétition.

Mais ce n'est pas si simple, lorsqu'on passe par les vues standard de rest-framework (RetrievieView), le serializers est souvent instancié sans intance. C'est lors de la génération des datas au final que l'instance est passé en paramètre

to_representation(self, instance)

Donc on ne sait qu'au dernier moment le type de champs que l'on est en train de rendre... Ce qui nous facilite pas vraiment la tâche.

Il semblerait que les méthodes , create et update soit similaire sur la mécanique, attention donc..

Ember Integration

  • app js standalone
  • page de sélection du form voulu dans une liste qui amène à l'éditeur

Make access optional

Définir des champs required/disabled dans l'API Crud ( égalemen dans les modèles par extension)

Les objets nesteds doivent être enleve avant chaque action sur les fields

Par defaut, DRF jete une exception quand il y a une opération su un objet nested ne sachant pas comment le traiter (update, create ou delete ?)

Le comportement est le même pour l'update et le create,

  • On dépile les data des objets nested
  • On fait la mise à jour (ou création) du field
  • On fait la mise à jour (ou création) des objets nested

Le code existant est défaillant en update lorsqu'il y a des objets validations, il faut en profiter pour refactoriser un peu ça.

Implementation des access

  • Mettre en place une methode pour que l'application cliente puisse fournir un jeu d'access (Settings, fonctions, etc)
  • Mettre en place le end point qui liste l'ensemble des access
  • Lier les accesses au fields d'un form

Le choix dans la date

Est-ce qu'on utilise un format universel? ISO8601
Faire que la communication API soit sur le même format.

Contextualize presets

Some validations are available for a specific site for example, others are available for all the site define in the platform. We need to find way to contextualize available presets.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.