Bloc sociétés
#1
Bonjour,

Je travaille sur le module "Beaver" et j'essaye d’intégrer un bloc sociétés.
j'ai essayé de le faire dans menu --> Blocs -->modification BEAVER, mais je ne trouve le champ "Cible et source" dont j'ai besoin.
Du coup, je regarde le modulle "billing". La structure me semble différente du module Beaver.
J'ai vu que dans le répertoire views --> base.py, il y a la classe "class RelatedBaseCreation(generic.AddingInstanceToEntityPopup):" ligne 42.

j'essaye d'adapter le code avec l'ajout de la classe RelatedBeaverCreation dans views/beaver.py

Code :
class RelatedBeaverCreation(generic.AddingInstanceToEntityPopup):    model = Beaver    # permissions: Union[str, Sequence[str], None] = 'billing'    permissions: Union[str, Sequence[str]] = 'beaver'  # Need creation perm too    initial_status = 1    entity_id_url_kwarg = 'target_id'    entity_classes = [        persons.get_organisation_model(),        persons.get_contact_model(),    ]    entity_form_kwarg = None    def get_initial(self):        initial = super().get_initial()        initial['status'] = self.initial_status        target = self.get_related_entity()        # initial['target'] = target  # DEPRECATED        initial[            base_forms.BeaverTargetSubCell(model=self.model).into_cell().key        ] = target        return initial    def get_success_url(self):        if bool_from_str_extended(self.request.GET.get('redirection', '0')):            return self.object.get_absolute_url()        return super().get_success_url()
de même pour customs_forms.py, apps.py, populate.py, models/beaver.py, forms/beaver.py.
Je me suis inspiré du didacticiel beaver §Formulaires personnalisés (CustomForms)

lors d'une cmd runserver, j'accède a ma liste de beaver mais quand je clique sur "create a beaver", j'ai une erreur "DoesNotExist at /beavers/beaver/add"
la vue création passe par custom_forms.BEAVER_CREATION_CFORM  avec la traceback ci dessous.
Code :
class BeaverCreation(generic.EntityCreation):    model = Beaver    #form_class = BeaverForm    form_class = custom_forms.BEAVER_CREATION_CFORM  # <== NEW


Code :
Environment: Request Method: GET Request URL: http://127.0.0.1:8000/beavers/beaver/add Django Version: 3.2.7 Python Version: 3.9.5 Installed Applications: ['creme.creme_core.apps.ContentTypesConfig', 'django.contrib.auth', 'django.contrib.sessions', 'formtools', 'creme.creme_core.apps.MediaGeneratorConfig', 'creme.creme_core', 'creme.creme_config', 'creme.documents', 'creme.persons', 'creme.activities', 'creme.assistants', 'creme.graphs', 'creme.reports', 'creme.products', 'creme.recurrents', 'creme.billing', 'creme.opportunities', 'creme.commercial', 'creme.events', 'creme.crudity', 'creme.emails', 'creme.projects', 'creme.tickets', 'creme.vcfs', 'creme.geolocation', 'creme.audits', 'creme.beavers'] Installed Middleware: ['creme.creme_core.middleware.exceptions.Ajax500Middleware', 'creme.creme_core.middleware.exceptions.Ajax404Middleware', 'creme.creme_core.middleware.exceptions.Ajax403Middleware', 'creme.creme_core.middleware.exceptions.Beautiful409Middleware', 'creme.creme_core.middleware.exceptions.BadRequestMiddleware', 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', 'creme.creme_core.middleware.locale.LocaleMiddleware', 'creme.creme_core.middleware.global_info.GlobalInfoMiddleware', 'creme.creme_core.middleware.timezone.TimezoneMiddleware'] Traceback (most recent call last):  File "C:\Users\OMEN\creme_crm\venv\lib\site-packages\django\core\handlers\exception.py", line 47, in inner    response = get_response(request)  File "C:\Users\OMEN\creme_crm\venv\lib\site-packages\django\core\handlers\base.py", line 181, in _get_response    response = wrapped_callback(request, *callback_args, **callback_kwargs)  File "C:\Users\OMEN\creme_crm\venv\lib\site-packages\django\views\generic\base.py", line 70, in view    return self.dispatch(request, *args, **kwargs)  File "c:\users\omen\creme_crm\creme\creme_core\views\generic\add.py", line 77, in dispatch    return super().dispatch(request, *args, **kwargs)  File "C:\Users\OMEN\creme_crm\venv\lib\site-packages\django\views\generic\base.py", line 98, in dispatch    return handler(request, *args, **kwargs)  File "C:\Users\OMEN\creme_crm\venv\lib\site-packages\django\views\generic\edit.py", line 168, in get    return super().get(request, *args, **kwargs)  File "C:\Users\OMEN\creme_crm\venv\lib\site-packages\django\views\generic\edit.py", line 133, in get    return self.render_to_response(self.get_context_data())  File "c:\users\omen\creme_crm\creme\creme_core\views\generic\add.py", line 80, in get_context_data    context = super().get_context_data(**kwargs)  File "C:\Users\OMEN\creme_crm\venv\lib\site-packages\django\views\generic\edit.py", line 66, in get_context_data    kwargs['form'] = self.get_form()  File "C:\Users\OMEN\creme_crm\venv\lib\site-packages\django\views\generic\edit.py", line 32, in get_form    form_class = self.get_form_class()  File "c:\users\omen\creme_crm\creme\creme_core\views\generic\add.py", line 88, in get_form_class    return self.get_custom_form_class(super().get_form_class())  File "c:\users\omen\creme_crm\creme\creme_core\views\generic\base.py", line 305, in get_custom_form_class    return form_class.build_form_class()  File "c:\users\omen\creme_crm\creme\creme_core\gui\custom_form.py", line 960, in build_form_class    return self.groups(item).form_class(  File "c:\users\omen\creme_crm\creme\creme_core\gui\custom_form.py", line 937, in groups    item = item or item_model.objects.get(cform_id=self.id)  File "C:\Users\OMEN\creme_crm\venv\lib\site-packages\django\db\models\manager.py", line 85, in manager_method    return getattr(self.get_queryset(), name)(*args, **kwargs)  File "C:\Users\OMEN\creme_crm\venv\lib\site-packages\django\db\models\query.py", line 435, in get    raise self.model.DoesNotExist( Exception Type: DoesNotExist at /beavers/beaver/add Exception Value: CustomFormConfigItem matching query does not exist.

Si je passe par BeaverForm pour la classe BeaverCration, je n'ai pas d'erreur mais je n'est pas le bloc sociétés.

En premier, est ce que il est possible d'avoir ce bloc sociétés sans toucher au code ?
Si non, est ce la bonne démarche ? est ce que j'ai oublié quelque chose (j'ai fait la cmd creme_populate, makemigartions beavers et migrate, mais il n'y a aucun changement) ?

en complément mon custom_forms.py
Code :
BEAVER_CREATION_CFORM = CustomFormDescriptor(    id='beavers-beaver_creation',    model=Beaver,    verbose_name=_('Creation form for beaver'),     base_form_class=beaver.BeaverCustomForm,     extra_sub_cells=[         beaver.BeaverSourceSubCell(model=Beaver),         beaver.BeaverTargetSubCell(model=Beaver),     ], )


merci de votre retour

Cordialement
Tiago
  Répondre
#2
Bonjour,

vous parlez d'un "bloc Sociétés" mais sans expliquez ce que vous entendez par là ; c'est donc difficile de vous aider à faire ce que vous voulez. Il semble qu'il y ait confusion ; parfois vous parlez de "menu --> Blocs" (qui sert à configurer les blocs des vues détaillées, de l'accueil et de "Ma page"), et parfois vous dites "Si je passe par BeaverForm pour la classe BeaverCration, je n'ai pas d'erreur mais je n'est pas le bloc sociétés." (et donc vous parleriez des blocs qu'on trouve dans les formulaires, et qu'on configure dans menu > Configuration générale > Formulaires personnalisés). Vous semblez parler donc confondre 2 types de blocs différents ; et oui la différence n'est pas forcément évidente (en général je vais parler de "bloc des formulaires" pour le 2ème type).

Les formulaires personnalisés sont surtout importants pour les apps de base qui vont être amenées à être utilisés par des tas d'utilisateurs différents avec des besoins différents. Pour une app spécifique à des utilisateurs particulier un formulaire classique peut tout à fait faire l'affaire (bon même si certains utilisateurs indécis aime changer l'ordre des champs des formulaires toutes les semaines, auquel cas un formulaire personnalisé est indiqué...). Et oui, il est tout à fait possible d'avoir des blocs  de formulaires dans un formulaire classique (les formulaires dans Creme ont des blocs depuis 10 ans, alors que les formulaires personnalisés sont apparus en 2.2) en utilisant l'attribut 'blocks' (regardez le fichier 'creme/creme_core/forms/base.py' et les divers exemples d'utilisation dans les formulaires des autres apps).

Si vous voulez quand même utiliser un formulaire personnalisé, votre message d'erreur semble indiquer que vous n'ayez pas correctement créé l'instance de 'CustomFormConfigItem' dans votre 'populate.py'.
  Répondre
#3
Bonjour,

Excusez moi je suis aller trop vite a ma problématique sans vraiment expliquer mon besoin clairement.

En fait, je souhaite associer un castor à une société ou à un contact. Comme sur le devis ou facture, ou on associe un devis/facture a une société ou a un contact.

je pensais qu'il fallait passé par un formulaire personnalisé pour faire cela.

je vais regardé du coté des blocs  de formulaires dans un formulaire classique  en utilisant l'attribut 'blocks' (regardez le fichier 'creme/creme_core/forms/base.py' et les divers exemples d'utilisation dans les formulaires des autres apps).

Merci
  Répondre


Atteindre :


Utilisateur(s) parcourant ce sujet : 3 visiteur(s)