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)